ColumnsResolver.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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\ColumnValueExpression;
  9. /**
  10. * Resolves columns names
  11. */
  12. class ColumnsResolver
  13. {
  14. /**
  15. * @var NameResolver
  16. */
  17. private $nameResolver;
  18. /**
  19. * @var ResourceConnection
  20. */
  21. private $resourceConnection;
  22. /**
  23. * @var \Magento\Framework\DB\Adapter\AdapterInterface
  24. */
  25. private $connection;
  26. /**
  27. * ColumnsResolver constructor.
  28. *
  29. * @param NameResolver $nameResolver
  30. * @param ResourceConnection $resourceConnection
  31. */
  32. public function __construct(
  33. NameResolver $nameResolver,
  34. ResourceConnection $resourceConnection
  35. ) {
  36. $this->nameResolver = $nameResolver;
  37. $this->resourceConnection = $resourceConnection;
  38. }
  39. /**
  40. * Returns connection
  41. *
  42. * @return \Magento\Framework\DB\Adapter\AdapterInterface
  43. */
  44. private function getConnection()
  45. {
  46. if (!$this->connection) {
  47. $this->connection = $this->resourceConnection->getConnection();
  48. }
  49. return $this->connection;
  50. }
  51. /**
  52. * Set columns list to SelectBuilder
  53. *
  54. * @param SelectBuilder $selectBuilder
  55. * @param array $entityConfig
  56. * @return array
  57. */
  58. public function getColumns(SelectBuilder $selectBuilder, $entityConfig)
  59. {
  60. if (!isset($entityConfig['attribute'])) {
  61. return [];
  62. }
  63. $group = [];
  64. $columns = $selectBuilder->getColumns();
  65. foreach ($entityConfig['attribute'] as $attributeData) {
  66. $columnAlias = $this->nameResolver->getAlias($attributeData);
  67. $tableAlias = $this->nameResolver->getAlias($entityConfig);
  68. $columnName = $this->nameResolver->getName($attributeData);
  69. if (isset($attributeData['function'])) {
  70. $prefix = '';
  71. if (!empty($attributeData['distinct'])) {
  72. $prefix = ' DISTINCT ';
  73. }
  74. $expression = new ColumnValueExpression(
  75. strtoupper($attributeData['function']) . '(' . $prefix
  76. . $this->getConnection()->quoteIdentifier($tableAlias . '.' . $columnName)
  77. . ')'
  78. );
  79. } else {
  80. $expression = $tableAlias . '.' . $columnName;
  81. }
  82. $columns[$columnAlias] = $expression;
  83. if (isset($attributeData['group'])) {
  84. $group[$columnAlias] = $expression;
  85. }
  86. }
  87. $selectBuilder->setGroup(array_merge($selectBuilder->getGroup(), $group));
  88. return $columns;
  89. }
  90. }