/** * {@inheritdoc} */ public function build(ScoreBuilder $scoreBuilder, Select $select, RequestQueryInterface $query, $conditionType) { /** @var $query \Magento\Framework\Search\Request\Query\Match */ $fieldList = []; foreach ($query->getMatches() as $match) { $fieldList[] = $match['field']; } $resolvedFieldList = $this->resolver->resolve($fieldList); $fieldIds = []; $columns = []; foreach ($resolvedFieldList as $field) { if ($field->getType() === FieldInterface::TYPE_FULLTEXT && $field->getAttributeId()) { $fieldIds[] = $field->getAttributeId(); } $column = $field->getColumn(); $columns[$column] = $column; } $exactMatchQuery = $this->getExactMatchQuery($columns, $query->getValue()); $scoreQuery = $this->getScoreQuery($columns, $query->getValue()); $scoreBuilder->addCondition(new \Zend_Db_Expr($scoreQuery), true); if ($query->getValue() != $this->queryHelper->singularize($query->getValue())) { $scoreQuery = $this->getScoreQuery($columns, $this->queryHelper->singularize($query->getValue())); $scoreBuilder->addCondition(new \Zend_Db_Expr($scoreQuery), true); } if ($fieldIds) { $select->where(sprintf('search_index.attribute_id IN (%s)', implode(',', $fieldIds))); } $select->having(new \Zend_Db_Expr($exactMatchQuery))->group('entity_id'); return $select; }
/** * {@inheritdoc} */ public function build(ScoreBuilder $scoreBuilder, Select $select, RequestQueryInterface $query, $conditionType) { /** @var $query \Magento\Framework\Search\Request\Query\Match */ $queryValue = $this->prepareQuery($query->getValue(), $conditionType); $fieldList = []; foreach ($query->getMatches() as $match) { $fieldList[] = $match['field']; } $resolvedFieldList = $this->resolver->resolve($fieldList); $fieldIds = []; $columns = []; foreach ($resolvedFieldList as $field) { if ($field->getType() === FieldInterface::TYPE_FULLTEXT && $field->getAttributeId()) { $fieldIds[] = $field->getAttributeId(); } $column = $field->getColumn(); $columns[$column] = $column; } $matchQuery = $this->fulltextHelper->getMatchQuery($columns, $queryValue, $this->fulltextSearchMode); $scoreBuilder->addCondition($matchQuery, true); if ($fieldIds) { $matchQuery = sprintf('(%s AND search_index.attribute_id IN (%s))', $matchQuery, implode(',', $fieldIds)); } $select->where($matchQuery); return $select; }
/** * {@inheritdoc} */ public function build(ScoreBuilder $scoreBuilder, Select $select, RequestQueryInterface $query, $conditionType) { /** @var $query \Magento\Framework\Search\Request\Query\Match */ $queryValue = $this->prepareQuery($query->getValue(), $conditionType); $fieldList = []; foreach ($query->getMatches() as $match) { $fieldList[] = $match['field']; } $resolvedFieldList = $this->resolver->resolve($fieldList); $queryBoost = $query->getBoost(); $scoreBuilder->addCondition($this->fulltextHelper->getMatchQuery($resolvedFieldList, $queryValue, Fulltext::FULLTEXT_MODE_BOOLEAN), $queryBoost !== null ? $queryBoost : 1); $select = $this->fulltextHelper->match($select, $resolvedFieldList, $queryValue, true, Fulltext::FULLTEXT_MODE_BOOLEAN); return $select; }
protected function processQuery(RequestQueryInterface $query, DataObject $params, $conditionType) { switch ($query->getType()) { case RequestQueryInterface::TYPE_MATCH: $this->processMatchQuery($query, $params, $conditionType); break; case RequestQueryInterface::TYPE_BOOL: $this->processBoolQuery($query, $params, $conditionType); break; case RequestQueryInterface::TYPE_FILTER: $this->processFilterQuery($query, $params, $conditionType); break; } }
/** * {@inheritdoc} */ public function build(ScoreBuilder $scoreBuilder, Select $select, RequestQueryInterface $query, $conditionType) { /** @var $query \Magento\Framework\Search\Request\Query\Match */ foreach ($query->getMatches() as $match) { $mode = Select::FULLTEXT_MODE_NATURAL; if ($conditionType === Bool::QUERY_CONDITION_NOT) { $match['value'] = '-' . $match['value']; $mode = Select::FULLTEXT_MODE_BOOLEAN; } $scoreBuilder->addCondition($select->getMatchQuery($match['field'], $match['value'], $mode), isset($match['boost']) ? $match['boost'] : 1); $select->match($match['field'], $match['value'], true, $mode); } return $select; }
/** * @param SphinxQL $select * @param RequestQueryInterface $query * @return SphinxQL */ public function build(SphinxQL $select, RequestQueryInterface $query) { /** @var \Magento\Framework\Search\Request\Query\Match $query */ $fieldList = []; foreach ($query->getMatches() as $match) { $fieldList[] = $match['field']; } $resolvedFieldList = $this->resolver->resolve($fieldList); $fieldIds = []; $columns = []; /** @var \Mirasvit\SearchSphinx\Model\Adapter\Field\Field $field */ foreach ($resolvedFieldList as $field) { if ($field->getType() === FieldInterface::TYPE_FULLTEXT && $field->getAttributeId()) { $fieldIds[] = $field->getAttributeId(); } $column = $field->getColumn(); $columns[$column] = $column; } $queryValue = $this->queryHelper->buildQuery($query->getValue()); $matchQuery = $this->buildMatchQuery($queryValue, $select); $select->match($columns, new QLExpression($matchQuery)); return $select; }
/** * @param RequestQueryInterface $query * @return FilterInterface[] */ private function getFilters($query) { $filters = []; switch ($query->getType()) { case RequestQueryInterface::TYPE_BOOL: /** @var \Magento\Framework\Search\Request\Query\BoolExpression $query */ foreach ($query->getMust() as $subQuery) { $filters = array_merge($filters, $this->getFilters($subQuery)); } foreach ($query->getShould() as $subQuery) { $filters = array_merge($filters, $this->getFilters($subQuery)); } foreach ($query->getMustNot() as $subQuery) { $filters = array_merge($filters, $this->getFilters($subQuery)); } break; case RequestQueryInterface::TYPE_FILTER: /** @var Filter $query */ $filter = $query->getReference(); if (FilterInterface::TYPE_BOOL === $filter->getType()) { $filters = array_merge($filters, $this->getFiltersFromBoolFilter($filter)); } else { $filters[] = $filter; } break; default: break; } return $filters; }
/** * Process query * * @param ScoreBuilder $scoreBuilder * @param RequestQueryInterface $query * @param Select $select * @param string $conditionType * @param QueryContainer $queryContainer * @return Select * @throws \InvalidArgumentException */ protected function processQuery( ScoreBuilder $scoreBuilder, RequestQueryInterface $query, Select $select, $conditionType, QueryContainer $queryContainer ) { switch ($query->getType()) { case RequestQueryInterface::TYPE_MATCH: /** @var MatchQuery $query */ $select = $queryContainer->addMatchQuery( $select, $query, $conditionType ); break; case RequestQueryInterface::TYPE_BOOL: /** @var BoolQuery $query */ $select = $this->processBoolQuery($scoreBuilder, $query, $select, $queryContainer); break; case RequestQueryInterface::TYPE_FILTER: /** @var FilterQuery $query */ $select = $this->processFilterQuery($scoreBuilder, $query, $select, $conditionType, $queryContainer); break; default: throw new \InvalidArgumentException(sprintf('Unknown query type \'%s\'', $query->getType())); } return $select; }
/** * @param QueryInterface $query * @return bool */ private function hasFilters(QueryInterface $query) { $hasFilters = false; switch ($query->getType()) { case RequestQueryInterface::TYPE_BOOL: /** @var \Magento\Framework\Search\Request\Query\Bool $query */ foreach ($query->getMust() as $subQuery) { $hasFilters |= $this->hasFilters($subQuery); } foreach ($query->getShould() as $subQuery) { $hasFilters |= $this->hasFilters($subQuery); } foreach ($query->getMustNot() as $subQuery) { $hasFilters |= $this->hasFilters($subQuery); } break; case RequestQueryInterface::TYPE_FILTER: $hasFilters |= true; break; default: $hasFilters |= false; break; } return $hasFilters; }
/** * Process query * * @param ScoreBuilder $scoreBuilder * @param RequestQueryInterface $query * @param Select $select * @param bool $isNot * @return Select * @throws \InvalidArgumentException */ protected function processQuery(ScoreBuilder $scoreBuilder, RequestQueryInterface $query, Select $select, $isNot) { switch ($query->getType()) { case RequestQueryInterface::TYPE_MATCH: /** @var MatchQuery $query */ $scoreBuilder->startQuery(); $select = $this->matchQueryBuilder->build($scoreBuilder, $select, $query, $isNot); $scoreBuilder->endQuery($query->getBoost()); break; case RequestQueryInterface::TYPE_BOOL: /** @var BoolQuery $query */ $select = $this->processBoolQuery($scoreBuilder, $query, $select); break; case RequestQueryInterface::TYPE_FILTER: /** @var FilterQuery $query */ $select = $this->processFilterQuery($scoreBuilder, $query, $select, $isNot); break; default: throw new \InvalidArgumentException(sprintf('Unknown query type \'%s\'', $query->getType())); } return $select; }
/** * Process query * * @param ScoreBuilder $scoreBuilder * @param RequestQueryInterface $query * @param Select $select * @param string $conditionType * @param QueryContainer $queryContainer * @return Select * @throws \InvalidArgumentException */ protected function processQuery(ScoreBuilder $scoreBuilder, RequestQueryInterface $query, Select $select, $conditionType, QueryContainer $queryContainer) { switch ($query->getType()) { case RequestQueryInterface::TYPE_BOOL: /** @var BoolQuery $query */ $select = $this->processBoolQuery($scoreBuilder, $query, $select, $queryContainer); break; case RequestQueryInterface::TYPE_FILTER: /** @var FilterQuery $query */ $select = $this->processFilterQuery($scoreBuilder, $query, $select, $conditionType, $queryContainer); break; } return $select; }
/** * @param RequestQueryInterface $query * @param SphinxQL $select * @param string $conditionType * @param QueryContainer $queryContainer * @return SphinxQL */ protected function processQuery(RequestQueryInterface $query, SphinxQL $select, $conditionType, QueryContainer $queryContainer) { switch ($query->getType()) { case RequestQueryInterface::TYPE_MATCH: $select = $queryContainer->addMatchQuery($select, $query, $conditionType); break; case RequestQueryInterface::TYPE_BOOL: $select = $this->processBoolQuery($query, $select, $queryContainer); break; } return $select; }