SelectHydrator.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Analytics\ReportXml;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\DB\Select;
  9. use Magento\Framework\ObjectManagerInterface;
  10. /**
  11. * Hydrator for report select parts
  12. */
  13. class SelectHydrator
  14. {
  15. /**
  16. * Array of supported Select parts
  17. *
  18. * @var array
  19. */
  20. private $predefinedSelectParts =
  21. [
  22. Select::DISTINCT,
  23. Select::COLUMNS,
  24. Select::UNION,
  25. Select::FROM,
  26. Select::WHERE,
  27. Select::GROUP,
  28. Select::HAVING,
  29. Select::ORDER,
  30. Select::LIMIT_COUNT,
  31. Select::LIMIT_OFFSET,
  32. Select::FOR_UPDATE
  33. ];
  34. /**
  35. * @var array
  36. */
  37. private $selectParts;
  38. /**
  39. * @var ResourceConnection
  40. */
  41. private $resourceConnection;
  42. /**
  43. * @var ObjectManagerInterface
  44. */
  45. private $objectManager;
  46. /**
  47. * @param ResourceConnection $resourceConnection
  48. * @param ObjectManagerInterface $objectManager
  49. * @param array $selectParts
  50. */
  51. public function __construct(
  52. ResourceConnection $resourceConnection,
  53. ObjectManagerInterface $objectManager,
  54. $selectParts = []
  55. ) {
  56. $this->resourceConnection = $resourceConnection;
  57. $this->objectManager = $objectManager;
  58. $this->selectParts = $selectParts;
  59. }
  60. /**
  61. * @return array
  62. */
  63. private function getSelectParts()
  64. {
  65. return array_merge($this->predefinedSelectParts, $this->selectParts);
  66. }
  67. /**
  68. * Extracts Select metadata parts
  69. *
  70. * @param Select $select
  71. * @return array
  72. * @throws \Zend_Db_Select_Exception
  73. */
  74. public function extract(Select $select)
  75. {
  76. $parts = [];
  77. foreach ($this->getSelectParts() as $partName) {
  78. $parts[$partName] = $select->getPart($partName);
  79. }
  80. return $parts;
  81. }
  82. /**
  83. * @param array $selectParts
  84. * @return Select
  85. */
  86. public function recreate(array $selectParts)
  87. {
  88. $select = $this->resourceConnection->getConnection()->select();
  89. $select = $this->processColumns($select, $selectParts);
  90. foreach ($selectParts as $partName => $partValue) {
  91. $select->setPart($partName, $partValue);
  92. }
  93. return $select;
  94. }
  95. /**
  96. * Process COLUMNS part values and add this part into select.
  97. *
  98. * If each column contains information about select expression
  99. * an object with the type of this expression going to be created and assigned to this column.
  100. *
  101. * @param Select $select
  102. * @param array $selectParts
  103. * @return Select
  104. */
  105. private function processColumns(Select $select, array &$selectParts)
  106. {
  107. if (!empty($selectParts[Select::COLUMNS]) && is_array($selectParts[Select::COLUMNS])) {
  108. $part = [];
  109. foreach ($selectParts[Select::COLUMNS] as $columnEntry) {
  110. list($correlationName, $column, $alias) = $columnEntry;
  111. if (is_array($column) && !empty($column['class'])) {
  112. $expression = $this->objectManager->create(
  113. $column['class'],
  114. isset($column['arguments']) ? $column['arguments'] : []
  115. );
  116. $part[] = [$correlationName, $expression, $alias];
  117. } else {
  118. $part[] = $columnEntry;
  119. }
  120. }
  121. $select->setPart(Select::COLUMNS, $part);
  122. unset($selectParts[Select::COLUMNS]);
  123. }
  124. return $select;
  125. }
  126. }