public function testGetDerivedQueries()
 {
     $this->matchContainerFactory->expects($this->once())->method('create')->willReturn('asdf');
     $result = $this->queryContainer->addMatchQuery($this->select, $this->requestQuery, BoolExpression::QUERY_CONDITION_MUST);
     $this->assertEquals($this->select, $result);
     $queries = $this->queryContainer->getMatchQueries();
     $this->assertCount(1, $queries);
     $this->assertEquals('asdf', reset($queries));
 }
Example #2
0
 /**
  * @param FilterInterface $filter
  * @param bool $isNegation
  * @param string $query
  * @param QueryContainer $queryContainer
  * @return string
  */
 private function processQueryWithField(FilterInterface $filter, $isNegation, $query, QueryContainer $queryContainer)
 {
     $currentStoreId = $this->scopeResolver->getScope()->getId();
     $attribute = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $filter->getField());
     $select = $this->getConnection()->select();
     $table = $attribute->getBackendTable();
     if ($filter->getField() == 'price') {
         $query = str_replace('price', 'min_price', $query);
         $select->from(['main_table' => $this->resource->getTableName('catalog_product_index_price')], 'entity_id')->where($query);
     } elseif ($filter->getField() == 'category_ids') {
         return 'category_index.category_id = ' . $filter->getValue();
     } else {
         if ($attribute->isStatic()) {
             $select->from(['main_table' => $table], 'entity_id')->where($query);
         } else {
             if ($filter->getType() == FilterInterface::TYPE_TERM) {
                 if (is_array($filter->getValue())) {
                     $value = sprintf('%s IN (%s)', $isNegation ? 'NOT' : '', implode(',', $filter->getValue()));
                 } else {
                     $value = ($isNegation ? '!' : '') . '= ' . $filter->getValue();
                 }
                 $filterQuery = sprintf('cpie.store_id = %d AND cpie.attribute_id = %d AND cpie.value %s', $this->scopeResolver->getScope()->getId(), $attribute->getId(), $value);
                 $queryContainer->addFilter($filterQuery);
                 return '';
             }
             $ifNullCondition = $this->getConnection()->getIfNullSql('current_store.value', 'main_table.value');
             $select->from(['main_table' => $table], 'entity_id')->joinLeft(['current_store' => $table], 'current_store.attribute_id = main_table.attribute_id AND current_store.store_id = ' . $currentStoreId, null)->columns([$filter->getField() => $ifNullCondition])->where('main_table.attribute_id = ?', $attribute->getAttributeId())->where('main_table.store_id = ?', \Magento\Store\Model\Store::DEFAULT_STORE_ID)->having($query);
         }
     }
     return 'search_index.entity_id IN (
         select entity_id from  ' . $this->conditionManager->wrapBrackets($select) . ' as filter
         )';
 }
Example #3
0
 public function testFilters()
 {
     $this->assertEmpty($this->queryContainer->getFilters());
     $this->queryContainer->addFilter('filter');
     $this->assertCount(1, $this->queryContainer->getFilters());
     $this->assertEquals(1, $this->queryContainer->getFiltersCount());
     $this->queryContainer->clearFilters();
     $this->assertCount(0, $this->queryContainer->getFilters());
     $this->assertEquals(1, $this->queryContainer->getFiltersCount());
 }
Example #4
0
 /**
  * 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;
 }
Example #5
0
 /**
  * @param RequestInterface $request
  * @param QueryContainer $queryContainer
  * @param ScoreBuilder $scoreBuilder
  * @param Select $select
  * @param IndexBuilderInterface $indexBuilder
  * @return Select
  * @throws \Zend_Db_Exception
  */
 private function addDerivedQueries(RequestInterface $request, QueryContainer $queryContainer, ScoreBuilder $scoreBuilder, Select $select, IndexBuilderInterface $indexBuilder)
 {
     $matchQueries = $queryContainer->getMatchQueries();
     if (!$matchQueries) {
         $select->columns($scoreBuilder->build());
         $select = $this->createAroundSelect($select, $scoreBuilder);
     } else {
         $matchContainer = array_shift($matchQueries);
         $this->matchBuilder->build($scoreBuilder, $select, $matchContainer->getRequest(), $matchContainer->getConditionType());
         $select->columns($scoreBuilder->build());
         $select = $this->createAroundSelect($select, $scoreBuilder);
         $select = $this->addMatchQueries($request, $select, $indexBuilder, $matchQueries);
     }
     return $select;
 }