4 class WikiDB_backend_dumb_TextSearchIter
5 extends WikiDB_backend_iterator
7 function WikiDB_backend_dumb_TextSearchIter(&$backend, &$pages, $search, $fulltext=false,
10 $this->_backend = &$backend;
11 $this->_pages = $pages;
12 $this->_fulltext = $fulltext;
13 $this->_search =& $search;
15 $this->_stoplist =& $search->_stoplist;
16 $this->stoplisted = array();
19 if (isset($options['limit'])) // extract from,count from limit
20 list($this->_from, $this->_count) = WikiDB_backend::limit($options['limit']);
23 if (isset($options['exclude'])) $this->_exclude = $options['exclude'];
24 else $this->_exclude = false;
27 function _get_content(&$page) {
28 $backend = &$this->_backend;
29 $pagename = $page['pagename'];
31 if (!isset($page['versiondata'])) {
32 $version = $backend->get_latest_version($pagename);
33 $page['versiondata'] = $backend->get_versiondata($pagename, $version, true);
35 return $page['versiondata']['%content'];
38 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);
60 $pages = &$this->_pages;
61 while ($page = $pages->next()) {
62 if ($score = $this->_match($page)) {
64 if (($this->_from > 0) and ($this->_index <= $this->_from))
65 // not yet reached the offset
67 /*if ($this->_count and ($this->_index > $this->_count)) {
68 // reached the limit, but need getTotal
73 $page['score'] = $score;
75 $page->score = $score;
83 $this->_pages->free();
91 // c-hanging-comment-ender-p: nil
92 // indent-tabs-mode: nil