summaryrefslogtreecommitdiff
path: root/demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php
diff options
context:
space:
mode:
Diffstat (limited to 'demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php')
-rw-r--r--demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php308
1 files changed, 308 insertions, 0 deletions
diff --git a/demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php b/demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php
new file mode 100644
index 00000000..da4af000
--- /dev/null
+++ b/demos/quickstart/protected/index/Zend/Search/Lucene/Index/Writer.php
@@ -0,0 +1,308 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to version 1.0 of the Zend Framework
+ * license, that is bundled with this package in the file LICENSE, and
+ * is available through the world-wide-web at the following URL:
+ * http://www.zend.com/license/framework/1_0.txt. If you did not receive
+ * a copy of the Zend Framework license and are unable to obtain it
+ * through the world-wide-web, please send a note to license@zend.com
+ * so we can mail you a copy immediately.
+ *
+ * @package Zend_Search_Lucene
+ * @subpackage Index
+ * @copyright Copyright (c) 2005-2006 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+
+
+/** Zend_Search_Lucene_Index_SegmentWriter */
+require_once 'Zend/Search/Lucene/Index/SegmentWriter.php';
+
+/** Zend_Search_Lucene_Index_SegmentInfo */
+require_once 'Zend/Search/Lucene/Index/SegmentInfo.php';
+
+
+/**
+ * @package Zend_Search_Lucene
+ * @subpackage Index
+ * @copyright Copyright (c) 2005-2006 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0
+ */
+class Zend_Search_Lucene_Index_Writer
+{
+ /**
+ * @todo Implement segment merger
+ * @todo Implement mergeFactor, minMergeDocs, maxMergeDocs usage.
+ * @todo Implement Analyzer substitution
+ * @todo Implement Zend_Search_Lucene_Storage_DirectoryRAM and Zend_Search_Lucene_Storage_FileRAM to use it for
+ * temporary index files
+ * @todo Directory lock processing
+ */
+
+ /**
+ * File system adapter.
+ *
+ * @var Zend_Search_Lucene_Storage_Directory
+ */
+ private $_directory = null;
+
+
+ /**
+ * Index version
+ * Counts how often the index has been changed by adding or deleting docs
+ *
+ * @var integer
+ */
+ private $_version;
+
+ /**
+ * Segment name counter.
+ * Used to name new segments .
+ *
+ * @var integer
+ */
+ private $_segmentNameCounter;
+
+ /**
+ * Number of the segments in the index
+ *
+ * @var inteher
+ */
+ private $_segments;
+
+ /**
+ * Determines how often segment indices
+ * are merged by addDocument().
+ *
+ * @var integer
+ */
+ public $mergeFactor;
+
+ /**
+ * Determines the minimal number of documents required before
+ * the buffered in-memory documents are merging and a new Segment
+ * is created.
+ *
+ * @var integer
+ */
+ public $minMergeDocs;
+
+ /**
+ * Determines the largest number of documents ever merged by addDocument().
+ *
+ * @var integer
+ */
+ public $maxMergeDocs;
+
+ /**
+ * List of the segments, created by index writer
+ * Array of Zend_Search_Lucene_Index_SegmentInfo objects
+ *
+ * @var array
+ */
+ private $_newSegments;
+
+ /**
+ * Current segment to add documents
+ *
+ * @var Zend_Search_Lucene_Index_SegmentWriter
+ */
+ private $_currentSegment;
+
+ /**
+ * Opens the index for writing
+ *
+ * IndexWriter constructor needs Directory as a parameter. It should be
+ * a string with a path to the index folder or a Directory object.
+ * Second constructor parameter create is optional - true to create the
+ * index or overwrite the existing one.
+ *
+ * @param Zend_Search_Lucene_Storage_Directory $directory
+ * @param boolean $create
+ */
+ public function __construct(Zend_Search_Lucene_Storage_Directory $directory, $create = false)
+ {
+ $this->_directory = $directory;
+
+ if ($create) {
+ foreach ($this->_directory->fileList() as $file) {
+ if ($file == 'deletable' ||
+ $file == 'segments' ||
+ substr($file, strlen($file)-4) == '.cfs') {
+ $this->_directory->deleteFile($file);
+ }
+ }
+ $segmentsFile = $this->_directory->createFile('segments');
+ $segmentsFile->writeInt((int)0xFFFFFFFF);
+ // write version
+ $segmentsFile->writeLong(0);
+ // write name counter
+ $segmentsFile->writeInt(0);
+ // write segment counter
+ $segmentsFile->writeInt(0);
+
+ $deletableFile = $this->_directory->createFile('deletable');
+ // write counter
+ $deletableFile->writeInt(0);
+
+ $this->_version = 0;
+ $this->_segmentNameCounter = 0;
+ $this->_segments = 0;
+ } else {
+ $segmentsFile = $this->_directory->getFileObject('segments');
+ $format = $segmentsFile->readInt();
+ if ($format != (int)0xFFFFFFFF) {
+ throw new Zend_Search_Lucene_Exception('Wrong segments file format');
+ }
+
+ // read version
+ $this->_version = $segmentsFile->readLong();
+ // read counter
+ $this->_segmentNameCounter = $segmentsFile->readInt();
+ // read segment counter
+ $this->_segments = $segmentsFile->readInt();
+ }
+
+ $this->_newSegments = array();
+ $this->_currentSegment = null;
+ }
+
+ /**
+ * Adds a document to this index.
+ *
+ * @param Zend_Search_Lucene_Document $document
+ */
+ public function addDocument(Zend_Search_Lucene_Document $document)
+ {
+ if ($this->_currentSegment === null) {
+ $this->_currentSegment =
+ new Zend_Search_Lucene_Index_SegmentWriter($this->_directory, $this->_newSegmentName());
+ }
+ $this->_currentSegment->addDocument($document);
+ $this->_version++;
+ }
+
+
+
+ /**
+ * Update segments file by adding current segment to a list
+ * @todo !!!!!Finish the implementation
+ *
+ * @throws Zend_Search_Lucene_Exception
+ */
+ private function _updateSegments()
+ {
+ $segmentsFile = $this->_directory->getFileObject('segments');
+ $newSegmentFile = $this->_directory->createFile('segments.new');
+
+ $newSegmentFile->writeInt((int)0xFFFFFFFF);
+ $newSegmentFile->writeLong($this->_version);
+ $newSegmentFile->writeInt($this->_segmentNameCounter);
+ $newSegmentFile->writeInt($this->_segments + count($this->_newSegments));
+
+ $segmentsFile->seek(20);
+ $newSegmentFile->writeBytes($segmentsFile->readBytes($this->_directory->fileLength('segments') - 20));
+
+ foreach ($this->_newSegments as $segmentName => $segmentInfo) {
+ $newSegmentFile->writeString($segmentName);
+ $newSegmentFile->writeInt($segmentInfo->count());
+ }
+
+ $this->_directory->renameFile('segments.new', 'segments');
+ }
+
+
+ /**
+ * Commit current changes
+ * returns array of new segments
+ *
+ * @return array
+ */
+ public function commit()
+ {
+ if ($this->_currentSegment !== null) {
+ $newSegment = $this->_currentSegment->close();
+ if ($newSegment !== null) {
+ $this->_newSegments[$newSegment->getName()] = $newSegment;
+ }
+ $this->_currentSegment = null;
+ }
+
+ if (count($this->_newSegments) != 0) {
+ $this->_updateSegments();
+ }
+
+ $result = $this->_newSegments;
+ $this->_newSegments = array();
+
+ return $result;
+ }
+
+
+ /**
+ * Merges the provided indexes into this index.
+ *
+ * @param array $readers
+ * @return void
+ */
+ public function addIndexes($readers)
+ {
+ /**
+ * @todo implementation
+ */
+ }
+
+
+ /**
+ * Returns the number of documents currently in this index.
+ *
+ * @return integer
+ */
+ public function docCount($readers)
+ {
+ /**
+ * @todo implementation
+ */
+ }
+
+
+ /**
+ * Flushes all changes to an index and closes all associated files.
+ *
+ */
+ public function close()
+ {
+ /**
+ * @todo implementation
+ */
+ }
+
+
+ /**
+ * Merges all segments together into a single segment, optimizing
+ * an index for search.
+ *
+ * return void
+ */
+ public function optimize()
+ {
+ /**
+ * @todo implementation
+ */
+ }
+
+ /**
+ * Get name for new segment
+ *
+ * @return string
+ */
+ private function _newSegmentName()
+ {
+ return '_' . base_convert($this->_segmentNameCounter++, 10, 36);
+ }
+
+}