]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/backend/dumb/TextSearchIter.php
Remove svn:keywords
[SourceForge/phpwiki.git] / lib / WikiDB / backend / dumb / TextSearchIter.php
1 <?php
2 class WikiDB_backend_dumb_TextSearchIter
3 extends WikiDB_backend_iterator
4 {
5     function WikiDB_backend_dumb_TextSearchIter(&$backend, &$pages, $search, $fulltext=false,
6                                                 $options=array())
7     {
8         $this->_backend = &$backend;
9         $this->_pages = $pages;
10         $this->_fulltext = $fulltext;
11         $this->_search  =& $search;
12         $this->_index   = 0;
13         $this->_stoplist =& $search->_stoplist;
14         $this->stoplisted = array();
15
16     $this->_from = 0;
17         if (isset($options['limit']))  // extract from,count from limit
18         list($this->_from, $this->_count) = WikiDB_backend::limit($options['limit']);
19         else
20         $this->_count = 0;
21         if (isset($options['exclude'])) $this->_exclude = $options['exclude'];
22         else $this->_exclude = false;
23     }
24
25     function _get_content(&$page) {
26         $backend = &$this->_backend;
27         $pagename = $page['pagename'];
28
29         if (!isset($page['versiondata'])) {
30             $version = $backend->get_latest_version($pagename);
31             $page['versiondata'] = $backend->get_versiondata($pagename, $version, true);
32         }
33         return $page['versiondata']['%content'];
34     }
35
36     function _match(&$page) {
37         $text = $page['pagename'];
38         if ($result = $this->_search->match($text)) { // first match the pagename only
39             return $this->_search->score($text) * 2.0;
40     }
41
42         if ($this->_fulltext) {
43             // eliminate stoplist words from fulltext search
44             if (preg_match("/^".$this->_stoplist."$/i", $text)) {
45                 $this->stoplisted[] = $text;
46                 return $result;
47             }
48             $text .= "\n" . $this->_get_content($page);
49             // Todo: Bonus for meta keywords (* 1.5) and headers
50             if ($this->_search->match($text))
51         return $this->_search->score($text);
52         } else {
53             return $result;
54     }
55     }
56
57     function next() {
58         $pages = &$this->_pages;
59         while ($page = $pages->next()) {
60             if ($score = $this->_match($page)) {
61             $this->_index++;
62             if (($this->_from > 0) and ($this->_index <= $this->_from))
63                     // not yet reached the offset
64             continue;
65                 /*if ($this->_count and ($this->_index > $this->_count)) {
66                     // reached the limit, but need getTotal
67                     $this->_count++;
68                     return false;
69                 }*/
70                 if (is_array($page))
71             $page['score'] = $score;
72         else
73             $page->score = $score;
74                 return $page;
75             }
76         }
77         return false;
78     }
79
80     function free() {
81         $this->_pages->free();
82     }
83 };
84
85 // Local Variables:
86 // mode: php
87 // tab-width: 8
88 // c-basic-offset: 4
89 // c-hanging-comment-ender-p: nil
90 // indent-tabs-mode: nil
91 // End: