Exemplo n.º 1
0
 /**
  * Applies full text search settings to query.
  *
  * @param SearchQueryInterface $searchQuery
  * @param AttributeDescriptor[] $fullTextSearchAttributes
  * @param string $fullTextSearchParam
  * @return SearchQueryInterface
  */
 public function applyFullTextSearchSettings(SearchQueryInterface $searchQuery, $fullTextSearchAttributes, $fullTextSearchParam = 'text')
 {
     if ($fullTextSearchAttributes) {
         if ($searchQuery instanceof BooleanQueryInterface) {
             $subQueries = $searchQuery->getSubQueries();
             $signs = $searchQuery->getSigns();
             foreach ($subQueries as $key => $subQuery) {
                 $subQueries[$key] = $this->applyFullTextSearchSettings($subQuery, $fullTextSearchAttributes, $fullTextSearchParam);
             }
             $searchQuery->setSubQueries($subQueries, $signs);
         } elseif ($searchQuery instanceof Term) {
             $field = $searchQuery->getField();
             if ($field == $fullTextSearchParam) {
                 $fields = array_map(function (AttributeDescriptor $attribute) {
                     return $attribute->name;
                 }, $fullTextSearchAttributes);
                 $searchQuery = new MultiMatch($fields, $searchQuery);
             } elseif (array_filter($fullTextSearchAttributes, function (AttributeDescriptor $attribute) use($field) {
                 return $attribute->name == $field;
             })) {
                 $searchQuery = new Match($searchQuery->getField(), $searchQuery);
             }
         }
     }
     return $searchQuery;
 }
Exemplo n.º 2
0
 protected static function removeQueryByFieldName(SearchQueryInterface $fromQuery, $field, $sign = true)
 {
     if ($fromQuery instanceof BooleanQueryInterface) {
         $subQueries = $fromQuery->getSubQueries();
         $signs = $fromQuery->getSigns();
         $removed = false;
         foreach ($subQueries as $key => $subQuery) {
             if ($subQuery instanceof FieldQueryInterface) {
                 if ($signs[$key] === $sign && $subQuery->getField() === $field) {
                     unset($subQueries[$key], $signs[$key]);
                     $removed = true;
                 }
             }
         }
         if (!$removed) {
             foreach ($subQueries as $key => $subQuery) {
                 if ($subQuery instanceof BooleanQueryInterface) {
                     $subQueries[$key] = self::removeQueryByFieldName($subQuery, $field, $sign);
                 }
             }
         }
         $fromQuery->setSubQueries($subQueries, $signs);
     } elseif ($fromQuery instanceof FieldQueryInterface && $fromQuery->getField() === $field) {
         return new Boolean();
     }
     return $fromQuery;
 }