<?php

namespace Drupal\search;

use Drupal\Core\Database\Query\ConditionInterface;

/**
 * Extends the core SearchQuery to be able to gets its protected values.
 */
class ViewsSearchQuery extends SearchQuery {

  /**
   * Returns the conditions property.
   *
   * @return array
   *   The query conditions.
   */
  public function &conditions() {
    return $this->conditions;
  }

  /**
   * Returns the words property.
   *
   * @return array
   *   The positive search keywords.
   */
  public function words() {
    return $this->words;
  }

  /**
   * Returns the simple property.
   *
   * @return bool
   *   TRUE if it is a simple query, and FALSE if it is complicated (phrases
   *   or LIKE).
   */
  public function simple() {
    return $this->simple;
  }

  /**
   * Returns the matches property.
   *
   * @return int
   *   The number of matches needed.
   */
  public function matches() {
    return $this->matches;
  }

  /**
   * Executes and returns the protected parseSearchExpression method.
   */
  public function publicParseSearchExpression() {
    return $this->parseSearchExpression();
  }

  /**
   * Replaces the original condition with a custom one from views recursively.
   *
   * @param string $search
   *   The searched value.
   * @param string $replace
   *   The value which replaces the search value.
   * @param array $condition
   *   The query conditions array in which the string is replaced. This is an
   *   item from a \Drupal\Core\Database\Query\Condition::conditions array,
   *   which must have a 'field' element.
   */
  public function conditionReplaceString($search, $replace, &$condition) {
    if ($condition['field'] instanceof ConditionInterface) {
      $conditions =& $condition['field']->conditions();
      foreach ($conditions as $key => &$subcondition) {
        if (is_numeric($key)) {
          // As conditions can be nested, the function has to be called
          // recursively.
          $this->conditionReplaceString($search, $replace, $subcondition);
        }
      }
    }
    else {
      $condition['field'] = str_replace($search, $replace, $condition['field']);
    }
  }

}
