Beispiel #1
0
 public function testFilesystemSubfoldersAutoCreation()
 {
     $directory = new Directory\Filesystem(__DIR__ . '/_tempFiles/_files/dir1/dir2/dir3');
     $this->assertTrue($directory instanceof Directory\DirectoryInterface);
     $directory->close();
     rmdir(__DIR__ . '/_tempFiles/_files/dir1/dir2/dir3');
     rmdir(__DIR__ . '/_tempFiles/_files/dir1/dir2');
     rmdir(__DIR__ . '/_tempFiles/_files/dir1');
 }
    public function testMerge()
    {
        $segmentsDirectory = new Directory\Filesystem(__DIR__ . '/_source/_files');
        $outputDirectory   = new Directory\Filesystem(__DIR__ . '/_files');
        $segmentsList = array('_0', '_1', '_2', '_3', '_4');

        $segmentMerger = new Index\SegmentMerger($outputDirectory, 'mergedSegment');

        foreach ($segmentsList as $segmentName) {
            $segmentMerger->addSource(new Index\SegmentInfo($segmentsDirectory, $segmentName, 2));
        }

        $mergedSegment = $segmentMerger->merge();
        $this->assertTrue($mergedSegment instanceof Index\SegmentInfo);
        unset($mergedSegment);

        $mergedFile = $outputDirectory->getFileObject('mergedSegment.cfs');
        $mergedFileData = $mergedFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs'));

        $sampleFile = $outputDirectory->getFileObject('mergedSegment.cfs.sample');
        $sampleFileData = $sampleFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs.sample'));

        $this->assertEquals($mergedFileData, $sampleFileData);

        $outputDirectory->deleteFile('mergedSegment.cfs');
    }
Beispiel #3
0
 /**
  * Write changes if it's necessary.
  *
  * This method must be invoked only from the Writer _updateSegments() method,
  * so index Write lock has to be already obtained.
  *
  * @internal
  * @throws Zend\Search\Lucene\Exception\RuntimeException
  */
 public function writeChanges()
 {
     // Get new generation number
     $latestDelGen = $this->_detectLatestDelGen();
     if (!$this->_deletedDirty) {
         // There was no deletions by current process
         if ($latestDelGen == $this->_delGen) {
             // Delete file hasn't been updated by any concurrent process
             return;
         } else {
             if ($latestDelGen > $this->_delGen) {
                 // Delete file has been updated by some concurrent process
                 // Reload deletions file
                 $this->_delGen = $latestDelGen;
                 $this->_deleted = $this->_loadDelFile();
                 return;
             } else {
                 throw new RuntimeException('Delete file processing workflow is corrupted for the segment \'' . $this->_name . '\'.');
             }
         }
     }
     if ($latestDelGen > $this->_delGen) {
         // Merge current deletions with latest deletions file
         $this->_delGen = $latestDelGen;
         $latestDelete = $this->_loadDelFile();
         if (extension_loaded('bitset')) {
             $this->_deleted = bitset_union($this->_deleted, $latestDelete);
         } else {
             $this->_deleted += $latestDelete;
         }
     }
     if (extension_loaded('bitset')) {
         $delBytes = $this->_deleted;
         $bitCount = count(bitset_to_array($delBytes));
     } else {
         $byteCount = floor($this->_docCount / 8) + 1;
         $delBytes = str_repeat(chr(0), $byteCount);
         for ($count = 0; $count < $byteCount; $count++) {
             $byte = 0;
             for ($bit = 0; $bit < 8; $bit++) {
                 if (isset($this->_deleted[$count * 8 + $bit])) {
                     $byte |= 1 << $bit;
                 }
             }
             $delBytes[$count] = chr($byte);
         }
         $bitCount = count($this->_deleted);
     }
     if ($this->_delGen == -1) {
         // Set delete file generation number to 1
         $this->_delGen = 1;
     } else {
         // Increase delete file generation number by 1
         $this->_delGen++;
     }
     $delFile = $this->_directory->createFile($this->_name . '_' . base_convert($this->_delGen, 10, 36) . '.del');
     $delFile->writeInt($this->_docCount);
     $delFile->writeInt($bitCount);
     $delFile->writeBytes($delBytes);
     $this->_deletedDirty = false;
 }
Beispiel #4
0
    public function testDelete()
    {
        $directory = new Directory\Filesystem(__DIR__ . '/_source/_files');

        $segmentInfo = new Index\SegmentInfo($directory, '_1', 2, 0 /* search for _1.del file */);
        $this->assertFalse($segmentInfo->hasDeletions());

        $segmentInfo->delete(0);
        $this->assertTrue($segmentInfo->hasDeletions());
        $delGen = $segmentInfo->getDelGen();
        // don't write changes
        unset($segmentInfo);

        $segmentInfo1 = new Index\SegmentInfo($directory, '_1', 2, $delGen);
        // Changes wasn't written, segment still has no deletions
        $this->assertFalse($segmentInfo1->hasDeletions());

        $segmentInfo1->delete(0);
        $segmentInfo1->writeChanges();
        $delGen = $segmentInfo1->getDelGen();
        unset($segmentInfo1);

        $segmentInfo2 = new Index\SegmentInfo($directory, '_1', 2, $delGen);
        $this->assertTrue($segmentInfo2->hasDeletions());
        unset($segmentInfo2);

        $directory->deleteFile('_1_' . base_convert($delGen, 10, 36) . '.del');

        $segmentInfo3 = new Index\SegmentInfo($directory, '_1', 2, -1 /* no detetions file */);
        $this->assertFalse($segmentInfo3->hasDeletions());
    }