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)); }
/** * @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 )'; }
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()); }
/** * 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 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; }