You are here

protected function Query::loadRecords in Drupal 8

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Config/Entity/Query/Query.php \Drupal\Core\Config\Entity\Query\Query::loadRecords()
  2. 10 core/lib/Drupal/Core/Config/Entity/Query/Query.php \Drupal\Core\Config\Entity\Query\Query::loadRecords()

Loads the config records to examine for the query.

Return value

array Config records keyed by entity IDs.

1 call to Query::loadRecords()
Query::execute in core/lib/Drupal/Core/Config/Entity/Query/Query.php
Execute the query.

File

core/lib/Drupal/Core/Config/Entity/Query/Query.php, line 127

Class

Query
Defines the entity query for configuration entities.

Namespace

Drupal\Core\Config\Entity\Query

Code

protected function loadRecords() {
  $prefix = $this->entityType
    ->getConfigPrefix() . '.';
  $prefix_length = strlen($prefix);

  // Search the conditions for restrictions on configuration object names.
  $names = FALSE;
  $id_condition = NULL;
  $id_key = $this->entityType
    ->getKey('id');
  if ($this->condition
    ->getConjunction() == 'AND') {
    $lookup_keys = $this->entityType
      ->getLookupKeys();
    $conditions = $this->condition
      ->conditions();
    foreach ($conditions as $condition_key => $condition) {
      $operator = $condition['operator'] ?: (is_array($condition['value']) ? 'IN' : '=');
      if (is_string($condition['field']) && ($operator == 'IN' || $operator == '=')) {

        // Special case ID lookups.
        if ($condition['field'] == $id_key) {
          $ids = (array) $condition['value'];
          $names = array_map(function ($id) use ($prefix) {
            return $prefix . $id;
          }, $ids);
        }
        elseif (in_array($condition['field'], $lookup_keys)) {

          // If we don't find anything then there are no matches. No point in
          // listing anything.
          $names = [];
          $keys = (array) $condition['value'];
          $keys = array_map(function ($value) use ($condition) {
            return $condition['field'] . ':' . $value;
          }, $keys);
          foreach ($this
            ->getConfigKeyStore()
            ->getMultiple($keys) as $list) {
            $names = array_merge($names, $list);
          }
        }
      }
      elseif (!$id_condition && $condition['field'] == $id_key) {
        $id_condition = $condition;
      }

      // We stop at the first restricting condition on name. In the case where
      // there are additional restricting conditions, results will be
      // eliminated when the conditions are checked on the loaded records.
      if ($names !== FALSE) {

        // If the condition has been responsible for narrowing the list of
        // configuration to check there is no point in checking it further.
        unset($conditions[$condition_key]);
        break;
      }
    }
  }

  // If no restrictions on IDs were found, we need to parse all records.
  if ($names === FALSE) {
    $names = $this->configFactory
      ->listAll($prefix);
  }

  // In case we have an ID condition, try to narrow down the list of config
  // objects to load.
  if ($id_condition && !empty($names)) {
    $value = $id_condition['value'];
    $filter = NULL;
    switch ($id_condition['operator']) {
      case '<>':
        $filter = function ($name) use ($value, $prefix_length) {
          $id = substr($name, $prefix_length);
          return $id !== $value;
        };
        break;
      case 'STARTS_WITH':
        $filter = function ($name) use ($value, $prefix_length) {
          $id = substr($name, $prefix_length);
          return strpos($id, $value) === 0;
        };
        break;
      case 'CONTAINS':
        $filter = function ($name) use ($value, $prefix_length) {
          $id = substr($name, $prefix_length);
          return strpos($id, $value) !== FALSE;
        };
        break;
      case 'ENDS_WITH':
        $filter = function ($name) use ($value, $prefix_length) {
          $id = substr($name, $prefix_length);
          return strrpos($id, $value) === strlen($id) - strlen($value);
        };
        break;
    }
    if ($filter) {
      $names = array_filter($names, $filter);
    }
  }

  // Load the corresponding records.
  $records = [];
  foreach ($this->configFactory
    ->loadMultiple($names) as $config) {
    $records[substr($config
      ->getName(), $prefix_length)] = $config
      ->get();
  }
  return $records;
}