Commit 711073d2 authored by Bas de Nooijer's avatar Bas de Nooijer

Refactored highlighting per-field settings

parent 13a7f96c
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
*/ */
class Solarium_Client_RequestBuilder_Select_Component_Highlighting class Solarium_Client_RequestBuilder_Select_Component_Highlighting
{ {
/** /**
* Add request settings for Highlighting * Add request settings for Highlighting
* *
...@@ -57,7 +57,8 @@ class Solarium_Client_RequestBuilder_Select_Component_Highlighting ...@@ -57,7 +57,8 @@ class Solarium_Client_RequestBuilder_Select_Component_Highlighting
// enable highlighting // enable highlighting
$request->addParam('hl', 'true'); $request->addParam('hl', 'true');
$request->addParam('hl.fl', $component->getFields()); // set global highlighting params
$request->addParam('hl.fl', implode(',', array_keys($component->getFields())));
$request->addParam('hl.snippets', $component->getSnippets()); $request->addParam('hl.snippets', $component->getSnippets());
$request->addParam('hl.fragsize', $component->getFragSize()); $request->addParam('hl.fragsize', $component->getFragSize());
$request->addParam('hl.mergeContiguous', $component->getMergeContiguous()); $request->addParam('hl.mergeContiguous', $component->getMergeContiguous());
...@@ -77,27 +78,34 @@ class Solarium_Client_RequestBuilder_Select_Component_Highlighting ...@@ -77,27 +78,34 @@ class Solarium_Client_RequestBuilder_Select_Component_Highlighting
$request->addParam('hl.regex.slop', $component->getRegexSlop()); $request->addParam('hl.regex.slop', $component->getRegexSlop());
$request->addParam('hl.regex.pattern', $component->getRegexPattern()); $request->addParam('hl.regex.pattern', $component->getRegexPattern());
$request->addParam('hl.regex.maxAnalyzedChars', $component->getRegexMaxAnalyzedChars()); $request->addParam('hl.regex.maxAnalyzedChars', $component->getRegexMaxAnalyzedChars());
$fieldOptions = $component->getPerFieldOptions(); // set per-field highlighting params
if (sizeof($fieldOptions)) { foreach($component->getFields() as $field) {
$this->_buildPerField($fieldOptions, $request); $this->_addFieldParams($field, $request);
} }
return $request; return $request;
} }
/** /**
* Set the per field highlighting options * Add per-field override options to the request
* *
* @param array $fieldOptions * @param Solarium_Query_Select_Component_Highlighting_Field $field
* @param Solarium_Client_Request $request * @param Solarium_Client_Request $request
* @return void
*/ */
protected function _buildPerField(array $fieldOptions, Solarium_Client_Request $request) protected function _addFieldParams($field, $request)
{ {
foreach ($fieldOptions as $field => $options) { $prefix = 'f.' . $field->getName() . '.hl.';
foreach ($options as $option => $value) { $request->addParam($prefix.'snippets', $field->getSnippets());
$request->addParam('f.' . $field . '.hl.' . $option, $value, true); $request->addParam($prefix.'fragsize', $field->getFragSize());
} $request->addParam($prefix.'mergeContiguous', $field->getMergeContiguous());
} $request->addParam($prefix.'alternateField', $field->getAlternateField());
$request->addParam($prefix.'formatter', $field->getFormatter());
$request->addParam($prefix.'simple.pre', $field->getSimplePrefix());
$request->addParam($prefix.'simple.post', $field->getSimplePostfix());
$request->addParam($prefix.'fragmenter', $field->getFragmenter());
$request->addParam($prefix.'useFastVectorHighlighter', $field->getUseFastVectorHighlighter());
} }
} }
\ No newline at end of file
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
* Highlighting component * Highlighting component
* *
* @link http://wiki.apache.org/solr/HighlightingParameters * @link http://wiki.apache.org/solr/HighlightingParameters
* *
* @package Solarium * @package Solarium
* @subpackage Query * @subpackage Query
*/ */
...@@ -58,48 +58,157 @@ class Solarium_Query_Select_Component_Highlighting extends Solarium_Query_Select ...@@ -58,48 +58,157 @@ class Solarium_Query_Select_Component_Highlighting extends Solarium_Query_Select
/** /**
* Component type * Component type
* *
* @var string * @var string
*/ */
protected $_type = Solarium_Query_Select::COMPONENT_HIGHLIGHTING; protected $_type = Solarium_Query_Select::COMPONENT_HIGHLIGHTING;
/** /**
* Specifies the field over the highlight will be set * Array of fields for highlighting
* *
* @var string * @var array
*/ */
protected $_overField; protected $_fields = array();
/** /**
* The options applied to specific fields * Initialize options
* *
* @var array * The field option needs setup work
*
* @return void
*/ */
protected $_fieldOptions = array(); protected function _init()
{
foreach ($this->_options AS $name => $value) {
switch ($name) {
case 'field':
$this->addFields($value);
break;
}
}
}
/** /**
* Set fields option * Get a field options object
* *
* Fields to generate highlighted snippets for * @param string $name
* @param boolean $autocreate
* @return Solarium_Query_Select_Component_Highlighting_Field
*/
public function getField($name, $autocreate = true)
{
if (isset($this->_fields[$name])) {
return $this->_fields[$name];
} else if($autocreate) {
$this->addField($name);
return $this->_fields[$name];
} else {
return null;
}
}
/**
* Add a field for highlighting
* *
* Separate multiple fields with commas. * @param string|array|Solarium_Query_Select_Component_Highlighting_Field $field
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function addField($field)
{
// autocreate object for string input
if (is_string($field)) {
$field = new Solarium_Query_Select_Component_Highlighting_Field(array('name' => $field));
} else if (is_array($field)) {
$field = new Solarium_Query_Select_Component_Highlighting_Field($field);
}
// validate field
if ($field->getName() === null) {
throw new Solarium_Exception('To add a highlighting field it needs to have at least a "name" setting');
}
$this->_fields[$field->getName()] = $field;
return $this;
}
/**
* Add multiple fields for highlighting
*
* @param string|array $fields can be an array of object instances or a string with comma
* separated fieldnames
* *
* @param string $fields
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface * @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/ */
public function setFields($fields) public function addFields($fields)
{ {
return $this->_setOption('fields', $fields); if (is_string($fields)) {
$fields = explode(',', $fields);
$fields = array_map('trim', $fields);
}
foreach ($fields AS $key => $field) {
// in case of a config array without key: add key to config
if (is_array($field) && !isset($field['name'])) {
$field['name'] = $key;
}
$this->addField($field);
}
return $this;
} }
/** /**
* Get fields option * Remove a highlighting field
* *
* @return string|null * @param string $field
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function removeField($field)
{
if (isset($this->_fields[$field])) {
unset($this->_fields[$field]);
}
return $this;
}
/**
* Remove all fields
*
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function clearFields()
{
$this->_fields = array();
return $this;
}
/**
* Get the list of fields
*
* @return array
*/ */
public function getFields() public function getFields()
{ {
return $this->getOption('fields'); return $this->_fields;
}
/**
* Set multiple fields
*
* This overwrites any existing fields
*
* @param array $fields
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setFields($fields)
{
$this->clearFields();
$this->addFields($fields);
return $this;
} }
/** /**
...@@ -518,67 +627,5 @@ class Solarium_Query_Select_Component_Highlighting extends Solarium_Query_Select ...@@ -518,67 +627,5 @@ class Solarium_Query_Select_Component_Highlighting extends Solarium_Query_Select
{ {
return $this->getOption('regexmaxanalyzedchars'); return $this->getOption('regexmaxanalyzedchars');
} }
/**
* Stop setting per field options
*/
public function endPerFieldOptions()
{
$this->_overField = null;
}
/**
* Returns the array with all the specific per field options
*
* @return array
*/
public function getPerFieldOptions()
{
return $this->_fieldOptions;
}
/**
* Override the _setOption method to take in account the per field options
*
* @param string $name
* @param mixed $value
*/
protected function _setOption($name, $value)
{
if (null !== $this->_overField) {
$this->_fieldOptions[$this->_overField][$name] = $value;
} else {
parent::_setOption($name, $value);
}
return $this;
}
/**
* Checks if a given field exists on the lists field. If not, it will
* be added
*
* @param string $fieldName
*/
protected function _checkField($fieldName)
{
if(strstr($this->getFields(), $fieldName) === false) {
$this->setFields($this->getFields() . (strlen($this->getFields()) > 0 ? ',' : '') . $fieldName);
}
}
/**
* This magic method implementation, sets the field over the highlight options
* will be applied
*
* @param string $name
* @return Solarium_Query_Select_Component_Highlighting
*/
public function __get($name)
{
$this->_checkField($name);
$this->_overField = $name;
return $this;
}
} }
\ No newline at end of file
<?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/
*
* @package Solarium
* @subpackage Query
*/
/**
* Highlighting per-field settings
*
* @link http://wiki.apache.org/solr/HighlightingParameters
*
* @package Solarium
* @subpackage Query
*/
class Solarium_Query_Select_Component_Highlighting_Field extends Solarium_Query_Select_Component
{
/**
* Value for fragmenter option gap
*/
const FRAGMENTER_GAP = 'gap';
/**
* Value for fragmenter option regex
*/
const FRAGMENTER_REGEX = 'regex';
/**
* Get name option
*
* @return string|null
*/
public function getName()
{
return $this->getOption('name');
}
/**
* Set name option
*
* @param string $name
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setName($name)
{
return $this->_setOption('name', $name);
}
/**
* Set snippets option
*
* Maximum number of snippets per field
*
* @param int $maximum
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setSnippets($maximum)
{
return $this->_setOption('snippets', $maximum);
}
/**
* Get snippets option
*
* @return int|null
*/
public function getSnippets()
{
return $this->getOption('snippets');
}
/**
* Set fragsize option
*
* The size, in characters, of fragments to consider for highlighting
*
* @param int $size
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setFragSize($size)
{
return $this->_setOption('fragsize', $size);
}
/**
* Get fragsize option
*
* @return int|null
*/
public function getFragSize()
{
return $this->getOption('fragsize');
}
/**
* Set mergeContiguous option
*
* Collapse contiguous fragments into a single fragment
*
* @param boolean $merge
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setMergeContiguous($merge)
{
return $this->_setOption('mergecontiguous', $merge);
}
/**
* Get mergeContiguous option
*
* @return boolean|null
*/
public function getMergeContiguous()
{
return $this->getOption('mergecontiguous');
}
/**
* Set alternatefield option
*
* @param string $field
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setAlternateField($field)
{
return $this->_setOption('alternatefield', $field);
}
/**
* Get alternatefield option
*
* @return string|null
*/
public function getAlternateField()
{
return $this->getOption('alternatefield');
}
/**
* Set formatter option
*
* @param string $formatter
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setFormatter($formatter = 'simple')
{
return $this->_setOption('formatter', $formatter);
}
/**
* Get formatter option
*
* @return string|null
*/
public function getFormatter()
{
return $this->getOption('formatter');
}
/**
* Set simple prefix option
*
* Solr option h1.simple.pre
*
* @param string $prefix
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setSimplePrefix($prefix)
{
return $this->_setOption('simpleprefix', $prefix);
}
/**
* Get simple prefix option
*
* Solr option hl.simple.pre
*
* @return string|null
*/
public function getSimplePrefix()
{
return $this->getOption('simpleprefix');
}
/**
* Set simple postfix option
*
* Solr option h1.simple.post
*
* @param string $postfix
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setSimplePostfix($postfix)
{
return $this->_setOption('simplepostfix', $postfix);
}
/**
* Get simple postfix option
*
* Solr option hl.simple.post
*
* @return string|null
*/
public function getSimplePostfix()
{
return $this->getOption('simplepostfix');
}
/**
* Set fragmenter option
*
* Use one of the constants as value.
*
* @param string $fragmenter
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setFragmenter($fragmenter)
{
return $this->_setOption('fragmenter', $fragmenter);
}
/**
* Get fragmenter option
*
* @return string|null
*/
public function getFragmenter()
{
return $this->getOption('fragmenter');
}
/**
* Set useFastVectorHighlighter option
*
* @param boolean $use
* @return Solarium_Query_Select_Component_Highlighting Provides fluent interface
*/
public function setUseFastVectorHighlighter($use)
{
return $this->_setOption('usefastvectorhighlighter', $use);
}
/**
* Get useFastVectorHighlighter option
*
* @return boolean|null
*/
public function getUseFastVectorHighlighter()
{
return $this->getOption('usefastvectorhighlighter');
}
}
\ No newline at end of file
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