_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); } }