From: <lph...@us...> - 2010-11-29 17:19:21
|
Revision: 30923 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=30923&view=rev Author: lphuberdeau Date: 2010-11-29 17:19:15 +0000 (Mon, 29 Nov 2010) Log Message: ----------- [MOD] Adding support for range filtering Modified Paths: -------------- trunk/lib/core/Search/Index/Lucene.php trunk/lib/core/Search/Query.php trunk/lib/core/Search/Type/Factory/Lucene.php trunk/lib/test/core/Search/Index/LuceneTest.php trunk/lib/test/core/Search/QueryTest.php Added Paths: ----------- trunk/lib/core/Search/Expr/Range.php Added: trunk/lib/core/Search/Expr/Range.php =================================================================== --- trunk/lib/core/Search/Expr/Range.php (rev 0) +++ trunk/lib/core/Search/Expr/Range.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -0,0 +1,53 @@ +<?php + +class Search_Expr_Range implements Search_Expr_Interface +{ + private $from; + private $to; + private $type; + private $field; + + function __construct($from, $to, $type = null, $field = null) + { + $this->from = $from; + $this->to = $to; + $this->type = $type; + $this->field = $field; + } + + function getToken($which) + { + if ($which != 'from' && $which != 'to') { + return null; + } + + return new Search_Expr_Token($this->$which, $this->type, $this->field); + } + + function setType($type) + { + $this->type = $type; + } + + function setField($field = 'global') + { + $this->field = $field; + } + + function walk($callback) + { + return call_user_func($callback, $this, array()); + } + + function getValue(Search_Type_Factory_Interface $typeFactory) + { + $type = $this->type; + return $typeFactory->$type($this->string); + } + + function getField() + { + return $this->field; + } +} + Modified: trunk/lib/core/Search/Index/Lucene.php =================================================================== --- trunk/lib/core/Search/Index/Lucene.php 2010-11-29 17:06:45 UTC (rev 30922) +++ trunk/lib/core/Search/Index/Lucene.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -140,6 +140,16 @@ $result->addSubquery($childNodes[0], false); return $result; + } elseif ($node instanceof Search_Expr_Range) { + $from = $node->getToken('from'); + $to = $node->getToken('to'); + $range = new Zend_Search_Lucene_Search_Query_Range( + $this->buildTerm($from)->getTerm(), + $this->buildTerm($to)->getTerm(), + true // inclusive + ); + + return $range; } elseif ($node instanceof Search_Expr_Token) { return $this->buildTerm($node); } Modified: trunk/lib/core/Search/Query.php =================================================================== --- trunk/lib/core/Search/Query.php 2010-11-29 17:06:45 UTC (rev 30922) +++ trunk/lib/core/Search/Query.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -49,6 +49,11 @@ $this->addPart($or, 'multivalue', 'allowed_groups'); } + function filterRange($from, $to, $field = 'modification_date') + { + $this->expr->addPart(new Search_Expr_Range($from, $to, 'timestamp', $field)); + } + private function addPart($query, $type, $field) { $query = $this->parse($query); Modified: trunk/lib/core/Search/Type/Factory/Lucene.php =================================================================== --- trunk/lib/core/Search/Type/Factory/Lucene.php 2010-11-29 17:06:45 UTC (rev 30922) +++ trunk/lib/core/Search/Type/Factory/Lucene.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -14,7 +14,7 @@ function timestamp($value) { - return new Search_Type_Whole($value); + return new Search_Type_Whole(gmdate('YmdHis', $value)); } function identifier($value) Modified: trunk/lib/test/core/Search/Index/LuceneTest.php =================================================================== --- trunk/lib/test/core/Search/Index/LuceneTest.php 2010-11-29 17:06:45 UTC (rev 30922) +++ trunk/lib/test/core/Search/Index/LuceneTest.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -5,6 +5,7 @@ */ class Search_Index_LuceneTest extends PHPUnit_Framework_TestCase { + const DOCUMENT_DATE = 1234567890; private $dir; private $index; @@ -19,6 +20,7 @@ 'object_type' => $typeFactory->identifier('wiki page'), 'object_id' => $typeFactory->identifier('HomePage'), 'language' => $typeFactory->identifier('en'), + 'modification_date' => $typeFactory->timestamp(self::DOCUMENT_DATE), 'description' => $typeFactory->plaintext('a description for the page'), 'wiki_content' => $typeFactory->wikitext('Hello world!'), 'categories' => $typeFactory->multivalue(array(1, 2, 5, 6)), @@ -112,10 +114,20 @@ $this->assertResultCount(0, 'filterPermissions', array('Project')); } + function testRangeFilter() + { + $this->assertResultCount(1, 'filterRange', self::DOCUMENT_DATE - 1000, self::DOCUMENT_DATE + 1000); + $this->assertResultCount(0, 'filterRange', self::DOCUMENT_DATE - 1000, self::DOCUMENT_DATE - 500); + $this->assertResultCount(1, 'filterRange', 2, 2000000000); // Check lexicography + } + private function assertResultCount($count, $filterMethod, $argument) { + $arguments = func_get_args(); + $arguments = array_slice($arguments, 2); + $query = new Search_Query; - $query->$filterMethod($argument); + call_user_func_array(array($query, $filterMethod), $arguments); $this->assertEquals($count, count($query->search($this->index))); } Modified: trunk/lib/test/core/Search/QueryTest.php =================================================================== --- trunk/lib/test/core/Search/QueryTest.php 2010-11-29 17:06:45 UTC (rev 30922) +++ trunk/lib/test/core/Search/QueryTest.php 2010-11-29 17:19:15 UTC (rev 30923) @@ -58,7 +58,7 @@ $query->search($index); $expr = new Search_Expr_And(array( - $expr = new Search_Expr_And(array( + new Search_Expr_And(array( new Search_Expr_Token('1', 'multivalue', 'categories'), new Search_Expr_Token('2', 'multivalue', 'categories'), )), @@ -76,7 +76,7 @@ $query->search($index); $expr = new Search_Expr_And(array( - $expr = new Search_Expr_And(array( + new Search_Expr_And(array( new Search_Expr_Token('1', 'multivalue', 'deep_categories'), new Search_Expr_Token('2', 'multivalue', 'deep_categories'), )), @@ -94,7 +94,7 @@ $query->search($index); $expr = new Search_Expr_And(array( - $expr = new Search_Expr_Or(array( + new Search_Expr_Or(array( new Search_Expr_Token('en', 'identifier', 'language'), new Search_Expr_Token('fr', 'identifier', 'language'), )), @@ -146,7 +146,7 @@ $query->search($index); $expr = new Search_Expr_And(array( - $expr = new Search_Expr_Or(array( + new Search_Expr_Or(array( new Search_Expr_Token('Registered', 'multivalue', 'allowed_groups'), new Search_Expr_Token('Editor', 'multivalue', 'allowed_groups'), new Search_Expr_Token('Project Lead ABC', 'multivalue', 'allowed_groups'), @@ -167,7 +167,7 @@ $this->assertEquals(50, $index->getLastCount()); } - function testSpecifiedRange() + function testSpecifiedPaginationRange() { $index = new Search_Index_Memory; $query = new Search_Query; @@ -178,5 +178,20 @@ $this->assertEquals(60, $index->getLastStart()); $this->assertEquals(30, $index->getLastCount()); } + + function testWithQueryRange() + { + $index = new Search_Index_Memory; + $query = new Search_Query; + $query->filterRange(1000, 2000); + + $query->search($index); + + $expr = new Search_Expr_And(array( + new Search_Expr_Range(1000, 2000, 'timestamp', 'modification_date') + )); + + $this->assertEquals($expr, $index->getLastQuery()); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |