/**
  * Build the match expression.
  */
 public function compile()
 {
     $query = '';
     foreach ($this->tokens as $token) {
         if (key($token) == 'MATCH') {
             if ($token['MATCH'] instanceof Expression) {
                 $query .= $token['MATCH']->value() . ' ';
             } elseif ($token['MATCH'] instanceof Match) {
                 $query .= '(' . $token['MATCH']->compile()->getCompiled() . ') ';
             } elseif (is_callable($token['MATCH'])) {
                 $sub = new static($this->sphinxql);
                 call_user_func($token['MATCH'], $sub);
                 $query .= '(' . $sub->compile()->getCompiled() . ') ';
             } elseif (strpos($token['MATCH'], ' ') === false) {
                 $query .= $this->sphinxql->escapeMatch($token['MATCH']) . ' ';
             } else {
                 $query .= '(' . $this->sphinxql->escapeMatch($token['MATCH']) . ') ';
             }
         } elseif (key($token) == 'OPERATOR') {
             $query .= $token['OPERATOR'];
         } elseif (key($token) == 'FIELD') {
             $query .= $token['FIELD'];
             if (count($token['fields']) == 1) {
                 $query .= $token['fields'][0];
             } else {
                 $query .= '(' . implode(',', $token['fields']) . ')';
             }
             if ($token['limit']) {
                 $query .= '[' . $token['limit'] . ']';
             }
             $query .= ' ';
         } elseif (key($token) == 'PHRASE') {
             $query .= '"' . $this->sphinxql->escapeMatch($token['PHRASE']) . '" ';
         } elseif (key($token) == 'PROXIMITY') {
             $query .= '"' . $this->sphinxql->escapeMatch($token['keywords']) . '"~';
             $query .= $token['PROXIMITY'] . ' ';
         } elseif (key($token) == 'QUORUM') {
             $query .= '"' . $this->sphinxql->escapeMatch($token['keywords']) . '"/';
             $query .= $token['QUORUM'] . ' ';
         } elseif (key($token) == 'BOOST') {
             $query = rtrim($query) . '^' . $token['BOOST'] . ' ';
         } elseif (key($token) == 'NEAR') {
             $query .= 'NEAR/' . $token['NEAR'] . ' ';
         } elseif (key($token) == 'ZONE') {
             $query .= 'ZONE:(' . implode(',', $token['ZONE']) . ') ';
         } elseif (key($token) == 'ZONESPAN') {
             $query .= 'ZONESPAN:(' . $token['ZONESPAN'] . ') ';
         }
     }
     $this->last_compiled = trim($query);
     return $this;
 }
Beispiel #2
0
 /**
  * Returns a new SphinxQL instance
  *
  * @return SphinxQL
  */
 protected function getSphinxQL()
 {
     return SphinxQL::create($this->getConnection());
 }