import
[web.mtrack] / inc / lib / Zend / Search / Lucene / TermStreamsPriorityQueue.php
1 <?php\r
2 /**\r
3  * Zend Framework\r
4  *\r
5  * LICENSE\r
6  *\r
7  * This source file is subject to the new BSD license that is bundled\r
8  * with this package in the file LICENSE.txt.\r
9  * It is also available through the world-wide-web at this URL:\r
10  * http://framework.zend.com/license/new-bsd\r
11  * If you did not receive a copy of the license and are unable to\r
12  * obtain it through the world-wide-web, please send an email\r
13  * to license@zend.com so we can send you a copy immediately.\r
14  *\r
15  * @category   Zend\r
16  * @package    Zend_Search_Lucene\r
17  * @subpackage Index\r
18  * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)\r
19  * @license    http://framework.zend.com/license/new-bsd     New BSD License\r
20  * @version    $Id: TermStreamsPriorityQueue.php 16971 2009-07-22 18:05:45Z mikaelkael $\r
21  */\r
22 \r
23 /** Zend_Search_Lucene_Index_TermsStream_Interface */\r
24 require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php';\r
25 \r
26 /** Zend_Search_Lucene_Index_TermsPriorityQueue */\r
27 require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php';\r
28 \r
29 \r
30 /**\r
31  * @category   Zend\r
32  * @package    Zend_Search_Lucene\r
33  * @subpackage Index\r
34  * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)\r
35  * @license    http://framework.zend.com/license/new-bsd     New BSD License\r
36  */\r
37 class Zend_Search_Lucene_TermStreamsPriorityQueue implements Zend_Search_Lucene_Index_TermsStream_Interface\r
38 {\r
39         /**\r
40          * Array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)\r
41          *\r
42          * @var array\r
43          */\r
44         protected $_termStreams;\r
45 \r
46         /**\r
47      * Terms stream queue\r
48      *\r
49      * @var Zend_Search_Lucene_Index_TermsPriorityQueue\r
50      */\r
51     protected $_termsStreamQueue = null;\r
52 \r
53     /**\r
54      * Last Term in a terms stream\r
55      *\r
56      * @var Zend_Search_Lucene_Index_Term\r
57      */\r
58     protected $_lastTerm = null;\r
59 \r
60 \r
61     /**\r
62      * Object constructor\r
63      *\r
64      * @param array $termStreams  array of term streams (Zend_Search_Lucene_Index_TermsStream_Interface objects)\r
65      */\r
66         public function __construct(array $termStreams)\r
67         {\r
68                 $this->_termStreams = $termStreams;\r
69 \r
70                 $this->resetTermsStream();\r
71         }\r
72 \r
73         /**\r
74      * Reset terms stream.\r
75      */\r
76     public function resetTermsStream()\r
77     {\r
78         $this->_termsStreamQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue();\r
79 \r
80         foreach ($this->_termStreams as $termStream) {\r
81             $termStream->resetTermsStream();\r
82 \r
83             // Skip "empty" containers\r
84             if ($termStream->currentTerm() !== null) {\r
85                 $this->_termsStreamQueue->put($termStream);\r
86             }\r
87         }\r
88 \r
89         $this->nextTerm();\r
90     }\r
91 \r
92     /**\r
93      * Skip terms stream up to specified term preffix.\r
94      *\r
95      * Prefix contains fully specified field info and portion of searched term\r
96      *\r
97      * @param Zend_Search_Lucene_Index_Term $prefix\r
98      */\r
99     public function skipTo(Zend_Search_Lucene_Index_Term $prefix)\r
100     {\r
101         $termStreams = array();\r
102 \r
103         while (($termStream = $this->_termsStreamQueue->pop()) !== null) {\r
104             $termStreams[] = $termStream;\r
105         }\r
106 \r
107         foreach ($termStreams as $termStream) {\r
108             $termStream->skipTo($prefix);\r
109 \r
110             if ($termStream->currentTerm() !== null) {\r
111                 $this->_termsStreamQueue->put($termStream);\r
112             }\r
113         }\r
114 \r
115         $this->nextTerm();\r
116     }\r
117 \r
118     /**\r
119      * Scans term streams and returns next term\r
120      *\r
121      * @return Zend_Search_Lucene_Index_Term|null\r
122      */\r
123     public function nextTerm()\r
124     {\r
125         while (($termStream = $this->_termsStreamQueue->pop()) !== null) {\r
126             if ($this->_termsStreamQueue->top() === null ||\r
127                 $this->_termsStreamQueue->top()->currentTerm()->key() !=\r
128                             $termStream->currentTerm()->key()) {\r
129                 // We got new term\r
130                 $this->_lastTerm = $termStream->currentTerm();\r
131 \r
132                 if ($termStream->nextTerm() !== null) {\r
133                     // Put segment back into the priority queue\r
134                     $this->_termsStreamQueue->put($termStream);\r
135                 }\r
136 \r
137                 return $this->_lastTerm;\r
138             }\r
139 \r
140             if ($termStream->nextTerm() !== null) {\r
141                 // Put segment back into the priority queue\r
142                 $this->_termsStreamQueue->put($termStream);\r
143             }\r
144         }\r
145 \r
146         // End of stream\r
147         $this->_lastTerm = null;\r
148 \r
149         return null;\r
150     }\r
151 \r
152     /**\r
153      * Returns term in current position\r
154      *\r
155      * @return Zend_Search_Lucene_Index_Term|null\r
156      */\r
157     public function currentTerm()\r
158     {\r
159         return $this->_lastTerm;\r
160     }\r
161 \r
162     /**\r
163      * Close terms stream\r
164      *\r
165      * Should be used for resources clean up if stream is not read up to the end\r
166      */\r
167     public function closeTermsStream()\r
168     {\r
169         while (($termStream = $this->_termsStreamQueue->pop()) !== null) {\r
170             $termStream->closeTermsStream();\r
171         }\r
172 \r
173         $this->_termsStreamQueue = null;\r
174         $this->_lastTerm         = null;\r
175     }\r
176 }\r