PageRenderTime 59ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/xampp/htdocs/magento/lib/Zend/Search/Lucene/Index/SegmentMerger.php

https://github.com/edmondscommerce/XAMPP-Magento-Demo-Site
PHP | 270 lines | 132 code | 38 blank | 100 comment | 17 complexity | 7ecd443b509c162d738eb23301fee276 MD5 | raw file
  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 Index
  18. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. /** Zend_Search_Lucene_Index_SegmentInfo */
  22. #require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
  23. /** Zend_Search_Lucene_Index_SegmentWriter_StreamWriter */
  24. #require_once 'Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php';
  25. /** Zend_Search_Lucene_Index_SegmentInfoPriorityQueue */
  26. #require_once 'Zend/Search/Lucene/Index/SegmentInfoPriorityQueue.php';
  27. /**
  28. * @category Zend
  29. * @package Zend_Search_Lucene
  30. * @subpackage Index
  31. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  32. * @license http://framework.zend.com/license/new-bsd New BSD License
  33. */
  34. class Zend_Search_Lucene_Index_SegmentMerger
  35. {
  36. /**
  37. * Target segment writer
  38. *
  39. * @var Zend_Search_Lucene_Index_SegmentWriter_StreamWriter
  40. */
  41. private $_writer;
  42. /**
  43. * Number of docs in a new segment
  44. *
  45. * @var integer
  46. */
  47. private $_docCount;
  48. /**
  49. * A set of segments to be merged
  50. *
  51. * @var array Zend_Search_Lucene_Index_SegmentInfo
  52. */
  53. private $_segmentInfos = array();
  54. /**
  55. * Flag to signal, that merge is already done
  56. *
  57. * @var boolean
  58. */
  59. private $_mergeDone = false;
  60. /**
  61. * Field map
  62. * [<segment_name>][<field_number>] => <target_field_number>
  63. *
  64. * @var array
  65. */
  66. private $_fieldsMap = array();
  67. /**
  68. * Object constructor.
  69. *
  70. * Creates new segment merger with $directory as target to merge segments into
  71. * and $name as a name of new segment
  72. *
  73. * @param Zend_Search_Lucene_Storage_Directory $directory
  74. * @param string $name
  75. */
  76. public function __construct($directory, $name)
  77. {
  78. $this->_writer = new Zend_Search_Lucene_Index_SegmentWriter_StreamWriter($directory, $name);
  79. }
  80. /**
  81. * Add segmnet to a collection of segments to be merged
  82. *
  83. * @param Zend_Search_Lucene_Index_SegmentInfo $segment
  84. */
  85. public function addSource(Zend_Search_Lucene_Index_SegmentInfo $segmentInfo)
  86. {
  87. $this->_segmentInfos[$segmentInfo->getName()] = $segmentInfo;
  88. }
  89. /**
  90. * Do merge.
  91. *
  92. * Returns number of documents in newly created segment
  93. *
  94. * @return Zend_Search_Lucene_Index_SegmentInfo
  95. * @throws Zend_Search_Lucene_Exception
  96. */
  97. public function merge()
  98. {
  99. if ($this->_mergeDone) {
  100. #require_once 'Zend/Search/Lucene/Exception.php';
  101. throw new Zend_Search_Lucene_Exception('Merge is already done.');
  102. }
  103. if (count($this->_segmentInfos) < 1) {
  104. #require_once 'Zend/Search/Lucene/Exception.php';
  105. throw new Zend_Search_Lucene_Exception('Wrong number of segments to be merged ('
  106. . count($this->_segmentInfos)
  107. . ').');
  108. }
  109. $this->_mergeFields();
  110. $this->_mergeNorms();
  111. $this->_mergeStoredFields();
  112. $this->_mergeTerms();
  113. $this->_mergeDone = true;
  114. return $this->_writer->close();
  115. }
  116. /**
  117. * Merge fields information
  118. */
  119. private function _mergeFields()
  120. {
  121. foreach ($this->_segmentInfos as $segName => $segmentInfo) {
  122. foreach ($segmentInfo->getFieldInfos() as $fieldInfo) {
  123. $this->_fieldsMap[$segName][$fieldInfo->number] = $this->_writer->addFieldInfo($fieldInfo);
  124. }
  125. }
  126. }
  127. /**
  128. * Merge field's normalization factors
  129. */
  130. private function _mergeNorms()
  131. {
  132. foreach ($this->_writer->getFieldInfos() as $fieldInfo) {
  133. if ($fieldInfo->isIndexed) {
  134. foreach ($this->_segmentInfos as $segName => $segmentInfo) {
  135. if ($segmentInfo->hasDeletions()) {
  136. $srcNorm = $segmentInfo->normVector($fieldInfo->name);
  137. $norm = '';
  138. $docs = $segmentInfo->count();
  139. for ($count = 0; $count < $docs; $count++) {
  140. if (!$segmentInfo->isDeleted($count)) {
  141. $norm .= $srcNorm[$count];
  142. }
  143. }
  144. $this->_writer->addNorm($fieldInfo->name, $norm);
  145. } else {
  146. $this->_writer->addNorm($fieldInfo->name, $segmentInfo->normVector($fieldInfo->name));
  147. }
  148. }
  149. }
  150. }
  151. }
  152. /**
  153. * Merge fields information
  154. */
  155. private function _mergeStoredFields()
  156. {
  157. $this->_docCount = 0;
  158. foreach ($this->_segmentInfos as $segName => $segmentInfo) {
  159. $fdtFile = $segmentInfo->openCompoundFile('.fdt');
  160. for ($count = 0; $count < $segmentInfo->count(); $count++) {
  161. $fieldCount = $fdtFile->readVInt();
  162. $storedFields = array();
  163. for ($count2 = 0; $count2 < $fieldCount; $count2++) {
  164. $fieldNum = $fdtFile->readVInt();
  165. $bits = $fdtFile->readByte();
  166. $fieldInfo = $segmentInfo->getField($fieldNum);
  167. if (!($bits & 2)) { // Text data
  168. $storedFields[] =
  169. new Zend_Search_Lucene_Field($fieldInfo->name,
  170. $fdtFile->readString(),
  171. 'UTF-8',
  172. true,
  173. $fieldInfo->isIndexed,
  174. $bits & 1 );
  175. } else { // Binary data
  176. $storedFields[] =
  177. new Zend_Search_Lucene_Field($fieldInfo->name,
  178. $fdtFile->readBinary(),
  179. '',
  180. true,
  181. $fieldInfo->isIndexed,
  182. $bits & 1,
  183. true);
  184. }
  185. }
  186. if (!$segmentInfo->isDeleted($count)) {
  187. $this->_docCount++;
  188. $this->_writer->addStoredFields($storedFields);
  189. }
  190. }
  191. }
  192. }
  193. /**
  194. * Merge fields information
  195. */
  196. private function _mergeTerms()
  197. {
  198. $segmentInfoQueue = new Zend_Search_Lucene_Index_SegmentInfoPriorityQueue();
  199. $segmentStartId = 0;
  200. foreach ($this->_segmentInfos as $segName => $segmentInfo) {
  201. $segmentStartId = $segmentInfo->reset($segmentStartId, Zend_Search_Lucene_Index_SegmentInfo::SM_MERGE_INFO);
  202. // Skip "empty" segments
  203. if ($segmentInfo->currentTerm() !== null) {
  204. $segmentInfoQueue->put($segmentInfo);
  205. }
  206. }
  207. $this->_writer->initializeDictionaryFiles();
  208. $termDocs = array();
  209. while (($segmentInfo = $segmentInfoQueue->pop()) !== null) {
  210. // Merge positions array
  211. $termDocs += $segmentInfo->currentTermPositions();
  212. if ($segmentInfoQueue->top() === null ||
  213. $segmentInfoQueue->top()->currentTerm()->key() !=
  214. $segmentInfo->currentTerm()->key()) {
  215. // We got new term
  216. ksort($termDocs, SORT_NUMERIC);
  217. // Add term if it's contained in any document
  218. if (count($termDocs) > 0) {
  219. $this->_writer->addTerm($segmentInfo->currentTerm(), $termDocs);
  220. }
  221. $termDocs = array();
  222. }
  223. $segmentInfo->nextTerm();
  224. // check, if segment dictionary is finished
  225. if ($segmentInfo->currentTerm() !== null) {
  226. // Put segment back into the priority queue
  227. $segmentInfoQueue->put($segmentInfo);
  228. }
  229. }
  230. $this->_writer->closeDictionaryFiles();
  231. }
  232. }