/** * 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; }
/** * Returns a new SphinxQL instance * * @return SphinxQL */ protected function getSphinxQL() { return SphinxQL::create($this->getConnection()); }