Skip to content

Commit

Permalink
Merge 27e65b3 into 0d366ee
Browse files Browse the repository at this point in the history
  • Loading branch information
chs2 committed Jan 14, 2016
2 parents 0d366ee + 27e65b3 commit c2bfea8
Show file tree
Hide file tree
Showing 4 changed files with 289 additions and 5 deletions.
130 changes: 130 additions & 0 deletions library/Solarium/QueryType/Select/Query/Component/BoostQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<?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;
}
}
}
}
144 changes: 141 additions & 3 deletions library/Solarium/QueryType/Select/Query/Component/DisMax.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

namespace Solarium\QueryType\Select\Query\Component;

use Solarium\Exception\InvalidArgumentException;
use Solarium\QueryType\Select\Query\Query as SelectQuery;
use Solarium\QueryType\Select\RequestBuilder\Component\DisMax as RequestBuilder;

Expand All @@ -59,6 +60,13 @@ class DisMax extends AbstractComponent
'queryparser' => 'dismax',
);

/**
* Boostqueries.
*
* @var BoostQuery[]
*/
protected $boostQueries = array();

/**
* Get component type.
*
Expand Down Expand Up @@ -278,17 +286,147 @@ public function getTie()
*/
public function setBoostQuery($boostQuery)
{
return $this->setOption('boostquery', $boostQuery);
$this->clearBoostQueries();
$this->addBoostQuery(array('key' => 0, 'query' => $boostQuery));

return $this;
}

/**
* Get BoostQuery option.
*
* @param string $key
*
* @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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,15 @@ public function buildComponent($component, $request)
$request->addParam('ps', $component->getPhraseSlop());
$request->addParam('qs', $component->getQueryPhraseSlop());
$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());

return $request;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,15 @@ public function buildComponent($component, $request)
$request->addParam('ps3', $component->getPhraseTrigramSlop());
$request->addParam('qs', $component->getQueryPhraseSlop());
$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('boost', $component->getBoostFunctionsMult());
$request->addParam('uf', $component->getUserFields());
Expand Down

0 comments on commit c2bfea8

Please sign in to comment.