Commit 168e6a09 authored by Bas de Nooijer's avatar Bas de Nooijer

- added create methods

- unittest improvements
parent 41c60725
......@@ -80,14 +80,17 @@ class Solarium_Client extends Solarium_Configurable
*/
protected $_queryTypes = array(
self::QUERYTYPE_SELECT => array(
'query' => 'Solarium_Query_Select',
'requestbuilder' => 'Solarium_Client_RequestBuilder_Select',
'responseparser' => 'Solarium_Client_ResponseParser_Select'
),
self::QUERYTYPE_UPDATE => array(
'query' => 'Solarium_Query_Update',
'requestbuilder' => 'Solarium_Client_RequestBuilder_Update',
'responseparser' => 'Solarium_Client_ResponseParser_Update'
),
self::QUERYTYPE_PING => array(
'query' => 'Solarium_Query_Ping',
'requestbuilder' => 'Solarium_Client_RequestBuilder_Ping',
'responseparser' => 'Solarium_Client_ResponseParser_Ping'
),
......@@ -462,4 +465,65 @@ class Solarium_Client extends Solarium_Configurable
{
return $this->execute($query);
}
/**
* Create a query instance
*
* @param string $type
* @param array $options
* @return Solarium_Query
*/
public function createQuery($type, $options = null)
{
$type = strtolower($type);
$pluginResult = $this->_callPlugins('preCreateQuery', array($type, $options), true);
if($pluginResult !== null) return $pluginResult;
if (!isset($this->_queryTypes[$type])) {
throw new Solarium_Exception('Unknown querytype: '. $type);
}
$class = $this->_queryTypes[$type]['query'];
$query = new $class($options);
$this->_callPlugins('postCreateQuery', array($type, $options, $query));
return $query;
}
/**
* Create a select query instance
*
* @param mixed $options
* @return Solarium_Query_Select
*/
public function createSelect($options = null)
{
return $this->createQuery(self::QUERYTYPE_SELECT, $options);
}
/**
* Create an update query instance
*
* @param mixed $options
* @return Solarium_Query_Update
*/
public function createUpdate($options = null)
{
return $this->createQuery(self::QUERYTYPE_UPDATE, $options);
}
/**
* Create a ping query instance
*
* @param mixed $options
* @return Solarium_Query_Ping
*/
public function createPing($options = null)
{
return $this->createQuery(self::QUERYTYPE_PING, $options);
}
}
\ No newline at end of file
......@@ -81,7 +81,7 @@ class Solarium_Client_Adapter_Http extends Solarium_Client_Adapter
}
$uri = $this->getBaseUri() . $request->getUri();
$data = @file_get_contents($uri, false, $context);
$data = $this->_getData($uri, $context);
// if there is no data and there are no headers it's a total failure,
// a connection to the host was impossible.
......@@ -92,4 +92,16 @@ class Solarium_Client_Adapter_Http extends Solarium_Client_Adapter
return new Solarium_Client_Response($data, $http_response_header);
}
/**
* Execute request
*
* @param string $uri
* @param resource $context
* @return string
*/
protected function _getData($uri, $context)
{
return @file_get_contents($uri, false, $context);
}
}
\ No newline at end of file
......@@ -48,7 +48,7 @@
* @package Solarium
* @subpackage Client
*/
class Solarium_Client_Adapter_ZendHttp extends Solarium_Client_Adapter_Http
class Solarium_Client_Adapter_ZendHttp extends Solarium_Client_Adapter
{
/**
......@@ -143,9 +143,9 @@ class Solarium_Client_Adapter_ZendHttp extends Solarium_Client_Adapter_Http
* Execute a Solr request using the Zend_Http_Client instance
*
* @param Solarium_Client_Request $request
* @return string
* @return Solarium_Client_Response
*/
protected function _handleRequest($request)
public function execute($request)
{
$client = $this->getZendHttp();
......@@ -164,22 +164,12 @@ class Solarium_Client_Adapter_ZendHttp extends Solarium_Client_Adapter_Http
}
if ($request->getMethod() == Solarium_Client_Request::HEAD) {
return true;
$data = '';
} else {
$data = $response->getBody();
$type = $response->getHeader('Content-Type');
switch ($type) {
case 'text/plain; charset=utf-8':
return $this->_jsonDecode($data);
break;
default:
throw new Solarium_Exception(
'Unknown Content-Type in ZendHttp adapter: ' . $type
);
break;
}
}
return new Solarium_Client_Response($data, $response->getHeaders());
}
}
\ No newline at end of file
......@@ -69,16 +69,16 @@ class Solarium_Client_RequestBuilder_Select_Component_FacetSet extends Solarium_
foreach ($facets AS $facet) {
switch ($facet->getType())
{
case Solarium_Query_Select_Component_Facet::FIELD:
case Solarium_Query_Select_Component_FacetSet::FACET_FIELD:
$this->addFacetField($request, $facet);
break;
case Solarium_Query_Select_Component_Facet::QUERY:
case Solarium_Query_Select_Component_FacetSet::FACET_QUERY:
$this->addFacetQuery($request, $facet);
break;
case Solarium_Query_Select_Component_Facet::MULTIQUERY:
case Solarium_Query_Select_Component_FacetSet::FACET_MULTIQUERY:
$this->addFacetMultiQuery($request, $facet);
break;
case Solarium_Query_Select_Component_Facet::RANGE:
case Solarium_Query_Select_Component_FacetSet::FACET_RANGE:
$this->addFacetRange($request, $facet);
break;
default:
......
......@@ -75,19 +75,19 @@ class Solarium_Client_RequestBuilder_Update extends Solarium_Client_RequestBuild
$xml = '<update>';
foreach ($query->getCommands() AS $command) {
switch ($command->getType()) {
case Solarium_Query_Update_Command::ADD:
case Solarium_Query_Update::COMMAND_ADD:
$xml .= $this->buildAddXml($command);
break;
case Solarium_Query_Update_Command::DELETE:
case Solarium_Query_Update::COMMAND_DELETE:
$xml .= $this->buildDeleteXml($command);
break;
case Solarium_Query_Update_Command::OPTIMIZE:
case Solarium_Query_Update::COMMAND_OPTIMIZE:
$xml .= $this->buildOptimizeXml($command);
break;
case Solarium_Query_Update_Command::COMMIT:
case Solarium_Query_Update::COMMAND_COMMIT:
$xml .= $this->buildCommitXml($command);
break;
case Solarium_Query_Update_Command::ROLLBACK:
case Solarium_Query_Update::COMMAND_ROLLBACK:
$xml .= $this->buildRollbackXml();
break;
default:
......
......@@ -57,16 +57,16 @@ class Solarium_Client_ResponseParser_Select_Component_FacetSet
$facets = array();
foreach ($facetSet->getFacets() AS $key => $facet) {
switch ($facet->getType()) {
case Solarium_Query_Select_Component_Facet::FIELD:
case Solarium_Query_Select_Component_FacetSet::FACET_FIELD:
$result = $this->_facetField($facet, $data);
break;
case Solarium_Query_Select_Component_Facet::QUERY:
case Solarium_Query_Select_Component_FacetSet::FACET_QUERY:
$result = $this->_facetQuery($facet, $data);
break;
case Solarium_Query_Select_Component_Facet::MULTIQUERY:
case Solarium_Query_Select_Component_FacetSet::FACET_MULTIQUERY:
$result = $this->_facetMultiQuery($facet, $data);
break;
case Solarium_Query_Select_Component_Facet::RANGE:
case Solarium_Query_Select_Component_FacetSet::FACET_RANGE:
$result = $this->_facetRange($facet, $data);
break;
default:
......
......@@ -148,5 +148,24 @@ abstract class Solarium_Plugin_Abstract extends Solarium_Configurable
public function postExecute($query, $result)
{
}
/**
* @param string $query
* @param mixed $options
* @return void|Solarium_Query
*/
public function preCreateQuery($type, $options)
{
}
/**
* @param string $query
* @param mixed $options
* @param Solarium_Query
* @return void
*/
public function postCreateQuery($type, $options, $query)
{
}
}
\ No newline at end of file
......@@ -468,6 +468,17 @@ class Solarium_Query_Select extends Solarium_Query
return $this;
}
/**
* Create a filterquery instance
*
* @param mixed $options
* @return Solarium_Query_Select_FilterQuery
*/
public function createFilterQuery($options = null)
{
return new Solarium_Query_Select_FilterQuery($options);
}
/**
* Add a filter query
*
......
......@@ -46,14 +46,6 @@
abstract class Solarium_Query_Select_Component_Facet extends Solarium_Configurable
{
/**
* Constants for the facet types
*/
const QUERY = 'query';
const FIELD = 'field';
const MULTIQUERY = 'multiquery';
const RANGE = 'range';
/**
* Exclude tags for this facet
*
......
......@@ -74,7 +74,7 @@ class Solarium_Query_Select_Component_Facet_Field extends Solarium_Query_Select_
*/
public function getType()
{
return self::FIELD;
return Solarium_Query_Select_Component_FacetSet::FACET_FIELD;
}
/**
......
......@@ -81,7 +81,7 @@ class Solarium_Query_Select_Component_Facet_MultiQuery extends Solarium_Query_Se
*/
public function getType()
{
return self::MULTIQUERY;
return Solarium_Query_Select_Component_FacetSet::FACET_MULTIQUERY;
}
/**
......
......@@ -62,7 +62,7 @@ class Solarium_Query_Select_Component_Facet_Query extends Solarium_Query_Select_
*/
public function getType()
{
return self::QUERY;
return Solarium_Query_Select_Component_FacetSet::FACET_QUERY;
}
/**
......
......@@ -93,7 +93,7 @@ class Solarium_Query_Select_Component_Facet_Range extends Solarium_Query_Select_
*/
public function getType()
{
return self::RANGE;
return Solarium_Query_Select_Component_FacetSet::FACET_RANGE;
}
/**
......
......@@ -46,6 +46,26 @@
class Solarium_Query_Select_Component_FacetSet extends Solarium_Query_Select_Component
{
/**
* Facet type keys
*/
const FACET_FIELD = 'field';
const FACET_QUERY = 'query';
const FACET_MULTIQUERY = 'multiquery';
const FACET_RANGE = 'range';
/**
* Facet type mapping
*
* @var array
*/
protected $_facetTypes = array(
self::FACET_FIELD => 'Solarium_Query_Select_Component_Facet_Field',
self::FACET_QUERY => 'Solarium_Query_Select_Component_Facet_Query',
self::FACET_MULTIQUERY => 'Solarium_Query_Select_Component_Facet_MultiQuery',
self::FACET_RANGE => 'Solarium_Query_Select_Component_Facet_Range',
);
/**
* Component type
*
......@@ -224,8 +244,7 @@ class Solarium_Query_Select_Component_FacetSet extends Solarium_Query_Select_Com
public function addFacet($facet)
{
if (is_array($facet)) {
$className = 'Solarium_Query_Select_Component_Facet_'.ucfirst($facet['type']);
$facet = new $className($facet);
$facet = $this->createFacet($facet['type'], $facet);
}
$key = $facet->getKey();
......@@ -328,4 +347,65 @@ class Solarium_Query_Select_Component_FacetSet extends Solarium_Query_Select_Com
$this->addFacets($facets);
}
/**
* @param string $type
* @param array|object|null $options
* @return Solarium_Query_Select_Component_Facet
*/
public function createFacet($type, $options = null)
{
$type = strtolower($type);
if (!isset($this->_facetTypes[$type])) {
throw new Solarium_Exception("Facettype unknown: " . $type);
}
$class = $this->_facetTypes[$type];
return new $class($options);
}
/**
* Get a facet field instance
*
* @param mixed $options
* @return Solarium_Query_Select_Component_Facet_Field
*/
public function createFacetField($options = null)
{
return $this->createFacet(self::FACET_FIELD, $options);
}
/**
* Get a facet query instance
*
* @param mixed $options
* @return Solarium_Query_Select_Component_Facet_Query
*/
public function createFacetQuery($options = null)
{
return $this->createFacet(self::FACET_QUERY, $options);
}
/**
* Get a facet multiquery instance
*
* @param mixed $options
* @return Solarium_Query_Select_Component_Facet_MultiQuery
*/
public function createFacetMultiQuery($options = null)
{
return $this->createFacet(self::FACET_MULTIQUERY, $options);
}
/**
* Get a facet range instance
*
* @param mixed $options
* @return Solarium_Query_Select_Component_Facet_Range
*/
public function createFacetRange($options = null)
{
return $this->createFacet(self::FACET_RANGE, $options);
}
}
\ No newline at end of file
......@@ -49,14 +49,26 @@ class Solarium_Query_Update extends Solarium_Query
{
/**
* Get type for this query
* Update command type names
*/
const COMMAND_ADD = 'add';
const COMMAND_DELETE = 'delete';
const COMMAND_COMMIT = 'commit';
const COMMAND_ROLLBACK = 'rollback';
const COMMAND_OPTIMIZE = 'optimize';
/**
* Update command types
*
* @return string
* @var array
*/
public function getType()
{
return Solarium_Client::QUERYTYPE_UPDATE;
}
protected $_commandTypes = array(
self::COMMAND_ADD => 'Solarium_Query_Update_Command_Add',
self::COMMAND_DELETE => 'Solarium_Query_Update_Command_Delete',
self::COMMAND_COMMIT => 'Solarium_Query_Update_Command_Commit',
self::COMMAND_OPTIMIZE => 'Solarium_Query_Update_Command_Optimize',
self::COMMAND_ROLLBACK => 'Solarium_Query_Update_Command_Rollback',
);
/**
* Default options
......@@ -78,6 +90,16 @@ class Solarium_Query_Update extends Solarium_Query
*/
protected $_commands = array();
/**
* Get type for this query
*
* @return string
*/
public function getType()
{
return Solarium_Client::QUERYTYPE_UPDATE;
}
/**
* Initialize options
*
......@@ -90,31 +112,41 @@ class Solarium_Query_Update extends Solarium_Query
{
if (isset($this->_options['command'])) {
foreach ($this->_options['command'] as $key => $value) {
switch ($value['type']) {
case 'delete':
$command = new Solarium_Query_Update_Command_Delete($value);
break;
case 'commit':
$command = new Solarium_Query_Update_Command_Commit($value);
break;
case 'optimize':
$command = new Solarium_Query_Update_Command_Optimize($value);
break;
case 'rollback':
$command = new Solarium_Query_Update_Command_Rollback($value);
break;
case 'add':
throw new Solarium_Exception(
"Adding documents is not supported in configuration, use the API for this"
);
$type = $value['type'];
if ($type == self::COMMAND_ADD) {
throw new Solarium_Exception(
"Adding documents is not supported in configuration, use the API for this"
);
}
$this->add($key, $command);
$this->add($key, $this->createCommand($type, $value));
}
}
}
/**
* Create a command instance
*
* @throws Solarium_Exception
* @param string $type
* @param mixed $options
* @return Solarium_Query_Update_Command
*/
public function createCommand($type, $options = null)
{
$type = strtolower($type);
if (!isset($this->_commandTypes[$type])) {
throw new Solarium_Exception("Update commandtype unknown: " . $type);
}
$class = $this->_commandTypes[$type];
return new $class($options);
}
/**
* Get all commands for this update query
*
......
......@@ -44,15 +44,6 @@
abstract class Solarium_Query_Update_Command extends Solarium_Configurable
{
/**
* Command types
*/
const ADD = 'add';
const DELETE = 'delete';
const COMMIT = 'commit';
const OPTIMIZE = 'optimize';
const ROLLBACK = 'rollback';
/**
* Returns command type, for use in adapters
*
......
......@@ -61,7 +61,7 @@ class Solarium_Query_Update_Command_Add extends Solarium_Query_Update_Command
*/
public function getType()
{
return Solarium_Query_Update_Command::ADD;
return Solarium_Query_Update::COMMAND_ADD;
}
/**
......
......@@ -54,7 +54,7 @@ class Solarium_Query_Update_Command_Commit extends Solarium_Query_Update_Command
*/
public function getType()
{
return Solarium_Query_Update_Command::COMMIT;
return Solarium_Query_Update::COMMAND_COMMIT;
}
/**
......
......@@ -68,7 +68,7 @@ class Solarium_Query_Update_Command_Delete extends Solarium_Query_Update_Command
*/
public function getType()
{
return Solarium_Query_Update_Command::DELETE;
return Solarium_Query_Update::COMMAND_DELETE;
}
/**
......
......@@ -54,7 +54,7 @@ class Solarium_Query_Update_Command_Optimize
*/
public function getType()
{
return Solarium_Query_Update_Command::OPTIMIZE;
return Solarium_Query_Update::COMMAND_OPTIMIZE;
}
/**
......
......@@ -54,7 +54,7 @@ class Solarium_Query_Update_Command_Rollback
*/
public function getType()
{
return Solarium_Query_Update_Command::ROLLBACK;
return Solarium_Query_Update::COMMAND_ROLLBACK;
}
}
\ No newline at end of file
......@@ -44,7 +44,6 @@ class Solarium_ClientTest extends PHPUnit_Framework_TestCase
public function testGetAdapterWithDefaultAdapter()
{
$defaultAdapter = $this->_client->getOption('adapter');
$adapter = $this->_client->getAdapter();
$this->assertThat($adapter, $this->isInstanceOf($defaultAdapter));
......
......@@ -42,7 +42,7 @@ class Solarium_Query_Select_Component_Facet_FieldTest extends PHPUnit_Framework_
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Select_Component_Facet::FIELD,
Solarium_Query_Select_Component_FacetSet::FACET_FIELD,
$this->_facet->getType()
);
}
......
......@@ -45,7 +45,7 @@ class Solarium_Query_Select_Component_Facet_MultiQueryTest extends PHPUnit_Frame
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Select_Component_Facet::MULTIQUERY,
Solarium_Query_Select_Component_FacetSet::FACET_MULTIQUERY,
$this->_facet->getType()
);
}
......
......@@ -42,7 +42,7 @@ class Solarium_Query_Select_Component_Facet_QueryTest extends PHPUnit_Framework_
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Select_Component_Facet::QUERY,
Solarium_Query_Select_Component_FacetSet::FACET_QUERY,
$this->_facet->getType()
);
}
......
......@@ -42,7 +42,7 @@ class Solarium_Query_Select_Component_Facet_RangeTest extends PHPUnit_Framework_
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Select_Component_Facet::RANGE,
Solarium_Query_Select_Component_FacetSet::FACET_RANGE,
$this->_facet->getType()
);
}
......
......@@ -41,7 +41,7 @@ class Solarium_Query_Update_Command_AddTest extends PHPUnit_Framework_TestCase
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Update_Command::ADD,
Solarium_Query_Update::COMMAND_ADD,
$this->_command->getType()
);
}
......
......@@ -41,7 +41,7 @@ class Solarium_Query_Update_Command_CommitTest extends PHPUnit_Framework_TestCas
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Update_Command::COMMIT,
Solarium_Query_Update::COMMAND_COMMIT,
$this->_command->getType()
);
}
......
......@@ -41,7 +41,7 @@ class Solarium_Query_Update_Command_DeleteTest extends PHPUnit_Framework_TestCas
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Update_Command::DELETE,
Solarium_Query_Update::COMMAND_DELETE,
$this->_command->getType()
);
}
......
......@@ -41,7 +41,7 @@ class Solarium_Query_Update_Command_OptimizeTest extends PHPUnit_Framework_TestC
public function testGetType()
{
$this->assertEquals(
Solarium_Query_Update_Command::OPTIMIZE,
Solarium_Query_Update::COMMAND_OPTIMIZE,
$this->_command->getType()
);
}
......
......@@ -35,7 +35,7 @@ class Solarium_Query_Update_Command_RollbackTest extends PHPUnit_Framework_TestC
{
$command = new Solarium_Query_Update_Command_Rollback;
$this->assertEquals(
Solarium_Query_Update_Command::ROLLBACK,
Solarium_Query_Update::COMMAND_ROLLBACK,
$command->getType()
);
}
......
......@@ -107,7 +107,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::ROLLBACK,
Solarium_Query_Update::COMMAND_ROLLBACK,
$commands[0]->getType()
);
}
......@@ -118,7 +118,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::DELETE,
Solarium_Query_Update::COMMAND_DELETE,
$commands[0]->getType()
);
......@@ -134,7 +134,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::DELETE,
Solarium_Query_Update::COMMAND_DELETE,
$commands[0]->getType()
);
......@@ -150,7 +150,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::DELETE,
Solarium_Query_Update::COMMAND_DELETE,
$commands[0]->getType()
);
......@@ -166,7 +166,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::DELETE,
Solarium_Query_Update::COMMAND_DELETE,
$commands[0]->getType()
);
......@@ -184,7 +184,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::ADD,
Solarium_Query_Update::COMMAND_ADD,
$commands[0]->getType()
);
......@@ -203,7 +203,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::ADD,
Solarium_Query_Update::COMMAND_ADD,
$commands[0]->getType()
);
......@@ -229,7 +229,7 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::COMMIT,
Solarium_Query_Update::COMMAND_COMMIT,
$commands[0]->getType()
);
......@@ -255,7 +255,8 @@ class Solarium_Query_UpdateTest extends PHPUnit_Framework_TestCase
$commands = $this->_query->getCommands();
$this->assertEquals(
Solarium_Query_Update_Command::OPTIMIZE,
Solarium_Query_Update::COMMAND_OPTIMIZE,
Solarium_Query_Update::COMMAND_OPTIMIZE,
$commands[0]->getType()
);
......
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