/** * {@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; }
/** * {@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; }
public function testBuildQuery() { $boost = 3.14; /** @var Select|\PHPUnit_Framework_MockObject_MockObject $select */ $select = $this->getMockBuilder('Magento\\Framework\\DB\\Select')->setMethods(['getMatchQuery', 'match'])->disableOriginalConstructor()->getMock(); $select->expects($this->once())->method('getMatchQuery')->with($this->equalTo('some_field'), $this->equalTo('-some_value'))->will($this->returnValue('matchedQuery')); $select->expects($this->once())->method('match')->with($this->equalTo('some_field'), $this->equalTo('-some_value'), $this->equalTo(true), $this->equalTo(Select::FULLTEXT_MODE_BOOLEAN)); /** @var \Magento\Framework\Search\Request\Query\Match|\PHPUnit_Framework_MockObject_MockObject $query */ $query = $this->getMockBuilder('Magento\\Framework\\Search\\Request\\Query\\Match')->setMethods(['getMatches'])->disableOriginalConstructor()->getMock(); $query->expects($this->once())->method('getMatches')->will($this->returnValue([['field' => 'some_field', 'value' => 'some_value', 'boost' => $boost]])); $this->scoreBuilder->expects($this->once())->method('addCondition')->with($this->equalTo('matchedQuery'), $this->equalTo($boost)); $result = $this->match->build($this->scoreBuilder, $select, $query, Bool::QUERY_CONDITION_NOT); $this->assertEquals($select, $result); }
/** * @param RequestInterface $request * @param MatchContainer[] $matchQueries * @param ScoreBuilder $scoreBuilder * @param Select $select * @param IndexBuilderInterface $indexBuilder * @return Select * @internal param QueryContainer $queryContainer */ private function addMatchQueries(RequestInterface $request, array $matchQueries, ScoreBuilder $scoreBuilder, Select $select, IndexBuilderInterface $indexBuilder) { if (!$matchQueries) { $select->columns($scoreBuilder->build()); $select = $this->createAroundSelect($select, $scoreBuilder); } elseif (count($matchQueries) === 1) { $matchContainer = reset($matchQueries); $this->matchBuilder->build($scoreBuilder, $select, $matchContainer->getRequest(), $matchContainer->getConditionType()); $select->columns($scoreBuilder->build()); $select = $this->createAroundSelect($select, $scoreBuilder); } elseif (count($matchQueries) > 1) { $select->columns($scoreBuilder->build()); $select = $this->createAroundSelect($select, $scoreBuilder); $subSelect = $select; $select = $this->resource->getConnection(Resource::DEFAULT_READ_RESOURCE)->select(); $tables = array_merge(array_keys($matchQueries), ['main_select.relevance']); $relevance = implode('.relevance + ', $tables); $select->from(['main_select' => $subSelect], [$this->entityMetadata->getEntityId() => 'entity_id', 'relevance' => sprintf('(%s)', $relevance)]); foreach ($matchQueries as $matchName => $matchContainer) { $matchSelect = $indexBuilder->build($request); $matchScoreBuilder = $this->scoreBuilderFactory->create(); $matchSelect = $this->matchBuilder->build($matchScoreBuilder, $matchSelect, $matchContainer->getRequest(), $matchContainer->getConditionType()); $matchSelect->columns($matchScoreBuilder->build()); $select->join([$matchName => $this->createAroundSelect($matchSelect, $scoreBuilder)], $matchName . '.entity_id = main_select.entity_id', []); } } return $select; }
/** * {@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; }
public function testBuildQuery() { $boost = 3.14; /** @var Select|\PHPUnit_Framework_MockObject_MockObject $select */ $select = $this->getMockBuilder('Magento\\Framework\\DB\\Select')->setMethods(['getMatchQuery', 'match'])->disableOriginalConstructor()->getMock(); $this->fulltextHelper->expects($this->once())->method('getMatchQuery')->with($this->equalTo(['some_field']), $this->equalTo('-some_value*'))->will($this->returnValue('matchedQuery')); $this->fulltextHelper->expects($this->once())->method('match')->withConsecutive([$select, ['some_field'], '-some_value*', true, Fulltext::FULLTEXT_MODE_BOOLEAN])->willReturn($select); $this->resolver->expects($this->once())->method('resolve')->willReturnArgument(0); /** @var \Magento\Framework\Search\Request\Query\Match|\PHPUnit_Framework_MockObject_MockObject $query */ $query = $this->getMockBuilder('Magento\\Framework\\Search\\Request\\Query\\Match')->setMethods(['getMatches', 'getValue', 'getBoost'])->disableOriginalConstructor()->getMock(); $query->expects($this->once())->method('getValue')->willReturn('some_value '); $query->expects($this->once())->method('getBoost')->willReturn($boost); $query->expects($this->once())->method('getMatches')->willReturn([['field' => 'some_field']]); $this->scoreBuilder->expects($this->once())->method('addCondition'); $result = $this->match->build($this->scoreBuilder, $select, $query, Bool::QUERY_CONDITION_NOT); $this->assertEquals($select, $result); }
public function testBuildQuery() { /** @var Select|\PHPUnit_Framework_MockObject_MockObject $select */ $select = $this->getMockBuilder('Magento\Framework\DB\Select') ->setMethods(['getMatchQuery', 'match', 'where']) ->disableOriginalConstructor() ->getMock(); $this->fulltextHelper->expects($this->once()) ->method('getMatchQuery') ->with($this->equalTo(['some_field' => 'some_field']), $this->equalTo('-some_value*')) ->will($this->returnValue('matchedQuery')); $select->expects($this->once()) ->method('where') ->with('matchedQuery') ->willReturnSelf(); $this->resolver->expects($this->once()) ->method('resolve') ->willReturnCallback(function ($fieldList) { $resolvedFields = []; foreach ($fieldList as $column) { $field = $this->getMockBuilder('\Magento\Framework\Search\Adapter\Mysql\Field\FieldInterface') ->disableOriginalConstructor() ->getMockForAbstractClass(); $field->expects($this->any()) ->method('getColumn') ->willReturn($column); $resolvedFields[] = $field; } return $resolvedFields; }); /** @var \Magento\Framework\Search\Request\Query\Match|\PHPUnit_Framework_MockObject_MockObject $query */ $query = $this->getMockBuilder('Magento\Framework\Search\Request\Query\Match') ->setMethods(['getMatches', 'getValue']) ->disableOriginalConstructor() ->getMock(); $query->expects($this->once()) ->method('getValue') ->willReturn('some_value '); $query->expects($this->once()) ->method('getMatches') ->willReturn([['field' => 'some_field']]); $this->scoreBuilder->expects($this->once()) ->method('addCondition'); $result = $this->match->build($this->scoreBuilder, $select, $query, Bool::QUERY_CONDITION_NOT); $this->assertEquals($select, $result); }
public function testBuild() { $this->scoreBuilder->expects($this->once())->method('build')->willReturn('score condition'); $subSelect = $this->getMockBuilder('Magento\Framework\DB\Select') ->disableOriginalConstructor() ->getMock(); $this->indexBuilder->expects($this->once())->method('build')->willReturn($subSelect); $subSelect->expects($this->once())->method('columns')->with('score condition'); $this->request->expects($this->once())->method('getSize')->willReturn(1000); $subSelect->expects($this->once())->method('limit')->with(1000); $result = $this->queryContainer->addMatchQuery($this->select, $this->query, Bool::QUERY_CONDITION_MUST); $this->assertEquals($this->select, $result); }
/** * Process filter query * * @param ScoreBuilder $scoreBuilder * @param FilterQuery $query * @param Select $select * @param string $conditionType * @param QueryContainer $queryContainer * @return Select */ private function processFilterQuery( ScoreBuilder $scoreBuilder, FilterQuery $query, Select $select, $conditionType, QueryContainer $queryContainer ) { $scoreBuilder->startQuery(); switch ($query->getReferenceType()) { case FilterQuery::REFERENCE_QUERY: $select = $this->processQuery( $scoreBuilder, $query->getReference(), $select, $conditionType, $queryContainer ); $scoreBuilder->endQuery($query->getBoost()); break; case FilterQuery::REFERENCE_FILTER: $filterCondition = $this->filterBuilder->build($query->getReference(), $conditionType, $queryContainer); if ($filterCondition) { $select->where($filterCondition); } break; } $scoreBuilder->endQuery($query->getBoost()); return $select; }
/** * @param Select $query * @param Table $previousResultTable * @param ScoreBuilder $scoreBuilder * @return Select * @throws \Zend_Db_Exception */ private function joinPreviousResultToSelect(Select $query, Table $previousResultTable, ScoreBuilder $scoreBuilder) { $query->joinInner(['previous_results' => $previousResultTable->getName()], 'previous_results.entity_id = search_index.entity_id', []); $scoreBuilder->addCondition('previous_results.score', false); $query->columns($scoreBuilder->build()); $query = $this->createAroundSelect($query, $scoreBuilder); return $query; }
/** * Process filter query * * @param ScoreBuilder $scoreBuilder * @param FilterQuery $query * @param Select $select * @param bool $isNot * @return Select */ private function processFilterQuery(ScoreBuilder $scoreBuilder, FilterQuery $query, Select $select, $isNot) { switch ($query->getReferenceType()) { case FilterQuery::REFERENCE_QUERY: $scoreBuilder->startQuery(); $select = $this->processQuery($scoreBuilder, $query->getReference(), $select, $isNot); $scoreBuilder->endQuery($query->getBoost()); break; case FilterQuery::REFERENCE_FILTER: $filterCondition = $this->filterBuilder->build($query->getReference()); if ($isNot === true) { $filterCondition = '!' . $filterCondition; } $select->where($filterCondition); $scoreBuilder->addCondition(1, $query->getBoost()); break; } return $select; }