Query::loadRecords

protected Query::loadRecords()

Loads the config records to examine for the query.

Return value

array Config records keyed by entity IDs.

File

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

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 = array();
          $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);
          }
        }
      }
      // Save the first ID condition that is not an 'IN' or '=' for narrowing
      // down later.
      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 = array();
  foreach ($this->configFactory->loadMultiple($names) as $config) {
    $records[substr($config->getName(), $prefix_length)] = $config->get();
  }
  return $records;
}
doc_Drupal
2016-10-29 09:35:25
Comments
Leave a Comment

Please login to continue.