ConditionResolver.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Analytics\ReportXml\DB;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\DB\Sql\Expression;
  9. /**
  10. * Mapper for WHERE conditions
  11. */
  12. class ConditionResolver
  13. {
  14. /**
  15. * @var array
  16. */
  17. private $conditionMap = [
  18. 'eq' => '%1$s = %2$s',
  19. 'neq' => '%1$s != %2$s',
  20. 'like' => '%1$s LIKE %2$s',
  21. 'nlike' => '%1$s NOT LIKE %2$s',
  22. 'in' => '%1$s IN(%2$s)',
  23. 'nin' => '%1$s NOT IN(%2$s)',
  24. 'notnull' => '%1$s IS NOT NULL',
  25. 'null' => '%1$s IS NULL',
  26. 'gt' => '%1$s > %2$s',
  27. 'lt' => '%1$s < %2$s',
  28. 'gteq' => '%1$s >= %2$s',
  29. 'lteq' => '%1$s <= %2$s',
  30. 'finset' => 'FIND_IN_SET(%2$s, %1$s)'
  31. ];
  32. /**
  33. * @var \Magento\Framework\DB\Adapter\AdapterInterface
  34. */
  35. private $connection;
  36. /**
  37. * @var ResourceConnection
  38. */
  39. private $resourceConnection;
  40. /**
  41. * ConditionResolver constructor.
  42. * @param ResourceConnection $resourceConnection
  43. */
  44. public function __construct(
  45. ResourceConnection $resourceConnection
  46. ) {
  47. $this->resourceConnection = $resourceConnection;
  48. }
  49. /**
  50. * Returns connection
  51. *
  52. * @return \Magento\Framework\DB\Adapter\AdapterInterface
  53. */
  54. private function getConnection()
  55. {
  56. if (!$this->connection) {
  57. $this->connection = $this->resourceConnection->getConnection();
  58. }
  59. return $this->connection;
  60. }
  61. /**
  62. * Returns value for condition
  63. *
  64. * @param string $condition
  65. * @param string $referencedEntity
  66. * @return mixed|null|string|\Zend_Db_Expr
  67. */
  68. private function getValue($condition, $referencedEntity)
  69. {
  70. $value = null;
  71. $argument = isset($condition['_value']) ? $condition['_value'] : null;
  72. if (!isset($condition['type'])) {
  73. $condition['type'] = 'value';
  74. }
  75. switch ($condition['type']) {
  76. case "value":
  77. $value = $this->getConnection()->quote($argument);
  78. break;
  79. case "variable":
  80. $value = new Expression($argument);
  81. break;
  82. case "identifier":
  83. $value = $this->getConnection()->quoteIdentifier(
  84. $referencedEntity ? $referencedEntity . '.' . $argument : $argument
  85. );
  86. break;
  87. }
  88. return $value;
  89. }
  90. /**
  91. * Returns condition for WHERE
  92. *
  93. * @param SelectBuilder $selectBuilder
  94. * @param string $tableName
  95. * @param array $condition
  96. * @param null|string $referencedEntity
  97. * @return string
  98. */
  99. private function getCondition(SelectBuilder $selectBuilder, $tableName, $condition, $referencedEntity = null)
  100. {
  101. $columns = $selectBuilder->getColumns();
  102. if (isset($columns[$condition['attribute']])
  103. && $columns[$condition['attribute']] instanceof Expression
  104. ) {
  105. $expression = $columns[$condition['attribute']];
  106. } else {
  107. $expression = $this->getConnection()->quoteIdentifier($tableName . '.' . $condition['attribute']);
  108. }
  109. return sprintf(
  110. $this->conditionMap[$condition['operator']],
  111. $expression,
  112. $this->getValue($condition, $referencedEntity)
  113. );
  114. }
  115. /**
  116. * Build WHERE condition
  117. *
  118. * @param SelectBuilder $selectBuilder
  119. * @param array $filterConfig
  120. * @param string $aliasName
  121. * @param null|string $referencedAlias
  122. * @return array
  123. */
  124. public function getFilter(SelectBuilder $selectBuilder, $filterConfig, $aliasName, $referencedAlias = null)
  125. {
  126. $filtersParts = [];
  127. foreach ($filterConfig as $filter) {
  128. $glue = $filter['glue'];
  129. $parts = [];
  130. foreach ($filter['condition'] as $condition) {
  131. if (isset($condition['type']) && $condition['type'] == 'variable') {
  132. $selectBuilder->setParams(array_merge($selectBuilder->getParams(), [$condition['_value']]));
  133. }
  134. $parts[] = $this->getCondition(
  135. $selectBuilder,
  136. $aliasName,
  137. $condition,
  138. $referencedAlias
  139. );
  140. }
  141. if (isset($filter['filter'])) {
  142. $parts[] = '(' . $this->getFilter(
  143. $selectBuilder,
  144. $filter['filter'],
  145. $aliasName,
  146. $referencedAlias
  147. ) . ')';
  148. }
  149. $filtersParts[] = '(' . implode(' ' . strtoupper($glue) . ' ', $parts) . ')';
  150. }
  151. return implode(' OR ', $filtersParts);
  152. }
  153. }