source: cpc/trunk/project/lib/model/solr/SolrListener.php @ 1316

Last change on this file since 1316 was 1316, checked in by teymour, 11 years ago

Un vrai fichier de commands (protégé)

File size: 4.1 KB
Line 
1<?php
2
3class SolrListener extends Doctrine_Record_Listener
4{
5  /**
6     * Array of timestampable options
7     *
8     * @var string
9     */
10    protected $_options = array();
11
12    protected static $fileCommand = null;
13    protected static $fileDispatcher = null;
14
15    protected static function getFileCommand() {
16      if (!self::$fileDispatcher) {
17        self::$fileDispatcher = new sfEventDispatcher();
18      }
19      if (!self::$fileCommand) {
20        self::$fileCommand = new sfFileLogger(self::$fileDispatcher, array('file' => SolrConnector::getFileCommands()));
21      }
22      return self::$fileCommand;
23    }
24
25    private $command = null;
26
27    /**
28     * __construct
29     *
30     * @param string $options
31     * @return void
32     */
33    public function __construct($options)
34    {
35      $this->_options = $options;
36    }
37
38    protected $solr = NULL;
39    protected function getSolrConnector() {
40      if (!$this->solr)
41        $this->solr = new SolrConnector($this->_options);
42      return $this->solr;
43    }
44
45    private function get_and_strip($obj, $field) {
46      $f = $obj->get($field);
47      if ($f) {
48      if (get_class($f) && ! $f->id)
49        return ;
50      return strip_tags($f);
51    }
52    return ;
53  }
54
55  private function getObjFieldsValue($obj, $fields)
56  {
57    if (!is_array($fields)) {
58      return $this->get_and_strip($obj, $fields);
59    }
60    $s = '';
61    foreach($fields as $f) {
62      $s .= $this->get_and_strip($obj, $f).' ';
63    }
64    return $s;
65  }
66 
67  private function getLuceneObjId($obj) 
68  {
69    return get_class($obj).'/'.$obj->getId();
70  }
71 
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   
85    if ($t = $this->_options['description']) {
86      $content = $this->getObjFieldsValue($obj, $t);
87      $wordcount = str_word_count($content);
88    }
89   
90    if (isset($this->_options['extra_weight'])) 
91      $extra_weight = $this->_options['extra_weight'];
92    else
93      $extra_weight = 1;
94
95    if (isset($this->_options['devaluate_if_wordcount_under']) && ($wclimit = $this->_options['devaluate_if_wordcount_under'])) {
96       if ($wclimit > $wordcount)
97         $extra_weight *= ($wordcount*0.5) / $wclimit + 0.5 ;
98    }
99   
100    // On donne un poids plus important au titre
101    if (isset($this->_options['title']) && $t = $this->_options['title']) {
102      $json['title']['content'] = $this->getObjFieldsValue($obj, $t);
103      $json['title']['weight'] =  1.2 * $extra_weight;
104    }
105   
106    // La description
107    if (isset($content)) {
108      $json['description']['content'] = $content;
109      $json['description']['weight'] = $extra_weight;
110      $json['wordcount'] = $wordcount;
111    }
112     
113    // par default la date est la created_at
114    if ( !($t = $this->_options['date'])) {
115      $t = 'created_at';
116    }
117    $d = preg_replace('/\+.*/', 'Z', date('c', strtotime($this->getObjFieldsValue($obj, $t))));
118    $json['date']['content'] = $d;
119    $json['date']['weight'] = $extra_weight;
120   
121
122    $json['tags']['content'] = array();
123    try {
124      foreach($obj->getTags() as $tag) if ($tag)  {
125        $json['tags']['content'][] =  preg_replace('/:/', '=', $tag);
126      }
127    }catch (Exception $e) {}
128   
129    if ($t = $this->_options['moretags']) {
130      if (!is_array($t)) {
131        $s = $this->get_and_strip($obj, $t);
132        if ($s)
133          $json['tags']['content'][] = $t.'='.$s;
134      }else{
135        foreach ($t as $i) {
136          $s = $this->get_and_strip($obj, $i);
137          if (strlen($s)) {
138            $s = strip_tags($s);
139            $json['tags']['content'][] = $i.'='.$s;
140          }
141        }
142      }
143    }
144   
145    $json['tags']['weight'] = $extra_weight;
146   
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 
159}
Note: See TracBrowser for help on using the repository browser.