%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/search/engine/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/search/engine/Search.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2015 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\search\engine;
use Yii;
use yii\base\Component;
use humhub\modules\search\interfaces\Searchable;
use humhub\modules\content\models\Content;
use humhub\modules\content\models\ContentTag;
use humhub\modules\content\components\ContentActiveRecord;
use humhub\modules\content\components\ContentContainerActiveRecord;
use humhub\modules\user\models\User;
use humhub\modules\space\models\Space;
use humhub\modules\search\events\SearchAttributesEvent;
/**
* Description of HSearchComponent
*
* @since 0.12
* @author luke
*/
abstract class Search extends Component
{
const EVENT_SEARCH_ATTRIBUTES = 'search_attributes';
const EVENT_ON_REBUILD = 'onRebuild';
const DOCUMENT_TYPE_USER = 'user';
const DOCUMENT_TYPE_SPACE = 'space';
const DOCUMENT_TYPE_CONTENT = 'content';
const DOCUMENT_TYPE_OTHER = 'other';
const DOCUMENT_VISIBILITY_PUBLIC = 'public';
const DOCUMENT_VISIBILITY_PRIVATE = 'private';
/**
* @var int the minimum length of a search token
*/
public $minQueryTokenLength = 2;
/**
* Retrieves results from search
*
* Available options:
* page
* pageSize
*
* sortField Mixed String/Array
* model Mixed String/Array
* type Mixed String/Array
* checkPermissions boolean (TRUE/false)
* limitSpaces Array (Limit Content to given Spaces(
* filters Array (Additional filter Field=>Value)
*
* @param type $query
* @param array $options
* @return SearchResultSet
*/
abstract public function find($query, Array $options);
/**
* Stores an object in search index.
*
* @param Searchable $object
*/
abstract public function add(Searchable $object);
/**
* Updates an object in search index.
*
* @param Searchable $object
*/
abstract public function update(Searchable $object);
/**
* Deletes an object from search.
*
* @param Searchable $object
*/
abstract public function delete(Searchable $object);
/**
* Deletes all objects from search index.
*/
abstract public function flush();
/**
* Rebuilds search index
*/
public function rebuild()
{
$this->flush();
$this->trigger(self::EVENT_ON_REBUILD);
$this->optimize();
}
/**
* Optimizes the search index.
* Default implementation does nothing, may be overidden by child classes.
*/
public function optimize()
{
}
protected function getMetaInfoArray(Searchable $obj)
{
$meta = [];
$meta['type'] = $this->getDocumentType($obj);
$meta['pk'] = $obj->getPrimaryKey();
$meta['model'] = $obj->className();
if ($obj instanceof ContentContainerActiveRecord) {
$meta['containerModel'] = $obj->className();
$meta['containerPk'] = $obj->id;
}
// Add content related meta data
if ($meta['type'] == self::DOCUMENT_TYPE_CONTENT) {
if ($obj->content->container !== null) {
$meta['containerModel'] = $obj->content->container->className();
$meta['containerPk'] = $obj->content->container->id;
}
if ($obj->content->visibility == Content::VISIBILITY_PUBLIC) {
$meta['visibility'] = self::DOCUMENT_VISIBILITY_PUBLIC;
} else {
$meta['visibility'] = self::DOCUMENT_VISIBILITY_PRIVATE;
}
$meta['contentTags'] = implode(', ', array_map(function(ContentTag $tag) {
return $tag->name;
}, $obj->content->tags));
} elseif ($meta['type'] == self::DOCUMENT_TYPE_SPACE && $obj->visibility == Space::VISIBILITY_NONE) {
$meta['visibility'] = self::DOCUMENT_VISIBILITY_PRIVATE;
} else {
$meta['visibility'] = self::DOCUMENT_VISIBILITY_PUBLIC;
}
return $meta;
}
protected function getDocumentType(Searchable $obj)
{
if ($obj instanceof Space) {
return self::DOCUMENT_TYPE_SPACE;
} elseif ($obj instanceof User) {
return self::DOCUMENT_TYPE_USER;
} elseif ($obj instanceof ContentActiveRecord) {
return self::DOCUMENT_TYPE_CONTENT;
} else {
return self::DOCUMENT_TYPE_OTHER;
}
}
protected function setDefaultFindOptions($options)
{
if (!isset($options['page']) || $options['page'] == '') {
$options['page'] = 1;
}
if (!isset($options['pageSize']) || $options['pageSize'] == '') {
$options['pageSize'] = Yii::$app->settings->get('paginationSize');
}
if (!isset($options['checkPermissions'])) {
$options['checkPermissions'] = true;
}
if (!isset($options['limitSpaces'])) {
$options['limitSpaces'] = [];
}
return $options;
}
/**
* Returns additional search attributes for the given object.
* This contains a list of comments, files and other content addons.
*
* @param Searchable $object
* @return array the additional search attributes
*/
protected function getAdditionalAttributes(Searchable $object)
{
$additionalAttributes = [];
$this->trigger(self::EVENT_SEARCH_ATTRIBUTES, new SearchAttributesEvent($additionalAttributes, $object));
return $additionalAttributes;
}
}