Pwirth has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/392046 )
Change subject: [WIP]: POC: Querybuilder filter und sort base classes ...................................................................... [WIP]: POC: Querybuilder filter und sort base classes Change-Id: I33d0953b80a0976ab9184adcb39e768b37c8318c --- A src/Data/DataSetFilter.php R src/Data/DataSetFilter/Boolean.php R src/Data/DataSetFilter/Date.php R src/Data/DataSetFilter/ListValue.php R src/Data/DataSetFilter/Numeric.php A src/Data/DataSetFilter/Range.php R src/Data/DataSetFilter/StringValue.php R src/Data/DataSetFilter/TemplateTitle.php R src/Data/DataSetFilter/Title.php A src/Data/DataSetSort.php M src/Data/DatabaseWriter.php M src/Data/Filter.php D src/Data/Filter/Range.php M src/Data/FilterFactory.php M src/Data/Filterer.php A src/Data/IFilter.php M src/Data/IPrimaryDataProvider.php A src/Data/ISort.php A src/Data/QueryBuilder.php A src/Data/QueryFilter.php A src/Data/QueryFilterFactory.php A src/Data/QuerySort.php M src/Data/ReaderParams.php M src/Data/Sort.php M src/Data/Watchlist/PrimaryDataProvider.php A tests/phpunit/Data/DataSetFilter/BooleanTest.php R tests/phpunit/Data/DataSetFilter/DateTest.php R tests/phpunit/Data/DataSetFilter/ListValueTest.php R tests/phpunit/Data/DataSetFilter/NumericTest.php R tests/phpunit/Data/DataSetFilter/StringValueTest.php R tests/phpunit/Data/DataSetFilter/TemplateTitleTest.php R tests/phpunit/Data/DataSetFilter/TitleTest.php D tests/phpunit/Data/Filter/BooleanTest.php M tests/phpunit/Data/FiltererTest.php M tests/phpunit/Data/ReaderParamsTest.php M tests/phpunit/Data/SorterTest.php 36 files changed, 499 insertions(+), 244 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceFoundation refs/changes/46/392046/1 diff --git a/src/Data/DataSetFilter.php b/src/Data/DataSetFilter.php new file mode 100644 index 0000000..2ee7f17 --- /dev/null +++ b/src/Data/DataSetFilter.php @@ -0,0 +1,40 @@ +<?php + +namespace BlueSpice\Data; + +abstract class DataSetFilter extends Filter { + const COMPARISON_EQUALS = 'eq'; + const COMPARISON_NOT_EQUALS = 'neq'; + + /** + * + * @param \BlueSpice\Data\Record $dataSet + * @return boolean + */ + public function matches( $dataSet ) { + return $this->doesMatch( $dataSet ); + } + + + /** + * + * @param stdClass[]|array[] $filters + * @return Filter[] + */ + public static function newCollectionFromArray( $filters ) { + $filterObjects = []; + foreach( $filters as $filter ) { + if( is_object( $filter ) ) { + $filter = (array) $filter; + } + try { + $filterObjects[] = FilterFactory::newFromArray( $filter ); + } catch( \Exception $e ) { + continue; + } + } + return $filterObjects; + } + + protected abstract function doesMatch( $dataSet ); +} diff --git a/src/Data/Filter/Boolean.php b/src/Data/DataSetFilter/Boolean.php similarity index 81% rename from src/Data/Filter/Boolean.php rename to src/Data/DataSetFilter/Boolean.php index 22fa99f..59c6a1b 100644 --- a/src/Data/Filter/Boolean.php +++ b/src/Data/DataSetFilter/Boolean.php @@ -1,10 +1,10 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; -use BlueSpice\Data\Filter; +use BlueSpice\Data\DataSetFilter; -class Boolean extends Filter { +class Boolean extends DataSetFilter { /** * Performs filtering based on given filter of type bool on a dataset diff --git a/src/Data/Filter/Date.php b/src/Data/DataSetFilter/Date.php similarity index 95% rename from src/Data/Filter/Date.php rename to src/Data/DataSetFilter/Date.php index e45dc37..f6a0f9b 100644 --- a/src/Data/Filter/Date.php +++ b/src/Data/DataSetFilter/Date.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; class Date extends Range { diff --git a/src/Data/Filter/ListValue.php b/src/Data/DataSetFilter/ListValue.php similarity index 82% rename from src/Data/Filter/ListValue.php rename to src/Data/DataSetFilter/ListValue.php index 00bc7ca..61b865e 100644 --- a/src/Data/Filter/ListValue.php +++ b/src/Data/DataSetFilter/ListValue.php @@ -1,10 +1,10 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; -use BlueSpice\Data\Filter; +use BlueSpice\Data\DataSetFilter; -class ListValue extends Filter { +class ListValue extends DataSetFilter { /** * Performs list filtering based on given filter of type array on a dataset diff --git a/src/Data/Filter/Numeric.php b/src/Data/DataSetFilter/Numeric.php similarity index 94% rename from src/Data/Filter/Numeric.php rename to src/Data/DataSetFilter/Numeric.php index 0d84024..8e43d45 100644 --- a/src/Data/Filter/Numeric.php +++ b/src/Data/DataSetFilter/Numeric.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; class Numeric extends Range { /** diff --git a/src/Data/DataSetFilter/Range.php b/src/Data/DataSetFilter/Range.php new file mode 100644 index 0000000..1113e42 --- /dev/null +++ b/src/Data/DataSetFilter/Range.php @@ -0,0 +1,10 @@ +<?php + +namespace BlueSpice\Data\DataSetFilter; + +use BlueSpice\Data\DataSetFilter; + +abstract class Range extends DataSetFilter { + const COMPARISON_LOWER_THAN = 'lt'; + const COMPARISON_GREATER_THAN = 'gt'; +} \ No newline at end of file diff --git a/src/Data/Filter/StringValue.php b/src/Data/DataSetFilter/StringValue.php similarity index 81% rename from src/Data/Filter/StringValue.php rename to src/Data/DataSetFilter/StringValue.php index d569ab6..5ea411e 100644 --- a/src/Data/Filter/StringValue.php +++ b/src/Data/DataSetFilter/StringValue.php @@ -1,13 +1,13 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; -use BlueSpice\Data\Filter; +use BlueSpice\Data\DataSetFilter; /** * Class name "String" is reserved */ -class StringValue extends Filter { +class StringValue extends DataSetFilter { const COMPARISON_STARTS_WITH = 'sw'; const COMPARISON_ENDS_WITH = 'ew'; const COMPARISON_CONTAINS = 'ct'; diff --git a/src/Data/Filter/TemplateTitle.php b/src/Data/DataSetFilter/TemplateTitle.php similarity index 74% rename from src/Data/Filter/TemplateTitle.php rename to src/Data/DataSetFilter/TemplateTitle.php index 0ef445b..19ce804 100644 --- a/src/Data/Filter/TemplateTitle.php +++ b/src/Data/DataSetFilter/TemplateTitle.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; class TemplateTitle extends Title { protected function getDefaultTitleNamespace() { diff --git a/src/Data/Filter/Title.php b/src/Data/DataSetFilter/Title.php similarity index 96% rename from src/Data/Filter/Title.php rename to src/Data/DataSetFilter/Title.php index b4d0187..38b66e2 100644 --- a/src/Data/Filter/Title.php +++ b/src/Data/DataSetFilter/Title.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Data\Filter; +namespace BlueSpice\Data\DataSetFilter; class Title extends Range { diff --git a/src/Data/DataSetSort.php b/src/Data/DataSetSort.php new file mode 100644 index 0000000..e88a156 --- /dev/null +++ b/src/Data/DataSetSort.php @@ -0,0 +1,42 @@ +<?php + +namespace BlueSpice\Data; + +class DataSetSort extends Sort { + + /** + * + * @param string $property + * @param string $direction + * @throws UnexpectedValueException + */ + public function __construct( $property, $direction = static::ASCENDING ) { + parent::__construct( $property , $direction ); + + if( !in_array( $this->direction, [ static::ASCENDING, static::DESCENDING ] ) ) { + throw new UnexpectedValueException( + "'{$this->direction}' is not an allowed value for argument \$direction" + ); + } + } + + /** + * + * @param stdClass[]|array[] $sorts + * @return Sort[] + */ + public static function newCollectionFromArray( $sorts ) { + $sortObjects = []; + foreach( $sorts as $sort ) { + if( is_array( $sort ) ) { + $sort = (object) $sort; + } + + $sortObjects[] = new DataSetSort( + $sort->property, + isset( $sort->direction ) ? $sort->direction : null + ); + } + return $sortObjects; + } +} diff --git a/src/Data/DatabaseWriter.php b/src/Data/DatabaseWriter.php index 895a809..b078f35 100644 --- a/src/Data/DatabaseWriter.php +++ b/src/Data/DatabaseWriter.php @@ -235,7 +235,7 @@ Filter::KEY_FIELD => $fieldName, Filter::KEY_VALUE => $record->get( $fieldName ), Filter::KEY_TYPE => $this->getFieldType( $fieldName ), - Filter::KEY_COMPARISON => Filter::COMPARISON_EQUALS, + Filter::KEY_COMPARISON => DataSetFilter::COMPARISON_EQUALS, ]; } diff --git a/src/Data/Filter.php b/src/Data/Filter.php index ea87ceb..cf60413 100644 --- a/src/Data/Filter.php +++ b/src/Data/Filter.php @@ -2,14 +2,7 @@ namespace BlueSpice\Data; -abstract class Filter { - const COMPARISON_EQUALS = 'eq'; - const COMPARISON_NOT_EQUALS = 'neq'; - - const KEY_TYPE = 'type'; - const KEY_COMPARISON = 'comparison'; - const KEY_FIELD = 'field'; - const KEY_VALUE = 'value'; +abstract class Filter implements IFilter{ /** * @@ -63,32 +56,4 @@ return $this->comparison; } - /** - * - * @param \BlueSpice\Data\Record $dataSet - * @return boolean - */ - public function matches( $dataSet ) { - return $this->doesMatch( $dataSet ); - } - - - /** - * - * @param stdClass[]|array[] $filters - * @return Filter[] - */ - public static function newCollectionFromArray( $filters ) { - $filterObjects = []; - foreach( $filters as $filter ) { - if( is_object( $filter ) ) { - $filter = (array) $filter; - } - $filterObjects[] = FilterFactory::newFromArray( $filter ); - } - - return $filterObjects; - } - - protected abstract function doesMatch( $dataSet ); } diff --git a/src/Data/Filter/Range.php b/src/Data/Filter/Range.php deleted file mode 100644 index b85b724..0000000 --- a/src/Data/Filter/Range.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -namespace BlueSpice\Data\Filter; - -use BlueSpice\Data\Filter; - -abstract class Range extends Filter { - const COMPARISON_LOWER_THAN = 'lt'; - const COMPARISON_GREATER_THAN = 'gt'; -} \ No newline at end of file diff --git a/src/Data/FilterFactory.php b/src/Data/FilterFactory.php index 40544d4..d89022f 100644 --- a/src/Data/FilterFactory.php +++ b/src/Data/FilterFactory.php @@ -2,20 +2,20 @@ namespace BlueSpice\Data; -class FilterFactory { +abstract class FilterFactory { /** * * @var array */ - public static $typeMap = [ - 'string' => 'BlueSpice\Data\Filter\StringValue', - 'date'=> 'BlueSpice\Data\Filter\Date', - #'datetime'=> 'BlueSpice\Data\Filter\DateTime', - 'boolean'=> 'BlueSpice\Data\Filter\Boolean', - 'numeric' => 'BlueSpice\Data\Filter\Numeric', - 'title' => 'BlueSpice\Data\Filter\Title', - 'templatetitle' => 'BlueSpice\Data\Filter\TemplateTitle', - 'list' => 'BlueSpice\Data\Filter\ListValue' + protected static $typeMap = [ + 'string' => 'BlueSpice\Data\DataSetFilter\StringValue', + 'date'=> 'BlueSpice\Data\DataSetFilter\Date', + #'datetime'=> 'BlueSpice\Data\DataSetFilter\DateTime', + 'boolean'=> 'BlueSpice\Data\DataSetFilter\Boolean', + 'numeric' => 'BlueSpice\Data\DataSetFilter\Numeric', + 'title' => 'BlueSpice\Data\DataSetFilter\Title', + 'templatetitle' => 'BlueSpice\Data\DataSetFilter\TemplateTitle', + 'list' => 'BlueSpice\Data\DataSetFilter\ListValue' ]; /** @@ -25,8 +25,8 @@ * @throws \UnexpectedValueException */ public static function newFromArray( $filter ) { - if( isset( self::$typeMap[$filter[Filter::KEY_TYPE]]) ) { - return new self::$typeMap[$filter[Filter::KEY_TYPE]]( $filter ); + if( isset( static::$typeMap[$filter[Filter::KEY_TYPE]]) ) { + return new static::$typeMap[$filter[Filter::KEY_TYPE]]( $filter ); } else { throw new \UnexpectedValueException( diff --git a/src/Data/Filterer.php b/src/Data/Filterer.php index 0b2b354..1095ac4 100644 --- a/src/Data/Filterer.php +++ b/src/Data/Filterer.php @@ -39,6 +39,9 @@ */ protected function matchFilter( $dataSet ) { foreach( $this->filters as $filter ) { + if( !$filter instanceof DataSetFilter ) { + continue; + } //If just one of these filters does not apply, the dataset needs //to be removed if( !$filter->matches( $dataSet ) ) { diff --git a/src/Data/IFilter.php b/src/Data/IFilter.php new file mode 100644 index 0000000..29044b4 --- /dev/null +++ b/src/Data/IFilter.php @@ -0,0 +1,30 @@ +<?php + +namespace BlueSpice\Data; + +interface IFilter { + + const KEY_TYPE = 'type'; + const KEY_COMPARISON = 'comparison'; + const KEY_FIELD = 'field'; + const KEY_VALUE = 'value'; + + /** + * + * @return string + */ + public function getField(); + + /** + * + * @return mixed + */ + public function getValue(); + + /** + * + * @return string + */ + public function getComparison(); + +} diff --git a/src/Data/IPrimaryDataProvider.php b/src/Data/IPrimaryDataProvider.php index 5871aab..c7c8195 100644 --- a/src/Data/IPrimaryDataProvider.php +++ b/src/Data/IPrimaryDataProvider.php @@ -8,10 +8,9 @@ * * @param string $query Special simple filter that aims at one specific * field that the DataProvider needs to define. - * @param Filter[] $preFilters Complete set of filters that will also be - * applied later during the process by the "Filterer" step. Having it here - * allows us to prefilter and tweak performance + * @param ReaderParams $params Complete set of reder params. Having it here + * allows us to prefilter, presort and tweak performance * @return \BlueSpice\Data\Record[] */ - public function makeData( $query = '', $preFilters = [] ); + public function makeData( $query = '', $params = null ); } \ No newline at end of file diff --git a/src/Data/ISort.php b/src/Data/ISort.php new file mode 100644 index 0000000..b102c7b --- /dev/null +++ b/src/Data/ISort.php @@ -0,0 +1,22 @@ +<?php + +namespace BlueSpice\Data; + +interface ISort { + + const ASCENDING = 'ASC'; + const DESCENDING = 'DESC'; + + /** + * + * @return string + */ + public function getProperty(); + + /** + * + * @return string One of Sort::ASCENDING or Sort::DESCENDING + */ + public function getDirection(); + +} diff --git a/src/Data/QueryBuilder.php b/src/Data/QueryBuilder.php new file mode 100644 index 0000000..422ea0b --- /dev/null +++ b/src/Data/QueryBuilder.php @@ -0,0 +1,36 @@ +<?php + +namespace BlueSpice\Data; + +class QueryBuilder { + + /** + * + * @var Filter[] + */ + protected $filters = null; + + /** + * + * @param Filter $filters + */ + public function __construct( $filters ) { + $this->filters = $filters; + } + + /** + * + * @param mixed $query + * @return mixed $query + */ + public function build( $query ) { + foreach( $this->filters as $filter ) { + if( !$filter instanceof QueryFilter ) { + continue; + } + $query = $filter->build( $query ); + } + + return $query; + } +} \ No newline at end of file diff --git a/src/Data/QueryFilter.php b/src/Data/QueryFilter.php new file mode 100644 index 0000000..b6c06a4 --- /dev/null +++ b/src/Data/QueryFilter.php @@ -0,0 +1,39 @@ +<?php + +namespace BlueSpice\Data; + +abstract class QueryFilter implements IFilter{ + + /** + * + * @param \BlueSpice\Data\Record $dataSet + * @return boolean + */ + public function build( $dataSet ) { + return $this->buildQuery( $dataSet ); + } + + + /** + * + * @param stdClass[]|array[] $filters + * @return Filter[] + */ + public static function newCollectionFromArray( $filters ) { + $filterObjects = []; + foreach( $filters as $filter ) { + if( is_object( $filter ) ) { + $filter = (array) $filter; + } + try { + $filterObjects[] = QueryFilterFactory::newFromArray( $filter ); + } catch( \Exception $e ) { + continue; + } + } + + return $filterObjects; + } + + protected abstract function buildQuery( $dataSet ); +} diff --git a/src/Data/QueryFilterFactory.php b/src/Data/QueryFilterFactory.php new file mode 100644 index 0000000..cfbf418 --- /dev/null +++ b/src/Data/QueryFilterFactory.php @@ -0,0 +1,28 @@ +<?php + +namespace BlueSpice\Data; + +abstract class QueryFilterFactory { + /** + * + * @var array + */ + protected static $typeMap = []; + + /** + * + * @param array $filter + * @return \BlueSpice\Data\QueryFilter + * @throws \UnexpectedValueException + */ + public static function newFromArray( $filter ) { + if( isset( static::$typeMap[$filter[Filter::KEY_TYPE]]) ) { + return new static::$typeMap[$filter[Filter::KEY_TYPE]]( $filter ); + } + else { + throw new \UnexpectedValueException( + "No filter class for '{$filter[Filter::KEY_TYPE]}' available!" + ); + } + } +} diff --git a/src/Data/QuerySort.php b/src/Data/QuerySort.php new file mode 100644 index 0000000..f79aebd --- /dev/null +++ b/src/Data/QuerySort.php @@ -0,0 +1,42 @@ +<?php + +namespace BlueSpice\Data; + +abstract class QuerySort extends Sort { + + /** + * + * @param string $property + * @param string $direction + * @throws UnexpectedValueException + */ + public function __construct( $property, $direction = static::ASCENDING ) { + parent::__construct( $property , $direction ); + + if( !in_array( $this->direction, [ static::ASCENDING, static::DESCENDING ] ) ) { + throw new UnexpectedValueException( + "'{$this->direction}' is not an allowed value for argument \$direction" + ); + } + } + + /** + * + * @param mixed $query + * @return boolean + */ + public function build( $query ) { + return $this->buildQuery( $query ); + } + + /** + * + * @param stdClass[]|array[] $sorts + * @return Sort[] + */ + public function newCollectionFromArray( $sorts ) { + return []; + } + + protected abstract function buildQuery( $query ); +} diff --git a/src/Data/ReaderParams.php b/src/Data/ReaderParams.php index 05de0a9..f9eef31 100644 --- a/src/Data/ReaderParams.php +++ b/src/Data/ReaderParams.php @@ -2,9 +2,6 @@ namespace BlueSpice\Data; -use BlueSpice\Data\Sort; -use BlueSpice\Data\Filter; - class ReaderParams { const LIMIT_INFINITE = -1; @@ -102,14 +99,39 @@ return; } - $this->sort = Sort::newCollectionFromArray( $params['sort'] ); + $dataSort = DataSetSort::newCollectionFromArray( $params['sort'] ); + foreach( $dataSort as $sort ) { + $this->sort[ $sort->getProperty() ] = $sort; + } + + $querySort = QuerySort::newCollectionFromArray( $params['sort'] ); + foreach( $querySort as $sort ) { + $this->sort[ $sort->getProperty() ] = $sort; + } + + $this->sort = array_values( $this->sort ); } protected function setFilter( $params ) { if( !isset( $params['filter'] ) || !is_array( $params['filter'] ) ) { return; } - $this->filter = Filter::newCollectionFromArray( $params['filter'] ); + + $dataFilter = DataSetFilter::newCollectionFromArray( + $params['filter'] + ); + foreach( $dataFilter as $filter ) { + $this->filter[$filter->getField()] = $filter; + } + + $queryFilter = QueryFilter::newCollectionFromArray( + $params['filter'] + ); + foreach( $queryFilter as $filter ) { + $this->filter[$filter->getField()] = $filter; + } + + $this->filter = array_values( $this->filter ); } } \ No newline at end of file diff --git a/src/Data/Sort.php b/src/Data/Sort.php index d392e11..bb63636 100644 --- a/src/Data/Sort.php +++ b/src/Data/Sort.php @@ -2,10 +2,7 @@ namespace BlueSpice\Data; -class Sort { - - const ASCENDING = 'ASC'; - const DESCENDING = 'DESC'; +abstract class Sort implements ISort { protected $property = ''; @@ -17,11 +14,11 @@ * @param string $direction * @throws UnexpectedValueException */ - public function __construct( $property, $direction = self::ASCENDING ) { + public function __construct( $property, $direction = static::ASCENDING ) { $this->property = $property; $this->direction = strtoupper( $direction ); - if( !in_array( $this->direction, [ self::ASCENDING, self::DESCENDING ] ) ) { + if( !in_array( $this->direction, [ static::ASCENDING, static::DESCENDING ] ) ) { throw new UnexpectedValueException( "'{$this->direction}' is not an allowed value for argument \$direction" ); @@ -50,25 +47,5 @@ */ public function __toString() { return $this->getProperty().' '.$this->getDirection(); - } - - /** - * - * @param stdClass[]|array[] $sorts - * @return Sort[] - */ - public static function newCollectionFromArray( $sorts ) { - $sortObjects = []; - foreach( $sorts as $sort ) { - if( is_array( $sort ) ) { - $sort = (object) $sort; - } - - $sortObjects[] = new Sort( - $sort->property, - isset( $sort->direction ) ? $sort->direction : null - ); - } - return $sortObjects; } } diff --git a/src/Data/Watchlist/PrimaryDataProvider.php b/src/Data/Watchlist/PrimaryDataProvider.php index 1de86d5..ad01c08 100644 --- a/src/Data/Watchlist/PrimaryDataProvider.php +++ b/src/Data/Watchlist/PrimaryDataProvider.php @@ -42,14 +42,21 @@ /** * - * @param string $query - * @param type $preFilters + * @param string $queryString + * @param \BlueSpice\Data\ReaderParams $params */ - public function makeData( $query = '', $preFilters = [] ) { + public function makeData( $queryString = '', $params = [] ) { + + $query = [ + 'tables' => [ 'watchlist' ], + 'fields' => '*', + 'conditions' => [], + 'options' => [], + ]; $res = $this->db->select( 'watchlist', '*', - $this->makePreFilterConds( $preFilters ) + $this->makePreFilterConds( $params, $query, $queryString ) ); $distinctUserIds = []; @@ -71,10 +78,13 @@ /** * - * @param Filter[] $preFilters + * @param \BlueSpice\Data\ReaderParams $params + * @param array $query + * @param string $queryString * @return array */ - protected function makePreFilterConds( $preFilters ) { + protected function makePreFilterConds( $params, $query, $queryString ) { + $preFilters = $params->getFilter(); $conds = []; $filterFinder = new FilterFinder( $preFilters ); $userIdFilter = $filterFinder->findByField( 'user_id' ); diff --git a/tests/phpunit/Data/DataSetFilter/BooleanTest.php b/tests/phpunit/Data/DataSetFilter/BooleanTest.php new file mode 100644 index 0000000..8eb6352 --- /dev/null +++ b/tests/phpunit/Data/DataSetFilter/BooleanTest.php @@ -0,0 +1,98 @@ +<?php + +namespace BlueSpice\Tests\Data\DataSetFilter; + +use BlueSpice\Data\DataSetFilter; +use BlueSpice\Data\Record; + +/** + * @group BlueSpice + * @group BlueSpiceFoundation + */ +class BooleanTest extends \PHPUnit_Framework_TestCase { + public function testPositive() { + $filter = new DataSetFilter\Boolean( [ + 'field' => 'field1', + 'comparison' => 'eq', + 'value' => true + ] ); + + $result = $filter->matches( new Record( (object)[ + 'field1' => true, + 'field2' => false + ] ) ); + + $this->assertTrue( $result ); + } + + public function testNegative() { + $filter = new DataSetFilter\Boolean( [ + 'field' => 'field1', + 'comparison' => 'eq', + 'value' => false + ] ); + + $result = $filter->matches( new Record( (object)[ + 'field1' => true, + 'field2' => false + ] ) ); + + $this->assertFalse( $result ); + } + + + /** + * @dataProvider provideAppliesToValues + * @param boolean $expecation + * @param mixed $fieldValue + * @param mixed $filterValue + * @param string $comparison + */ + public function testAppliesTo ( $expectation, $comparison, $fieldValue, $filterValue ) { + $filter = new DataSetFilter\Boolean( [ + DataSetFilter\Boolean::KEY_FIELD => 'field_A', + DataSetFilter\Boolean::KEY_VALUE => $filterValue, + DataSetFilter\Boolean::KEY_COMPARISON => $comparison + ] ); + + $dataSet = new Record( (object) [ + 'field_A' => $fieldValue + ] ); + + if( $expectation ) { + $this->assertTrue( $filter->matches( $dataSet ), 'Filter should apply' ); + } + else { + $this->assertFalse( $filter->matches( $dataSet ), 'Filter should not apply' ); + } + } + + public function provideAppliesToValues() { + return [ + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, true, true ], + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, 1, true ], + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, '1', true ], + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, false, false ], + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, 0, false ], + [ true, DataSetFilter\Boolean::COMPARISON_EQUALS, '0', false ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, true, false ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, 1, false ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, '1', false ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, false, true ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, 0, true ], + [ true, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, '0', true ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, true, false ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, 1, false ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, '1', false ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, false, true ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, 0, true ], + [ false, DataSetFilter\Boolean::COMPARISON_EQUALS, '0', true ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, true, true ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, 1, true ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, '1', true ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, false, false ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, 0, false ], + [ false, DataSetFilter\Boolean::COMPARISON_NOT_EQUALS, '0', false ] + ]; + } +} diff --git a/tests/phpunit/Data/Filter/DateTest.php b/tests/phpunit/Data/DataSetFilter/DateTest.php similarity index 61% rename from tests/phpunit/Data/Filter/DateTest.php rename to tests/phpunit/Data/DataSetFilter/DateTest.php index d54830a..cf4ab8f 100644 --- a/tests/phpunit/Data/Filter/DateTest.php +++ b/tests/phpunit/Data/DataSetFilter/DateTest.php @@ -2,7 +2,7 @@ namespace BlueSpice\Tests\Data\Filter; -use \BlueSpice\Data\Filter; +use \BlueSpice\Data\DataSetFilter; use BlueSpice\Data\Record; /** @@ -11,7 +11,7 @@ */ class DateTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new Filter\Date( [ + $filter = new DataSetFilter\Date( [ 'field' => 'field1', 'comparison' => 'gt', 'value' => '2017/01/01' @@ -26,7 +26,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\Date( [ + $filter = new \BlueSpice\Data\DataSetFilter\Date( [ 'field' => 'field1', 'comparison' => 'gt', 'value' => '2017/01/02' @@ -48,10 +48,10 @@ * @param string $comparison */ public function testAppliesTo ( $expectation, $comparison, $fieldValue, $filterValue ) { - $filter = new Filter\Date([ - Filter::KEY_FIELD => 'field_A', - Filter::KEY_VALUE => $filterValue, - Filter::KEY_COMPARISON => $comparison + $filter = new DataSetFilter\Date([ + DataSetFilter::KEY_FIELD => 'field_A', + DataSetFilter::KEY_VALUE => $filterValue, + DataSetFilter::KEY_COMPARISON => $comparison ]); $dataSet = new Record( (object)[ @@ -68,13 +68,13 @@ public function provideAppliesToValues() { return [ - [ true, Filter::COMPARISON_EQUALS, '2017-07-01', '20170701000000' ], - [ true, Filter::COMPARISON_EQUALS, 0, '1970-01-01' ], - [ true, Filter::COMPARISON_EQUALS, '1970/01/02', '1970-01-02' ], - [ true, Filter\Range::COMPARISON_GREATER_THAN, '1970/01/02', 1 ], - [ true, Filter\Range::COMPARISON_LOWER_THAN, '1970/01/02', 'now' ], - [ true, Filter\Range::COMPARISON_LOWER_THAN, 'now - 1 week', 'now' ], - [ false, Filter\Range::COMPARISON_EQUALS, 'now - 1 week', 'now' ], + [ true, DataSetFilter::COMPARISON_EQUALS, '2017-07-01', '20170701000000' ], + [ true, DataSetFilter::COMPARISON_EQUALS, 0, '1970-01-01' ], + [ true, DataSetFilter::COMPARISON_EQUALS, '1970/01/02', '1970-01-02' ], + [ true, DataSetFilter\Range::COMPARISON_GREATER_THAN, '1970/01/02', 1 ], + [ true, DataSetFilter\Range::COMPARISON_LOWER_THAN, '1970/01/02', 'now' ], + [ true, DataSetFilter\Range::COMPARISON_LOWER_THAN, 'now - 1 week', 'now' ], + [ false, DataSetFilter\Range::COMPARISON_EQUALS, 'now - 1 week', 'now' ], ]; } } diff --git a/tests/phpunit/Data/Filter/ListValueTest.php b/tests/phpunit/Data/DataSetFilter/ListValueTest.php similarity index 80% rename from tests/phpunit/Data/Filter/ListValueTest.php rename to tests/phpunit/Data/DataSetFilter/ListValueTest.php index feacbfc..c434926 100644 --- a/tests/phpunit/Data/Filter/ListValueTest.php +++ b/tests/phpunit/Data/DataSetFilter/ListValueTest.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Tests\Data\Filter; +namespace BlueSpice\Tests\Data\DataSetFilter; use BlueSpice\Data\Record; @@ -10,7 +10,7 @@ */ class ListValueTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new \BlueSpice\Data\Filter\ListValue( [ + $filter = new \BlueSpice\Data\DataSetFilter\ListValue( [ 'field' => 'field1', 'comparison' => 'ct', 'value' => [ 'Hello' ] @@ -25,7 +25,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\ListValue( [ + $filter = new \BlueSpice\Data\DataSetFilter\ListValue( [ 'field' => 'field1', 'comparison' => 'ct', 'value' => [ 'Hello' ] diff --git a/tests/phpunit/Data/Filter/NumericTest.php b/tests/phpunit/Data/DataSetFilter/NumericTest.php similarity index 79% rename from tests/phpunit/Data/Filter/NumericTest.php rename to tests/phpunit/Data/DataSetFilter/NumericTest.php index d9d137d..fa75263 100644 --- a/tests/phpunit/Data/Filter/NumericTest.php +++ b/tests/phpunit/Data/DataSetFilter/NumericTest.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Tests\Data\Filter; +namespace BlueSpice\Tests\Data\DataSetFilter; use BlueSpice\Data\Record; @@ -10,7 +10,7 @@ */ class NumericTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new \BlueSpice\Data\Filter\Numeric( [ + $filter = new \BlueSpice\Data\DataSetFilter\Numeric( [ 'field' => 'field1', 'comparison' => 'gt', 'value' => 5 @@ -25,7 +25,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\Numeric( [ + $filter = new \BlueSpice\Data\DataSetFilter\Numeric( [ 'field' => 'field1', 'comparison' => 'gt', 'value' => 5 diff --git a/tests/phpunit/Data/Filter/StringValueTest.php b/tests/phpunit/Data/DataSetFilter/StringValueTest.php similarity index 80% rename from tests/phpunit/Data/Filter/StringValueTest.php rename to tests/phpunit/Data/DataSetFilter/StringValueTest.php index 4456358..95f2e1a 100644 --- a/tests/phpunit/Data/Filter/StringValueTest.php +++ b/tests/phpunit/Data/DataSetFilter/StringValueTest.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Tests\Data\Filter; +namespace BlueSpice\Tests\Data\DataSetFilter; use BlueSpice\Data\Record; @@ -10,7 +10,7 @@ */ class StringValueTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new \BlueSpice\Data\Filter\StringValue( [ + $filter = new \BlueSpice\Data\DataSetFilter\StringValue( [ 'field' => 'field1', 'comparison' => 'ct', 'value' => 'ello' @@ -25,7 +25,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\StringValue( [ + $filter = new \BlueSpice\Data\DataSetFilter\StringValue( [ 'field' => 'field1', 'comparison' => 'ct', 'value' => 'allo' diff --git a/tests/phpunit/Data/Filter/TemplateTitleTest.php b/tests/phpunit/Data/DataSetFilter/TemplateTitleTest.php similarity index 80% rename from tests/phpunit/Data/Filter/TemplateTitleTest.php rename to tests/phpunit/Data/DataSetFilter/TemplateTitleTest.php index 789fc28..d543de1 100644 --- a/tests/phpunit/Data/Filter/TemplateTitleTest.php +++ b/tests/phpunit/Data/DataSetFilter/TemplateTitleTest.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Tests\Data\Filter; +namespace BlueSpice\Tests\Data\DataSetFilter; use BlueSpice\Data\Record; @@ -10,7 +10,7 @@ */ class TemplateTitleTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new \BlueSpice\Data\Filter\TemplateTitle( [ + $filter = new \BlueSpice\Data\DataSetFilter\TemplateTitle( [ 'field' => 'field1', 'comparison' => 'eq', 'value' => 'Help' @@ -25,7 +25,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\TemplateTitle( [ + $filter = new \BlueSpice\Data\DataSetFilter\TemplateTitle( [ 'field' => 'field1', 'comparison' => 'eq', 'value' => 'Help' diff --git a/tests/phpunit/Data/Filter/TitleTest.php b/tests/phpunit/Data/DataSetFilter/TitleTest.php similarity index 81% rename from tests/phpunit/Data/Filter/TitleTest.php rename to tests/phpunit/Data/DataSetFilter/TitleTest.php index 412a703..274b671 100644 --- a/tests/phpunit/Data/Filter/TitleTest.php +++ b/tests/phpunit/Data/DataSetFilter/TitleTest.php @@ -1,6 +1,6 @@ <?php -namespace BlueSpice\Tests\Data\Filter; +namespace BlueSpice\Tests\Data\DataSetFilter; use BlueSpice\Data\Record; @@ -10,7 +10,7 @@ */ class TitleTest extends \PHPUnit_Framework_TestCase { public function testPositive() { - $filter = new \BlueSpice\Data\Filter\Title( [ + $filter = new \BlueSpice\Data\DataSetFilter\Title( [ 'field' => 'field2', 'comparison' => 'eq', 'value' => 'User:WikiSysop' @@ -25,7 +25,7 @@ } public function testNegative() { - $filter = new \BlueSpice\Data\Filter\Title( [ + $filter = new \BlueSpice\Data\DataSetFilter\Title( [ 'field' => 'field1', 'comparison' => 'eq', 'value' => 'Hilfe' diff --git a/tests/phpunit/Data/Filter/BooleanTest.php b/tests/phpunit/Data/Filter/BooleanTest.php deleted file mode 100644 index 59f07e0..0000000 --- a/tests/phpunit/Data/Filter/BooleanTest.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - -namespace BlueSpice\Tests\Data\Filter; - -use BlueSpice\Data\Filter; -use BlueSpice\Data\Record; - -/** - * @group BlueSpice - * @group BlueSpiceFoundation - */ -class BooleanTest extends \PHPUnit_Framework_TestCase { - public function testPositive() { - $filter = new Filter\Boolean( [ - 'field' => 'field1', - 'comparison' => 'eq', - 'value' => true - ] ); - - $result = $filter->matches( new Record( (object)[ - 'field1' => true, - 'field2' => false - ] ) ); - - $this->assertTrue( $result ); - } - - public function testNegative() { - $filter = new Filter\Boolean( [ - 'field' => 'field1', - 'comparison' => 'eq', - 'value' => false - ] ); - - $result = $filter->matches( new Record( (object)[ - 'field1' => true, - 'field2' => false - ] ) ); - - $this->assertFalse( $result ); - } - - - /** - * @dataProvider provideAppliesToValues - * @param boolean $expecation - * @param mixed $fieldValue - * @param mixed $filterValue - * @param string $comparison - */ - public function testAppliesTo ( $expectation, $comparison, $fieldValue, $filterValue ) { - $filter = new Filter\Boolean( [ - Filter\Boolean::KEY_FIELD => 'field_A', - Filter\Boolean::KEY_VALUE => $filterValue, - Filter\Boolean::KEY_COMPARISON => $comparison - ] ); - - $dataSet = new Record( (object) [ - 'field_A' => $fieldValue - ] ); - - if( $expectation ) { - $this->assertTrue( $filter->matches( $dataSet ), 'Filter should apply' ); - } - else { - $this->assertFalse( $filter->matches( $dataSet ), 'Filter should not apply' ); - } - } - - public function provideAppliesToValues() { - return [ - [ true, Filter\Boolean::COMPARISON_EQUALS, true, true ], - [ true, Filter\Boolean::COMPARISON_EQUALS, 1, true ], - [ true, Filter\Boolean::COMPARISON_EQUALS, '1', true ], - [ true, Filter\Boolean::COMPARISON_EQUALS, false, false ], - [ true, Filter\Boolean::COMPARISON_EQUALS, 0, false ], - [ true, Filter\Boolean::COMPARISON_EQUALS, '0', false ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, true, false ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, 1, false ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, '1', false ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, false, true ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, 0, true ], - [ true, Filter\Boolean::COMPARISON_NOT_EQUALS, '0', true ], - [ false, Filter\Boolean::COMPARISON_EQUALS, true, false ], - [ false, Filter\Boolean::COMPARISON_EQUALS, 1, false ], - [ false, Filter\Boolean::COMPARISON_EQUALS, '1', false ], - [ false, Filter\Boolean::COMPARISON_EQUALS, false, true ], - [ false, Filter\Boolean::COMPARISON_EQUALS, 0, true ], - [ false, Filter\Boolean::COMPARISON_EQUALS, '0', true ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, true, true ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, 1, true ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, '1', true ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, false, false ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, 0, false ], - [ false, Filter\Boolean::COMPARISON_NOT_EQUALS, '0', false ] - ]; - } -} diff --git a/tests/phpunit/Data/FiltererTest.php b/tests/phpunit/Data/FiltererTest.php index f7bf7ad..3a07598 100644 --- a/tests/phpunit/Data/FiltererTest.php +++ b/tests/phpunit/Data/FiltererTest.php @@ -3,7 +3,7 @@ namespace BlueSpice\Tests\Data; use BlueSpice\Data\Filterer; -use BlueSpice\Data\Filter; +use BlueSpice\Data\DataSetFilter; use BlueSpice\Data\Record; /** @@ -65,7 +65,7 @@ * @dataProvider provideFilterData */ public function testFilter( $filters, $expectedCount ) { - $filterer = new Filterer( Filter::newCollectionFromArray( $filters ) ); + $filterer = new Filterer( DataSetFilter::newCollectionFromArray( $filters ) ); $dataSets = $this->makeDataSets(); $filteredDataSets = $filterer->filter( $dataSets ); diff --git a/tests/phpunit/Data/ReaderParamsTest.php b/tests/phpunit/Data/ReaderParamsTest.php index 2af1858..f45d5ff 100644 --- a/tests/phpunit/Data/ReaderParamsTest.php +++ b/tests/phpunit/Data/ReaderParamsTest.php @@ -62,7 +62,7 @@ ); $this->assertEquals( - \BlueSpice\Data\Filter\StringValue::COMPARISON_CONTAINS, + \BlueSpice\Data\DataSetFilter\StringValue::COMPARISON_CONTAINS, $firstFilter->getComparison() ); diff --git a/tests/phpunit/Data/SorterTest.php b/tests/phpunit/Data/SorterTest.php index 59c0868..2e9672f 100644 --- a/tests/phpunit/Data/SorterTest.php +++ b/tests/phpunit/Data/SorterTest.php @@ -79,7 +79,7 @@ * @dataProvider provideSortData */ public function testSort( $sort, $expectedSorting ) { - $sorter = new Sorter( Sort::newCollectionFromArray( $sort ) ); + $sorter = new Sorter( DataSetSort::newCollectionFromArray( $sort ) ); $dataSets = $this->makeDataSets(); $sortedDataSets = $sorter->sort( $dataSets ); -- To view, visit https://gerrit.wikimedia.org/r/392046 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I33d0953b80a0976ab9184adcb39e768b37c8318c Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/BlueSpiceFoundation Gerrit-Branch: master Gerrit-Owner: Pwirth <wi...@hallowelt.biz> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits