123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Analytics\ReportXml\DB;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Framework\DB\Sql\Expression;
- /**
- * Mapper for WHERE conditions
- */
- class ConditionResolver
- {
- /**
- * @var array
- */
- private $conditionMap = [
- 'eq' => '%1$s = %2$s',
- 'neq' => '%1$s != %2$s',
- 'like' => '%1$s LIKE %2$s',
- 'nlike' => '%1$s NOT LIKE %2$s',
- 'in' => '%1$s IN(%2$s)',
- 'nin' => '%1$s NOT IN(%2$s)',
- 'notnull' => '%1$s IS NOT NULL',
- 'null' => '%1$s IS NULL',
- 'gt' => '%1$s > %2$s',
- 'lt' => '%1$s < %2$s',
- 'gteq' => '%1$s >= %2$s',
- 'lteq' => '%1$s <= %2$s',
- 'finset' => 'FIND_IN_SET(%2$s, %1$s)'
- ];
- /**
- * @var \Magento\Framework\DB\Adapter\AdapterInterface
- */
- private $connection;
- /**
- * @var ResourceConnection
- */
- private $resourceConnection;
- /**
- * ConditionResolver constructor.
- * @param ResourceConnection $resourceConnection
- */
- public function __construct(
- ResourceConnection $resourceConnection
- ) {
- $this->resourceConnection = $resourceConnection;
- }
- /**
- * Returns connection
- *
- * @return \Magento\Framework\DB\Adapter\AdapterInterface
- */
- private function getConnection()
- {
- if (!$this->connection) {
- $this->connection = $this->resourceConnection->getConnection();
- }
- return $this->connection;
- }
- /**
- * Returns value for condition
- *
- * @param string $condition
- * @param string $referencedEntity
- * @return mixed|null|string|\Zend_Db_Expr
- */
- private function getValue($condition, $referencedEntity)
- {
- $value = null;
- $argument = isset($condition['_value']) ? $condition['_value'] : null;
- if (!isset($condition['type'])) {
- $condition['type'] = 'value';
- }
- switch ($condition['type']) {
- case "value":
- $value = $this->getConnection()->quote($argument);
- break;
- case "variable":
- $value = new Expression($argument);
- break;
- case "identifier":
- $value = $this->getConnection()->quoteIdentifier(
- $referencedEntity ? $referencedEntity . '.' . $argument : $argument
- );
- break;
- }
- return $value;
- }
- /**
- * Returns condition for WHERE
- *
- * @param SelectBuilder $selectBuilder
- * @param string $tableName
- * @param array $condition
- * @param null|string $referencedEntity
- * @return string
- */
- private function getCondition(SelectBuilder $selectBuilder, $tableName, $condition, $referencedEntity = null)
- {
- $columns = $selectBuilder->getColumns();
- if (isset($columns[$condition['attribute']])
- && $columns[$condition['attribute']] instanceof Expression
- ) {
- $expression = $columns[$condition['attribute']];
- } else {
- $expression = $this->getConnection()->quoteIdentifier($tableName . '.' . $condition['attribute']);
- }
- return sprintf(
- $this->conditionMap[$condition['operator']],
- $expression,
- $this->getValue($condition, $referencedEntity)
- );
- }
- /**
- * Build WHERE condition
- *
- * @param SelectBuilder $selectBuilder
- * @param array $filterConfig
- * @param string $aliasName
- * @param null|string $referencedAlias
- * @return array
- */
- public function getFilter(SelectBuilder $selectBuilder, $filterConfig, $aliasName, $referencedAlias = null)
- {
- $filtersParts = [];
- foreach ($filterConfig as $filter) {
- $glue = $filter['glue'];
- $parts = [];
- foreach ($filter['condition'] as $condition) {
- if (isset($condition['type']) && $condition['type'] == 'variable') {
- $selectBuilder->setParams(array_merge($selectBuilder->getParams(), [$condition['_value']]));
- }
- $parts[] = $this->getCondition(
- $selectBuilder,
- $aliasName,
- $condition,
- $referencedAlias
- );
- }
- if (isset($filter['filter'])) {
- $parts[] = '(' . $this->getFilter(
- $selectBuilder,
- $filter['filter'],
- $aliasName,
- $referencedAlias
- ) . ')';
- }
- $filtersParts[] = '(' . implode(' ' . strtoupper($glue) . ' ', $parts) . ')';
- }
- return implode(' OR ', $filtersParts);
- }
- }
|