Commit d553c099 authored by Bas de Nooijer's avatar Bas de Nooijer

Added support for parameter dereferencing, including tests and examples.

Did require some refactoring of other classes though.
Also implemented dereferencing support in the join helper method.
parent 39256a07
<?php
require('init.php');
htmlHeader();
// create a client instance and get a select query instance
$client = new Solarium_Client($config);
// first an example manually defining dereferenced params
$query = $client->createSelect();
$helper = $query->getHelper();
$join = $helper->qparser('join', array('from' => 'manu_id', 'to' => 'id'), true);
$queryString = $join . 'id:1';
$query->setQuery($queryString);
$request = $client->createRequest($query);
// output resulting url with dereferenced params
echo urldecode($request->getUri()) . '<hr/>';
// this second example gives the exact same result, using the special join helper
$query = $client->createSelect();
$helper = $query->getHelper();
$join = $helper->join('manu_id', 'id', true);
$queryString = $join . 'id:1';
$query->setQuery($queryString);
$request = $client->createRequest($query);
echo urldecode($request->getUri());
htmlFooter();
\ No newline at end of file
...@@ -113,6 +113,7 @@ ...@@ -113,6 +113,7 @@
</ul> </ul>
<li><a href="6.2-escaping.php">6.2 Escaping</a></li> <li><a href="6.2-escaping.php">6.2 Escaping</a></li>
<li><a href="6.3-placeholder-syntax.php">6.3 Placeholder syntax</a></li> <li><a href="6.3-placeholder-syntax.php">6.3 Placeholder syntax</a></li>
<li><a href="6.4-dereferenced-params.php">6.4 Dereferenced params</a></li>
</ul> </ul>
<li>7. Plugins</li> <li>7. Plugins</li>
......
...@@ -45,6 +45,22 @@ ...@@ -45,6 +45,22 @@
abstract class Solarium_Client_RequestBuilder abstract class Solarium_Client_RequestBuilder
{ {
/**
* Build request for a select query
*
* @param Solarium_Query $query
* @return Solarium_Client_Request
*/
public function build($query)
{
$request = new Solarium_Client_Request;
$request->setHandler($query->getHandler());
$request->addParams($query->getParams());
$request->addParam('wt', 'json');
return $request;
}
/** /**
* Render a param with localParams * Render a param with localParams
* *
......
...@@ -53,10 +53,7 @@ class Solarium_Client_RequestBuilder_Analysis extends Solarium_Client_RequestBui ...@@ -53,10 +53,7 @@ class Solarium_Client_RequestBuilder_Analysis extends Solarium_Client_RequestBui
*/ */
public function build($query) public function build($query)
{ {
$request = new Solarium_Client_Request; $request = parent::build($query);
$request->setHandler($query->getHandler());
$request->addParam('wt', 'json');
$request->addParam('analysis.query', $query->getQuery()); $request->addParam('analysis.query', $query->getQuery());
$request->addParam('analysis.showmatch', $query->getShowMatch()); $request->addParam('analysis.showmatch', $query->getShowMatch());
......
...@@ -53,10 +53,8 @@ class Solarium_Client_RequestBuilder_Ping extends Solarium_Client_RequestBuilder ...@@ -53,10 +53,8 @@ class Solarium_Client_RequestBuilder_Ping extends Solarium_Client_RequestBuilder
*/ */
public function build($query) public function build($query)
{ {
$request = new Solarium_Client_Request; $request = parent::build($query);
$request->setHandler($query->getHandler());
$request->setMethod(Solarium_Client_Request::METHOD_GET); $request->setMethod(Solarium_Client_Request::METHOD_GET);
$request->addParam('wt', 'json');
return $request; return $request;
} }
......
...@@ -53,15 +53,13 @@ class Solarium_Client_RequestBuilder_Select extends Solarium_Client_RequestBuild ...@@ -53,15 +53,13 @@ class Solarium_Client_RequestBuilder_Select extends Solarium_Client_RequestBuild
*/ */
public function build($query) public function build($query)
{ {
$request = new Solarium_Client_Request; $request = parent::build($query);
$request->setHandler($query->getHandler());
// add basic params to request // add basic params to request
$request->addParam('q', $query->getQuery()); $request->addParam('q', $query->getQuery());
$request->addParam('start', $query->getStart()); $request->addParam('start', $query->getStart());
$request->addParam('rows', $query->getRows()); $request->addParam('rows', $query->getRows());
$request->addParam('fl', implode(',', $query->getFields())); $request->addParam('fl', implode(',', $query->getFields()));
$request->addParam('wt', 'json');
$request->addParam('q.op', $query->getQueryDefaultOperator()); $request->addParam('q.op', $query->getQueryDefaultOperator());
$request->addParam('df', $query->getQueryDefaultField()); $request->addParam('df', $query->getQueryDefaultField());
......
...@@ -56,10 +56,8 @@ class Solarium_Client_RequestBuilder_Terms extends Solarium_Client_RequestBuilde ...@@ -56,10 +56,8 @@ class Solarium_Client_RequestBuilder_Terms extends Solarium_Client_RequestBuilde
*/ */
public function build($query) public function build($query)
{ {
$request = new Solarium_Client_Request; $request = parent::build($query);
$request->setHandler($query->getHandler());
$request->addParam('terms', true); $request->addParam('terms', true);
$request->addParam('wt', 'json');
$request->addParam('terms.lower', $query->getLowerbound()); $request->addParam('terms.lower', $query->getLowerbound());
$request->addParam('terms.lower.incl', $query->getLowerboundInclude()); $request->addParam('terms.lower.incl', $query->getLowerboundInclude());
$request->addParam('terms.mincount', $query->getMinCount()); $request->addParam('terms.mincount', $query->getMinCount());
......
...@@ -53,12 +53,10 @@ class Solarium_Client_RequestBuilder_Update extends Solarium_Client_RequestBuild ...@@ -53,12 +53,10 @@ class Solarium_Client_RequestBuilder_Update extends Solarium_Client_RequestBuild
*/ */
public function build($query) public function build($query)
{ {
$request = new Solarium_Client_Request; $request = parent::build($query);
$request->setHandler($query->getHandler());
$request->setMethod(Solarium_Client_Request::METHOD_POST); $request->setMethod(Solarium_Client_Request::METHOD_POST);
$request->addParam('wt', 'json');
$request->setRawData($this->getRawData($query)); $request->setRawData($this->getRawData($query));
return $request; return $request;
} }
...@@ -213,13 +211,13 @@ class Solarium_Client_RequestBuilder_Update extends Solarium_Client_RequestBuild ...@@ -213,13 +211,13 @@ class Solarium_Client_RequestBuilder_Update extends Solarium_Client_RequestBuild
$command->getExpungeDeletes() $command->getExpungeDeletes()
); );
$xml .= '/>'; $xml .= '/>';
return $xml; return $xml;
} }
/** /**
* Build XMl for a rollback command * Build XMl for a rollback command
* *
* @return string * @return string
*/ */
public function buildRollbackXml() public function buildRollbackXml()
......
...@@ -51,14 +51,21 @@ abstract class Solarium_Query extends Solarium_Configurable ...@@ -51,14 +51,21 @@ abstract class Solarium_Query extends Solarium_Configurable
* @var Solarium_Query_Helper * @var Solarium_Query_Helper
*/ */
protected $_helper; protected $_helper;
/**
* Extra query params (e.g. dereferenced params)
*
* @var array
*/
protected $_params = array();
/** /**
* Get type for this query * Get type for this query
* *
* @return string * @return string
*/ */
abstract public function getType(); abstract public function getType();
/** /**
* Set handler option * Set handler option
* *
...@@ -118,10 +125,36 @@ abstract class Solarium_Query extends Solarium_Configurable ...@@ -118,10 +125,36 @@ abstract class Solarium_Query extends Solarium_Configurable
public function getHelper() public function getHelper()
{ {
if (null === $this->_helper) { if (null === $this->_helper) {
$this->_helper = new Solarium_Query_Helper; $this->_helper = new Solarium_Query_Helper($this);
} }
return $this->_helper; return $this->_helper;
} }
/**
* Add extra params to the request
*
* Only intended for internal use, for instance with dereferenced params.
* Therefore the params are limited in functionality. Only add and get
*
* @param string $name
* @param string $value
* @return self Provides fluent interface
*/
public function addParam($name, $value)
{
$this->_params[$name] = $value;
return $this;
}
/**
* Get extra params
*
* @return array
*/
public function getParams()
{
return $this->_params;
}
} }
\ No newline at end of file
...@@ -61,6 +61,27 @@ class Solarium_Query_Helper ...@@ -61,6 +61,27 @@ class Solarium_Query_Helper
*/ */
protected $_assembleParts; protected $_assembleParts;
/**
* Counter to keep dereferenced params unique (within a single query instance)
*
* @var int
*/
protected $_derefencedParamsLastKey = 0;
/**
* @var Solarium_Query
*/
protected $_query;
/**
* Constructor
*
* @param Solarium_Query $query
*/
public function __construct($query = null) {
$this->_query = $query;
}
/** /**
* Escape a term * Escape a term
* *
...@@ -201,10 +222,28 @@ class Solarium_Query_Helper ...@@ -201,10 +222,28 @@ class Solarium_Query_Helper
* *
* @param string $name * @param string $name
* @param array $params * @param array $params
* @param boolean $dereferenced
* @return string * @return string
*/ */
public function qparser($name, $params = array()) public function qparser($name, $params = array(), $dereferenced = false)
{ {
if ($dereferenced) {
if(!$this->_query) {
throw new Solarium_Exception(
'Dereferenced params can only be used in a Solarium_Query_Helper instance retrieved from the query '
. 'by using the getHelper() method, this instance was manually created'
);
}
foreach($params as $paramKey => $paramValue) {
$this->_derefencedParamsLastKey++;
$derefKey = 'deref_' . $this->_derefencedParamsLastKey;
$this->_query->addParam($derefKey, $paramValue);
$params[$paramKey] = '$'.$derefKey;
}
}
$output = '{!'.$name; $output = '{!'.$name;
foreach ($params as $key=>$value) { foreach ($params as $key=>$value) {
$output .= ' ' . $key . '=' . $value; $output .= ' ' . $key . '=' . $value;
...@@ -297,13 +336,14 @@ class Solarium_Query_Helper ...@@ -297,13 +336,14 @@ class Solarium_Query_Helper
* @see http://wiki.apache.org/solr/Join * @see http://wiki.apache.org/solr/Join
* @since 2.4.0 * @since 2.4.0
* *
* @param $from * @param string $from
* @param $to * @param string $to
* @param boolean $dereferenced
* @return string * @return string
*/ */
public function join($from, $to) public function join($from, $to, $dereferenced = false)
{ {
return $this->qparser('join', array('from' => $from, 'to' => $to)); return $this->qparser('join', array('from' => $from, 'to' => $to), $dereferenced);
} }
} }
\ No newline at end of file
...@@ -58,7 +58,7 @@ class Solarium_Query_Select_Component_Facet_Query extends Solarium_Query_Select_ ...@@ -58,7 +58,7 @@ class Solarium_Query_Select_Component_Facet_Query extends Solarium_Query_Select_
/** /**
* Get the facet type * Get the facet type
* *
* @return string * @return string
*/ */
public function getType() public function getType()
...@@ -81,7 +81,7 @@ class Solarium_Query_Select_Component_Facet_Query extends Solarium_Query_Select_ ...@@ -81,7 +81,7 @@ class Solarium_Query_Select_Component_Facet_Query extends Solarium_Query_Select_
$helper = new Solarium_Query_Helper; $helper = new Solarium_Query_Helper;
$query = $helper->assemble($query, $bind); $query = $helper->assemble($query, $bind);
} }
return $this->_setOption('query', $query); return $this->_setOption('query', $query);
} }
......
...@@ -67,7 +67,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa ...@@ -67,7 +67,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa
); );
$this->assertEquals( $this->assertEquals(
'select?q=*:*&start=0&rows=10&fl=*,score&wt=json', 'select?wt=json&q=*:*&start=0&rows=10&fl=*,score',
urldecode($request->getUri()) urldecode($request->getUri())
); );
} }
...@@ -84,7 +84,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa ...@@ -84,7 +84,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa
); );
$this->assertEquals( $this->assertEquals(
'select?q=*:*&start=0&rows=10&fl=*,score&wt=json&sort=id asc,name desc', 'select?wt=json&q=*:*&start=0&rows=10&fl=*,score&sort=id asc,name desc',
urldecode($request->getUri()) urldecode($request->getUri())
); );
} }
...@@ -101,7 +101,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa ...@@ -101,7 +101,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa
); );
$this->assertEquals( $this->assertEquals(
'select?q=*:*&start=0&rows=10&fl=*,score&wt=json&q.op=AND&df=mydefault', 'select?wt=json&q=*:*&start=0&rows=10&fl=*,score&q.op=AND&df=mydefault',
urldecode($request->getUri()) urldecode($request->getUri())
); );
} }
...@@ -120,7 +120,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa ...@@ -120,7 +120,7 @@ class Solarium_Client_RequestBuilder_SelectTest extends PHPUnit_Framework_TestCa
); );
$this->assertEquals( $this->assertEquals(
'select?q=*:*&start=0&rows=10&fl=*,score&wt=json&sort=id asc,name desc&fq=published:true&fq={!tag=t1,t2}category:23', 'select?wt=json&q=*:*&start=0&rows=10&fl=*,score&sort=id asc,name desc&fq=published:true&fq={!tag=t1,t2}category:23',
urldecode($request->getUri()) urldecode($request->getUri())
); );
} }
......
...@@ -31,7 +31,9 @@ ...@@ -31,7 +31,9 @@
class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase
{ {
/**
* @var TestRequestBuilder
*/
protected $_builder; protected $_builder;
public function setup() public function setup()
...@@ -39,10 +41,23 @@ class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase ...@@ -39,10 +41,23 @@ class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase
$this->_builder = new TestRequestBuilder; $this->_builder = new TestRequestBuilder;
} }
public function testBuild()
{
$query = new Solarium_Query_Select;
$query->addParam('p1','v1');
$query->addParam('p2','v2');
$request = $this->_builder->build($query);
$this->assertEquals(
'select?p1=v1&p2=v2&wt=json',
urldecode($request->getUri())
);
}
public function testRenderLocalParams() public function testRenderLocalParams()
{ {
$myParams = array('tag' => 'mytag', 'ex' => array('exclude1','exclude2')); $myParams = array('tag' => 'mytag', 'ex' => array('exclude1','exclude2'));
$this->assertEquals( $this->assertEquals(
'{!tag=mytag ex=exclude1,exclude2}myValue', '{!tag=mytag ex=exclude1,exclude2}myValue',
$this->_builder->renderLocalParams('myValue', $myParams) $this->_builder->renderLocalParams('myValue', $myParams)
...@@ -60,5 +75,5 @@ class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase ...@@ -60,5 +75,5 @@ class Solarium_Client_RequestBuilderTest extends PHPUnit_Framework_TestCase
} }
class TestRequestBuilder extends Solarium_Client_RequestBuilder{ class TestRequestBuilder extends Solarium_Client_RequestBuilder{
} }
\ No newline at end of file
...@@ -31,11 +31,12 @@ ...@@ -31,11 +31,12 @@
class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase
{ {
protected $_helper; protected $_helper, $_query;
public function setUp() public function setUp()
{ {
$this->_helper = new Solarium_Query_Helper; $this->_query = new Solarium_Query_Select;
$this->_helper = new Solarium_Query_Helper($this->_query);
} }
public function testRangeQueryInclusive() public function testRangeQueryInclusive()
...@@ -104,6 +105,38 @@ class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase ...@@ -104,6 +105,38 @@ class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase
); );
} }
public function testQparserDereferencedNoQuery()
{
$helper = new Solarium_Query_Helper();
$this->setExpectedException('Solarium_Exception');
$helper->qparser('join', array('from' => 'manu_id', 'to' => 'id'), true);
}
public function testQparserDereferenced()
{
$this->assertEquals(
'{!join from=$deref_1 to=$deref_2}',
$this->_helper->qparser('join', array('from' => 'manu_id', 'to' => 'id'), true)
);
$this->assertEquals(
array('deref_1' => 'manu_id', 'deref_2' => 'id'),
$this->_query->getParams()
);
// second call, params should have updated counts
$this->assertEquals(
'{!join from=$deref_3 to=$deref_4}',
$this->_helper->qparser('join', array('from' => 'cat_id', 'to' => 'prod_id'), true)
);
// previous params should also still be there
$this->assertEquals(
array('deref_1' => 'manu_id', 'deref_2' => 'id', 'deref_3' => 'cat_id', 'deref_4' => 'prod_id'),
$this->_query->getParams()
);
}
public function testFunctionCallNoParams() public function testFunctionCallNoParams()
{ {
$this->assertEquals( $this->assertEquals(
...@@ -205,4 +238,17 @@ class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase ...@@ -205,4 +238,17 @@ class Solarium_Query_HelperTest extends PHPUnit_Framework_TestCase
); );
} }
public function testJoinDereferenced()
{
$this->assertEquals(
'{!join from=$deref_1 to=$deref_2}',
$this->_helper->join('manu_id', 'id', true)
);
$this->assertEquals(
array('deref_1' => 'manu_id', 'deref_2' => 'id'),
$this->_query->getParams()
);
}
} }
...@@ -38,7 +38,7 @@ class Solarium_QueryTest extends PHPUnit_Framework_TestCase ...@@ -38,7 +38,7 @@ class Solarium_QueryTest extends PHPUnit_Framework_TestCase
$query->setHandler('myhandler'); $query->setHandler('myhandler');
$this->assertEquals('myhandler', $query->getHandler()); $this->assertEquals('myhandler', $query->getHandler());
} }
public function testSetAndGetResultClass() public function testSetAndGetResultClass()
{ {
$query = new TestQuery; $query = new TestQuery;
...@@ -56,7 +56,20 @@ class Solarium_QueryTest extends PHPUnit_Framework_TestCase ...@@ -56,7 +56,20 @@ class Solarium_QueryTest extends PHPUnit_Framework_TestCase
get_class($helper) get_class($helper)
); );
} }
public function testAddAndGetParams()
{
$query = new TestQuery;
$query->addParam('p1','v1');
$query->addParam('p2','v2');
$query->addParam('p2','v3'); //should overwrite previous value
$this->assertEquals(
array('p1' => 'v1', 'p2' => 'v3'),
$query->getParams()
);
}
} }
class TestQuery extends Solarium_Query class TestQuery extends Solarium_Query
......
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