/**
  * @see sfTask
  */
 protected function execute($arguments = array(), $options = array())
 {
     $config = sfLucene::getConfig();
     $query = $arguments['query'];
     // check and reduce indexes
     if ($options['index'] !== null) {
         if (!in_array($options['index'], array_keys($config))) {
             throw new Exception('Index %s not exist', $options['index']);
         }
         $config = array($config[$options['index']]);
     }
     // build the lucene criteria
     $criteria = sfLuceneCriteria::newInstance()->addPhrase($query)->setOffset($options['start'])->setLimit($options['limit']);
     // walk over the indexes
     foreach ($config as $index => $indexConfig) {
         // check culture
         $cultures = $indexConfig['index']['cultures'];
         if ($options['culture'] !== null) {
             if (!in_array($options['culture'], $cultures)) {
                 //TODO: change to log error
                 throw new Exception(sprintf('Culture %s is not configurate for index %s', $options['culture'], $index));
             }
             $cultures = array($options['culture']);
         }
         $this->log(sprintf('search for `%s` from %u to %u', $query, $options['start'], $options['limit']));
         // walk over the cultures
         foreach ($cultures as $culture) {
             // get lucene instance and retrieve the results
             $results = sfLucene::getInstance($index, $culture)->friendlyFind($criteria);
             $this->log(sprintf('found %u results in index `%s` with culture `%s`', count($results), $index, $culture));
             foreach ($results as $result) {
                 $this->logSection('result ', sprintf('%s %s (%u%%)', $result->getInternalModel(), $result->getInternalTitle(), $result->getScore()));
             }
         }
     }
 }
