Unverified Commit 96cfccf8 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 71bd9d45
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 }
+6 −0
Original line number Diff line number Diff line
@@ -2180,8 +2180,14 @@ public function getProvider(): string {
   *
   * @throws \Drupal\Core\DependencyInjection\ContainerNotInitializedException
   *   If the container has not been initialized yet.
   *
   * @deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. Use
   *   dependency injection instead.
   *
   * @see https://www.drupal.org/node/3218001
   */
  public function getPagerManager(): PagerManagerInterface {
    @trigger_error(__METHOD__ . '() is deprecated in drupal:9.4.0 and will be required in drupal:10.0.0. Use dependency injection instead. See https://www.drupal.org/node/3218001', E_USER_DEPRECATED);
    return \Drupal::service('pager.manager');
  }

+19 −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.
@@ -16,6 +17,13 @@
 */
class PagerSelectExtender extends SelectExtender {

  /**
   * The pager manager service.
   *
   * @var \Drupal\Core\Pager\PagerManagerInterface
   */
  protected $pagerManager;

  /**
   * The highest element we've autogenerated so far.
   *
@@ -56,9 +64,16 @@ class PagerSelectExtender extends SelectExtender {
   *   Select query object.
   * @param \Drupal\Core\Database\Connection $connection
   *   Database connection object.
   * @param \Drupal\Core\Pager\PagerManagerInterface $pager_manager
   *   The pager manager service.
   */
  public function __construct(SelectInterface $query, Connection $connection) {
  public function __construct(SelectInterface $query, Connection $connection, PagerManagerInterface $pager_manager = NULL) {
    if (is_null($pager_manager)) {
      @trigger_error('Calling ' . __METHOD__ . ' without the $pager_manager argument is deprecated in drupal:9.4.0 and will be required in drupal:10.0.0. Use the relevant service to instantiate extenders. See https://www.drupal.org/node/3218001', E_USER_DEPRECATED);
      $pager_manager = \Drupal::service('pager.manager');
    }
    parent::__construct($query, $connection);
    $this->pagerManager = $pager_manager;

    // Add pager tag. Do this here to ensure that it is always added before
    // preExecute() is called.
@@ -86,7 +101,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.
@@ -101,7 +116,7 @@ public function execute() {
   */
  protected function ensureElement() {
    if (!isset($this->element)) {
      $this->element($this->connection->getPagerManager()->getMaxPagerElementId() + 1);
      $this->element($this->pagerManager->getMaxPagerElementId() + 1);
    }
  }

@@ -169,7 +184,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;
  }

+45 −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 {

  /**
   * The pager manager service.
   *
   * @var \Drupal\Core\Pager\PagerManagerInterface
   */
  protected $pagerManager;

  /**
   * Constructs a PagerSelectExtenderFactory object.
   *
   * @param \Drupal\Core\Pager\PagerManagerInterface $pager_manager
   *   The pager manager service.
   */
  public function __construct(PagerManagerInterface $pager_manager) {
    $this->pagerManager = $pager_manager;
  }

  /**
   * 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);
  }

}
+11 −0
Original line number Diff line number Diff line
@@ -320,7 +320,18 @@ public function havingCompile(Connection $connection) {
   * {@inheritdoc}
   */
  public function extend($extender_name) {
    // @todo remove the BC layer in Drupal 10.
    // @see https://www.drupal.org/project/drupal/issues/3260284
    $parts = explode('\\', $extender_name);

    if (count($parts) === 1) {
      return \Drupal::service('select_extender_factory.' . $extender_name)->get($this, $this->connection);
    }

    // BC layer.
    // @todo remove in Drupal 10.
    // @see https://www.drupal.org/project/drupal/issues/3260284
    @trigger_error("Passing '$extender_name' as a fully qualified class name to " . __METHOD__ . '() is deprecated in drupal:9.4.0 and is removed from drupal:10.0.0. Pass the appropriate suffix for a \'select_extender_factory\' service instead. See https://www.drupal.org/node/3218001', E_USER_DEPRECATED);
    $class = end($parts);
    $driver_class = $this->connection->getDriverClass($class);
    if ($driver_class !== $class) {
Loading