QueryFactory.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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\Analytics\ReportXml\DB\SelectBuilderFactory;
  8. use Magento\Framework\App\CacheInterface;
  9. use Magento\Framework\ObjectManagerInterface;
  10. /**
  11. * Creates Query object according to configuration
  12. * Factory for @see \Magento\Analytics\ReportXml\Query
  13. */
  14. class QueryFactory
  15. {
  16. /**
  17. * @var Config
  18. */
  19. private $config;
  20. /**
  21. * @var SelectBuilderFactory
  22. */
  23. private $selectBuilderFactory;
  24. /**
  25. * @var DB\Assembler\AssemblerInterface[]
  26. */
  27. private $assemblers;
  28. /**
  29. * @var CacheInterface
  30. */
  31. private $queryCache;
  32. /**
  33. * @var ObjectManagerInterface
  34. */
  35. private $objectManager;
  36. /**
  37. * @var SelectHydrator
  38. */
  39. private $selectHydrator;
  40. /**
  41. * QueryFactory constructor.
  42. *
  43. * @param CacheInterface $queryCache
  44. * @param SelectHydrator $selectHydrator
  45. * @param ObjectManagerInterface $objectManager
  46. * @param SelectBuilderFactory $selectBuilderFactory
  47. * @param Config $config
  48. * @param array $assemblers
  49. */
  50. public function __construct(
  51. CacheInterface $queryCache,
  52. SelectHydrator $selectHydrator,
  53. ObjectManagerInterface $objectManager,
  54. SelectBuilderFactory $selectBuilderFactory,
  55. Config $config,
  56. array $assemblers
  57. ) {
  58. $this->config = $config;
  59. $this->selectBuilderFactory = $selectBuilderFactory;
  60. $this->assemblers = $assemblers;
  61. $this->queryCache = $queryCache;
  62. $this->objectManager = $objectManager;
  63. $this->selectHydrator = $selectHydrator;
  64. }
  65. /**
  66. * Returns query connection name according to configuration
  67. *
  68. * @param string $queryConfig
  69. * @return string
  70. */
  71. private function getQueryConnectionName($queryConfig)
  72. {
  73. $connectionName = 'default';
  74. if (isset($queryConfig['connection'])) {
  75. $connectionName = $queryConfig['connection'];
  76. }
  77. return $connectionName;
  78. }
  79. /**
  80. * Create query according to configuration settings
  81. *
  82. * @param string $queryName
  83. * @return Query
  84. */
  85. private function constructQuery($queryName)
  86. {
  87. $queryConfig = $this->config->get($queryName);
  88. $selectBuilder = $this->selectBuilderFactory->create();
  89. $selectBuilder->setConnectionName($this->getQueryConnectionName($queryConfig));
  90. foreach ($this->assemblers as $assembler) {
  91. $selectBuilder = $assembler->assemble($selectBuilder, $queryConfig);
  92. }
  93. $select = $selectBuilder->create();
  94. return $this->objectManager->create(
  95. Query::class,
  96. [
  97. 'select' => $select,
  98. 'selectHydrator' => $this->selectHydrator,
  99. 'connectionName' => $selectBuilder->getConnectionName(),
  100. 'config' => $queryConfig
  101. ]
  102. );
  103. }
  104. /**
  105. * Creates query by name
  106. *
  107. * @param string $queryName
  108. * @return Query
  109. */
  110. public function create($queryName)
  111. {
  112. $cached = $this->queryCache->load($queryName);
  113. if ($cached) {
  114. $queryData = json_decode($cached, true);
  115. return $this->objectManager->create(
  116. Query::class,
  117. [
  118. 'select' => $this->selectHydrator->recreate($queryData['select_parts']),
  119. 'selectHydrator' => $this->selectHydrator,
  120. 'connectionName' => $queryData['connectionName'],
  121. 'config' => $queryData['config']
  122. ]
  123. );
  124. }
  125. $query = $this->constructQuery($queryName);
  126. $this->queryCache->save(json_encode($query), $queryName);
  127. return $query;
  128. }
  129. }