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

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

Correction de divers bug + modif de l'indexation de parlementaires

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    private $command = null;
13
14    /**
15     * __construct
16     *
17     * @param string $options
18     * @return void
19     */
20    public function __construct($options)
21    {
22      $this->_options = $options;
23    }
24
25    protected $solr = NULL;
26    protected function getSolrConnector() {
27      if (!$this->solr)
28        $this->solr = new SolrConnector($this->_options);
29      return $this->solr;
30    }
31
32    private function get_and_strip($obj, $field) {
33      if (!$obj || !get_class($obj))
34        return array();
35      $f = $obj->get($field);
36      if ($f) {
37        if (is_array($f) || (get_class($f) == 'Doctrine_Collection')) {
38          $res = array();
39          foreach($f as $i) {
40            $res[] = $i.'';
41          }
42          return $res;
43        }
44        if (get_class($f) && ! $f->id)
45          return array();
46        return array(strip_tags($f));
47      }
48      return array();
49    }
50
51  private function getObjFieldsValue($obj, $fields)
52  {
53    if (!is_array($fields)) {
54      return implode(' ',$this->get_and_strip($obj, $fields));
55    }
56    $s = '';
57    foreach($fields as $f) {
58      $s .= implode(' ', $this->get_and_strip($obj, $f)).' ';
59    }
60    return $s;
61  }
62 
63  private function getLuceneObjId($obj) 
64  {
65    return get_class($obj).'/'.$obj->getId();
66  }
67 
68  // Réindexation après une création / modification
69  public function postSave(Doctrine_Event $event)
70  {
71    $obj = $event->getInvoker();
72
73    $t = null;
74    if (isset( $this->_options['index_if']) && $t = $this->_options['index_if'] && $t && !$obj->get($t))
75      return ;
76   
77    $json = array();
78    $json['id'] = $this->getLuceneObjId($obj);
79    $json['object_id'] =  $obj->getId();
80    $json['object_name'] = get_class($obj);
81   
82    if (isset($this->_options['description']) && $t = $this->_options['description']) {
83      $content = $this->getObjFieldsValue($obj, $t);
84      $wordcount = str_word_count($content);
85    }
86   
87    if (isset($this->_options['extra_weight'])) 
88      $extra_weight = $this->_options['extra_weight'];
89    else
90      $extra_weight = 1;
91
92    if (isset($this->_options['devaluate_if_wordcount_under']) && ($wclimit = $this->_options['devaluate_if_wordcount_under'])) {
93       if ($wclimit > $wordcount)
94         $extra_weight *=  0.5 ;
95    }
96   
97    // On donne un poids plus important au titre
98    if (isset($this->_options['title']) && $t = $this->_options['title']) {
99      $json['title']['content'] = $this->getObjFieldsValue($obj, $t);
100      $json['title']['weight'] =  1.2 * $extra_weight;
101    }
102   
103    // La description
104    if (isset($content)) {
105      $json['description']['content'] = $content;
106      $json['description']['weight'] = $extra_weight;
107      $json['wordcount'] = $wordcount;
108    }
109     
110    // par default la date est la created_at
111    if (!isset($this->_options['date']) || !($t = $this->_options['date'])) {
112      $t = 'created_at';
113    }
114    $date = $this->getObjFieldsValue($obj, $t);
115    $d = preg_replace('/\+.*/', 'Z', date('c', strtotime($date)));
116    $json['date']['content'] = $d;
117    $json['date']['weight'] = $extra_weight;
118   
119
120    $json['tags']['content'] = array();
121    try {
122      foreach($obj->getTags() as $tag) if ($tag)  {
123        $json['tags']['content'][] =  preg_replace('/:/', '=', $tag);
124      }
125    }catch (Exception $e) {}
126   
127    if (isset($this->_options['moretags']) && $t = $this->_options['moretags']) {
128      if (!is_array($t)) {
129        $t = array($t);
130      }
131      foreach ($t as $i) {
132        $content = $this->get_and_strip($obj, $i);
133        $i = preg_replace('/([A-Z].*)s$/', '\1', $i);
134        foreach($content as $c) {
135          $s = $c;
136          if (strlen($s)) {
137            $s = strip_tags($s);
138            $json['tags']['content'][] = $i.'='.$s;
139          }
140        }
141      }
142    }
143   
144    $json['tags']['weight'] = $extra_weight;
145   
146    SolrCommands::getInstance()->addCommand('UPDATE', $json);
147  }
148 
149  // Désindexation après une suppression
150  public function postDelete(Doctrine_Event $event)
151  {
152    $obj = $event->getInvoker();
153    $json = new stdClass();
154    $json->id = $this->getLuceneObjId($obj);
155    SolrCommands::getInstance()->addCommand('DELETE', $json);
156  }
157 
158}
Note: See TracBrowser for help on using the repository browser.