SelectRenderer.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\DB\Select;
  7. use Magento\Framework\DB\Select;
  8. /**
  9. * Class SelectRenderer
  10. */
  11. class SelectRenderer implements RendererInterface
  12. {
  13. /**
  14. * @var RendererInterface[]
  15. */
  16. protected $renderers;
  17. /**
  18. * @param RendererInterface[] $renderers
  19. */
  20. public function __construct(
  21. array $renderers
  22. ) {
  23. $this->renderers = $this->sort($renderers);
  24. }
  25. /**
  26. * Sort renderers
  27. *
  28. * @param array $renders
  29. * @return array
  30. */
  31. protected function sort($renders)
  32. {
  33. $length = count($renders);
  34. if ($length <= 1) {
  35. return $renders;
  36. } else {
  37. $pivot = array_shift($renders);
  38. $left = $right = [];
  39. foreach ($renders as $render) {
  40. if ($render['sort'] < $pivot['sort']) {
  41. $left[] = $render;
  42. } else {
  43. $right[] = $render;
  44. }
  45. }
  46. return array_merge(
  47. $this->sort($left),
  48. [$pivot],
  49. $this->sort($right)
  50. );
  51. }
  52. }
  53. /**
  54. * Render SELECT statement
  55. *
  56. * @param Select $select
  57. * @param string $sql
  58. * @return string
  59. */
  60. public function render(Select $select, $sql = '')
  61. {
  62. $sql = Select::SQL_SELECT;
  63. foreach ($this->renderers as $renderer) {
  64. if (in_array($renderer['part'], [Select::COLUMNS, Select::FROM]) || $select->getPart($renderer['part'])) {
  65. $sql = $renderer['renderer']->render($select, $sql);
  66. }
  67. }
  68. return $sql;
  69. }
  70. }