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

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

Bug du index_if

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']) {
75      if (!($obj->get($t))) {
76        return $this->postDelete($event);
77      }
78    }
79   
80    $json = array();
81    $json['id'] = $this->getLuceneObjId($obj);
82    $json['object_id'] =  $obj->getId();
83    $json['object_name'] = get_class($obj);
84    if (isset($this->_options['description']) && $t = $this->_options['description']) {
85      $content = $this->getObjFieldsValue($obj, $t);
86      $wordcount = str_word_count($content);
87    }
88   
89    if (isset($this->_options['extra_weight'])) 
90      $extra_weight = $this->_options['extra_weight'];
91    else
92      $extra_weight = 1;
93
94    if (isset($this->_options['devaluate_if_wordcount_under']) && ($wclimit = $this->_options['devaluate_if_wordcount_under'])) {
95       if ($wclimit > $wordcount)
96         $extra_weight *=  0.5 ;
97    }
98   
99    // On donne un poids plus important au titre
100    if (isset($this->_options['title']) && $t = $this->_options['title']) {
101      $json['title']['content'] = $this->getObjFieldsValue($obj, $t);
102      $json['title']['weight'] =  1.2 * $extra_weight;
103    }
104   
105    // La description
106    if (isset($content)) {
107      $json['description']['content'] = $content;
108      $json['description']['weight'] = $extra_weight;
109      $json['wordcount'] = $wordcount;
110    }
111     
112    // par default la date est la created_at
113    if (!isset($this->_options['date']) || !($t = $this->_options['date'])) {
114      $t = 'created_at';
115    }
116    $date = $this->getObjFieldsValue($obj, $t);
117    $d = preg_replace('/\+.*/', 'Z', date('c', strtotime($date)));
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 (isset($this->_options['moretags']) && $t = $this->_options['moretags']) {
130      if (!is_array($t)) {
131        $t = array($t);
132      }
133      foreach ($t as $i) {
134        $content = $this->get_and_strip($obj, $i);
135        $i = preg_replace('/([A-Z].*)s$/', '\1', $i);
136        foreach($content as $c) {
137          $s = $c;
138          if (strlen($s)) {
139            $s = strip_tags($s);
140            $json['tags']['content'][] = $i.'='.$s;
141          }
142        }
143      }
144    }
145   
146    $json['tags']['weight'] = $extra_weight;
147   
148    SolrCommands::getInstance()->addCommand('UPDATE', $json);
149  }
150 
151  // Désindexation après une suppression
152  public function postDelete(Doctrine_Event $event)
153  {
154    $obj = $event->getInvoker();
155    $json = new stdClass();
156    $json->id = $this->getLuceneObjId($obj);
157    SolrCommands::getInstance()->addCommand('DELETE', $json);
158  }
159 
160}
Note: See TracBrowser for help on using the repository browser.