gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php

363 lines
7.6 KiB
PHP

<?php
namespace SMW\Tests\Elastic\QueryEngine\DescriptionInterpreters;
use SMW\DataItemFactory;
use SMW\Elastic\QueryEngine\DescriptionInterpreters\SomeValueInterpreter;
use SMW\Options;
use SMW\Query\DescriptionFactory;
use SMW\Tests\PHPUnitCompat;
/**
* @covers \SMW\Elastic\QueryEngine\DescriptionInterpreters\SomeValueInterpreter
* @group semantic-mediawiki
*
* @license GPL-2.0-or-later
* @since 3.0
*
* @author mwjames
*/
class SomeValueInterpreterTest extends \PHPUnit\Framework\TestCase {
use PHPUnitCompat;
private $conditionBuilder;
private $descriptionFactory;
private $dataItemFactory;
public function setUp(): void {
$this->descriptionFactory = new DescriptionFactory();
$this->dataItemFactory = new DataItemFactory();
$this->conditionBuilder = $this->getMockBuilder( '\SMW\Elastic\QueryEngine\ConditionBuilder' )
->disableOriginalConstructor()
->setMethods( [ 'getID' ] )
->getMock();
$this->conditionBuilder->setOptions( new Options(
[
'maximum.value.length' => 500
]
) );
}
public function testCanConstruct() {
$this->assertInstanceOf(
SomeValueInterpreter::class,
new SomeValueInterpreter( $this->conditionBuilder )
);
}
public function testInterpretDescription_MissingPropertyThrowsException() {
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$options = [];
$description = $this->descriptionFactory->newValueDescription(
$this->dataItemFactory->newDIWikiPage( 'Foo' )
);
$this->expectException( '\RuntimeException' );
$instance->interpretDescription( $description, $options );
}
public function testInterpretDescription_MissingPIDThrowsException() {
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$options = [
'property' => $this->dataItemFactory->newDIProperty( 'Bar' )
];
$description = $this->descriptionFactory->newValueDescription(
$this->dataItemFactory->newDIWikiPage( 'Foo' )
);
$this->expectException( '\RuntimeException' );
$instance->interpretDescription( $description, $options );
}
/**
* @dataProvider numberValueProvider
*/
public function testInterpretDescription_NumberValue( $dataItem, $comparator, $options, $expected ) {
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$description = $this->descriptionFactory->newValueDescription(
$dataItem,
null,
$comparator
);
$condition = $instance->interpretDescription(
$description,
$options
);
$this->assertEquals(
$expected,
(string)$condition
);
}
/**
* @dataProvider timeValueProvider
*/
public function testInterpretDescription_TimeValue( $dataItem, $comparator, $options, $expected ) {
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$description = $this->descriptionFactory->newValueDescription(
$dataItem,
null,
$comparator
);
$condition = $instance->interpretDescription(
$description,
$options
);
$this->assertEquals(
$expected,
(string)$condition
);
}
/**
* @dataProvider textValueProvider
*/
public function testInterpretDescription_TextValue( $dataItem, $comparator, $options, $expected ) {
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$description = $this->descriptionFactory->newValueDescription(
$dataItem,
null,
$comparator
);
$condition = $instance->interpretDescription(
$description,
$options
);
$this->assertEquals(
$expected,
(string)$condition
);
}
/**
* @dataProvider pageValueProvider
*/
public function testInterpretDescription_PageValue( $dataItem, $comparator, $options, $expected ) {
$this->conditionBuilder->expects( $this->any() )
->method( 'getID' )
->willReturnOnConsecutiveCalls( 42, 1001, 9000, 110001 );
$this->conditionBuilder->setOptions( new Options(
[
'cjk.best.effort.proximity.match' => true,
'maximum.value.length' => 500
]
) );
$instance = new SomeValueInterpreter(
$this->conditionBuilder
);
$description = $this->descriptionFactory->newValueDescription(
$dataItem,
null,
$comparator
);
$condition = $instance->interpretDescription(
$description,
$options
);
$this->assertEquals(
$expected,
(string)$condition
);
}
public function numberValueProvider() {
$dataItemFactory = new DataItemFactory();
$options = [
'property' => $dataItemFactory->newDIProperty( 'Bar' ),
'pid' => 'P:42',
'field' => 'numField',
'type' => 'must'
];
$dataItem = $dataItemFactory->newDINumber( 123 );
yield [
$dataItem,
SMW_CMP_EQ,
$options,
'{"bool":{"filter":{"term":{"P:42.numField":123}}}}'
];
yield [
$dataItem,
SMW_CMP_NEQ,
$options,
'{"bool":{"must_not":{"term":{"P:42.numField":123}}}}'
];
yield [
$dataItem,
SMW_CMP_LESS,
$options,
'{"bool":{"must":[{"range":{"P:42.numField":{"lt":123}}}]}}'
];
yield [
$dataItem,
SMW_CMP_GRTR,
$options,
'{"bool":{"must":[{"range":{"P:42.numField":{"gt":123}}}]}}'
];
yield [
$dataItem,
SMW_CMP_LEQ,
$options,
'{"bool":{"must":[{"range":{"P:42.numField":{"lte":123}}}]}}'
];
yield [
$dataItem,
SMW_CMP_GEQ,
$options,
'{"bool":{"must":[{"range":{"P:42.numField":{"gte":123}}}]}}'
];
// This form is actually handled differently using a compound
// [[Has number::~123]] -> [[Has number:: <q>[[≥0]] [[≤123]]</q> ]]
yield [
$dataItem,
SMW_CMP_LIKE,
$options,
'{"bool":{"must":[{"match":{"P:42.numField":{"query":123,"operator":"and"}}}]}}'
];
yield [
$dataItem,
SMW_CMP_NLKE,
$options,
'{"bool":{"must_not":[{"match":{"P:42.numField":{"query":123,"operator":"and"}}}]}}'
];
}
public function timeValueProvider() {
$dataItemFactory = new DataItemFactory();
$options = [
'property' => $dataItemFactory->newDIProperty( 'Bar' ),
'pid' => 'P:42',
'field' => 'datField',
'type' => 'must'
];
$dataItem = $dataItemFactory->newDITime( 1, 1970, 12, 12, 12, 12, 12 );
yield [
$dataItem,
SMW_CMP_EQ,
$options,
'{"bool":{"filter":{"term":{"P:42.datField":2440933.0084722}}}}'
];
yield [
$dataItem,
SMW_CMP_NEQ,
$options,
'{"bool":{"must_not":{"term":{"P:42.datField":2440933.0084722}}}}'
];
}
public function textValueProvider() {
$dataItemFactory = new DataItemFactory();
$options = [
'property' => $dataItemFactory->newDIProperty( 'Bar' ),
'pid' => 'P:42',
'field' => 'txtField',
'type' => 'must'
];
$dataItem = $dataItemFactory->newDIBlob( '*test*' );
yield [
$dataItem,
SMW_CMP_EQ,
$options,
'{"bool":{"filter":{"term":{"P:42.txtField.keyword":"*test*"}}}}'
];
yield [
$dataItem,
SMW_CMP_LIKE,
$options,
'{"bool":{"must":{"query_string":{"fields":["P:42.txtField","P:42.txtField.keyword"],"query":"*test*"}}}}'
];
}
public function pageValueProvider() {
$dataItemFactory = new DataItemFactory();
$options = [
'property' => $dataItemFactory->newDIProperty( 'Bar' ),
'pid' => 'P:42',
'field' => 'wpgID',
'type' => 'must'
];
$dataItem = $dataItemFactory->newDIWikiPage( 'test' );
yield [
$dataItem,
SMW_CMP_EQ,
$options,
'{"bool":{"filter":{"term":{"P:42.wpgID":42}}}}'
];
$options = [
'property' => $dataItemFactory->newDIProperty( 'Bar' ),
'pid' => 'P:42',
'field' => 'wpgField',
'type' => 'must'
];
yield [
$dataItem,
SMW_CMP_LIKE,
$options,
'{"bool":{"must":{"query_string":{"fields":["P:42.wpgField"],"query":"+test"}}}}'
];
$dataItem = $dataItemFactory->newDIWikiPage( '*テスト*' );
yield [
$dataItem,
SMW_CMP_LIKE,
$options,
'{"bool":{"must":[{"match_phrase":{"P:42.wpgField":"テスト"}}]}}'
];
}
}