Commit 24cfcbbd authored by schausson's avatar schausson

Added option to add multiple boostqueries to dismax parser

parent 0d366ee3
<?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\Select\Query\Component;
use Solarium\Core\Configurable;
use Solarium\Core\Query\Helper;
/**
* Filterquery.
*
* @link http://wiki.apache.org/solr/CommonQueryParameters#fq
*/
class BoostQuery extends Configurable
{
/**
* Query.
*
* @var string
*/
protected $query;
/**
* Get key value.
*
* @return string
*/
public function getKey()
{
return $this->getOption('key');
}
/**
* Set key value.
*
* @param string $value
*
* @return self Provides fluent interface
*/
public function setKey($value)
{
return $this->setOption('key', $value);
}
/**
* Set the query string.
*
* This overwrites the current value
*
* @param string $query
* @param array $bind Bind values for placeholders in the query string
*
* @return self Provides fluent interface
*/
public function setQuery($query, $bind = null)
{
if (!is_null($bind)) {
$helper = new Helper();
$query = $helper->assemble($query, $bind);
}
$this->query = trim($query);
return $this;
}
/**
* Get the query string.
*
* @return string
*/
public function getQuery()
{
return $this->query;
}
/**
* Initialize options.
*/
protected function init()
{
foreach ($this->options as $name => $value) {
switch ($name) {
case 'key':
$this->setKey($value);
break;
case 'query':
$this->setQuery($value);
break;
}
}
}
}
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
namespace Solarium\QueryType\Select\Query\Component; namespace Solarium\QueryType\Select\Query\Component;
use Solarium\Exception\InvalidArgumentException;
use Solarium\QueryType\Select\Query\Query as SelectQuery; use Solarium\QueryType\Select\Query\Query as SelectQuery;
use Solarium\QueryType\Select\RequestBuilder\Component\DisMax as RequestBuilder; use Solarium\QueryType\Select\RequestBuilder\Component\DisMax as RequestBuilder;
...@@ -59,6 +60,13 @@ class DisMax extends AbstractComponent ...@@ -59,6 +60,13 @@ class DisMax extends AbstractComponent
'queryparser' => 'dismax', 'queryparser' => 'dismax',
); );
/**
* Boostqueries.
*
* @var BoostQuery[]
*/
protected $boostQueries = array();
/** /**
* Get component type. * Get component type.
* *
...@@ -278,17 +286,147 @@ class DisMax extends AbstractComponent ...@@ -278,17 +286,147 @@ class DisMax extends AbstractComponent
*/ */
public function setBoostQuery($boostQuery) public function setBoostQuery($boostQuery)
{ {
return $this->setOption('boostquery', $boostQuery); $this->clearBoostQueries();
$this->addBoostQuery(array('key' => 0, 'query' => $boostQuery));
return $this;
} }
/** /**
* Get BoostQuery option. * Get BoostQuery option.
* *
* @param string $key
*
* @return string|null * @return string|null
*/ */
public function getBoostQuery() public function getBoostQuery($key = null)
{
if ($key !== null) {
if (array_key_exists($key, $this->boostQueries)) {
return $this->boostQueries[$key]->getQuery();
}
} else if (!empty($this->boostQueries)) {
/** @var BoostQuery[] $boostQueries */
$boostQueries = array_values($this->boostQueries);
return $boostQueries[0]->getQuery();
} else if (array_key_exists('boostquery', $this->options)) {
return $this->options['boostquery'];
}
return null;
}
/**
* Add a boost query.
*
* Supports a boostquery instance or a config array, in that case a new
* boostquery instance wil be created based on the options.
*
* @throws InvalidArgumentException
*
* @param BoostQuery|array $boostQuery
*
* @return self Provides fluent interface
*/
public function addBoostQuery($boostQuery)
{
if (is_array($boostQuery)) {
$boostQuery = new BoostQuery($boostQuery);
}
$key = $boostQuery->getKey();
if (0 === strlen($key)) {
throw new InvalidArgumentException('A filterquery must have a key value');
}
//double add calls for the same BQ are ignored, but non-unique keys cause an exception
if (array_key_exists($key, $this->boostQueries) && $this->boostQueries[$key] !== $boostQuery) {
throw new InvalidArgumentException('A filterquery must have a unique key value within a query');
} else {
$this->boostQueries[$key] = $boostQuery;
}
return $this;
}
/**
* Add multiple boostqueries.
*
* @param array $boostQueries
*
* @return self Provides fluent interface
*/
public function addBoostQueries(array $boostQueries)
{
foreach ($boostQueries as $key => $boostQuery) {
// in case of a config array: add key to config
if (is_array($boostQuery) && !isset($boostQuery['key'])) {
$boostQuery['key'] = $key;
}
$this->addBoostQuery($boostQuery);
}
return $this;
}
/**
* Get all boostqueries.
*
* @return BoostQuery[]
*/
public function getBoostQueries()
{
return $this->boostQueries;
}
/**
* Remove a single filterquery.
*
* You can remove a filterquery by passing its key, or by passing the filterquery instance
*
* @param string|BoostQuery $boostQuery
*
* @return self Provides fluent interface
*/
public function removeBoostQuery($boostQuery)
{
if (is_object($boostQuery)) {
$boostQuery = $boostQuery->getKey();
}
if (isset($this->boostQueries[$boostQuery])) {
unset($this->boostQueries[$boostQuery]);
}
return $this;
}
/**
* Remove all filterqueries.
*
* @return self Provides fluent interface
*/
public function clearBoostQueries()
{
$this->boostQueries = array();
return $this;
}
/**
* Set multiple filterqueries.
*
* This overwrites any existing filterqueries
*
* @param array $boostQueries
*/
public function setBoostQueries($boostQueries)
{ {
return $this->getOption('boostquery'); $this->clearBoostQueries();
$this->addBoostQueries($boostQueries);
} }
/** /**
......
...@@ -68,7 +68,15 @@ class DisMax implements ComponentRequestBuilderInterface ...@@ -68,7 +68,15 @@ class DisMax implements ComponentRequestBuilderInterface
$request->addParam('ps', $component->getPhraseSlop()); $request->addParam('ps', $component->getPhraseSlop());
$request->addParam('qs', $component->getQueryPhraseSlop()); $request->addParam('qs', $component->getQueryPhraseSlop());
$request->addParam('tie', $component->getTie()); $request->addParam('tie', $component->getTie());
$request->addParam('bq', $component->getBoostQuery());
// add boostqueries to request
$boostQueries = $component->getBoostQueries();
if (count($boostQueries) !== 0) {
foreach ($boostQueries as $boostQuery) {
$request->addParam('bq', $boostQuery->getQuery());
}
}
$request->addParam('bf', $component->getBoostFunctions()); $request->addParam('bf', $component->getBoostFunctions());
return $request; return $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