You are here

protected function WebformSubmissionListBuilder::getQuery in Webform 8.5

Same name and namespace in other branches
  1. 6.x src/WebformSubmissionListBuilder.php \Drupal\webform\WebformSubmissionListBuilder::getQuery()

Get the base entity query filtered by webform and search.

Parameters

string $keys: (optional) Search key.

string $state: (optional) Submission state.

string $source_entity: (optional) Source entity (type:id).

Return value

\Drupal\Core\Entity\Query\QueryInterface An entity query.

1 call to WebformSubmissionListBuilder::getQuery()
WebformSubmissionListBuilder::getEntityIds in src/WebformSubmissionListBuilder.php
Loads entity IDs using a pager sorted by the entity id.

File

src/WebformSubmissionListBuilder.php, line 1366

Class

WebformSubmissionListBuilder
Provides a list controller for webform submission entity.

Namespace

Drupal\webform

Code

protected function getQuery($keys = '', $state = '', $source_entity = '') {

  /** @var \Drupal\webform\WebformSubmissionStorageInterface $submission_storage */
  $submission_storage = $this
    ->getStorage();
  $query = $submission_storage
    ->getQuery();
  $submission_storage
    ->addQueryConditions($query, $this->webform, $this->sourceEntity, $this->account);

  // Filter by key(word).
  if ($keys) {

    // Search values.
    $sub_query = Database::getConnection()
      ->select('webform_submission_data', 'sd')
      ->fields('sd', [
      'sid',
    ])
      ->condition('value', '%' . $keys . '%', 'LIKE');
    $submission_storage
      ->addQueryConditions($sub_query, $this->webform);

    // Search UUID and Notes.
    $or_condition = $query
      ->orConditionGroup();
    $or_condition
      ->condition('notes', '%' . $keys . '%', 'LIKE');

    // Only search UUID if keys is alphanumeric with dashes.
    // @see Issue #2978420: Error SQL with accent mark submissions filter.
    if (preg_match('/^[0-9a-z-]+$/', $keys)) {
      $or_condition
        ->condition('uuid', $keys);
    }
    $query
      ->condition($query
      ->orConditionGroup()
      ->condition('sid', $sub_query, 'IN')
      ->condition($or_condition));
  }

  // Filter by (submission) state.
  switch ($state) {
    case static::STATE_STARRED:
      $query
        ->condition('sticky', 1);
      break;
    case static::STATE_UNSTARRED:
      $query
        ->condition('sticky', 0);
      break;
    case static::STATE_LOCKED:
      $query
        ->condition('locked', 1);
      break;
    case static::STATE_UNLOCKED:
      $query
        ->condition('locked', 0);
      break;
    case static::STATE_DRAFT:
      $query
        ->condition('in_draft', 1);
      break;
    case static::STATE_COMPLETED:
      $query
        ->condition('in_draft', 0);
      break;
  }

  // Filter by source entity.
  if ($source_entity && strpos($source_entity, ':') !== FALSE) {
    list($entity_type, $entity_id) = explode(':', $source_entity);
    $query
      ->condition('entity_type', $entity_type);
    $query
      ->condition('entity_id', $entity_id);
  }

  // Filter by draft. (Only applies to user submissions and drafts)
  if (isset($this->draft)) {

    // Cast boolean to integer to support SQLite.
    $query
      ->condition('in_draft', (int) $this->draft);
  }
  return $query;
}