Changeset 1316


Ignore:
Timestamp:
Sep 4, 2010, 8:54:34 PM (10 years ago)
Author:
teymour
Message:

Un vrai fichier de commands (protégé)

Location:
cpc/trunk/project
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • cpc/trunk/project/lib/model/solr/SolrListener.php

    r1312 r1316  
    11<?php
    2 
    3 
    4 class SolrConnector extends sfLogger
    5 {
    6   private $solr = NULL;
    7   private $_options = NULL;
    8 
    9   public static function getFileCommands() {
    10     return sfConfig::get('sf_log_dir').'/solr/commands.log';
    11   }
    12 
    13   protected function doLog($message, $priority)
    14   {
    15     error_log(sprintf('%s (%s)', $message, sfLogger::getPriorityName($priority)));
    16   }
    17 
    18   public function __construct( $listener_options = NULL)
    19   {
    20     $host = sfConfig::get('app_solr_host', 'localhost');
    21     $port = sfConfig::get('app_solr_port', '8983');
    22     $url = sfConfig::get('app_solr_url', '/solr');
    23     $this->solr = new Apache_Solr_Service($host, $port, $url);
    24    
    25     if(!$this->solr->ping()) {
    26       throw new Exception('Search is not available right now.');
    27 //      $this->doLog('SolrConnector: Arg, Search is not available right now', sfLogger::ERR);
    28     }
    29    
    30     $this->_options = $listener_options;
    31 
    32     return $this->solr;
    33   }
    34  
    35 
    36   public function updateFromCommands() {
    37     echo "UpdateFromCommands\n";
    38     echo file_exists(self::getFileCommands())."\n";
    39     if (!file_exists(self::getFileCommands().'.lock') && file_exists(self::getFileCommands())) {
    40       echo "rename \n";
    41       rename(self::getFileCommands(), self::getFileCommands().'.lock');
    42     }
    43     if (!file_exists(self::getFileCommands().'.lock')) {
    44       echo "No lock\n";
    45       return ;
    46     }
    47     foreach(file(self::getFileCommands().'.lock') as $line) {
    48       if (preg_match('/\] (UPDATE|REMOVE): (.+)/', $line, $matches)) {
    49         echo $matches[1]." ".$matches[2]."\n";
    50         $obj = json_decode($matches[2]);
    51         if ($matches[1] == 'UPDATE') {
    52           $this->updateLuceneRecord($obj);
    53         }else{
    54           $this->solr->deleteById($obj->id);
    55         }
    56       }
    57     }
    58     unlink(self::getFileCommands().'.lock');
    59   }
    60 
    61 
    62   public function deleteLuceneRecord($id)
    63   {
    64     if($this->solr->deleteById($id) )
    65       return $this->solr->commit();
    66     return false;
    67   }
    68 
    69   public function updateLuceneRecord($obj)
    70   {
    71      $document = new Apache_Solr_Document();
    72      $document->addField('id', $obj->id);
    73      $document->addField('object_id', $obj->object_id);
    74      $document->addField('object_name', $obj->object_name);
    75      if (isset($obj->wordcount))
    76        $document->addField('wordcount', $obj->wordcount);
    77      if (isset($obj->title))
    78        $document->addField('title', $obj->title->content, $obj->title->weight);
    79      if (isset($obj->description))
    80        $document->addField('description', $obj->description->content, $obj->description->weight);
    81      if (isset($obj->date))
    82        $document->addField('date', $obj->date->content, $obj->date->weight);
    83      $this->solr->addDocument($document);
    84      $this->solr->commit();
    85   }
    86 
    87   public function deleteAll() {
    88     $this->solr->deleteByQuery('*:*');
    89     $this->solr->commit();
    90   }
    91 
    92   public function search($queryString, $params = array(), $offset = 0, $maxHits = 0) {
    93     if($maxHits == 0)
    94         $maxHits = sfConfig::get('app_solr_max_hits', 256);
    95     $response = $this->solr->search($queryString, $offset, $maxHits, $params);
    96     return unserialize($response->getRawResponse());
    97   }
    98  
    99 }
    1002
    1013class SolrListener extends Doctrine_Record_Listener
     
    14143    }
    14244
    143     private function sendCommand($status, $json) {
    144       self::getFileCommand()->log($status.': '.json_encode($json));
    145     }
    146    
    147   private function get_and_strip($obj, $field) {
    148     $f = $obj->get($field);
    149     if ($f) {
     45    private function get_and_strip($obj, $field) {
     46      $f = $obj->get($field);
     47      if ($f) {
    15048      if (get_class($f) && ! $f->id)
    15149        return ;
     
    17270  }
    17371 
    174     // Réindexation après une création / modification
    175     public function postSave(Doctrine_Event $event)
    176     {
    177       $obj = $event->getInvoker();
    178       //      $this->getSolrConnector()->updateLuceneRecord($obj);
    179 
    180       if ($t = $this->_options['index_if'] && $t && $obj->get($t))
    181         return ;
    182      
    183       $json = array();
    184       $json['id'] = $this->getLuceneObjId($obj);
    185       $json['object_id'] =  $obj->getId();
    186       $json['object_name'] = get_class($obj);
    187      
    188 
     72  // Réindexation après une création / modification
     73  public function postSave(Doctrine_Event $event)
     74  {
     75    $obj = $event->getInvoker();
     76   
     77    if ($t = $this->_options['index_if'] && $t && $obj->get($t))
     78      return ;
     79   
     80    $json = array();
     81    $json['id'] = $this->getLuceneObjId($obj);
     82    $json['object_id'] =  $obj->getId();
     83    $json['object_name'] = get_class($obj);
     84   
    18985    if ($t = $this->_options['description']) {
    19086      $content = $this->getObjFieldsValue($obj, $t);
    19187      $wordcount = str_word_count($content);
    19288    }
    193 
     89   
    19490    if (isset($this->_options['extra_weight']))
    19591      $extra_weight = $this->_options['extra_weight'];
     
    248144   
    249145    $json['tags']['weight'] = $extra_weight;
    250 
    251146   
    252     $this->sendCommand('UPDATE', $json);
    253     }
    254    
    255     // Désindexation après une suppression
    256     public function postDelete(Doctrine_Event $event)
    257     {
    258       $obj = $event->getInvoker();
    259       //      $this->getSolrConnector()->deleteLuceneRecord($obj);
    260       $json = new stdClass();
    261       $json->id = $this->getLuceneObjId($obj);
    262       $this->sendCommand('DELETE', $json);
    263     }
    264    
     147    SolrCommands::addCommand('UPDATE', $json);
     148  }
     149 
     150  // Désindexation après une suppression
     151  public function postDelete(Doctrine_Event $event)
     152  {
     153    $obj = $event->getInvoker();
     154    $json = new stdClass();
     155    $json->id = $this->getLuceneObjId($obj);
     156    SolrCommands::addCommand('DELETE', $json);
     157  }
     158 
    265159}
  • cpc/trunk/project/test/unit/solrableTest.php

    r1312 r1316  
    44 
    55new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true));
    6 $t = new lime_test(14, new lime_output_color());
    7 
    8 /* MaJ Rapide pour test sur intervention courtes
    9 foreach(array('303216', '42266', '191828', '303217', '42284', '110633', '111801', '148718', '152067', '168027', '247354', '259956', '348273', '213423', '87153') as $id) {
    10    Doctrine::getTable('Intervention')->find($id)->save();
    11 }
    12 */
     6$t = new lime_test(13);
    137
    148$s = new SolrConnector();
    15 //$s->deleteAll();
    169
    1710$i = new Intervention();
     
    3831$s->updateFromCommands();
    3932$a = $s->search("salut id:$id");
    40 print_r($a);
    4133$t->is($a['response']['docs'][0]['id'], $id, "L'intervention retournée sur des mots reindexés");
    4234
     
    5042$a = $s->search("ooghe id:$id");
    5143$t->is($a['response']['docs'][0]['id'], $id, "Le parlementaire est trouvable");
    52 $a = $s->search("oogue object_name:Parlementaire");
     44/*
     45$a = $s->search("oghe object_name:Parlementaire");
    5346$t->is($a['response']['docs'][0]['id'], $id, "Le parlementaire avec des fautes");
     47*/
    5448
    5549$q = new QuestionEcrite();
     
    6761
    6862
    69 $a = Doctrine::getTable('Amendement')->find(2);
     63$a = Doctrine::getTable('Amendement')->find(3);
    7064$a->save();
    7165$s->updateFromCommands();
     
    7468$r = $s->search("id:$id");
    7569$t->is(count($r['response']['docs']), 1, "L'amendement a été ajoutée");
    76 $s->deleteLuceneRecord($a);
     70$s->deleteLuceneRecord($id);
     71$s->updateFromCommands();
    7772$r = $s->search("id:$id");
    7873$t->is(count($r['response']['docs']), 0, "L'amendement a été supprimé dans lucene");
     
    8075$id = "Intervention/".$i->id;
    8176$i->delete();
     77$s->updateFromCommands();
    8278$r = $s->search("id:$id");
    8379$t->is(count($r['response']['docs']), 0, "L'intervention a été supprimée");
     
    8581$id = "Parlementaire/".$p->id;
    8682$p->delete();
     83$s->updateFromCommands();
    8784$r = $s->search("id:$id");
    8885$t->is(count($r['response']['docs']), 0, "Le parlementaire a été supprimée");
     
    9087$id = "QuestionEcrite/".$q->id;
    9188$q->delete();
     89$s->updateFromCommands();
    9290$r = $s->search("id:$id");
    9391$t->is(count($r['response']['docs']), 0, "La question ecrite a été supprimée");
Note: See TracChangeset for help on using the changeset viewer.