Unverified Commit d0f71781 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3217699 by mondrake, daffie, alexpott, andypost: Convert select query...

Issue #3217699 by mondrake, daffie, alexpott, andypost: Convert select query extenders to backend-overrideable services
parent f59f3ae9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1790,3 +1790,13 @@ services:
  pager.parameters:
    class: Drupal\Core\Pager\PagerParameters
    arguments: ['@request_stack']
  select_extender_factory.pager:
    class: Drupal\Core\Database\Query\PagerSelectExtenderFactory
    arguments: ['@pager.manager']
    tags:
      - { name: backend_overridable }
  select_extender_factory.table_sort:
    class: Drupal\Core\Database\Query\TableSortExtenderFactory
    arguments: ['@request_stack']
    tags:
      - { name: backend_overridable }
+0 −14
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@
use Drupal\Core\Database\Query\Truncate;
use Drupal\Core\Database\Query\Update;
use Drupal\Core\Database\Query\Upsert;
use Drupal\Core\Pager\PagerManagerInterface;

/**
 * Base Database API class.
@@ -1836,19 +1835,6 @@ public function getProvider(): string {
    return ($first === 'Drupal' && strtolower($second) === $second) ? $second : 'core';
  }

  /**
   * Get the pager manager service, if available.
   *
   * @return \Drupal\Core\Pager\PagerManagerInterface
   *   The pager manager service, if available.
   *
   * @throws \Drupal\Core\DependencyInjection\ContainerNotInitializedException
   *   If the container has not been initialized yet.
   */
  public function getPagerManager(): PagerManagerInterface {
    return \Drupal::service('pager.manager');
  }

  /**
   * Runs a simple query to validate json datatype support.
   *
+11 −4
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace Drupal\Core\Database\Query;

use Drupal\Core\Database\Connection;
use Drupal\Core\Pager\PagerManagerInterface;

/**
 * Query extender for pager queries.
@@ -44,8 +45,14 @@ class PagerSelectExtender extends SelectExtender {
   *   Select query object.
   * @param \Drupal\Core\Database\Connection $connection
   *   Database connection object.
   * @param \Drupal\Core\Pager\PagerManagerInterface $pagerManager
   *   The pager manager service.
   */
  public function __construct(SelectInterface $query, Connection $connection) {
  public function __construct(
    SelectInterface $query,
    Connection $connection,
    protected PagerManagerInterface $pagerManager
  ) {
    parent::__construct($query, $connection);

    // Add pager tag. Do this here to ensure that it is always added before
@@ -74,7 +81,7 @@ public function execute() {
    $this->ensureElement();

    $total_items = $this->getCountQuery()->execute()->fetchField();
    $pager = $this->connection->getPagerManager()->createPager($total_items, $this->limit, $this->element);
    $pager = $this->pagerManager->createPager($total_items, $this->limit, $this->element);
    $this->range($pager->getCurrentPage() * $this->limit, $this->limit);

    // Now that we've added our pager-based range instructions, run the query normally.
@@ -89,7 +96,7 @@ public function execute() {
   */
  protected function ensureElement() {
    if (!isset($this->element)) {
      $this->element($this->connection->getPagerManager()->getMaxPagerElementId() + 1);
      $this->element($this->pagerManager->getMaxPagerElementId() + 1);
    }
  }

@@ -157,7 +164,7 @@ public function limit($limit = 10) {
   */
  public function element($element) {
    $this->element = $element;
    $this->connection->getPagerManager()->reservePagerElementId($this->element);
    $this->pagerManager->reservePagerElementId($this->element);
    return $this;
  }

+39 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Core\Database\Query;

use Drupal\Core\Database\Connection;
use Drupal\Core\Pager\PagerManagerInterface;

/**
 * Select extender factory for pager queries.
 */
class PagerSelectExtenderFactory {

  /**
   * Constructs a PagerSelectExtenderFactory object.
   *
   * @param \Drupal\Core\Pager\PagerManagerInterface $pagerManager
   *   The pager manager service.
   */
  public function __construct(
    protected PagerManagerInterface $pagerManager
  ) {
  }

  /**
   * Returns a query extender for pager queries.
   *
   * @param \Drupal\Core\Database\Query\SelectInterface $query
   *   Select query object.
   * @param \Drupal\Core\Database\Connection $connection
   *   Database connection object.
   *
   * @return \Drupal\Core\Database\Query\PagerSelectExtender
   *   A query extender for pager queries.
   */
  public function get(SelectInterface $query, Connection $connection): PagerSelectExtender {
    return new PagerSelectExtender($query, $connection, $this->pagerManager);
  }

}
+1 −7
Original line number Diff line number Diff line
@@ -320,13 +320,7 @@ public function havingCompile(Connection $connection) {
   * {@inheritdoc}
   */
  public function extend($extender_name) {
    $parts = explode('\\', $extender_name);
    $class = end($parts);
    $driver_class = $this->connection->getDriverClass($class);
    if ($driver_class !== $class) {
      return new $driver_class($this, $this->connection);
    }
    return new $extender_name($this, $this->connection);
    return \Drupal::service('select_extender_factory.' . $extender_name)->get($this, $this->connection);
  }

  /**
Loading