2 class WikiDB_backend_dumb_TextSearchIter
3 extends WikiDB_backend_iterator
5 function __construct(&$backend, &$pages, $search, $fulltext = false,
8 $this->_backend = &$backend;
9 $this->_pages = $pages;
10 $this->_fulltext = $fulltext;
11 $this->_search =& $search;
13 $this->_stoplist =& $search->_stoplist;
14 $this->stoplisted = array();
17 if (isset($options['limit'])) // extract from,count from limit
18 list($this->_from, $this->_count) = WikiDB_backend::limit($options['limit']);
21 if (isset($options['exclude'])) $this->_exclude = $options['exclude'];
22 else $this->_exclude = false;
25 function _get_content(&$page)
27 $backend = &$this->_backend;
28 $pagename = $page['pagename'];
30 if (!isset($page['versiondata'])) {
31 $version = $backend->get_latest_version($pagename);
32 $page['versiondata'] = $backend->get_versiondata($pagename, $version, true);
34 return $page['versiondata']['%content'];
37 function _match(&$page)
39 $text = $page['pagename'];
40 if ($result = $this->_search->match($text)) { // first match the pagename only
41 return $this->_search->score($text) * 2.0;
44 if ($this->_fulltext) {
45 // eliminate stoplist words from fulltext search
46 if (preg_match("/^" . $this->_stoplist . "$/i", $text)) {
47 $this->stoplisted[] = $text;
50 $text .= "\n" . $this->_get_content($page);
51 // Todo: Bonus for meta keywords (* 1.5) and headers
52 if ($this->_search->match($text))
53 return $this->_search->score($text);
61 $pages = &$this->_pages;
62 while ($page = $pages->next()) {
63 if ($score = $this->_match($page)) {
65 if (($this->_from > 0) and ($this->_index <= $this->_from))
66 // not yet reached the offset
68 /*if ($this->_count and ($this->_index > $this->_count)) {
69 // reached the limit, but need getTotal
74 $page['score'] = $score;
76 $page->score = $score;
85 $this->_pages->free();
93 // c-hanging-comment-ender-p: nil
94 // indent-tabs-mode: nil