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