summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php335
1 files changed, 335 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php
new file mode 100644
index 00000000..88b4fcd6
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/Query/ComparatorFilterConditionQueryDBIntegrationTest.php
@@ -0,0 +1,335 @@
+<?php
+
+namespace SMW\Tests\Integration\Query;
+
+use SMW\DIProperty;
+use SMW\Query\Language\SomeProperty;
+use SMW\Query\Language\ValueDescription;
+use SMW\Tests\MwDBaseUnitTestCase;
+use SMW\Tests\Utils\UtilityFactory;
+use SMwConjunction as Conjunction;
+use SMWDIBlob as DIBlob;
+use SMWDINumber as DINumber;
+use SMWDITime as DITime;
+use SMWQuery as Query;
+
+/**
+ * @group SMW
+ * @group SMWExtension
+ *
+ * @group semantic-mediawiki-integration
+ * @group semantic-mediawiki-query
+ *
+ * @group mediawiki-database
+ * @group medium
+ *
+ * @license GNU GPL v2+
+ * @since 2.0
+ *
+ * @author mwjames
+ */
+class ComparatorFilterConditionQueryDBIntegrationTest extends MwDBaseUnitTestCase {
+
+ private $subjectsToBeCleared = [];
+ private $semanticDataFactory;
+ private $queryResultValidator;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->queryResultValidator = UtilityFactory::getInstance()->newValidatorFactory()->newQueryResultValidator();
+ $this->semanticDataFactory = UtilityFactory::getInstance()->newSemanticDataFactory();
+ }
+
+ protected function tearDown() {
+
+ foreach ( $this->subjectsToBeCleared as $subject ) {
+ $this->getStore()->deleteSubject( $subject->getTitle() );
+ }
+
+ parent::tearDown();
+ }
+
+ /**
+ * @dataProvider numericConjunctionFilterProvider
+ */
+ public function testNumericConjunctionConstraints( $range, $parameters, $expected ) {
+ $this->queryPagesThatUseConjunctionConstraintsForPropertyValues( $range, $parameters, $expected );
+ }
+
+ /**
+ * @dataProvider textConjunctionFilterProvider
+ */
+ public function testTextConjunctionConstraints( $range, $parameters, $expected ) {
+ $this->queryPagesThatUseConjunctionConstraintsForPropertyValues( $range, $parameters, $expected );
+ }
+
+ /**
+ * @dataProvider dateConjunctionFilterProvider
+ */
+ public function testDateConjunctionConstraints( $range, $parameters, $expected ) {
+
+ if ( is_a( $this->getStore(), '\SMW\SPARQLStore\SPARQLStore' )
+ && is_a( $this->getStore()->getConnection( 'sparql' ), '\SMW\SPARQLStore\RepositoryConnectors\VirtuosoRepositoryConnector' ) ) {
+ $this->markTestSkipped( "Date filter constraints do not work properly in Virtuoso" );
+ }
+
+ $this->queryPagesThatUseConjunctionConstraintsForPropertyValues( $range, $parameters, $expected );
+ }
+
+ public function queryPagesThatUseConjunctionConstraintsForPropertyValues( $range, $parameters, $expected ) {
+
+ $expectedSubjects = [];
+ $property = $parameters['property'];
+
+ foreach ( $range as $key => $value ) {
+
+ $semanticData = $this->semanticDataFactory
+ ->newEmptySemanticData( __METHOD__ . strval( $key ) );
+
+ $semanticData->addPropertyObjectValue( $property, $value );
+
+ $this->subjectsToBeCleared[] = $semanticData->getSubject();
+ $this->getStore()->updateData( $semanticData );
+
+ if ( in_array( $key, $expected['subjects'] ) ) {
+ $expectedSubjects[] = $semanticData->getSubject();
+ }
+ }
+
+ $description = new Conjunction( [
+ new SomeProperty(
+ $property,
+ new ValueDescription( $parameters['lower'], null, $parameters['lowerComp'] ) ),
+ new SomeProperty(
+ $property,
+ new ValueDescription( $parameters['upper'], null, $parameters['upperComp'] ) ),
+ ] );
+
+ $query = new Query(
+ $description,
+ false,
+ false
+ );
+
+ $query->querymode = Query::MODE_INSTANCES;
+
+ $queryResult = $this->getStore()->getQueryResult( $query );
+
+ $this->assertEquals(
+ $expected['count'],
+ $queryResult->getCount()
+ );
+
+ $this->queryResultValidator->assertThatQueryResultHasSubjects(
+ $expectedSubjects,
+ $queryResult
+ );
+ }
+
+ public function numericConjunctionFilterProvider() {
+
+ $property = new DIProperty( 'SomeNumericPropertyToFilter' );
+ $property->setPropertyTypeId( '_num' );
+
+ #0 Numeric Greater Equal, Less Equal
+ $provider[] = [
+ [
+ 1 => new DINumber( 1 ),
+ 6 => new DINumber( 6 ),
+ 10 => new DINumber( 10 )
+ ],
+ [
+ 'lower' => new DINumber( 1 ),
+ 'upper' => new DINumber( 9 ),
+ 'lowerComp' => SMW_CMP_GEQ,
+ 'upperComp' => SMW_CMP_LEQ,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ 1, 6 ]
+ ]
+ ];
+
+ #1 Numeric Greater, Equal
+ $provider[] = [
+ [
+ 1 => new DINumber( 1 ),
+ 2 => new DINumber( 2 ),
+ 6 => new DINumber( 6 ),
+ 10 => new DINumber( 10 )
+ ],
+ [
+ 'lower' => new DINumber( 1 ),
+ 'upper' => new DINumber( 10 ),
+ 'lowerComp' => SMW_CMP_GRTR,
+ 'upperComp' => SMW_CMP_LESS,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ 2, 6 ]
+ ]
+ ];
+
+ #2 Numeric Greater, Less
+ $provider[] = [
+ [
+ 1 => new DINumber( 1 ),
+ 2 => new DINumber( 2 )
+ ],
+ [
+ 'lower' => new DINumber( 1 ),
+ 'upper' => new DINumber( 2 ),
+ 'lowerComp' => SMW_CMP_GRTR,
+ 'upperComp' => SMW_CMP_LESS,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 0,
+ 'subjects' => []
+ ]
+ ];
+
+ #3 Numeric Greater, Not Like
+ $provider[] = [
+ [
+ 1 => new DINumber( 1 ),
+ 2 => new DINumber( 2 ),
+ 3 => new DINumber( 3 )
+ ],
+ [
+ 'lower' => new DINumber( 1 ),
+ 'upper' => new DINumber( 3 ),
+ 'lowerComp' => SMW_CMP_GRTR,
+ 'upperComp' => SMW_CMP_NEQ,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 1,
+ 'subjects' => [ 2 ]
+ ]
+ ];
+
+ return $provider;
+ }
+
+ public function textConjunctionFilterProvider() {
+
+ $property = new DIProperty( 'SomeBlobPropertyToFilter' );
+ $property->setPropertyTypeId( '_txt' );
+
+ #4 Text, Greater Equal, Less Equal
+ $provider[] = [
+ [
+ 'AA' => new DIBlob( 'AA' ),
+ 'BB' => new DIBlob( 'BB' ),
+ 'CC' => new DIBlob( 'CC' )
+ ],
+ [
+ 'lower' => new DIBlob( 'AA' ),
+ 'upper' => new DIBlob( 'BB' ),
+ 'lowerComp' => SMW_CMP_GEQ,
+ 'upperComp' => SMW_CMP_LEQ,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ 'AA', 'BB' ]
+ ]
+ ];
+
+ #5 Text, Like, Like
+ $provider[] = [
+ [
+ 'A' => new DIBlob( 'A' ),
+ 'AA' => new DIBlob( 'AA' ),
+ 'BBA' => new DIBlob( 'BBA' ),
+ 'AAC' => new DIBlob( 'AAC' )
+ ],
+ [
+ 'lower' => new DIBlob( 'A*' ),
+ 'upper' => new DIBlob( 'AA*' ),
+ 'lowerComp' => SMW_CMP_LIKE,
+ 'upperComp' => SMW_CMP_LIKE,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ 'AA', 'AAC' ]
+ ]
+ ];
+
+ #6 Text, Like, Not Like
+ $provider[] = [
+ [
+ 'AABA' => new DIBlob( 'AABA' ),
+ 'AACA' => new DIBlob( 'AACA' ),
+ 'AAAB' => new DIBlob( 'AAAB' ),
+ ],
+ [
+ 'lower' => new DIBlob( 'AA?A' ),
+ 'upper' => new DIBlob( 'AA?B' ),
+ 'lowerComp' => SMW_CMP_LIKE,
+ 'upperComp' => SMW_CMP_NLKE,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ 'AABA', 'AACA' ]
+ ]
+ ];
+
+ return $provider;
+ }
+
+ public function dateConjunctionFilterProvider() {
+
+ $property = new DIProperty( 'SomeDatePropertyToFilter' );
+ $property->setPropertyTypeId( '_dat' );
+
+ #7 Date, Greater Equal, Less Equal
+ $provider[] = [
+ [
+ '197001' => new DITime( 1, 1970, 01, 01, 1, 1 ),
+ '197002' => new DITime( 1, 1970, 02, 01, 1, 1 ),
+ '197003' => new DITime( 1, 1970, 03, 01, 1, 1 ),
+ ],
+ [
+ 'lower' => new DITime( 1, 1970, 01, 01 ),
+ 'upper' => new DITime( 1, 1970, 03, 01 ),
+ 'lowerComp' => SMW_CMP_GEQ,
+ 'upperComp' => SMW_CMP_LEQ,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 2,
+ 'subjects' => [ '197001', '197002' ]
+ ]
+ ];
+
+ #7 Date, Greater Equal, Less Equal
+ $provider[] = [
+ [
+ '1970011' => new DITime( 1, 1970, 01, 01, 1, 1 ),
+ '1970012' => new DITime( 1, 1970, 01, 02, 1, 1 ),
+ '1970013' => new DITime( 1, 1970, 01, 03, 1, 1 ),
+ ],
+ [
+ 'lower' => new DITime( 1, 1970, 01, 01, 2 ),
+ 'upper' => new DITime( 1, 1970, 01, 02, 2 ),
+ 'lowerComp' => SMW_CMP_GRTR,
+ 'upperComp' => SMW_CMP_LESS,
+ 'property' => $property,
+ ],
+ [
+ 'count' => 1,
+ 'subjects' => [ '1970012' ]
+ ]
+ ];
+
+ return $provider;
+ }
+
+}