/** * Asserts the complexity for an index * * The complexity is always O(log(n)). * * @param IndexGenerator $generator Index generator * @param SplitCounter $counter Split counter in binary search * * @return float */ protected function assertComplexity(IndexGenerator $generator, SplitCounter $counter) { if (\count($counter) == 0) { return; } $this->assertLessThan(\log($generator->getIndexLength(), 2) * 2, \count($counter)); }
/** * Test for the search complexity * * @dataProvider provideTestComplexity */ public function testComplexity(IndexGenerator $generator) { $index = $generator->getIndex(); foreach ($index as $result) { $counter = new SplitCounter(); $index->search($result->getKey()); $counter->stopCounting(); $this->assertComplexity($generator, $counter); } }
/** * Test cases for testFailSearch() * * @return void */ public function provideTestFailSearch() { $cases = array(); // different sizes $lengths = array(0, 1, 10, IndexGenerator::getBlockSize() - 1, IndexGenerator::getBlockSize(), IndexGenerator::getBlockSize() + 1, IndexGenerator::getBlockSize() * 4); foreach ($lengths as $length) { // Fail searching for MIN(index) - 1 $generator = new FixedSizeIndexGenerator(); $generator->setIndexLength($length); $generator->getIndex(); $cases[] = array($generator->getIndex(), $generator->getMinimum() - 1); // Fail searching for MAX(index) + 1 $generator = new FixedSizeIndexGenerator(); $generator->setIndexLength($length); $generator->getIndex(); $cases[] = array($generator->getIndex(), $generator->getMaximum() + 1); // Fail searching for any missing key inside the index range $generator = new FixedSizeIndexGenerator(); $generator->setIndexLength($length); $generator->setStepSize(2); $generator->getIndex(); $cases[] = array($generator->getIndex(), $generator->getMaximum() / 2 + 0.1); } return $cases; }
/** * @dataProvider provideTestAllValidRanges */ public function testAllValidRanges(IndexGenerator $generator) { $index = $generator->getIndex(); for ($length = 0; $length <= $generator->getIndexLength(); $length++) { for ($min = $generator->getMinimum(); $min + $length <= $generator->getMaximum(); $min++) { $range = new index\Range($min, $min + $length); $range->setInclusive(true); $foundKeys = index\IteratorUtil::toKeysArray($index->searchRange($range)); $expectedKeys = array(); for ($key = $range->getMin(); $key <= $range->getMax(); $key++) { $expectedKeys[] = $key; } $this->assertEquals($expectedKeys, $foundKeys, "failed range[{$range->getMin()}, {$range->getMax()}] for index[{$generator->getMinimum()}, {$generator->getMaximum()}]"); } } }
/** * Tests iterating with a different offset * * @dataProvider provideTestCases */ public function testOffset(IndexGenerator $generator) { $index = $generator->getIndex(); $expectedResults = array(); foreach ($index->getIterator() as $result) { $expectedResults[] = $result; } for ($offset = 0; $offset < $index->getFile()->getFileSize(); $offset++) { // shift $expectedResults after passing the first offset if (isset($expectedResults[0]) && $offset > $expectedResults[0]->getOffset()) { array_shift($expectedResults); } $iterator = $index->getIterator(); if (isset($expectedResults[0]) && $offset == $expectedResults[0]->getOffset()) { $iterator->setOffset($offset, index\Parser::HINT_RESULT_BOUNDARY); } else { $iterator->setOffset($offset); } $results = array(); foreach ($iterator as $result) { $results[] = $result; } $expectedArray = $this->toPrimitiveResultArray($expectedResults); $resultArray = $this->toPrimitiveResultArray($results); $this->assertEquals($expectedArray, $resultArray, "not equal at offset {$offset}"); } }
/** * Returns the characteristic properties of this index * * This is used for the file name creation. * * @return array */ protected function getIndexProperties() { return array_merge(parent::getIndexProperties(), array($this->indexFieldOffset, $this->getIndexFieldLength())); }