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

Moved requestbuilder and responseparser mappings out of the select query class...

Moved requestbuilder and responseparser mappings out of the select query class and into the query component classes
parent 2eec03ac
...@@ -48,26 +48,29 @@ use Solarium\Core\Configurable; ...@@ -48,26 +48,29 @@ use Solarium\Core\Configurable;
* @package Solarium * @package Solarium
* @subpackage Query * @subpackage Query
*/ */
class Component extends Configurable abstract class Component extends Configurable
{ {
/** /**
* Component type * Get component type
* *
* To be implemented in extending classes * @return string
*/
abstract public function getType();
/**
* Get the requestbuilder class for this query
* *
* @var string * @return object
*/ */
protected $type = ''; abstract public function getRequestBuilder();
/** /**
* Get component type * Get the response parser class for this query
* *
* @return string * @return object
*/ */
public function getType() abstract public function getResponseParser();
{
return $this->type;
}
} }
\ No newline at end of file
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\Debug as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\Debug as ResponseParser;
/** /**
* Debug component * Debug component
...@@ -54,11 +56,34 @@ class Debug extends Component ...@@ -54,11 +56,34 @@ class Debug extends Component
{ {
/** /**
* Component type * Get component type
* *
* @var string * @return string
*/ */
protected $type = SelectQuery::COMPONENT_DEBUG; public function getType()
{
return SelectQuery::COMPONENT_DEBUG;
}
/**
* 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;
}
/** /**
* Get the explainOther option * Get the explainOther option
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\DisMax as RequestBuilder;
/** /**
* DisMax component * DisMax component
...@@ -53,13 +54,6 @@ use Solarium\Query\Select\Query\Query as SelectQuery; ...@@ -53,13 +54,6 @@ use Solarium\Query\Select\Query\Query as SelectQuery;
class DisMax extends Component class DisMax extends Component
{ {
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_DISMAX;
/** /**
* Default options * Default options
* *
...@@ -69,6 +63,36 @@ class DisMax extends Component ...@@ -69,6 +63,36 @@ class DisMax extends Component
'queryparser' => 'dismax', 'queryparser' => 'dismax',
); );
/**
* Get component type
*
* @return string
*/
public function getType()
{
return SelectQuery::COMPONENT_DISMAX;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* This component has no response parser...
*
* @return null
*/
public function getResponseParser()
{
return null;
}
/** /**
* Set QueryAlternative option * Set QueryAlternative option
* *
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\DistributedSearch as RequestBuilder;
/** /**
* Distributed Search (sharding) component * Distributed Search (sharding) component
...@@ -54,18 +55,41 @@ class DistributedSearch extends Component ...@@ -54,18 +55,41 @@ class DistributedSearch extends Component
{ {
/** /**
* Component type * Request to be distributed across all shards in the list
* *
* @var string * @var array
*/ */
protected $type = SelectQuery::COMPONENT_DISTRIBUTEDSEARCH; protected $shards = array();
/** /**
* Request to be distributed across all shards in the list * Get component type
* *
* @var array * @return string
*/ */
protected $shards = array(); public function getType()
{
return SelectQuery::COMPONENT_DISTRIBUTEDSEARCH;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* This component has no response parser...
*
* @return null
*/
public function getResponseParser()
{
return null;
}
/** /**
* Initialize options * Initialize options
......
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Core\Exception; use Solarium\Core\Exception;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\FacetSet as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\FacetSet as ResponseParser;
/** /**
* MoreLikeThis component * MoreLikeThis component
...@@ -86,13 +88,6 @@ class FacetSet extends Component ...@@ -86,13 +88,6 @@ class FacetSet extends Component
self::FACET_RANGE => 'Solarium\Query\Select\Query\Component\Facet\Range', self::FACET_RANGE => 'Solarium\Query\Select\Query\Component\Facet\Range',
); );
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_FACETSET;
/** /**
* Default options * Default options
* *
...@@ -107,6 +102,36 @@ class FacetSet extends Component ...@@ -107,6 +102,36 @@ class FacetSet extends Component
*/ */
protected $facets = array(); protected $facets = array();
/**
* Get component type
*
* @return string
*/
public function getType()
{
return SelectQuery::COMPONENT_FACETSET;
}
/**
* 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
* *
......
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\Grouping as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\Grouping as ResponseParser;
/** /**
* Grouping component * Grouping component
...@@ -89,6 +91,36 @@ class Grouping extends Component ...@@ -89,6 +91,36 @@ class Grouping extends Component
*/ */
protected $queries = array(); protected $queries = array();
/**
* Get component type
*
* @return string
*/
public function getType()
{
return SelectQuery::COMPONENT_GROUPING;
}
/**
* 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
* *
......
...@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Highlighting; ...@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Highlighting;
use Solarium\Core\Exception; use Solarium\Core\Exception;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\Query\Component\Component; use Solarium\Query\Select\Query\Component\Component;
use Solarium\Query\Select\RequestBuilder\Component\Highlighting as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\Highlighting as ResponseParser;
/** /**
* Highlighting component * Highlighting component
...@@ -65,18 +67,41 @@ class Highlighting extends Component ...@@ -65,18 +67,41 @@ class Highlighting extends Component
const FRAGMENTER_REGEX = 'regex'; const FRAGMENTER_REGEX = 'regex';
/** /**
* Component type * Array of fields for highlighting
* *
* @var string * @var array
*/ */
protected $type = SelectQuery::COMPONENT_HIGHLIGHTING; protected $fields = array();
/** /**
* Array of fields for highlighting * Get component type
* *
* @var array * @return string
*/ */
protected $fields = array(); public function getType()
{
return SelectQuery::COMPONENT_HIGHLIGHTING;
}
/**
* 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
......
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\MoreLikeThis as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\MoreLikeThis as ResponseParser;
/** /**
* MoreLikeThis component * MoreLikeThis component
...@@ -54,11 +56,34 @@ class MoreLikeThis extends Component ...@@ -54,11 +56,34 @@ class MoreLikeThis extends Component
{ {
/** /**
* Component type * Get component type
* *
* @var string * @return string
*/ */
protected $type = SelectQuery::COMPONENT_MORELIKETHIS; public function getType()
{
return SelectQuery::COMPONENT_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;
}
/** /**
* Set fields option * Set fields option
......
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
*/ */
namespace Solarium\Query\Select\Query\Component; namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\Spellcheck as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\Spellcheck as ResponseParser;
/** /**
* Spellcheck component * Spellcheck component
...@@ -53,11 +55,34 @@ use Solarium\Query\Select\Query\Query as SelectQuery; ...@@ -53,11 +55,34 @@ use Solarium\Query\Select\Query\Query as SelectQuery;
class Spellcheck extends Component class Spellcheck extends Component
{ {
/** /**
* Component type * Get component type
* *
* @var string * @return string
*/ */
protected $type = SelectQuery::COMPONENT_SPELLCHECK; public function getType()
{
return SelectQuery::COMPONENT_SPELLCHECK;
}
/**
* 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 query option * Set query option
......
...@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Stats; ...@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Stats;
use Solarium\Core\Exception; use Solarium\Core\Exception;
use Solarium\Query\Select\Query\Query as SelectQuery; use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\Query\Component\Component; use Solarium\Query\Select\Query\Component\Component;
use Solarium\Query\Select\RequestBuilder\Component\Stats as RequestBuilder;
use Solarium\Query\Select\ResponseParser\Component\Stats as ResponseParser;
/** /**
* Stats component * Stats component
...@@ -55,13 +57,6 @@ use Solarium\Query\Select\Query\Component\Component; ...@@ -55,13 +57,6 @@ use Solarium\Query\Select\Query\Component\Component;
class Stats extends Component class Stats extends Component
{ {
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_STATS;
/** /**
* Stats facets for all fields * Stats facets for all fields
* *
...@@ -76,6 +71,36 @@ class Stats extends Component ...@@ -76,6 +71,36 @@ class Stats extends Component
*/ */
protected $fields = array(); protected $fields = array();
/**
* Get component type
*
* @return string
*/
public function getType()
{
return SelectQuery::COMPONENT_STATS;
}
/**
* 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
* *
......
...@@ -175,51 +175,15 @@ class Query extends BaseQuery ...@@ -175,51 +175,15 @@ class Query extends BaseQuery
* @var array * @var array
*/ */
protected $componentTypes = array( protected $componentTypes = array(
self::COMPONENT_FACETSET => array( self::COMPONENT_FACETSET => 'Solarium\Query\Select\Query\Component\FacetSet',
'component' => 'Solarium\Query\Select\Query\Component\FacetSet', self::COMPONENT_DISMAX => 'Solarium\Query\Select\Query\Component\DisMax',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\FacetSet', self::COMPONENT_MORELIKETHIS => 'Solarium\Query\Select\Query\Component\MoreLikeThis',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\FacetSet', self::COMPONENT_HIGHLIGHTING => 'Solarium\Query\Select\Query\Component\Highlighting\Highlighting',
), self::COMPONENT_GROUPING => 'Solarium\Query\Select\Query\Component\Grouping',
self::COMPONENT_DISMAX => array( self::COMPONENT_SPELLCHECK => 'Solarium\Query\Select\Query\Component\Spellcheck',
'component' => 'Solarium\Query\Select\Query\Component\DisMax', self::COMPONENT_DISTRIBUTEDSEARCH => 'Solarium\Query\Select\Query\Component\DistributedSearch',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\DisMax', self::COMPONENT_STATS => 'Solarium\Query\Select\Query\Component\Stats\Stats',
'responseparser' => null, self::COMPONENT_DEBUG => 'Solarium\Query\Select\Query\Component\Debug',
),
self::COMPONENT_MORELIKETHIS => array(
'component' => 'Solarium\Query\Select\Query\Component\MoreLikeThis',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\MoreLikeThis',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\MoreLikeThis',
),
self::COMPONENT_HIGHLIGHTING => array(
'component' => 'Solarium\Query\Select\Query\Component\Highlighting\Highlighting',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\Highlighting',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\Highlighting',
),
self::COMPONENT_GROUPING => array(
'component' => 'Solarium\Query\Select\Query\Component\Grouping',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\Grouping',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\Grouping',
),
self::COMPONENT_SPELLCHECK => array(
'component' => 'Solarium\Query\Select\Query\Component\Spellcheck',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\Spellcheck',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\Spellcheck',
),
self::COMPONENT_DISTRIBUTEDSEARCH => array(
'component' => 'Solarium\Query\Select\Query\Component\DistributedSearch',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\DistributedSearch',
'responseparser' => null,
),
self::COMPONENT_STATS => array(
'component' => 'Solarium\Query\Select\Query\Component\Stats\Stats',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\Stats',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\Stats',
),
self::COMPONENT_DEBUG => array(
'component' => 'Solarium\Query\Select\Query\Component\Debug',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\Debug',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\Debug',
),
); );
/** /**
...@@ -784,18 +748,11 @@ class Query extends BaseQuery ...@@ -784,18 +748,11 @@ class Query extends BaseQuery
* *
* @param string $key * @param string $key
* @param string $component * @param string $component
* @param string $requestBuilder
* @param string $responseParser
* @return self Provides fluent interface * @return self Provides fluent interface
*/ */
public function registerComponentType($key, $component, $requestBuilder=null, $responseParser=null) public function registerComponentType($key, $component)
{ {
$this->componentTypes[$key] = array( $this->componentTypes[$key] = $component;
'component' => $component,
'requestbuilder' => $requestBuilder,
'responseparser' => $responseParser,
);
return $this; return $this;
} }
...@@ -831,7 +788,7 @@ class Query extends BaseQuery ...@@ -831,7 +788,7 @@ class Query extends BaseQuery
throw new Exception('Cannot autoload unknown component: ' . $key); throw new Exception('Cannot autoload unknown component: ' . $key);
} }
$className = $this->componentTypes[$key]['component']; $className = $this->componentTypes[$key];
$className = class_exists($className) ? $className : $className.strrchr($className, '\\'); $className = class_exists($className) ? $className : $className.strrchr($className, '\\');
$component = new $className($config); $component = new $className($config);
$this->setComponent($key, $component); $this->setComponent($key, $component);
......
...@@ -93,11 +93,9 @@ class RequestBuilder extends BaseRequestBuilder ...@@ -93,11 +93,9 @@ class RequestBuilder extends BaseRequestBuilder
} }
// add components to request // add components to request
$types = $query->getComponentTypes();
foreach ($query->getComponents() as $component) { foreach ($query->getComponents() as $component) {
$componentBuilderClass = $types[$component->getType()]['requestbuilder']; $componentBuilder = $component->getRequestBuilder();
if (!empty($componentBuilderClass)) { if ($componentBuilder) {
$componentBuilder = new $componentBuilderClass;
$request = $componentBuilder->buildComponent($component, $request); $request = $componentBuilder->buildComponent($component, $request);
} }
} }
......
...@@ -75,11 +75,9 @@ class ResponseParser extends BaseResponseParser ...@@ -75,11 +75,9 @@ class ResponseParser extends BaseResponseParser
// component results // component results
$components = array(); $components = array();
$types = $query->getComponentTypes();
foreach ($query->getComponents() as $component) { foreach ($query->getComponents() as $component) {
$componentParserClass = $types[$component->getType()]['responseparser']; $componentParser = $component->getResponseParser();
if (!empty($componentParserClass)) { if ($componentParser) {
$componentParser = new $componentParserClass;
$components[$component->getType()] = $componentParser->parse($query, $component, $data); $components[$component->getType()] = $componentParser->parse($query, $component, $data);
} }
} }
......
...@@ -46,5 +46,18 @@ class ComponentTest extends \PHPUnit_Framework_TestCase ...@@ -46,5 +46,18 @@ class ComponentTest extends \PHPUnit_Framework_TestCase
class TestComponent extends Component{ class TestComponent extends Component{
protected $type = 'testtype'; public function getType()
{
return 'testtype';
}
public function getRequestBuilder()
{
return null;
}
public function getResponseParser()
{
return null;
}
} }
\ No newline at end of file
...@@ -577,11 +577,7 @@ class QueryTest extends \PHPUnit_Framework_TestCase ...@@ -577,11 +577,7 @@ class QueryTest extends \PHPUnit_Framework_TestCase
public function testRegisterComponentType() public function testRegisterComponentType()
{ {
$components = $this->query->getComponentTypes(); $components = $this->query->getComponentTypes();
$components['mykey'] = array( $components['mykey'] = 'mycomponent';
'component' => 'mycomponent',
'requestbuilder' => 'mybuilder',
'responseparser' => 'myparser',
);
$this->query->registerComponentType('mykey','mycomponent','mybuilder','myparser'); $this->query->registerComponentType('mykey','mycomponent','mybuilder','myparser');
......
...@@ -166,4 +166,14 @@ class TestDummyComponent extends Component{ ...@@ -166,4 +166,14 @@ class TestDummyComponent extends Component{
{ {
return 'testcomponent'; return 'testcomponent';
} }
public function getRequestBuilder()
{
return null;
}
public function getResponseParser()
{
return null;
}
} }
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