/** * 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; }
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; }