Commit fefdb978 authored by Katherine Walker's avatar Katherine Walker

Improve ExplainTest and ExplainFunctionalTest

parent c7b2b033
...@@ -80,16 +80,12 @@ class Explain implements Executable ...@@ -80,16 +80,12 @@ class Explain implements Executable
throw UnsupportedException::explainNotSupported(); throw UnsupportedException::explainNotSupported();
} }
if ($this->explainable instanceOf \MongoDB\Operation\Distinct) { if ($this->explainable instanceof \MongoDB\Operation\Distinct && ! \MongoDB\server_supports_feature($server, self::$wireVersionForDistinct)) {
if (! \MongoDB\server_supports_feature($server, self::$wireVersionForDistinct)) { throw UnsupportedException::explainNotSupported();
throw UnsupportedException::explainNotSupported();
}
} }
if ($this->explainable instanceOf \MongoDB\Operation\FindAndModify) { if ($this->explainable instanceof \MongoDB\Operation\FindAndModify && ! \MongoDB\server_supports_feature($server, self::$wireVersionForFindAndModify)) {
if (! \MongoDB\server_supports_feature($server, self::$wireVersionForFindAndModify)) { throw UnsupportedException::explainNotSupported();
throw UnsupportedException::explainNotSupported();
}
} }
$cmd = ['explain' => $this->explainable->getCommandDocument()]; $cmd = ['explain' => $this->explainable->getCommandDocument()];
......
...@@ -22,65 +22,10 @@ class ExplainFunctionalTest extends FunctionalTestCase ...@@ -22,65 +22,10 @@ class ExplainFunctionalTest extends FunctionalTestCase
} }
} }
public function testCountAllPlansExecution() /**
{ * @dataProvider provideVerbosityInformation
$insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [ */
['x' => 0], public function testCount($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
['x' => 1],
['x' => 2],
['y' => 3]
]);
$insertMany->execute($this->getPrimaryServer());
$operation = new Count($this->getDatabaseName(), $this->getCollectionName(), ['x' => ['$gte' => 1]], []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_ALL_PLANS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testCountDefaultVerbosity()
{
$insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [
['x' => 0],
['x' => 1],
['x' => 2],
['y' => 3]
]);
$insertMany->execute($this->getPrimaryServer());
$operation = new Count($this->getDatabaseName(), $this->getCollectionName(), ['x' => ['$gte' => 1]], []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testCountExecutionStats()
{
$insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [
['x' => 0],
['x' => 1],
['x' => 2],
['y' => 3]
]);
$insertMany->execute($this->getPrimaryServer());
$operation = new Count($this->getDatabaseName(), $this->getCollectionName(), ['x' => ['$gte' => 1]], []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_EXEC_STATS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertFalse(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testCountQueryPlanner()
{ {
$insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [ $insertMany = new InsertMany($this->getDatabaseName(), $this->getCollectionName(), [
['x' => 0], ['x' => 0],
...@@ -91,62 +36,16 @@ class ExplainFunctionalTest extends FunctionalTestCase ...@@ -91,62 +36,16 @@ class ExplainFunctionalTest extends FunctionalTestCase
$insertMany->execute($this->getPrimaryServer()); $insertMany->execute($this->getPrimaryServer());
$operation = new Count($this->getDatabaseName(), $this->getCollectionName(), ['x' => ['$gte' => 1]], []); $operation = new Count($this->getDatabaseName(), $this->getCollectionName(), ['x' => ['$gte' => 1]], []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_QUERY, 'typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertFalse(array_key_exists('executionStats', $result));
}
public function testDistinctAllPlansExecution()
{
if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('Distinct is not supported on servers with version < 3.2');
}
$operation = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_ALL_PLANS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
} }
public function testDistinctDefaultVerbosity() /**
{ * @dataProvider provideVerbosityInformation
if (version_compare($this->getServerVersion(), '3.2.0', '<')) { */
$this->markTestSkipped('Distinct is not supported on servers with version < 3.2'); public function testDistinct($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
}
$operation = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testDistinctExecutionStats()
{
if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('Distinct is not supported on servers with version < 3.2');
}
$operation = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_EXEC_STATS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertFalse(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testDistinctQueryPlanner()
{ {
if (version_compare($this->getServerVersion(), '3.2.0', '<')) { if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('Distinct is not supported on servers with version < 3.2'); $this->markTestSkipped('Distinct is not supported on servers with version < 3.2');
...@@ -154,62 +53,16 @@ class ExplainFunctionalTest extends FunctionalTestCase ...@@ -154,62 +53,16 @@ class ExplainFunctionalTest extends FunctionalTestCase
$operation = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []); $operation = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_QUERY, 'typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertFalse(array_key_exists('executionStats', $result));
} }
public function testFindAndModifyAllPlansExecution() /**
{ * @dataProvider provideVerbosityInformation
if (version_compare($this->getServerVersion(), '3.2.0', '<')) { */
$this->markTestSkipped('FindAndModify is not supported on servers with version < 3.2'); public function testFindAndModify($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
}
$operation = new FindAndModify($this->getDatabaseName(), $this->getCollectionName(), ['remove' => true]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_ALL_PLANS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindAndModifyDefaultVerbosity()
{
if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('FindAndModify is not supported on servers with version < 3.2');
}
$operation = new FindAndModify($this->getDatabaseName(), $this->getCollectionName(), ['remove' => true]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindAndModifyExecutionStats()
{
if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('FindAndModify is not supported on servers with version < 3.2');
}
$operation = new FindAndModify($this->getDatabaseName(), $this->getCollectionName(), ['remove' => true]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_EXEC_STATS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertFalse(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindAndModifyQueryPlanner()
{ {
if (version_compare($this->getServerVersion(), '3.2.0', '<')) { if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('FindAndModify is not supported on servers with version < 3.2'); $this->markTestSkipped('FindAndModify is not supported on servers with version < 3.2');
...@@ -217,69 +70,31 @@ class ExplainFunctionalTest extends FunctionalTestCase ...@@ -217,69 +70,31 @@ class ExplainFunctionalTest extends FunctionalTestCase
$operation = new FindAndModify($this->getDatabaseName(), $this->getCollectionName(), ['remove' => true]); $operation = new FindAndModify($this->getDatabaseName(), $this->getCollectionName(), ['remove' => true]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_QUERY, 'typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertFalse(array_key_exists('executionStats', $result));
} }
public function testFindAllPlansExecution() /**
{ * @dataProvider provideVerbosityInformation
$this->createFixtures(3); */
public function testFind($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
$operation = new Find($this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_ALL_PLANS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindDefaultVerbosity()
{
$this->createFixtures(3);
$operation = new Find($this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindExecutionStats()
{
$this->createFixtures(3);
$operation = new Find($this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_EXEC_STATS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertFalse(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindQueryPlanner()
{ {
$this->createFixtures(3); $this->createFixtures(3);
$operation = new Find($this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()]); $operation = new Find($this->getDatabaseName(), $this->getCollectionName(), [], ['readConcern' => $this->createDefaultReadConcern()]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_QUERY, 'typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertFalse(array_key_exists('executionStats', $result));
} }
public function testFindMaxAwait() /**
* @dataProvider provideVerbosityInformation
*/
public function testFindMaxAwait($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
{ {
if (version_compare($this->getServerVersion(), '3.2.0', '<')) { if (version_compare($this->getServerVersion(), '3.2.0', '<')) {
$this->markTestSkipped('maxAwaitTimeMS option is not supported'); $this->markTestSkipped('maxAwaitTimeMS option is not supported');
...@@ -312,67 +127,49 @@ class ExplainFunctionalTest extends FunctionalTestCase ...@@ -312,67 +127,49 @@ class ExplainFunctionalTest extends FunctionalTestCase
$operation = new Find($databaseName, $cappedCollectionName, [], ['cursorType' => Find::TAILABLE_AWAIT, 'maxAwaitTimeMS' => $maxAwaitTimeMS]); $operation = new Find($databaseName, $cappedCollectionName, [], ['cursorType' => Find::TAILABLE_AWAIT, 'maxAwaitTimeMS' => $maxAwaitTimeMS]);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
}
public function testFindOneAllPlansExecution()
{
$this->createFixtures(1);
$operation = new FindOne($this->getDatabaseName(), $this->getCollectionName(), []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_ALL_PLANS, 'typeMap' => ['root' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
} }
public function testFindOneDefaultVerbosity() /**
* @dataProvider provideVerbosityInformation
*/
public function testFindOne($verbosity, $executionStatsExpected, $allPlansExecutionExpected)
{ {
$this->createFixtures(1); $this->createFixtures(1);
$operation = new FindOne($this->getDatabaseName(), $this->getCollectionName(), []); $operation = new FindOne($this->getDatabaseName(), $this->getCollectionName(), []);
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['typeMap' => ['root' => 'array']]); $explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => $verbosity, 'typeMap' => ['root' => 'array', 'document' => 'array']]);
$result = $explainOperation->execute($this->getPrimaryServer()); $result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result)); $this->assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected);
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertTrue(array_key_exists('allPlansExecution', $result['executionStats']));
} }
public function testFindOneExecutionStats() public function provideVerbosityInformation()
{ {
$this->createFixtures(1); return [
[Explain::VERBOSITY_ALL_PLANS, true, true],
$operation = new FindOne($this->getDatabaseName(), $this->getCollectionName(), []); [Explain::VERBOSITY_EXEC_STATS, true, false],
[Explain::VERBOSITY_QUERY, false, false]
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_EXEC_STATS, 'typeMap' => ['root' => 'array']]); ];
$result = $explainOperation->execute($this->getPrimaryServer());
$this->assertTrue(array_key_exists('queryPlanner', $result));
$this->assertTrue(array_key_exists('executionStats', $result));
$this->assertFalse(array_key_exists('allPlansExecution', $result['executionStats']));
} }
public function testFindOneQueryPlanner() private function assertExplainResult($result, $executionStatsExpected, $allPlansExecutionExpected)
{ {
$this->createFixtures(1); $this->assertArrayHasKey('queryPlanner', $result);
if ($executionStatsExpected) {
$operation = new FindOne($this->getDatabaseName(), $this->getCollectionName(), []); $this->assertArrayHasKey('executionStats', $result);
if ($allPlansExecutionExpected) {
$explainOperation = new Explain($this->getDatabaseName(), $operation, ['verbosity' => Explain::VERBOSITY_QUERY, 'typeMap' => ['root' => 'array']]); $this->assertArrayHasKey('allPlansExecution', $result['executionStats']);
$result = $explainOperation->execute($this->getPrimaryServer()); } else {
$this->assertArrayNotHasKey('allPlansExecution', $result['executionStats']);
$this->assertTrue(array_key_exists('queryPlanner', $result)); }
$this->assertFalse(array_key_exists('executionStats', $result)); } else {
$this->assertArrayNotHasKey('executionStats', $result);
}
} }
/** /**
......
...@@ -12,19 +12,9 @@ class ExplainTest extends TestCase ...@@ -12,19 +12,9 @@ class ExplainTest extends TestCase
* @expectedException MongoDB\Exception\InvalidArgumentException * @expectedException MongoDB\Exception\InvalidArgumentException
* @dataProvider provideInvalidConstructorOptions * @dataProvider provideInvalidConstructorOptions
*/ */
public function testConstructorOptionTypeChecksForCount(array $options) public function testConstructorOptionTypeChecks(array $options)
{ {
$explainable = new Count($this->getDatabaseName(), $this->getCollectionName(),[]); $explainable = $this->createMock('MongoDB\Operation\Explainable');
new Explain($this->getDatabaseName(), $explainable, $options);
}
/**
* @expectedException MongoDB\Exception\InvalidArgumentException
* @dataProvider provideInvalidConstructorOptions
*/
public function testConstructorOptionTypeChecksForDistinct(array $options)
{
$explainable = new Distinct($this->getDatabaseName(), $this->getCollectionName(), 'x', []);
new Explain($this->getDatabaseName(), $explainable, $options); new Explain($this->getDatabaseName(), $explainable, $options);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment