<?php
/**
* Broker expansion
* @package Broker
* @subpackage Expansion
*/
namespace BrokerExpansion;
/**
* DistanceExpansion
*/
class DistanceExpansion implements \Broker\Expansion {
/**
* Value
*
* @var string
*/
private $value;
/**
* Configuration
*
* @var object
*/
private $configuration;
/**
* Broker configuration
*
* @var object
*/
private $brokerConfiguration;
/**
* Solr configuration
*
* @var object
*/
private $solrConfiguration;
/**
* Filter
*
* @var object
*/
private $filter;
/**
* Condition
*
* @var object
*/
private $condition;
/**
* Errors
* @var array
*/
private $errors;
/**
* Method
*
* @var string
*/
private $method;
/**
* Prefix
*
* @var string
*/
private $prefix;
/**
* Field
*
* @var string
*/
private $field;
/**
* Minimum
*
* @var integer
*/
private $minimum;
/**
* Maximum
*
* @var integer
*/
private $maximum;
/**
* Number
*
* @var integer
*/
private $number;
/**
* Regexp
*
* @var string
*/
private $regexp;
/**
* Parameter
*
* @var object
*/
private $parameter;
/**
* Default minimum
*
* @var integer
*/
private static $defaultMinimum = 0;
/**
* Default maximum
*
* @var integer
*/
private static $defaultMaximum = 1;
/**
* Default number
*
* @var integer
*/
private static $defaultNumber = 100;
/**
* Constructor
*
* @param string|array $value
* @param object $expansionConfiguration
* @param object $brokerConfiguration
* @param object $solrConfiguration
*/
public function __construct($value, $expansionConfiguration, $brokerConfiguration, $solrConfiguration) {
$this->errors = array();
$this->value = $value;
$this->configuration = $expansionConfiguration;
$this->brokerConfiguration = $brokerConfiguration;
$this->solrConfiguration = $solrConfiguration;
$this->filter = null;
$this->condition = null;
$this->minimum = self::$defaultMinimum;
$this->maximum = self::$defaultMaximum;
$this->number = self::$defaultNumber;
$this->regexp = null;
$this->parameter = null;
if (isset ( $expansionConfiguration->parameters ) && is_object ( $expansionConfiguration->parameters )) {
if (isset ( $expansionConfiguration->parameters->method ) && is_string ( $expansionConfiguration->parameters->method )) {
$this->method = $expansionConfiguration->parameters->method;
} else {
$this->errors[] = "no (valid) method provided";
}
if (isset ( $expansionConfiguration->parameters->prefix ) && is_string ( $expansionConfiguration->parameters->prefix )) {
$this->prefix = $expansionConfiguration->parameters->prefix;
} else {
$this->errors[] = "no (valid) prefix provided";
}
if (isset ( $expansionConfiguration->parameters->field ) && is_string ( $expansionConfiguration->parameters->field )) {
$this->field = $expansionConfiguration->parameters->field;
} else {
$this->errors[] = "no (valid) field provided";
}
if (isset ( $expansionConfiguration->parameters->filter )) {
$this->filter = $expansionConfiguration->parameters->filter;
}
if (isset ( $expansionConfiguration->parameters->condition)) {
$this->condition = $expansionConfiguration->parameters->condition;
}
if (isset ( $expansionConfiguration->parameters->configuration ) && is_string ( $expansionConfiguration->parameters->configuration )) {
$this->solrConfiguration = $expansionConfiguration->parameters->configuration;
} else if (isset ( $expansionConfiguration->parameters->configuration )) {
$this->errors[] = "invalid configuration provided";
}
if (isset ( $expansionConfiguration->parameters->minimum ) && is_numeric ( $expansionConfiguration->parameters->minimum )) {
$this->minimum = $expansionConfiguration->parameters->minimum;
} else if (isset ( $expansionConfiguration->parameters->minimum )) {
$this->errors[] = "invalid minimum provided";
}
if (isset ( $expansionConfiguration->parameters->maximum ) && is_numeric ( $expansionConfiguration->parameters->maximum )) {
$this->maximum = $expansionConfiguration->parameters->maximum;
} else if (isset ( $expansionConfiguration->parameters->maximum )) {
$this->errors[] = "invalid maximum provided";
}
if (isset ( $expansionConfiguration->parameters->number ) && is_int ( $expansionConfiguration->parameters->number )) {
$this->number = $expansionConfiguration->parameters->number;
} else if (isset ( $expansionConfiguration->parameters->number )) {
$this->errors[] = "invalid number provided";
}
if (isset ( $expansionConfiguration->parameters->regexp ) && is_string ( $expansionConfiguration->parameters->regexp )) {
$this->regexp = $expansionConfiguration->parameters->regexp;
} else if (isset ( $expansionConfiguration->parameters->regexp )) {
$this->errors[] = "invalid regexp provided";
}
if (isset ( $expansionConfiguration->parameters->parameter ) && is_object ( $expansionConfiguration->parameters->parameter )) {
$this->parameter = $expansionConfiguration->parameters->parameter;
} else if (isset ( $expansionConfiguration->parameters->parameter )) {
$this->errors[] = "invalid parameter provided";
}
}
}
/**
*
* {@inheritDoc}
*
* @see \Broker\Expansion::cached()
*/
public static function cached() {
return true;
}
/**
*
* {@inheritDoc}
*
* @see \Broker\Expansion::description()
*/
public static function description() {
return "expansion returning words with distance within limits";
}
/**
*
* {@inheritDoc}
*
* @see \Broker\Expansion::parameters()
*/
public static function parameters() {
return array (
"method" => "obligatory, mtas distance function (for example levenshtein or damerauLevenshtein)",
"prefix" => "obligatory",
"field" => "obligatory",
"filter" => "optional, filter for request computing expansion",
"condition" => "optional, condition for request computing expansion",
"configuration" => "optional, uses current configuration if applicable",
"minimum" => "optional, default using " . self::$defaultMinimum ,
"maximum" => "optional, default using " . self::$defaultMaximum ,
"number" => "optional, default using " . self::$defaultNumber ,
"regexp" => "optional, default none",
"parameter" => "optional object with mtas distance parameters, default none"
);
}
/**
*
* {@inheritDoc}
*
* @see \Broker\Expansion::getValues()
*/
public function getValues() {
$list = array();
$request = new \stdClass ();
if($this->solrConfiguration!=null) {
$request->configuration = $this->solrConfiguration;
}
if($this->filter!=null) {
$request->filter = $this->filter;
}
if($this->condition!=null) {
$request->condition = $this->condition;
}
$request->response = new \stdClass ();
$request->response->mtas = new \stdClass ();
$request->response->mtas->termvector = array();
$request->response->mtas->termvector[0] = new \stdClass ();
$request->response->mtas->termvector[0]->field = $this->field;
$request->response->mtas->termvector[0]->prefix = $this->prefix;
$request->response->mtas->termvector[0]->sort = new \stdClass ();
$request->response->mtas->termvector[0]->sort->type = "sum";
$request->response->mtas->termvector[0]->sort->direction = "desc";
$request->response->mtas->termvector[0]->number = $this->number;
if($this->regexp!=null) {
$request->response->mtas->termvector[0]->regexp = $this->regexp;
}
$request->response->mtas->termvector[0]->distances = array();
$request->response->mtas->termvector[0]->distances[0] = new \stdClass ();
$request->response->mtas->termvector[0]->distances[0]->type = $this->method;
$request->response->mtas->termvector[0]->distances[0]->base = $this->value;
$request->response->mtas->termvector[0]->distances[0]->minimum = $this->minimum;
$request->response->mtas->termvector[0]->distances[0]->maximum = $this->maximum;
if($this->parameter!=null) {
$request->response->mtas->termvector[0]->distances[0]->parameter = $this->parameter;
}
//parse
$parser = new \Broker\Parser ($request, $this->brokerConfiguration, null, null, null, null);
if(count($parser->getWarnings ())>0) {
foreach($parser->getWarnings() AS $warning) {
$this->errors[] = $warning;
}
} else if(count($parser->getErrors ())>0) {
foreach($parser->getErrors() AS $error) {
$this->errors[] = $error;
}
} else {
try {
$solr = new \Broker\Solr ( $parser->getConfiguration (), $parser->getUrl (), "select", $parser->getRequest (), $parser->getRequestAddition(), $parser->getShards () != null ? implode ( ",", $parser->getShards () ) : null, $parser->getCache () );
$solrResponse = $solr->getResponse ();
if ($solrResponse && is_object ( $solrResponse )) {
if(isset($solrResponse->mtas) && is_object($solrResponse->mtas)) {
if(isset($solrResponse->mtas->termvector) && is_array($solrResponse->mtas->termvector)) {
if(count($solrResponse->mtas->termvector)>0 && is_object($solrResponse->mtas->termvector[0])) {
if(isset($solrResponse->mtas->termvector[0]->list) && is_array($solrResponse->mtas->termvector[0]->list)) {
foreach($solrResponse->mtas->termvector[0]->list AS $item) {
if(is_object($item) && isset($item->key) && is_string($item->key)) {
$list[] = $item->key;
}
}
}
}
}
}
}
} catch ( \Broker\SolrException $se ) {
$this->errors[] = $se->getMessage ();
} catch ( \Exception $e ) {
$this->errors[] = $solr->getResponse ();
}
}
return $list;
}
/**
*
* {@inheritDoc}
*
* @see \Broker\Expansion::getErrors()
*/
public function getErrors() {
if (count ( $this->errors ) > 0) {
return $this->errors;
} else {
return null;
}
}
}
?>