JoinAssembler.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Analytics\ReportXml\DB\Assembler;
  7. use Magento\Analytics\ReportXml\DB\NameResolver;
  8. use Magento\Analytics\ReportXml\DB\SelectBuilder;
  9. use Magento\Analytics\ReportXml\DB\ConditionResolver;
  10. use Magento\Analytics\ReportXml\DB\ColumnsResolver;
  11. use Magento\Framework\App\ResourceConnection;
  12. /**
  13. * Assembles JOIN conditions
  14. */
  15. class JoinAssembler implements AssemblerInterface
  16. {
  17. /**
  18. * @var ConditionResolver
  19. */
  20. private $conditionResolver;
  21. /**
  22. * @var NameResolver
  23. */
  24. private $nameResolver;
  25. /**
  26. * @var ColumnsResolver
  27. */
  28. private $columnsResolver;
  29. /**
  30. * @var ResourceConnection
  31. */
  32. private $resourceConnection;
  33. /**
  34. * @param ConditionResolver $conditionResolver
  35. * @param ColumnsResolver $columnsResolver
  36. * @param NameResolver $nameResolver
  37. * @param ResourceConnection $resourceConnection
  38. */
  39. public function __construct(
  40. ConditionResolver $conditionResolver,
  41. ColumnsResolver $columnsResolver,
  42. NameResolver $nameResolver,
  43. ResourceConnection $resourceConnection
  44. ) {
  45. $this->conditionResolver = $conditionResolver;
  46. $this->nameResolver = $nameResolver;
  47. $this->columnsResolver = $columnsResolver;
  48. $this->resourceConnection = $resourceConnection;
  49. }
  50. /**
  51. * Assembles JOIN conditions
  52. *
  53. * @param SelectBuilder $selectBuilder
  54. * @param array $queryConfig
  55. * @return SelectBuilder
  56. */
  57. public function assemble(SelectBuilder $selectBuilder, $queryConfig)
  58. {
  59. if (!isset($queryConfig['source']['link-source'])) {
  60. return $selectBuilder;
  61. }
  62. $joins = [];
  63. $filters = $selectBuilder->getFilters();
  64. $sourceAlias = $this->nameResolver->getAlias($queryConfig['source']);
  65. foreach ($queryConfig['source']['link-source'] as $join) {
  66. $joinAlias = $this->nameResolver->getAlias($join);
  67. $joins[$joinAlias] = [
  68. 'link-type' => isset($join['link-type']) ? $join['link-type'] : 'left',
  69. 'table' => [
  70. $joinAlias => $this->resourceConnection
  71. ->getTableName($this->nameResolver->getName($join)),
  72. ],
  73. 'condition' => $this->conditionResolver->getFilter(
  74. $selectBuilder,
  75. $join['using'],
  76. $joinAlias,
  77. $sourceAlias
  78. )
  79. ];
  80. if (isset($join['filter'])) {
  81. $filters = array_merge(
  82. $filters,
  83. [
  84. $this->conditionResolver->getFilter(
  85. $selectBuilder,
  86. $join['filter'],
  87. $joinAlias,
  88. $sourceAlias
  89. )
  90. ]
  91. );
  92. }
  93. $columns = $this->columnsResolver->getColumns($selectBuilder, isset($join['attribute']) ? $join : []);
  94. $selectBuilder->setColumns(array_merge($selectBuilder->getColumns(), $columns));
  95. }
  96. $selectBuilder->setFilters($filters);
  97. $selectBuilder->setJoins(array_merge($selectBuilder->getJoins(), $joins));
  98. return $selectBuilder;
  99. }
  100. }