/** * {@inheritdoc} */ public function buildFilter(RequestFilterInterface $filter, $isNegation) { /** @var RangeFilterRequest $filter */ $queries = [$this->getLeftConditionPart($filter, $isNegation), $this->getRightConditionPart($filter, $isNegation)]; $unionOperator = $this->getConditionUnionOperator($isNegation); return $this->conditionManager->combineQueries($queries, $unionOperator); }
public function testCombineQueries() { $queries = ['a = b', false, true, '', 0, 'test']; $unionOperator = 'AND'; $expectedResult = 'a = b AND 1 AND 0 AND test'; $actualResult = $this->conditionManager->combineQueries($queries, $unionOperator); $this->assertEquals($expectedResult, $actualResult); }
/** * @param \Magento\Framework\Search\Request\FilterInterface[] $filters * @param string $unionOperator * @param bool $isNegation * @return string */ private function buildFilters(array $filters, $unionOperator, $isNegation) { $queries = []; foreach ($filters as $filter) { $queries[] = $this->processFilter($filter, $isNegation); } return $this->conditionManager->combineQueries($queries, $unionOperator); }
/** * Add filtering by dimensions * * @param RequestInterface $request * @param Select $select * @return \Magento\Framework\DB\Select */ private function processDimensions(RequestInterface $request, Select $select) { $dimensions = $this->prepareDimensions($request->getDimensions()); $query = $this->conditionManager->combineQueries($dimensions, Select::SQL_OR); if (!empty($query)) { $select->where($this->conditionManager->wrapBrackets($query)); } return $select; }
/** * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function setUp() { $objectManager = new ObjectManager($this); $this->conditionManager = $this->getMockBuilder('Magento\\Framework\\Search\\Adapter\\Mysql\\ConditionManager')->disableOriginalConstructor()->setMethods(['generateCondition', 'combineQueries', 'wrapBrackets'])->getMock(); $this->conditionManager->expects($this->any())->method('generateCondition')->will($this->returnCallback(function ($field, $operator, $value) { return sprintf('%s %s %s', $field, $operator, $value); })); $this->conditionManager->expects($this->any())->method('combineQueries')->will($this->returnCallback(function ($queries, $operator) { return implode(' ' . $operator . ' ', array_filter($queries, 'strlen')); })); $this->conditionManager->expects($this->any())->method('wrapBrackets')->will($this->returnCallback(function ($query) { return !empty($query) ? sprintf('(%s)', $query) : ''; })); $rangeBuilder = $this->getMockBuilder('\\Magento\\Framework\\Search\\Adapter\\Mysql\\Filter\\Builder\\Range')->setMethods(['buildFilter'])->disableOriginalConstructor()->getMock(); $rangeBuilder->expects($this->any())->method('buildFilter')->will($this->returnCallback(function (FilterInterface $filter, $isNegation) { /** * @var \Magento\Framework\Search\Request\Filter\Range $filter * @var \Magento\Framework\DB\Adapter\AdapterInterface $adapter */ $fromCondition = ''; if ($filter->getFrom() !== null) { $fromCondition = $this->conditionManager->generateCondition($filter->getField(), $isNegation ? '<' : '>=', $filter->getFrom()); } $toCondition = ''; if ($filter->getTo() !== null) { $toCondition = $this->conditionManager->generateCondition($filter->getField(), $isNegation ? '>=' : '<', $filter->getTo()); } $unionOperator = $isNegation ? Select::SQL_OR : Select::SQL_AND; return $this->conditionManager->combineQueries([$fromCondition, $toCondition], $unionOperator); })); $termBuilder = $this->getMockBuilder('\\Magento\\Framework\\Search\\Adapter\\Mysql\\Filter\\Builder\\Term')->setMethods(['buildFilter'])->disableOriginalConstructor()->getMock(); $termBuilder->expects($this->any())->method('buildFilter')->will($this->returnCallback(function (FilterInterface $filter, $isNegation) { /** * @var \Magento\Framework\Search\Request\Filter\Term $filter * @var \Magento\Framework\DB\Adapter\AdapterInterface $adapter */ return $this->conditionManager->generateCondition($filter->getField(), $isNegation ? '!=' : '=', $filter->getValue()); })); $this->preprocessor = $this->getMockBuilder('Magento\\Framework\\Search\\Adapter\\Mysql\\Filter\\PreprocessorInterface')->setMethods(['process'])->disableOriginalConstructor()->getMockForAbstractClass(); $this->preprocessor->expects($this->any())->method('process')->willReturnCallback(function ($filter, $isNegation, $queryString) { return $this->conditionManager->wrapBrackets($queryString); }); $this->builder = $objectManager->getObject('Magento\\Framework\\Search\\Adapter\\Mysql\\Filter\\Builder', ['range' => $rangeBuilder, 'term' => $termBuilder, 'conditionManager' => $this->conditionManager, 'preprocessor' => $this->preprocessor]); }
/** * Add filtering by dimensions * * @param RequestInterface $request * @param Select $select * @return \Magento\Framework\DB\Select */ private function processDimensions(RequestInterface $request, Select $select) { $dimensions = []; foreach ($request->getDimensions() as $dimension) { $dimensions[] = $this->dimensionsBuilder->build($dimension); } $query = $this->conditionManager->combineQueries($dimensions, Select::SQL_OR); if (!empty($query)) { $select->where($this->conditionManager->wrapBrackets($query)); } return $select; }