$lucene->find($query);
$t->ok($query == $mock->args[0], '->find() accepts Zend API queries');
$t->isa_ok($mock->scoring, 'Zend_Search_Lucene_Search_Similarity_Default', '->find() with a Zend API queries uses default scoring algorithm');
$scoring = new MockScoring();
$lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->setScoringAlgorithm($scoring));
$t->is($mock->scoring, $scoring, '->find() changes the scoring algorithm if sfLuceneCriteria specifies it');
$t->isa_ok(Zend_Search_Lucene_Search_Similarity::getDefault(), 'Zend_Search_Lucene_Search_Similarity_Default', '->find() resets the default scoring algorithm after processing');
$lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->addAscendingSortBy('sort1')->addDescendingSortBy('sort2', SORT_NUMERIC));
$t->is_deeply(array_splice($mock->args, 1), array('sort1', SORT_REGULAR, SORT_ASC, 'sort2', SORT_NUMERIC, SORT_DESC), '->find() uses sorting rules from sfLuceneCriteria');
$results = $lucene->friendlyFind('foo');
$t->isa_ok($results, 'sfLuceneResults', '->friendlyFind() returns an instance of sfLuceneResults');
$t->is($results->toArray(), range(1, 100), '->friendlyFind() houses the data from ZSL');
$t->is($results->getSearch(), $lucene, '->friendlyFind() is connected to the Lucene instance');
$mock->e = true;
try {
    $lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->setScoringAlgorithm(new MockScoring()));
    $t->fail('if ZSL throws exception, ->find() also throws the exception');
    $t->skip('if ZSL throws exception, ->find() stills resets the scoring algorithm');
} catch (Exception $e) {
    $t->pass('if ZSL throws exception, ->find() also throws the exception');
    $t->isa_ok(Zend_Search_Lucene_Search_Similarity::getDefault(), 'Zend_Search_Lucene_Search_Similarity_Default', 'if ZSL throws exception, ->find() stills resets the scoring algorithm');
}
$lucene->forceLucene($originalLucene);
$t->diag('testing ->rebuildIndex()');
class MockIndexerFactory
{
    public $handlers, $deleteLock = false, $search;
    public function __construct($h, $s)
    {
        $this->handlers = $h;
        $this->search = $s;
function inst()
{
    return sfLuceneCriteria::newInstance();
}
function inst()
{
    return sfLuceneCriteria::newInstance(sfLucene::getInstance('testLucene'));
}
function inst($app_configuration)
{
    return sfLuceneCriteria::newInstance();
}
 /**
  * Wrapper for Lucene's find()
  * @param mixed $query The query
  * @return array The array of results
  */
 public function find($query)
 {
     $this->configure();
     $timer = sfTimerManager::getTimer('Zend Search Lucene Find');
     $sort = array();
     $scoring = null;
     if ($query instanceof sfLuceneCriteria) {
         foreach ($query->getSorts() as $sortable) {
             $sort[] = $sortable['field'];
             $sort[] = $sortable['type'];
             $sort[] = $sortable['order'];
         }
         $scoring = $query->getScoringAlgorithm();
         $query = $query->getQuery();
     } elseif (is_string($query)) {
         $query = sfLuceneCriteria::newInstance($this)->addString($query)->getQuery();
     }
     $defaultScoring = Zend_Search_Lucene_Search_Similarity::getDefault();
     if ($scoring) {
         Zend_Search_Lucene_Search_Similarity::setDefault($scoring);
     }
     try {
         // as we rarely sort, we can avoid the overhead of call_user_func() with this conditional
         if (count($sort)) {
             $args = array_merge(array($query), $sort);
             $results = call_user_func_array(array($this->getLucene(), 'find'), $args);
         } else {
             $results = $this->getLucene()->find($query);
         }
     } catch (Exception $e) {
         Zend_Search_Lucene_Search_Similarity::setDefault($defaultScoring);
         $timer->addTime();
         throw $e;
     }
     Zend_Search_Lucene_Search_Similarity::setDefault($defaultScoring);
     $timer->addTime();
     return $results;
 }
Esempio n. 7
0
 /**
  * Wrapper for Lucene's find()
  * @param mixed $query The query
  * @return array The array of results
  */
 public function find($query, $is_sane = false)
 {
     $this->configure();
     $timer = sfTimerManager::getTimer('Solr Search Lucene Find');
     if (is_string($query)) {
         $criteria = sfLuceneCriteria::newInstance();
         if ($is_sane) {
             $criteria->add($query, sfLuceneCriteria::TYPE_AND, true);
         } else {
             $criteria->addString($query);
         }
         $query = $criteria;
     }
     try {
         $change_path = $query->getPath();
         if ($change_path) {
             $old_path = $this->getSearchService()->getPath();
             $this->getSearchService()->setPath($query->getPath());
         }
         $results = $this->getSearchService()->search($query->getQuery(), $query->getOffset(), $query->getLimit(), $query->getParams(), $query->getHttpMethod());
         if ($change_path) {
             $this->getSearchService()->setPath($old_path);
         }
     } catch (Exception $e) {
         $timer->addTime();
         throw $e;
     }
     $timer->addTime();
     return $results;
 }
Esempio n. 8
0
    {
        if ($this->e) {
            throw new Exception('Because you said so');
        }
        $this->args = func_get_args();
        return range(1, 100);
    }
}
$mock = new MockLucene();
$originalLucene = $lucene->getLucene();
$lucene->forceLucene($mock);
$t->is($lucene->find('foo'), range(1, 100), '->find() returns what ZSL returns');
$query = sfLuceneCriteria::newInstance($lucene)->add('foo')->addRange('a', 'b', 'c');
$lucene->find($query);
$t->ok($query->getQuery() == $mock->args[0], '->find() accepts sfLuceneCriteria queries');
$lucene->find(sfLuceneCriteria::newInstance($lucene)->add('foo')->addAscendingSortBy('sort1')->addDescendingSortBy('sort2', SORT_DESC)->addSortBy('sort3'));
$t->is_deeply(array_splice($mock->args, 1), array(0, 10, array('fl' => array('*,score'), 'sort' => array('score desc, sort1 asc, sort2 desc, sort3 asc')), 'GET'), '->find() uses sorting rules from sfLuceneCriteria');
$mock->e = true;
$lucene->forceLucene($originalLucene);
$t->diag('testing ->rebuildIndex()');
class MockIndexerFactory
{
    public $handlers, $deleteLock = false, $search;
    public function __construct($h, $s)
    {
        $this->handlers = $h;
        $this->search = $s;
    }
    public function getHandlers()
    {
        $this->deleteLock = $this->search->getParameter('delete_lock');