Вход Регистрация
Файл: framework/search/filters/FulltextFilter.php
Строк: 97
<?php
/**
 * @package framework
 * @subpackage search
 */

/**
 * Filters by full-text matching on the given field.
 *
 * Full-text indexes are only available with MyISAM tables. The following column types are
 * supported:
 *   - Char
 *   - Varchar
 *   - Text
 *
 * To enable full-text matching on fields, you also need to add an index to the
 * database table, using the {$indexes} hash in your DataObject subclass:
 *
 * <code>
 *   private static $indexes = array(
 *      'SearchFields' => 'fulltext(Name, Title, Description)'
 *   );
 * </code>
 *
 * @todo Add support for databases besides MySQL
 */
class FulltextFilter extends SearchFilter {

    protected function 
applyOne(DataQuery $query) {
        
$this->model $query->applyRelation($this->relation);
        
$predicate sprintf("MATCH (%s) AGAINST (?)"$this->getDbName());
        return 
$query->where(array($predicate => $this->getValue()));
    }

    protected function 
excludeOne(DataQuery $query) {
        
$this->model $query->applyRelation($this->relation);
        
$predicate sprintf("NOT MATCH (%s) AGAINST (?)"$this->getDbName());
        return 
$query->where(array($predicate => $this->getValue()));
    }

    public function 
isEmpty() {
        return 
$this->getValue() === array() || $this->getValue() === null || $this->getValue() === '';
    }


    
/**
     * This implementation allows for a list of columns to be passed into MATCH() instead of just one.
     *
     * @example
     * <code>
     *     MyDataObject::get()->filter('SearchFields:fulltext', 'search term')
     * </code>
     *
     * @return string
    */
    
public function getDbName() {
        
$indexes Config::inst()->get($this->model"indexes");
        if(
is_array($indexes) && array_key_exists($this->getName(), $indexes)) {
            
$index $indexes[$this->getName()];
            if(
is_array($index) && array_key_exists("value"$index)) {
                return 
$this->prepareColumns($index['value']);
            } else {
                
// Parse a fulltext string (eg. fulltext ("ColumnA", "ColumnB")) to figure out which columns
                // we need to search.
                
if(preg_match('/^fulltexts+((.+))$/i'$index$matches)) {
                    return 
$this->prepareColumns($matches[1]);
                } else {
                    throw new 
Exception("Invalid fulltext index format for '" $this->getName()
                        . 
"' on '" $this->model "'");
                }
            }
        }

        return 
parent::getDbName();
    }

    
/**
     * Adds table identifier to the every column.
     * Columns must have table identifier to prevent duplicate column name error.
     *
     * @return string
    */
    
protected function prepareColumns($columns) {
        
$cols preg_split('/"?s*,s*"?/'trim($columns'(") '));
        
$class ClassInfo::table_for_object_field($this->modelcurrent($cols));
        
$cols array_map(function($col) use ($class) {
            return 
sprintf('"%s"."%s"'$class$col);
        }, 
$cols);
        return 
implode(','$cols);
    }

}
Онлайн: 1
Реклама