コード例 #1
0
ファイル: Match.php プロジェクト: Doability/magento2dev
 /**
  * {@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;
 }
コード例 #2
0
ファイル: Match.php プロジェクト: pradeep-wagento/magento2
 /**
  * {@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;
 }
コード例 #3
0
ファイル: Match.php プロジェクト: shabbirvividads/magento2
 /**
  * {@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;
 }
コード例 #4
0
 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;
     }
 }
コード例 #5
0
ファイル: Match.php プロジェクト: pavelnovitsky/magento2
 /**
  * {@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;
 }
コード例 #6
0
ファイル: Match.php プロジェクト: Doability/magento2dev
 /**
  * @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;
 }
コード例 #7
0
 /**
  * @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;
 }
コード例 #8
0
ファイル: Mapper.php プロジェクト: nja78/magento2
 /**
  * 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;
 }
コード例 #9
0
ファイル: IndexBuilder.php プロジェクト: nja78/magento2
 /**
  * @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;
 }
コード例 #10
0
ファイル: Mapper.php プロジェクト: pavelnovitsky/magento2
 /**
  * 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;
 }
コード例 #11
0
ファイル: Mapper.php プロジェクト: Doability/magento2dev
 /**
  * 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;
 }
コード例 #12
0
ファイル: MapperQL.php プロジェクト: Doability/magento2dev
 /**
  * @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;
 }