1
0
mirror of synced 2025-02-21 14:43:14 +03:00
This commit is contained in:
zYne 2007-07-26 22:57:36 +00:00
parent 8ee4d75b69
commit 569348bdda
2 changed files with 64 additions and 21 deletions

View File

@ -132,7 +132,7 @@ class Doctrine_Search
unset($def['sequence']); unset($def['sequence']);
unset($def['primary']); unset($def['primary']);
$col = strtolower($name . '_' . $column); $col = strtolower(Doctrine::tableize($name) . '_' . $column);
$def['primary'] = true; $def['primary'] = true;
$fk[$col] = $def; $fk[$col] = $def;

View File

@ -37,24 +37,23 @@ class Doctrine_Search_Query
*/ */
protected $_query; protected $_query;
/** /**
* @var array $_aliases an array of searchable component aliases * @var Doctrine_Table $_table the index table
*/ */
protected $_aliases = array(); protected $_table = array();
protected $_sql = '';
/** /**
* @param Doctrine_Query $query the base query * @param octrine_Table $_table the index table
*/ */
public function __construct($query) public function __construct($table)
{ {
if (is_string($query)) { if (is_string($table)) {
$this->_query = new Doctrine_Query(); $table = Doctrine_Manager::table($table);
$this->_query->parseQuery($query); }
} elseif ($query instanceof Doctrine_Query) {
$this->_query = $query; $this->_table = $table;
} else {
throw new Doctrine_Exception('Constructor argument should be either Doctrine_Query object or a valid DQL query string'); $this->_query = new Doctrine_Query();
}
$this->_query->getQuery();
} }
/** /**
* getQuery * getQuery
@ -65,13 +64,54 @@ class Doctrine_Search_Query
{ {
return $this->_query; return $this->_query;
} }
public function addAlias($alias)
{
$this->_aliases[] = $alias;
}
public function search($text) public function search($text)
{
$text = strtolower(trim($text));
$terms = Doctrine_Tokenizer::quoteExplode($text);
$foreignId = current(array_diff($this->_table->getColumnNames(), array('keyword', 'field', 'position')));
$numTerms = count($terms);
switch ($numTerms) {
case 0:
return false;
break;
case 1:
// only one term found, use fast
$select = 'SELECT COUNT(keyword) AS relevance, ' . $foreignId;
$from = 'FROM ' . $this->_table->getTableName();
if (strpos($terms[0], "'") === false) {
$where = 'WHERE keyword = ?';
$params = array($terms[0]);
} else {
$terms[0] = trim($terms[0], "' ");
$where = 'WHERE keyword = ?';
$terms = Doctrine_Tokenizer::quoteExplode($terms[0]);
$params = $terms;
foreach ($terms as $k => $term) {
if ($k === 0) {
continue;
}
$where .= ' AND (position + ' . $k . ') = (SELECT position FROM ' . $this->_table->getTableName() . ' WHERE keyword = ?)';
}
}
$groupby = 'GROUP BY ' . $foreignId;
$orderby = 'ORDER BY relevance';
break;
default:
}
$this->_sql = $select . ' ' . $from . ' ' . $where . ' ' . $groupby . ' ' . $orderby;
}
public function search2($text)
{ {
$text = strtolower($text); $text = strtolower($text);
@ -107,7 +147,10 @@ class Doctrine_Search_Query
$this->_query->addWhere(implode(' OR ', $condition), $terms); $this->_query->addWhere(implode(' OR ', $condition), $terms);
} }
} }
public function getSql()
{
return $this->_sql;
}
public function execute() public function execute()
{ {
$resultSet = $this->_query->execute(); $resultSet = $this->_query->execute();