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

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

Résolution du pb de semaphore pointé par Roux

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