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;
* @package Solarium
* @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()
{
return $this->type;
}
abstract public function getResponseParser();
}
\ No newline at end of file
......@@ -41,6 +41,8 @@
*/
namespace Solarium\Query\Select\Query\Component;
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
......@@ -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
......
......@@ -41,6 +41,7 @@
*/
namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\DisMax as RequestBuilder;
/**
* DisMax component
......@@ -53,13 +54,6 @@ use Solarium\Query\Select\Query\Query as SelectQuery;
class DisMax extends Component
{
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_DISMAX;
/**
* Default options
*
......@@ -69,6 +63,36 @@ class DisMax extends Component
'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
*
......
......@@ -41,6 +41,7 @@
*/
namespace Solarium\Query\Select\Query\Component;
use Solarium\Query\Select\Query\Query as SelectQuery;
use Solarium\Query\Select\RequestBuilder\Component\DistributedSearch as RequestBuilder;
/**
* Distributed Search (sharding) 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
......
......@@ -42,6 +42,8 @@
namespace Solarium\Query\Select\Query\Component;
use Solarium\Core\Exception;
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
......@@ -86,13 +88,6 @@ class FacetSet extends Component
self::FACET_RANGE => 'Solarium\Query\Select\Query\Component\Facet\Range',
);
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_FACETSET;
/**
* Default options
*
......@@ -107,6 +102,36 @@ class FacetSet extends Component
*/
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
*
......
......@@ -41,6 +41,8 @@
*/
namespace Solarium\Query\Select\Query\Component;
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
......@@ -89,6 +91,36 @@ class Grouping extends Component
*/
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
*
......
......@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Highlighting;
use Solarium\Core\Exception;
use Solarium\Query\Select\Query\Query as SelectQuery;
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
......@@ -65,18 +67,41 @@ class Highlighting extends Component
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
......
......@@ -41,6 +41,8 @@
*/
namespace Solarium\Query\Select\Query\Component;
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
......@@ -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
......
......@@ -41,6 +41,8 @@
*/
namespace Solarium\Query\Select\Query\Component;
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
......@@ -53,11 +55,34 @@ use Solarium\Query\Select\Query\Query as SelectQuery;
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
......
......@@ -43,6 +43,8 @@ namespace Solarium\Query\Select\Query\Component\Stats;
use Solarium\Core\Exception;
use Solarium\Query\Select\Query\Query as SelectQuery;
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
......@@ -55,13 +57,6 @@ use Solarium\Query\Select\Query\Component\Component;
class Stats extends Component
{
/**
* Component type
*
* @var string
*/
protected $type = SelectQuery::COMPONENT_STATS;
/**
* Stats facets for all fields
*
......@@ -76,6 +71,36 @@ class Stats extends Component
*/
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
*
......
......@@ -175,51 +175,15 @@ class Query extends BaseQuery
* @var array
*/
protected $componentTypes = array(
self::COMPONENT_FACETSET => array(
'component' => 'Solarium\Query\Select\Query\Component\FacetSet',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\FacetSet',
'responseparser' => 'Solarium\Query\Select\ResponseParser\Component\FacetSet',
),
self::COMPONENT_DISMAX => array(
'component' => 'Solarium\Query\Select\Query\Component\DisMax',
'requestbuilder' => 'Solarium\Query\Select\RequestBuilder\Component\DisMax',
'responseparser' => null,
),
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',
),
self::COMPONENT_FACETSET => 'Solarium\Query\Select\Query\Component\FacetSet',
self::COMPONENT_DISMAX => 'Solarium\Query\Select\Query\Component\DisMax',
self::COMPONENT_MORELIKETHIS => 'Solarium\Query\Select\Query\Component\MoreLikeThis',
self::COMPONENT_HIGHLIGHTING => 'Solarium\Query\Select\Query\Component\Highlighting\Highlighting',
self::COMPONENT_GROUPING => 'Solarium\Query\Select\Query\Component\Grouping',
self::COMPONENT_SPELLCHECK => 'Solarium\Query\Select\Query\Component\Spellcheck',
self::COMPONENT_DISTRIBUTEDSEARCH => 'Solarium\Query\Select\Query\Component\DistributedSearch',
self::COMPONENT_STATS => 'Solarium\Query\Select\Query\Component\Stats\Stats',
self::COMPONENT_DEBUG => 'Solarium\Query\Select\Query\Component\Debug',
);
/**
......@@ -784,18 +748,11 @@ class Query extends BaseQuery
*
* @param string $key
* @param string $component
* @param string $requestBuilder
* @param string $responseParser
* @return self Provides fluent interface
*/
public function registerComponentType($key, $component, $requestBuilder=null, $responseParser=null)
public function registerComponentType($key, $component)
{
$this->componentTypes[$key] = array(
'component' => $component,
'requestbuilder' => $requestBuilder,
'responseparser' => $responseParser,
);
$this->componentTypes[$key] = $component;
return $this;
}
......@@ -831,7 +788,7 @@ class Query extends BaseQuery
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, '\\');
$component = new $className($config);
$this->setComponent($key, $component);
......
......@@ -93,11 +93,9 @@ class RequestBuilder extends BaseRequestBuilder
}
// add components to request
$types = $query->getComponentTypes();
foreach ($query->getComponents() as $component) {
$componentBuilderClass = $types[$component->getType()]['requestbuilder'];
if (!empty($componentBuilderClass)) {
$componentBuilder = new $componentBuilderClass;
$componentBuilder = $component->getRequestBuilder();
if ($componentBuilder) {
$request = $componentBuilder->buildComponent($component, $request);
}
}
......
......@@ -75,11 +75,9 @@ class ResponseParser extends BaseResponseParser
// component results
$components = array();
$types = $query->getComponentTypes();
foreach ($query->getComponents() as $component) {
$componentParserClass = $types[$component->getType()]['responseparser'];
if (!empty($componentParserClass)) {
$componentParser = new $componentParserClass;
$componentParser = $component->getResponseParser();
if ($componentParser) {
$components[$component->getType()] = $componentParser->parse($query, $component, $data);
}
}
......
......@@ -46,5 +46,18 @@ class ComponentTest extends \PHPUnit_Framework_TestCase
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
public function testRegisterComponentType()
{
$components = $this->query->getComponentTypes();
$components['mykey'] = array(
'component' => 'mycomponent',
'requestbuilder' => 'mybuilder',
'responseparser' => 'myparser',
);
$components['mykey'] = 'mycomponent';
$this->query->registerComponentType('mykey','mycomponent','mybuilder','myparser');
......
......@@ -166,4 +166,14 @@ class TestDummyComponent extends Component{
{
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