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

Various fixes for porting the extract querytype to Solarium 3 (work in progress...)

parent a7335438
......@@ -174,7 +174,7 @@ class ZendHttp extends Configurable implements AdapterInterface
switch ($request->getMethod()) {
case Request::METHOD_GET:
$client->setMethod(\Zend_Http_Client::GET);
$client->setParameterGet($request->getQueryAsArray());
$client->setParameterGet($request->getParams());
break;
case Request::METHOD_POST:
$client->setMethod(\Zend_Http_Client::POST);
......@@ -182,24 +182,22 @@ class ZendHttp extends Configurable implements AdapterInterface
if ($request->getFileUpload()) {
$this->prepareFileUpload($client, $request);
} else {
$client->setParameterGet($request->getQueryAsArray());
$client->setParameterGet($request->getParams());
$client->setRawData($request->getRawData());
$request->addHeader('Content-Type: text/xml; charset=UTF-8');
}
break;
case Request::METHOD_HEAD:
$client->setMethod(\Zend_Http_Client::HEAD);
$client->setParameterGet($request->getQueryAsArray());
$client->setParameterGet($request->getParams());
break;
default:
throw new OutOfBoundsException('Unsupported method: ' . $request->getMethod());
break;
}
$client->setMethod($request->getMethod());
$client->setUri($endpoint->getBaseUri() . $request->getUri());
$client->setHeaders($request->getHeaders());
$client->setRawData($request->getRawData());
$this->timeout = $endpoint->getTimeout();
$response = $client->request();
......@@ -271,7 +269,7 @@ class ZendHttp extends Configurable implements AdapterInterface
$client->setFileUpload('content', 'content', $content, 'application/octet-stream; charset=binary');
// set query params as "multipart/form-data" fields
foreach ($request->getQueryAsArray() as $name => $value) {
foreach ($request->getParams() as $name => $value) {
$client->setFileUpload(null, $name, $value, 'text/plain; charset=utf-8');
}
}
......
......@@ -38,6 +38,15 @@
* @subpackage Query
*/
/**
* @namespace
*/
namespace Solarium\QueryType\Extract;
use Solarium\Core\Query\Query as BaseQuery;
use Solarium\Core\Client\Client;
use Solarium\QueryType\Update\ResponseParser as UpdateResponseParser;
use Solarium\QueryType\Update\Query\Document;
/**
* Extract query
*
......@@ -50,7 +59,7 @@
* @package Solarium
* @subpackage Query
*/
class Solarium_Query_Extract extends Solarium_Query
class Query extends BaseQuery
{
/**
* Default options
......@@ -59,7 +68,8 @@ class Solarium_Query_Extract extends Solarium_Query
*/
protected $_options = array(
'handler' => 'update/extract',
'resultclass' => 'Solarium_Result_Update',
'resultclass' => 'Solarium\QueryType\Extract\Result',
'omitheader' => true,
);
/**
......@@ -67,7 +77,7 @@ class Solarium_Query_Extract extends Solarium_Query
*
* @var array
*/
protected $_fieldMappings = array();
protected $fieldMappings = array();
/**
* Get type for this query
......@@ -76,7 +86,27 @@ class Solarium_Query_Extract extends Solarium_Query
*/
public function getType()
{
return Solarium_Client::QUERYTYPE_EXTRACT;
return Client::QUERY_EXTRACT;
}
/**
* Get a requestbuilder for this query
*
* @return RequestBuilder
*/
public function getRequestBuilder()
{
return new RequestBuilder;
}
/**
* Get a response parser for this query
*
* @return UpdateResponseParser
*/
public function getResponseParser()
{
return new UpdateResponseParser;
}
/**
......@@ -94,26 +124,24 @@ class Solarium_Query_Extract extends Solarium_Query
}
}
// {{{ Options
/**
* Set the document with literal fields and boost settings
*
* The fields in the document are indexed together with the generated
* fields that Solr extracts from the file.
*
* @param Solarium_Document_ReadWrite $document
* @return Solarium_Query_Extract
* @param Document $document
* @return self
*/
public function setDocument($document)
{
return $this->_setOption('document', $document);
return $this->setOption('document', $document);
}
/**
* Get the document with literal fields and boost settings
*
* @return Solarium_Document_ReadWrite|null
* @return Document|null
*/
public function getDocument()
{
......@@ -124,11 +152,11 @@ class Solarium_Query_Extract extends Solarium_Query
* Set the file to upload and index
*
* @param string $filename
* @return Solarium_Query_Extract
* @return self
*/
public function setFile($filename)
{
return $this->_setOption('file', $filename);
return $this->setOption('file', $filename);
}
/**
......@@ -145,11 +173,11 @@ class Solarium_Query_Extract extends Solarium_Query
* Set the prefix for fields that are not defined in the schema
*
* @param string $uprefix
* @return Solarium_Query_Extract
* @return self
*/
public function setUprefix($uprefix)
{
return $this->_setOption('uprefix', $uprefix);
return $this->setOption('uprefix', $uprefix);
}
/**
......@@ -167,11 +195,11 @@ class Solarium_Query_Extract extends Solarium_Query
* determined
*
* @param string $defaultField
* @return Solarium_Query_Extract
* @return self
*/
public function setDefaultField($defaultField)
{
return $this->_setOption('defaultField', $defaultField);
return $this->setOption('defaultField', $defaultField);
}
/**
......@@ -190,11 +218,11 @@ class Solarium_Query_Extract extends Solarium_Query
* For example, Content-Type would be mapped to content_type.
*
* @param bool $lowerNames
* @return Solarium_Query_Extract
* @return self
*/
public function setLowernames($lowerNames)
{
return $this->_setOption('lowernames', (bool) $lowerNames);
return $this->setOption('lowernames', (bool) $lowerNames);
}
/**
......@@ -211,11 +239,11 @@ class Solarium_Query_Extract extends Solarium_Query
* Set if the extract should be committed immediately
*
* @param bool $commit
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function setCommit($commit)
{
return $this->_setOption('commit', (bool) $commit);
return $this->setOption('commit', (bool) $commit);
}
/**
......@@ -232,11 +260,11 @@ class Solarium_Query_Extract extends Solarium_Query
* Set milliseconds until extract update is committed. Since Solr 3.4
*
* @param int $commitWithin
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function setCommitWithin($commitWithin)
{
return $this->_setOption('commitWithin', $commitWithin);
return $this->setOption('commitWithin', $commitWithin);
}
/**
......@@ -249,10 +277,6 @@ class Solarium_Query_Extract extends Solarium_Query
return $this->getOption('commitWithin');
}
// }}}
// {{{ Field Mappings
/**
* Add a name mapping from one field to another
*
......@@ -261,11 +285,11 @@ class Solarium_Query_Extract extends Solarium_Query
*
* @param string $fromField Original field name
* @param mixed|array $toField New field name
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function addFieldMapping($fromField, $toField)
{
$this->_fieldMappings[$fromField] = $toField;
$this->fieldMappings[$fromField] = $toField;
return $this;
}
......@@ -274,7 +298,7 @@ class Solarium_Query_Extract extends Solarium_Query
* Add multiple field name mappings
*
* @param array $mappings Name mapping in the form [$fromField => $toField, ...]
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function addFieldMappings($mappings)
{
......@@ -289,12 +313,12 @@ class Solarium_Query_Extract extends Solarium_Query
* Remove a field name mapping
*
* @param string $fromField
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function removeFieldMapping($fromField)
{
if (isset($this->_fieldMappings[$fromField])) {
unset($this->_fieldMappings[$fromField]);
if (isset($this->fieldMappings[$fromField])) {
unset($this->fieldMappings[$fromField]);
}
return $this;
......@@ -303,11 +327,11 @@ class Solarium_Query_Extract extends Solarium_Query
/**
* Remove all field name mappings
*
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function clearFieldMappings()
{
$this->_fieldMappings = array();
$this->fieldMappings = array();
return $this;
}
......@@ -318,14 +342,14 @@ class Solarium_Query_Extract extends Solarium_Query
*/
public function getFieldMappings()
{
return $this->_fieldMappings;
return $this->fieldMappings;
}
/**
* Set many field name mappings. This overwrites any existing fields.
*
* @param array $mappings Name mapping in the form [$fromField => $toField, ...]
* @return Solarium_Query_Extract Provides fluent interface
* @return self Provides fluent interface
*/
public function setFieldMappings($mappings)
{
......@@ -334,6 +358,4 @@ class Solarium_Query_Extract extends Solarium_Query
return $this;
}
// }}}
}
......@@ -38,27 +38,35 @@
* @subpackage Client
*/
/**
* @namespace
*/
namespace Solarium\QueryType\Extract;
use Solarium\Core\Query\QueryInterface;
use Solarium\Core\Query\RequestBuilder as BaseRequestBuilder;
use Solarium\Core\Client\Request;
use Solarium\Exception\RuntimeException;
/**
* Build an extract request
*
* @package Solarium
* @subpackage Client
*/
class Solarium_Client_RequestBuilder_Extract extends Solarium_Client_RequestBuilder
class RequestBuilder extends BaseRequestBuilder
{
/**
* Build the request
*
* @param Solarium_Query_Extract $query
* @return Solarium_Client_Request
* @param Query $query
* @return Request
*/
public function build($query)
public function build(QueryInterface $query)
{
$request = parent::build($query);
$request->setMethod(Solarium_Client_Request::METHOD_POST);
// common options
$request->setMethod(Request::METHOD_POST);
// add common options to request
$request->addParam('commit', $query->getCommit());
$request->addParam('commitWithin', $query->getCommitWithin());
......@@ -70,11 +78,10 @@ class Solarium_Client_RequestBuilder_Extract extends Solarium_Client_RequestBuil
$request->addParam('fmap.' . $fromField, $toField);
}
// document
// add document settings to request
if (($doc = $query->getDocument()) != null) {
if ($doc->getBoost() !== null) {
throw new Solarium_Exception('Extract does not support document-level boosts, use field boosts instead.');
throw new RuntimeException('Extract does not support document-level boosts, use field boosts instead.');
}
// literal.*
......@@ -91,8 +98,7 @@ class Solarium_Client_RequestBuilder_Extract extends Solarium_Client_RequestBuil
}
}
// file
// add file to request
$request->setFileUpload($query->getFile());
$request->addParam('resource.name', basename($query->getFile()));
......
<?php
/**
* Copyright 2011 Bas de Nooijer. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this listof conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of the copyright holder.
*
* @copyright Copyright 2011 Bas de Nooijer <solarium@raspberry.nl>
* @license http://github.com/basdenooijer/solarium/raw/master/COPYING
* @link http://www.solarium-project.org/
*/
/**
* @namespace
*/
namespace Solarium\QueryType\Extract;
use Solarium\QueryType\Update\Result as UpdateResult;
/**
* An extract result is similar to an update result, but we do want to return a query specific result class instead of
* an update query result class.
*/
class Result extends UpdateResult
{
}
......@@ -89,12 +89,12 @@ class ZendHttpTest extends \PHPUnit_Framework_TestCase
public function testExecute()
{
$method = Request::METHOD_GET;
$method = Request::METHOD_POST;
$rawData = 'xyz';
$responseData = 'abc';
$handler = 'myhandler';
$headers = array(
'Content-Type: application/x-www-form-urlencoded'
'X-test: 123'
);
$request = new Request();
......@@ -116,7 +116,10 @@ class ZendHttpTest extends \PHPUnit_Framework_TestCase
->with($this->equalTo('http://127.0.0.1:8983/solr/myhandler?'));
$mock->expects($this->once())
->method('setHeaders')
->with($this->equalTo($headers));
->with($this->equalTo(array(
'X-test: 123',
'Content-Type: text/xml; charset=UTF-8',
)));
$mock->expects($this->once())
->method('setRawData')
->with($this->equalTo($rawData));
......
......@@ -488,6 +488,7 @@ authentication: Array
resource: /myHandler?param1=1&param2=test+content
resource urldecoded: /myHandler?param1=1&param2=test content
raw data: post data
file upload:
',
(string) $this->request
);
......
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