Commit 2eec03ac authored by Bas de Nooijer's avatar Bas de Nooijer

Moved requestbuilder and responseparser mappings out of the client class and into the query classes

parent 67efa44a
......@@ -122,46 +122,14 @@ class Client extends Configurable
* These can be customized using {@link registerQueryType()}
*/
protected $queryTypes = array(
self::QUERY_SELECT => array(
'query' => 'Solarium\Query\Select\Query\Query',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\RequestBuilder',
'responseparser' => 'Solarium\Query\Select\ResponseParser\ResponseParser'
),
self::QUERY_UPDATE => array(
'query' => 'Solarium\Query\Update\Query\Query',
'requestbuilder' => 'Solarium\Query\Update\RequestBuilder',
'responseparser' => 'Solarium\Query\Update\ResponseParser'
),
self::QUERY_PING => array(
'query' => 'Solarium\Query\Ping\Query',
'requestbuilder' => 'Solarium\Query\Ping\RequestBuilder',
'responseparser' => 'Solarium\Query\Ping\ResponseParser'
),
self::QUERY_MORELIKETHIS => array(
'query' => 'Solarium\Query\MoreLikeThis\Query',
'requestbuilder' => 'Solarium\Query\MoreLikeThis\RequestBuilder',
'responseparser' => 'Solarium\Query\MoreLikeThis\ResponseParser'
),
self::QUERY_ANALYSIS_DOCUMENT => array(
'query' => 'Solarium\Query\Analysis\Query\Document',
'requestbuilder' => 'Solarium\Query\Analysis\RequestBuilder\Document',
'responseparser' => 'Solarium\Query\Analysis\ResponseParser\Document'
),
self::QUERY_ANALYSIS_FIELD => array(
'query' => 'Solarium\Query\Analysis\Query\Field',
'requestbuilder' => 'Solarium\Query\Analysis\RequestBuilder\Field',
'responseparser' => 'Solarium\Query\Analysis\ResponseParser\Field'
),
self::QUERY_TERMS => array(
'query' => 'Solarium\Query\Terms\Query',
'requestbuilder' => 'Solarium\Query\Terms\RequestBuilder',
'responseparser' => 'Solarium\Query\Terms\ResponseParser'
),
self::QUERY_SUGGESTER => array(
'query' => 'Solarium\Query\Suggester\Query',
'requestbuilder' => 'Solarium\Query\Suggester\RequestBuilder',
'responseparser' => 'Solarium\Query\Suggester\ResponseParser'
),
self::QUERY_SELECT => 'Solarium\Query\Select\Query\Query',
self::QUERY_UPDATE => 'Solarium\Query\Update\Query\Query',
self::QUERY_PING => 'Solarium\Query\Ping\Query',
self::QUERY_MORELIKETHIS => 'Solarium\Query\MoreLikeThis\Query',
self::QUERY_ANALYSIS_DOCUMENT => 'Solarium\Query\Analysis\Query\Document',
self::QUERY_ANALYSIS_FIELD => 'Solarium\Query\Analysis\Query\Field',
self::QUERY_TERMS => 'Solarium\Query\Terms\Query',
self::QUERY_SUGGESTER => 'Solarium\Query\Suggester\Query',
);
/**
......@@ -229,6 +197,7 @@ class Client extends Configurable
* The adapter has to be a class that extends
* {@link Solarium\Client\Adapter}.
*
*
* If a string is passed it is assumed to be the classname and it will be
* instantiated on first use. This requires the availability of the class
* through autoloading or a manual require before calling this method.
......@@ -302,18 +271,12 @@ class Client extends Configurable
* require before calling this method.
*
* @param string $type
* @param string $query
* @param string|object $requestBuilder
* @param string|object $responseParser
* @param string $queryClass
* @return self Provides fluent interface
*/
public function registerQueryType($type, $query, $requestBuilder, $responseParser)
public function registerQueryType($type, $queryClass)
{
$this->queryTypes[$type] = array(
'query' => $query,
'requestbuilder' => $requestBuilder,
'responseparser' => $responseParser,
);
$this->queryTypes[$type] = $queryClass;
return $this;
}
......@@ -326,16 +289,15 @@ class Client extends Configurable
*/
public function registerQueryTypes($queryTypes)
{
foreach ($queryTypes as $type => $queryType) {
foreach ($queryTypes as $type => $class) {
if (!isset($queryType['type'])) $queryType['type'] = $type;
// support both "key=>value" and "(no-key) => array(key=>x,query=>y)" formats
if (is_array($class)) {
if (isset($class['type'])) $type = $class['type'];
$class = $class['query'];
}
$this->registerQueryType(
$queryType['type'],
$queryType['query'],
$queryType['requestbuilder'],
$queryType['responseparser']
);
$this->registerQueryType($type, $class);
}
}
......@@ -439,7 +401,7 @@ class Client extends Configurable
*
* You can remove a plugin by passing the plugin key, or the plugin instance
*
* @param string|AbstractPlugin $plugin
* @param string|Plugin $plugin
* @return self Provides fluent interface
*/
public function removePlugin($plugin)
......@@ -514,15 +476,11 @@ class Client extends Configurable
$pluginResult = $this->callPlugins('preCreateRequest', array($query), true);
if($pluginResult !== null) return $pluginResult;
$queryType = $query->getType();
if (!isset($this->queryTypes[$queryType])) {
throw new Exception('No requestbuilder registered for querytype: '. $queryType);
$requestBuilder = $query->getRequestBuilder();
if (!$requestBuilder) {
throw new Exception('No requestbuilder returned by querytype: '. $query->getType());
}
$requestBuilder = $this->queryTypes[$queryType]['requestbuilder'];
if (is_string($requestBuilder)) {
$requestBuilder = new $requestBuilder;
}
$request = $requestBuilder->build($query);
$this->callPlugins('postCreateRequest', array($query, $request));
......@@ -746,7 +704,7 @@ class Client extends Configurable
throw new Exception('Unknown querytype: '. $type);
}
$class = $this->queryTypes[$type]['query'];
$class = $this->queryTypes[$type];
$query = new $class($options);
$this->callPlugins('postCreateQuery', array($type, $options, $query));
......
......@@ -73,6 +73,21 @@ abstract class Query extends Configurable
*/
abstract public function getType();
/**
* Get the requestbuilder class for this query
*
* @return object
*/
abstract public function getRequestBuilder();
/**
* Get the response parser class for this query
*
* @return object
*/
abstract public function getResponseParser();
/**
* Set handler option
*
......
......@@ -68,14 +68,12 @@ class QueryType extends Result
protected function parseResponse()
{
if (!$this->parsed) {
$queryType = $this->query->getType();
$queryTypes = $this->client->getQueryTypes();
if (!isset($queryTypes[$queryType])) {
throw new Exception('No responseparser registered for querytype: '. $queryType);
$responseParser = $this->query->getResponseParser();
if (!$responseParser) {
throw new Exception('No responseparser returned by querytype: '. $this->query->getType());
}
$responseParserClass = $queryTypes[$queryType]['responseparser'];
$responseParser = new $responseParserClass;
$this->mapData($responseParser->parse($this));
$this->parsed = true;
......
......@@ -41,7 +41,8 @@
*/
namespace Solarium\Query\Analysis\Query;
use Solarium\Core\Client\Client;
use Solarium\Query\Analysis\ResponseParser\Document as ResponseParser;
use Solarium\Query\Analysis\RequestBuilder\Document as RequestBuilder;
/**
* Analysis document query
......@@ -79,6 +80,26 @@ class Document extends Query
return Client::QUERY_ANALYSIS_DOCUMENT;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Add a single document
*
......
......@@ -41,6 +41,8 @@
*/
namespace Solarium\Query\Analysis\Query;
use Solarium\Core\Client\Client;
use Solarium\Query\Analysis\ResponseParser\Field as ResponseParser;
use Solarium\Query\Analysis\RequestBuilder\Field as RequestBuilder;
/**
* Analysis document query
......@@ -71,6 +73,26 @@ class Field extends Query
return Client::QUERY_ANALYSIS_FIELD;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Set the field value option
*
......
......@@ -45,6 +45,8 @@
namespace Solarium\Query\MoreLikeThis;
use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Core\Client\Client;
use Solarium\Query\MoreLikeThis\ResponseParser as ResponseParser;
use Solarium\Query\MoreLikeThis\RequestBuilder as RequestBuilder;
/**
* MoreLikeThis Query
......@@ -69,6 +71,26 @@ class Query extends SelectQuery
return Client::QUERY_MORELIKETHIS;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Default options
*
......
......@@ -42,6 +42,7 @@
namespace Solarium\Query\Ping;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Core\Client\Client;
use Solarium\Query\Ping\RequestBuilder as RequestBuilder;
/**
* Ping query
......@@ -66,6 +67,26 @@ class Query extends BaseQuery
return Client::QUERY_PING;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* The ping query has no response parser so we return a null value
*
* @return null;
*/
public function getResponseParser()
{
return null;
}
/**
* Default options
*
......
......@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query;
use Solarium\Core\Exception;
use Solarium\Core\Client\Client;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Query\Select\RequestBuilder\RequestBuilder;
use Solarium\Query\Select\ResponseParser\ResponseParser;
/**
* Select Query
......@@ -132,6 +134,26 @@ class Query extends BaseQuery
return Client::QUERY_SELECT;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Default options
*
......
......@@ -42,6 +42,8 @@
namespace Solarium\Query\Suggester;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Core\Client\Client;
use Solarium\Query\Suggester\RequestBuilder;
use Solarium\Query\Suggester\ResponseParser;
/**
* Suggester Query
......@@ -64,6 +66,26 @@ class Query extends BaseQuery
return Client::QUERY_SUGGESTER;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Default options
*
......
......@@ -42,6 +42,8 @@
namespace Solarium\Query\Terms;
use Solarium\Core\Client\Client;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Query\Terms\RequestBuilder;
use Solarium\Query\Terms\ResponseParser;
/**
* Terms query
......@@ -67,6 +69,26 @@ class Query extends BaseQuery
return Client::QUERY_TERMS;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Default options
*
......
......@@ -43,6 +43,8 @@ namespace Solarium\Query\Update\Query;
use Solarium\Core\Exception;
use Solarium\Core\Client\Client;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Query\Update\RequestBuilder;
use Solarium\Query\Update\ResponseParser;
/**
* Update query
......@@ -126,6 +128,26 @@ class Query extends BaseQuery
return Client::QUERY_UPDATE;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return ResponseParser
*/
public function getResponseParser()
{
return new ResponseParser;
}
/**
* Initialize options
*
......
......@@ -67,11 +67,7 @@ class ClientTest extends \PHPUnit_Framework_TestCase
'port' => 8080,
),
'querytype' => array(
'myquerytype' => array(
'query' => 'MyQuery',
'requestbuilder' => 'MyRequestBuilder',
'responseparser' => 'MyResponseParser'
)
'myquerytype' => 'MyQuery',
),
'plugin' => array(
'myplugin' => array(
......@@ -116,8 +112,6 @@ class ClientTest extends \PHPUnit_Framework_TestCase
array(
'type' => 'myquerytype',
'query' => 'MyQuery',
'requestbuilder' => 'MyRequestBuilder',
'responseparser' => 'MyResponseParser',
)
),
'plugin' => array(
......@@ -141,11 +135,7 @@ class ClientTest extends \PHPUnit_Framework_TestCase
$queryTypes = $this->client->getQueryTypes();
$this->assertEquals(
array(
'requestbuilder' => 'MyRequestBuilder',
'responseparser' => 'MyResponseParser',
'query' => 'MyQuery',
),
'MyQuery',
$queryTypes['myquerytype']
);
......@@ -179,13 +169,9 @@ class ClientTest extends \PHPUnit_Framework_TestCase
{
$queryTypes = $this->client->getQueryTypes();
$this->client->registerQueryType('myquerytype','myquery','mybuilder','myparser');
$this->client->registerQueryType('myquerytype','myquery');
$queryTypes['myquerytype'] = array(
'query' => 'myquery',
'requestbuilder' => 'mybuilder',
'responseparser' => 'myparser',
);
$queryTypes['myquerytype'] = 'myquery';
$this->assertEquals(
$queryTypes,
......@@ -287,15 +273,22 @@ class ClientTest extends \PHPUnit_Framework_TestCase
public function testCreateRequest()
{
$queryStub = $this->getMock('Solarium\Query\Select\Query\Query');
$queryStub->expects($this->any())
->method('getType')
->will($this->returnValue('testquerytype'));
$observer = $this->getMock('Solarium\Core\Client\RequestBuilder', array('build'));
$observer->expects($this->once())
->method('build')
->with($this->equalTo($queryStub));
$queryStub->expects($this->any())
->method('getType')
->will($this->returnValue('testquerytype'));
$queryStub->expects($this->any())
->method('getType')
->will($this->returnValue('testquerytype'));
$queryStub->expects($this->any())
->method('getRequestBuilder')
->will($this->returnValue($observer));
$this->client->registerQueryType('testquerytype', 'Solarium\Query\Select\Query\Query', $observer, '');
$this->client->createRequest($queryStub);
}
......
......@@ -82,4 +82,14 @@ class TestQuery extends Query
{
return 'testType';
}
public function getRequestBuilder()
{
return null;
}
public function getResponseParser()
{
return null;
}
}
\ No newline at end of file
......@@ -94,6 +94,11 @@ class QueryDummyTest extends SelectQuery
{
return 'dummy';
}
public function getResponseParser()
{
return null;
}
}
class QueryTypeDummy extends QueryTypeResult
......
......@@ -69,7 +69,17 @@ class TestAnalysisQuery extends Query{
public function getType()
{
return null;
}
public function getRequestBuilder()
{
return null;
}
public function getResponseParser()
{
return null;
}
}
\ No newline at end of file
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