Initial commit
[moodle.git] / search / Zend / Search / Lucene / Search / QueryTokenizer.php
1 <?php
2 /**
3  * Zend Framework
4  *
5  * LICENSE
6  *
7  * This source file is subject to the new BSD license that is bundled
8  * with this package in the file LICENSE.txt.
9  * It is also available through the world-wide-web at this URL:
10  * http://framework.zend.com/license/new-bsd
11  * If you did not receive a copy of the license and are unable to
12  * obtain it through the world-wide-web, please send an email
13  * to license@zend.com so we can send you a copy immediately.
14  *
15  * @category   Zend
16  * @package    Zend_Search_Lucene
17  * @subpackage Search
18  * @copyright  Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com)
19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
20  */
23 /** Zend_Search_Lucene_Search_QueryToken */
24 require_once 'Zend/Search/Lucene/Search/QueryToken.php';
26 /** Zend_Search_Lucene_Exception */
27 require_once 'Zend/Search/Lucene/Exception.php';
30 /**
31  * @category   Zend
32  * @package    Zend_Search_Lucene
33  * @subpackage Search
34  * @copyright  Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com)
35  * @license    http://framework.zend.com/license/new-bsd     New BSD License
36  */
37 class Zend_Search_Lucene_Search_QueryTokenizer implements Iterator
38 {
39     /**
40      * inputString tokens.
41      *
42      * @var array
43      */
44     protected $_tokens = array();
46     /**
47      * tokens pointer.
48      *
49      * @var integer
50      */
51     protected $_currToken = 0;
54     /**
55      * QueryTokenize constructor needs query string as a parameter.
56      *
57      * @param string $inputString
58      */
59     public function __construct($inputString)
60     {
61         if (!strlen($inputString)) {
62             throw new Zend_Search_Lucene_Exception('Cannot tokenize empty query string.');
63         }
65         $currentToken = '';
66         for ($count = 0; $count < strlen($inputString); $count++) {
67             if (ctype_alnum( $inputString{$count} )) {
68                 $currentToken .= $inputString{$count};
69             } else {
70                 // Previous token is finished
71                 if (strlen($currentToken)) {
72                     $this->_tokens[] = new Zend_Search_Lucene_Search_QueryToken(Zend_Search_Lucene_Search_QueryToken::TOKTYPE_WORD,
73                                                                 $currentToken);
74                     $currentToken = '';
75                 }
77                 if ($inputString{$count} == '+' || $inputString{$count} == '-') {
78                     $this->_tokens[] = new Zend_Search_Lucene_Search_QueryToken(Zend_Search_Lucene_Search_QueryToken::TOKTYPE_SIGN,
79                                                                 $inputString{$count});
80                 } elseif ($inputString{$count} == '(' || $inputString{$count} == ')') {
81                     $this->_tokens[] = new Zend_Search_Lucene_Search_QueryToken(Zend_Search_Lucene_Search_QueryToken::TOKTYPE_BRACKET,
82                                                                 $inputString{$count});
83                 } elseif ($inputString{$count} == ':' && $this->count()) {
84                     if ($this->_tokens[count($this->_tokens)-1]->type == Zend_Search_Lucene_Search_QueryToken::TOKTYPE_WORD) {
85                         $this->_tokens[count($this->_tokens)-1]->type = Zend_Search_Lucene_Search_QueryToken::TOKTYPE_FIELD;
86                     }
87                 }
88             }
89         }
91         if (strlen($currentToken)) {
92             $this->_tokens[] = new Zend_Search_Lucene_Search_QueryToken(Zend_Search_Lucene_Search_QueryToken::TOKTYPE_WORD, $currentToken);
93         }
94     }
97     /**
98      * Returns number of tokens
99      *
100      * @return integer
101      */
102     public function count()
103     {
104         return count($this->_tokens);
105     }
108     /**
109      * Returns TRUE if a token exists at the current position.
110      *
111      * @return boolean
112      */
113     public function valid()
114     {
115         return $this->_currToken < $this->count();
116     }
119     /**
120      * Resets token stream.
121      *
122      * @return integer
123      */
124     public function rewind()
125     {
126         $this->_currToken = 0;
127     }
130     /**
131      * Returns the token at the current position or FALSE if
132      * the position does not contain a valid token.
133      *
134      * @return mixed
135      */
136     public function current()
137     {
138         return $this->valid() ? $this->_tokens[$this->_currToken] : false;
139     }
142     /**
143      * Returns next token
144      *
145      * @return Zend_Search_Lucene_Search_QueryToken
146      */
147     public function next()
148     {
149         return ++$this->_currToken;
150     }
153     /**
154      * Return the position of the current token.
155      *
156      * @return integer
157      */
158     public function key()
159     {
160         return $this->_currToken;
161     }