<?php
/**
* Broker
* @package Broker
*/
namespace Broker;
/**
* Configuration
*/
class Configuration {
/**
* Configuration
*
* @var array
*/
public $config;
/**
* Solr configuration
*
* @var array
*/
public $solr;
/**
* Filename configuration
*
* @var string
*/
private $filename;
/**
* Timestamp configuration file
*
* @var number
*/
private $configTimestamp;
/**
* Timestamp solr configuration
*
* @var number
*/
private $solrTimestamp;
/**
* Constructor
*
* @param string $file
* configuration file
*/
public function __construct($file) {
$this->filename = $file;
if (file_exists ( $file ) && is_readable ( $file )) {
$this->load ( $file );
$this->getSolrConfiguration ( md5 ( $file ), filectime ( $file ) );
} else {
$this->filename = null;
$this->config = null;
$this->solr = null;
$this->configTimestamp = null;
$this->solrTimestamp = null;
}
}
/**
* Check if configuration is found and processed
*
* @return bool
*/
public function installed() {
return $this->config != null;
}
/**
* Get configuration item
*
* @param string $name
* @return object
*/
public function getConfig($name) {
if ($this->config && is_array ( $this->config ) && isset ( $this->config [$name] ) && is_array ( $this->config [$name] )) {
return $this->config [$name];
} else {
return false;
}
}
/**
* Get solr configuration item
*
* @param object $name
*/
public function getSolrConfig($name) {
if ($this->solr && is_array ( $this->solr ) && isset ( $this->solr [$name] ) && is_array ( $this->solr [$name] )) {
return $this->solr [$name];
} else {
return false;
}
}
/**
* Create url based on optional operation and suboperation
*
* @param NULL|string $operation
* @param NULL|string $suboperation
* @param NULL|string $subsuboperation
* @return string
*/
public function url($operation = null, $suboperation = null, $subsuboperation = null) {
if ($operation == null || ! $operation || ! preg_match ( "/^[a-z]+$/i", $operation )) {
return SITE_LOCATION;
} else {
if ($suboperation == null || ! $suboperation || ! preg_match ( "/^[a-z0-9]+$/i", $suboperation )) {
if (array_key_exists ( "HTTP_MOD_REWRITE", $_SERVER )) {
return SITE_LOCATION . $operation . DIRECTORY_SEPARATOR;
} else {
return SITE_LOCATION . "?operation=" . urlencode ( $operation );
}
} else {
if ($subsuboperation == null || ! $subsuboperation || ! preg_match ( "/^[a-z0-9]+$/i", $subsuboperation )) {
if (array_key_exists ( "HTTP_MOD_REWRITE", $_SERVER )) {
return SITE_LOCATION . $operation . DIRECTORY_SEPARATOR . $suboperation . DIRECTORY_SEPARATOR ;
} else {
return SITE_LOCATION . "?operation=" . urlencode ( $operation ) . "&suboperation=" . urlencode ( $suboperation );
}
} else {
if (array_key_exists ( "HTTP_MOD_REWRITE", $_SERVER )) {
return SITE_LOCATION . $operation . DIRECTORY_SEPARATOR . $suboperation . DIRECTORY_SEPARATOR . $subsuboperation . DIRECTORY_SEPARATOR;
} else {
return SITE_LOCATION . "?operation=" . urlencode ( $operation ) . "&suboperation=" . urlencode ( $suboperation ) . "&subsuboperation=" . urlencode ( $subsuboperation );
}
}
}
}
}
/**
* Get expansions
*
* @return array
*/
public function getExpansions() {
$list = array ();
$directory = SITE_CONFIG_MODULES_EXPANSION_DIR;
if (is_dir ( $directory )) {
if ($dh = opendir ( $directory )) {
while ( ($file = readdir ( $dh )) !== false ) {
if (is_file ( $directory . $file ) && preg_match ( "/^([A-Z][A-Za-z0-9]+)Expansion\.class\.php$/", $file, $match )) {
$expansionName = $match [1];
$expansionObjectClass = "\\BrokerExpansion\\" . $expansionName . "Expansion";
if (class_exists ( $expansionObjectClass, true ) && in_array ( "Broker\\Expansion", class_implements ( $expansionObjectClass, true ) )) {
$list [lcfirst ( $expansionName )] = array (
"cached" => $expansionObjectClass::cached (),
"description" => $expansionObjectClass::description (),
"parameters" => $expansionObjectClass::parameters ()
);
}
}
}
}
}
return $list;
}
/**
* Get timestamp configuration file
*
* @return NULL|number
*/
public function getConfigTimestamp() {
return $this->configTimestamp;
}
/**
* Get timestamp automatic solr configuration
*
* @return object
*/
public function getSolrTimestamp() {
return $this->solrTimestamp;
}
/**
* Reset configuration
*/
public function reset() {
unlink ( SITE_CACHE_CONFIGURATION_DIR . "solr.json" );
if (file_exists ( $this->filename ) && is_readable ( $this->filename )) {
$this->getSolrConfiguration ( md5 ( $this->filename ), filectime ( $this->filename ) );
}
}
/**
* Load configuration from file
*
* @param string $file
*/
private function load($file) {
$old = array ();
$old = get_defined_vars ();
include ($file);
$new = get_defined_vars ();
$this->config = array ();
$this->configTimestamp = filemtime ( $file );
foreach ( $new as $key => $value ) {
if (! isset ( $old [$key] )) {
$this->config [$key] = $value;
}
}
}
/**
* Create solr configuration if necessary
*
* @param string $md5hash
* @param number $filetime
*/
private function getSolrConfiguration($md5hash, $filetime) {
$solrConfigurationFilename = SITE_CACHE_CONFIGURATION_DIR . "solr.json";
if (file_exists ( $solrConfigurationFilename )) {
$data = file_get_contents ( $solrConfigurationFilename );
$this->solr = json_decode ( $data, true );
$this->solrTimestamp = filemtime ( $solrConfigurationFilename );
if ($this->solr && json_last_error () == JSON_ERROR_NONE) {
if (! isset ( $this->solr ["_md5hash"] ) || $this->solr ["_md5hash"] != $md5hash) {
// delete
unlink ( $solrConfigurationFilename );
} else if (! isset ( $this->solr ["_filetime"] ) || $this->solr ["_filetime"] != $filetime) {
// delete also
unlink ( $solrConfigurationFilename );
} else {
return;
}
}
}
// reload and regenerate
$this->solr = array ();
$this->solr ["_md5hash"] = $md5hash;
$this->solr ["_filetime"] = $filetime;
if (isset ( $this->config ["solr"] ) && is_array ( $this->config ["solr"] ) && count ( $this->config ["solr"] ) > 0) {
foreach ( $this->config ["solr"] as $key => $solrConfiguration ) {
if (! is_array ( $solrConfiguration )) {
die ( "Invalid solr configuration '" . $key . "'" );
} else if (! isset ( $solrConfiguration ["url"] ) || ! is_string ( $solrConfiguration ["url"] ) || trim ( $solrConfiguration ["url"] ) == "") {
die ( "Invalid or no url in solr configuration '" . $key . "'" );
} else if (! preg_match ( "/^[a-z0-9]+$/i", $key )) {
die ( "Invalid name solr configuration '" . $key . "'" );
} else {
$this->solr [$key] = array ();
$this->solr [$key] ["fields"] = array ();
$this->solr [$key] ["dynamicFields"] = array ();
$this->solr [$key] ["multiValued"] = array ();
$this->solr [$key] ["indexed"] = array ();
$this->solr [$key] ["required"] = array ();
$this->solr [$key] ["stored"] = array ();
$this->solr [$key] ["mtas"] = array ();
$this->solr [$key] ["mtasHandler"] = null;
$this->solr [$key] ["typeText"] = array ();
$this->solr [$key] ["typeBoolean"] = array ();
$this->solr [$key] ["typeString"] = array ();
$this->solr [$key] ["typeInteger"] = array ();
$this->solr [$key] ["typeDate"] = array ();
$this->solr [$key] ["typeLong"] = array ();
$this->solr [$key] ["typeBinary"] = array ();
$this->solr [$key] ["typeGeo"] = array ();
// get handler
$ch = curl_init ( $solrConfiguration ["url"] . "select?q=*:*&rows=0&mtas=true&mtas.status=true&mtas.status.mtasHandler=true&wt=json" );
$options = array (
CURLOPT_HTTPHEADER => array (
"Content-Type: application/x-www-form-urlencoded; charset=utf-8"
),
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array ( $ch, $options );
$result = curl_exec ( $ch );
if ($data = json_decode ( $result, true )) {
if (isset ( $data ["mtas"] ) && is_array ( $data ["mtas"] )) {
if (isset ( $data ["mtas"]["status"] ) && is_array ( $data ["mtas"]["status"] )) {
if (isset ( $data ["mtas"]["status"]["mtasHandler"] ) && is_string ( $data ["mtas"]["status"]["mtasHandler"])) {
$this->solr [$key] ["mtasHandler"] = preg_replace("/^\//","",$data ["mtas"]["status"]["mtasHandler"]);
}
}
}
}
// get schema
$ch = curl_init ( $solrConfiguration ["url"] . "schema?wt=json" );
$options = array (
CURLOPT_HTTPHEADER => array (
"Content-Type: application/x-www-form-urlencoded; charset=utf-8"
),
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array ( $ch, $options );
$result = curl_exec ( $ch );
if ($data = json_decode ( $result, true )) {
if (isset ( $data ["schema"] ) && is_array ( $data ["schema"] )) {
$fieldTypes = array ();
$fieldTypes ["text"] = array ();
$fieldTypes ["boolean"] = array ();
$fieldTypes ["string"] = array ();
$fieldTypes ["integer"] = array ();
$fieldTypes ["long"] = array ();
$fieldTypes ["date"] = array ();
$fieldTypes ["binary"] = array ();
$fieldTypes ["geo"] = array();
$fieldTypes ["mtas"] = array ();
if (isset ( $data ["schema"] ["fieldTypes"] ) && is_array ( $data ["schema"] ["fieldTypes"] )) {
foreach ( $data ["schema"] ["fieldTypes"] as $item ) {
if (isset ( $item ["name"] ) && is_string ( $item ["name"] )) {
if (isset ( $item ["class"] ) && is_string ( $item ["class"] )) {
if ($item ["class"] == "solr.TextField" || $item ["class"] == "mtas.solr.schema.MtasPreAnalyzedField") {
$fieldTypes ["text"] [] = $item ["name"];
} else if ($item ["class"] == "solr.BoolField") {
$fieldTypes ["boolean"] [] = $item ["name"];
} else if ($item ["class"] == "solr.StrField") {
$fieldTypes ["string"] [] = $item ["name"];
} else if ($item ["class"] == "solr.TrieIntField") {
$fieldTypes ["integer"] [] = $item ["name"];
} else if ($item ["class"] == "solr.TrieLongField") {
$fieldTypes ["long"] [] = $item ["name"];
} else if ($item ["class"] == "solr.TrieDateField") {
$fieldTypes ["date"] [] = $item ["name"];
} else if ($item ["class"] == "solr.BinaryField") {
$fieldTypes ["binary"] [] = $item ["name"];
} else if ($item ["class"] == "solr.RptWithGeometrySpatialField") {
$fieldTypes ["geo"] [] = $item ["name"];
}
}
if (isset ( $item ["postingsFormat"] ) && is_string ( $item ["postingsFormat"] )) {
if ($item ["postingsFormat"] == "MtasCodec") {
$fieldTypes ["mtas"] [] = $item ["name"];
}
}
}
}
}
if (isset ( $data ["schema"] ["dynamicFields"] ) && is_array ( $data ["schema"] ["dynamicFields"] )) {
foreach ( $data ["schema"] ["dynamicFields"] as $item ) {
if (isset ( $item ["name"] ) && is_string ( $item ["name"] ) && trim ( $item ["name"] ) != "") {
$this->solr [$key] ["dynamicFields"] [] = $item ["name"];
}
$this->solr [$key] = $this->_processSolrConfiguration ( $item, $fieldTypes, $this->solr [$key] );
}
}
if (isset ( $data ["schema"] ["fields"] ) && is_array ( $data ["schema"] ["fields"] )) {
foreach ( $data ["schema"] ["fields"] as $item ) {
if (isset ( $item ["name"] ) && is_string ( $item ["name"] ) && trim ( $item ["name"] ) != "") {
$this->solr [$key] ["fields"] [] = $item ["name"];
}
$this->solr [$key] = $this->_processSolrConfiguration ( $item, $fieldTypes, $this->solr [$key] );
}
}
if (isset ( $data ["schema"] ["uniqueKey"] ) && is_string ( $data ["schema"] ["uniqueKey"] )) {
$this->solr [$key] ["uniqueKey"] = $data ["schema"] ["uniqueKey"];
}
list ( $this->solr [$key] ["exampleFieldText"], $this->solr [$key] ["exampleFieldTextValues"] ) = $this->_findExample ( isset ( $solrConfiguration ["exampleFieldText"] ) ? $solrConfiguration ["exampleFieldText"] : null, isset ( $solrConfiguration ["exampleFieldTextValues"] ) ? $solrConfiguration ["exampleFieldTextValues"] : null, $this->solr [$key], $solrConfiguration, array (
"title",
"name"
), "text", true, null, true, null, false );
list ( $this->solr [$key] ["exampleFieldString"], $this->solr [$key] ["exampleFieldStringValues"] ) = $this->_findExample ( isset ( $solrConfiguration ["exampleFieldString"] ) ? $solrConfiguration ["exampleFieldString"] : null, isset ( $solrConfiguration ["exampleFieldStringValues"] ) ? $solrConfiguration ["exampleFieldStringValues"] : null, $this->solr [$key], $solrConfiguration, array (
"title",
"name"
), "string", true, null, true, null, false );
list ( $this->solr [$key] ["exampleFieldInteger"], $this->solr [$key] ["exampleFieldIntegerValues"] ) = $this->_findExample ( isset ( $solrConfiguration ["exampleFieldInteger"] ) ? $solrConfiguration ["exampleFieldInteger"] : null, isset ( $solrConfiguration ["exampleFieldIntegerValues"] ) ? $solrConfiguration ["exampleFieldIntegerValues"] : null, $this->solr [$key], $solrConfiguration, array (
"year"
), "integer/long", true, null, true, null, false );
list ( $this->solr [$key] ["exampleFieldGeo"], $this->solr [$key] ["exampleFieldGeoValues"] ) = $this->_findExample ( isset ( $solrConfiguration ["exampleFieldGeo"] ) ? $solrConfiguration ["exampleFieldGeo"] : null, isset ( $solrConfiguration ["exampleFieldGeoValues"] ) ? $solrConfiguration ["exampleFieldGeoValues"] : null, $this->solr [$key], $solrConfiguration, array (
"latlng"
), "geo", true, null, true, null, false );
list ( $this->solr [$key] ["exampleFieldMtas"], $this->solr [$key] ["exampleFieldMtasWord"], $this->solr [$key] ["exampleFieldMtasLemma"], $this->solr [$key] ["exampleFieldMtasPos"], $this->solr [$key] ["exampleFieldMtasSinglePosition"], $this->solr [$key] ["exampleFieldMtasMultiplePosition"], $this->solr [$key] ["exampleFieldMtasSetPosition"], $this->solr [$key] ["exampleFieldMtasIntersecting"] ) = $this->_findMtasExamples ( isset ( $solrConfiguration ["exampleFieldMtas"] ) ? $solrConfiguration ["exampleFieldMtas"] : null, $this->solr [$key], $solrConfiguration, array (
"mtas"
) );
} else {
die ( "No schema available for '" . $solrConfiguration ["url"] . "' in configuration '" . $key . "'" );
}
} else {
die ( "No schema available for '" . $solrConfiguration ["url"] . "' in configuration '" . $key . "'" );
}
// get config
$ch = curl_init ( $solrConfiguration ["url"] . "config?wt=json" );
$options = array (
CURLOPT_HTTPHEADER => array (
"Content-Type: application/x-www-form-urlencoded; charset=utf-8"
),
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array ( $ch, $options );
$result = curl_exec ( $ch );
if ($data = json_decode ( $result, true )) {
if (isset ( $data ["config"] ) && is_array ( $data ["config"] )) {
if (isset ( $data ["config"] ["queryParser"] ) && is_array ( $data ["config"] ["queryParser"] )) {
foreach ( $data ["config"] ["queryParser"] as $queryParserName => $queryParserConfig ) {
if (is_array ( $queryParserConfig ) && isset ( $queryParserConfig ["class"] ) && $queryParserConfig ["class"] == "mtas.solr.search.MtasSolrCQLQParserPlugin") {
if (isset ( $queryParserConfig ["name"] ) && is_string ( $queryParserConfig ["name"] )) {
$this->solr [$key] ["queryParserCql"] = $queryParserConfig ["name"];
}
} else if (is_array ( $queryParserConfig ) && isset ( $queryParserConfig ["class"] ) && $queryParserConfig ["class"] == "mtas.solr.search.MtasSolrSimpleQParserPlugin") {
if (isset ( $queryParserConfig ["name"] ) && is_string ( $queryParserConfig ["name"] )) {
$this->solr [$key] ["queryParserSimple"] = $queryParserConfig ["name"];
}
} elseif (is_array ( $queryParserConfig ) && isset ( $queryParserConfig ["class"] ) && $queryParserConfig ["class"] == "mtas.solr.search.MtasSolrJoinQParserPlugin") {
if (isset ( $queryParserConfig ["name"] ) && is_string ( $queryParserConfig ["name"] )) {
$this->solr [$key] ["queryParserJoin"] = $queryParserConfig ["name"];
}
}
}
}
} else {
die ( "No configuration available for '" . $solrConfiguration ["url"] . "' in configuration '" . $key . "'" );
}
} else {
die ( "No configuration available for '" . $solrConfiguration ["url"] . "' in configuration '" . $key . "'" );
}
}
}
} else {
die ( "No (valid) solr configuration" );
}
file_put_contents ( $solrConfigurationFilename, json_encode ( $this->solr ) );
}
/**
* Process solr configuration
*
* @param array $item
* @param array $fieldTypes
* @param array $configuration
* @return object
*/
private function _processSolrConfiguration($item, $fieldTypes, $configuration) {
if (isset ( $item ["multiValued"] ) && is_bool ( $item ["multiValued"] ) && $item ["multiValued"] == true) {
$configuration ["multiValued"] [] = $item ["name"];
}
if (isset ( $item ["indexed"] ) && is_bool ( $item ["indexed"] ) && $item ["indexed"] == true) {
$configuration ["indexed"] [] = $item ["name"];
}
if (isset ( $item ["required"] ) && is_bool ( $item ["required"] ) && $item ["required"] == true) {
$configuration ["required"] [] = $item ["name"];
}
if (isset ( $item ["stored"] ) && is_bool ( $item ["stored"] ) && $item ["stored"] == true) {
$configuration ["stored"] [] = $item ["name"];
}
if (isset ( $item ["type"] ) && is_string ( $item ["type"] )) {
if (in_array ( $item ["type"], $fieldTypes ["mtas"] )) {
$configuration ["mtas"] [] = $item ["name"];
}
if (in_array ( $item ["type"], $fieldTypes ["text"] )) {
$configuration ["typeText"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["boolean"] )) {
$configuration ["typeBoolean"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["string"] )) {
$configuration ["typeString"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["integer"] )) {
$configuration ["typeInteger"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["long"] )) {
$configuration ["typeLong"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["date"] )) {
$configuration ["typeDate"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["binary"] )) {
$configuration ["typeBinary"] [] = $item ["name"];
} else if (in_array ( $item ["type"], $fieldTypes ["geo"] )) {
$configuration ["typeGeo"] [] = $item ["name"];
}
}
return $configuration;
}
/**
* Check field
*
* @param string $field
* @param array $configuration
* @param string $type
* @param boolean $indexed
* @param boolean $required
* @param boolean $stored
* @param boolean $multivalued
* @param boolean $mtas
*/
private function _checkField($field, $configuration, $type = null, $indexed = null, $required = null, $stored = null, $multivalued = null, $mtas = null) {
if ($field && is_string ( $field )) {
$checkFields = array ();
if (in_array ( $field, $configuration ["fields"] )) {
$checkFields [] = $field;
} else {
foreach ( $configuration ["dynamicFields"] as $dynamicField ) {
$pattern = "/" . str_replace ( "\*", ".*", preg_quote ( $dynamicField ) ) . "/";
if (preg_match ( $pattern, $field )) {
$checkFields [] = $dynamicField;
}
}
}
foreach ( $checkFields as $checkField ) {
if ($type !== null) {
switch ($type) {
case "string" :
if (! in_array ( $checkField, $configuration ["typeString"] )) {
continue 2;
}
break;
case "boolean" :
if (! in_array ( $checkField, $configuration ["typeBoolean"] )) {
continue 2;
}
break;
case "text" :
if (! in_array ( $checkField, $configuration ["typeText"] )) {
continue 2;
}
break;
case "integer" :
if (! in_array ( $checkField, $configuration ["typeInteger"] )) {
continue 2;
}
break;
case "date" :
if (! in_array ( $checkField, $configuration ["typeDate"] )) {
continue 2;
}
break;
case "long" :
if (! in_array ( $checkField, $configuration ["typeLong"] )) {
continue 2;
}
break;
case "integer/long" :
if (! in_array ( $checkField, $configuration ["typeInteger"] ) && ! in_array ( $checkField, $configuration ["typeLong"] )) {
continue 2;
}
break;
case "geo" :
if (! in_array ( $checkField, $configuration ["typeGeo"] )) {
continue 2;
}
break;
default :
return false;
}
}
if ($indexed !== null) {
if ($indexed !== in_array ( $checkField, $configuration ["indexed"] )) {
continue;
}
}
if ($required !== null) {
if ($required !== in_array ( $checkField, $configuration ["required"] )) {
continue;
}
}
if ($stored !== null) {
if ($stored !== in_array ( $checkField, $configuration ["stored"] )) {
continue;
}
}
if ($multivalued !== null) {
if ($multivalued !== in_array ( $checkField, $configuration ["multivalued"] )) {
continue;
}
}
if ($mtas !== null) {
if ($mtas !== in_array ( $checkField, $configuration ["mtas"] )) {
continue;
}
}
return true;
}
return false;
} else {
return false;
}
}
/**
* Sort items by levenshtein distance
*
* @param array $items
* @param array $list
*/
private function _sortLevenshtein($items, $list) {
usort ( $items, function ($a, $b) use ($list) {
$p1 = 1;
$p2 = 1;
$p3 = 1;
$p4 = 10;
$d_a = null;
$d_b = null;
$a = strtolower ( $a );
$b = strtolower ( $b );
foreach ( $list as $item ) {
$item = strtolower ( $item );
$lev_a = levenshtein ( $item, $a, $p1, $p2, $p3 ) + ((strpos ( $a, $item ) === false) ? $p4 : 0);
$lev_b = levenshtein ( $item, $b, $p1, $p2, $p3 ) + ((strpos ( $b, $item ) === false) ? $p4 : 0);
$d_a = ($d_a == null) ? $lev_a : min ( $d_a, $lev_a );
$d_b = ($d_b == null) ? $lev_b : min ( $d_b, $lev_b );
}
return $d_a === $d_b ? 0 : ($d_a > $d_b ? 1 : - 1);
} );
return $items;
}
/**
* Find Mtas examples
*
* @param string $configSuggestion
* @param array $configuration
* @param array $solrConfiguration
* @param array $hints
*/
private function _findMtasExamples($configSuggestion, $configuration, $solrConfiguration, $hints) {
$field = null;
$word = null;
$lemma = null;
$pos = null;
$singlePosition = null;
$multiplePosition = null;
$setPosition = null;
$intersecting = null;
if ($configSuggestion != null && $this->_checkField ( $configSuggestion, $configuration, null, true, null, null, null, true )) {
$field = $configSuggestion;
} else {
$field = null;
$fields = $configuration ["fields"];
if ($hints != null && is_array ( $hints ) && count ( $hints ) > 0) {
$fields = $this->_sortLevenshtein ( $fields, $hints );
}
foreach ( $fields as $optionalField ) {
if ($this->_checkField ( $optionalField, $configuration, null, true, null, null, null, true )) {
$field = $optionalField;
break;
}
}
}
if ($field) {
// get prefixes
$request = "wt=json&rows=0&q=*:*&mtas=true&mtas.prefix=true&mtas.prefix.0.field=" . urlencode ( $field );
if (isset ( $solrConfiguration ["shards"] ) && count ( $solrConfiguration ["shards"] ) > 0) {
$shards = implode ( ",", $solrConfiguration ["shards"] );
} else {
$shards = null;
}
$tmpSolr = new \Broker\Solr ( "[configuration]", isset ( $solrConfiguration ["url"] ) ? $solrConfiguration ["url"] : null, "select", $request, null, $shards, null );
$response = $tmpSolr->getResponse ();
if (is_object ( $response ) && isset ( $response->mtas ) && isset ( $response->mtas->prefix )) {
$number = 10;
$singlePosition = isset ( $response->mtas->prefix [0]->singlePosition ) ? $response->mtas->prefix [0]->singlePosition : array ();
$multiplePosition = isset ( $response->mtas->prefix [0]->multiplePosition ) ? $response->mtas->prefix [0]->multiplePosition : array ();
$setPosition = isset ( $response->mtas->prefix [0]->setPosition ) ? $response->mtas->prefix [0]->setPosition : array ();
$intersecting = isset ( $response->mtas->prefix [0]->intersecting ) ? $response->mtas->prefix [0]->intersecting : array ();
if (count ( $singlePosition ) > 0) {
// get word
if (isset ( $solrConfiguration ["exampleMtasPrefixWord"] ) && is_string ( $solrConfiguration ["exampleMtasPrefixWord"] )) {
$hints = array (
$solrConfiguration ["exampleMtasPrefixWord"]
);
} else {
$hints = array (
"t",
"t_lc",
"word"
);
}
$singlePosition = $this->_sortLevenshtein ( $singlePosition, $hints );
$word = array (
$singlePosition [0]
);
if (isset ( $solrConfiguration ["exampleMtasPrefixWordValues"] ) && is_array ( $solrConfiguration ["exampleMtasPrefixWordValues"] )) {
$values = array ();
foreach ( $solrConfiguration ["exampleMtasPrefixWordValues"] as $valuesItem ) {
if (is_string ( $valuesItem )) {
$values [] = $valuesItem;
}
}
$word [] = $values;
} else {
$word [] = $this->_findMtasExamplesTermvector ( $solrConfiguration, $field, $shards, $word [0], $number );
}
// get lemma
if (isset ( $solrConfiguration ["exampleMtasPrefixLemma"] ) && is_string ( $solrConfiguration ["exampleMtasPrefixLemma"] )) {
$hints = array (
$solrConfiguration ["exampleMtasPrefixLemma"]
);
} else {
$hints = array (
"lemma"
);
}
$singlePosition = $this->_sortLevenshtein ( $singlePosition, $hints );
$lemma = array (
$singlePosition [0]
);
if (isset ( $solrConfiguration ["exampleMtasPrefixLemmaValues"] ) && is_array ( $solrConfiguration ["exampleMtasPrefixLemmaValues"] )) {
$values = array ();
foreach ( $solrConfiguration ["exampleMtasPrefixLemmaValues"] as $valuesItem ) {
if (is_string ( $valuesItem )) {
$values [] = $valuesItem;
}
}
$lemma [] = $values;
} else {
$lemma [] = $this->_findMtasExamplesTermvector ( $solrConfiguration, $field, $shards, $lemma [0], $number );
}
// get pos
if (isset ( $solrConfiguration ["exampleMtasPrefixPos"] ) && is_string ( $solrConfiguration ["exampleMtasPrefixPos"] )) {
$hints = array (
$solrConfiguration ["exampleMtasPrefixPos"]
);
} else {
$hints = array (
"pos"
);
}
$singlePosition = $this->_sortLevenshtein ( $singlePosition, $hints );
$pos = array (
$singlePosition [0]
);
if (isset ( $solrConfiguration ["exampleMtasPrefixPosValues"] ) && is_array ( $solrConfiguration ["exampleMtasPrefixPosValues"] )) {
$values = array ();
foreach ( $solrConfiguration ["exampleMtasPrefixPosValues"] as $valuesItem ) {
if (is_string ( $valuesItem )) {
$values [] = $valuesItem;
}
}
$pos [] = $values;
} else {
$pos [] = $this->_findMtasExamplesTermvector ( $solrConfiguration, $field, $shards, $pos [0], $number );
}
}
sort ( $singlePosition );
sort ( $multiplePosition );
sort ( $setPosition );
sort ( $intersecting );
}
}
return array (
$field,
$word,
$lemma,
$pos,
$singlePosition,
$multiplePosition,
$setPosition,
$intersecting
);
}
/**
* Find Mtas examples termvector
*
* @param array $solrConfiguration
* @param string $field
* @param array $shards
* @param string $prefix
* @param int $number
* @return array
*/
private function _findMtasExamplesTermvector($solrConfiguration, $field, $shards, $prefix, $number) {
$values = array ();
$request = "wt=json&rows=0&q=*:*&mtas=true&mtas.termvector=true";
$request .= "&mtas.termvector.0.field=" . urlencode ( $field );
$request .= "&mtas.termvector.0.prefix=" . urlencode ( $prefix );
$request .= "&mtas.termvector.0.number=" . intval ( $number );
$request .= "&mtas.termvector.0.regexp=[a-zA-Z0-9]*";
$request .= "&mtas.termvector.0.type=sum";
$request .= "&mtas.termvector.0.sort.type=sum";
$request .= "&mtas.termvector.0.sort.direction=desc";
$solr = new \Broker\Solr ( "[configuration]", isset ( $solrConfiguration ["url"] ) ? $solrConfiguration ["url"] : null, "select", $request, null, $shards, null );
$tvresponse = $solr->getResponse ();
if (is_object ( $tvresponse ) && isset ( $tvresponse->mtas ) && isset ( $tvresponse->mtas->termvector )) {
$tmpList = $tvresponse->mtas->termvector [0]->list;
foreach ( $tmpList as $tmpListItem ) {
$values [] = $tmpListItem->key;
}
}
return $values;
}
/**
* Find example
*
* @param string $configSuggestion
* @param array $configValuesSuggestion
* @param array $configuration
* @param array $solrConfiguration
* @param array $hints
* @param string $type
* @param boolean $indexed
* @param boolean $required
* @param boolean $stored
* @param boolean $multivalued
* @param boolean $mtas
*/
private function _findExample($configSuggestion, $configValuesSuggestion, $configuration, $solrConfiguration, $hints = null, $type = null, $indexed = null, $required = null, $stored = null, $multivalued = null, $mtas = null) {
if ($configSuggestion != null && $this->_checkField ( $configSuggestion, $configuration, $type, $indexed, $required, $stored, $multivalued, $mtas )) {
$field = $configSuggestion;
} else {
$field = null;
$fields = $configuration ["fields"];
if ($hints != null && is_array ( $hints ) && count ( $hints ) > 0) {
$fields = $this->_sortLevenshtein ( $fields, $hints );
}
foreach ( $fields as $optionalField ) {
if ($this->_checkField ( $optionalField, $configuration, $type, $indexed, $required, $stored, $multivalued, $mtas )) {
$field = $optionalField;
break;
}
}
}
// get values
if ($field != null) {
if ($configValuesSuggestion != null && is_array ( $configValuesSuggestion )) {
$values = array();
foreach ($configValuesSuggestion AS $valuesItem) {
if(is_string($valuesItem)) {
$values[]=$valuesItem;
}
}
} else {
$request = "wt=json&terms.fl=" . urlencode ( $field );
if (isset ( $solrConfiguration ["shards"] ) && count ( $solrConfiguration ["shards"] ) > 0) {
$shards = implode ( ",", $solrConfiguration ["shards"] );
$request .= "&shards.qt=terms";
} else {
$shards = null;
}
$solr = new \Broker\Solr ( "[configuration]", isset ( $solrConfiguration ["url"] ) ? $solrConfiguration ["url"] : null, "terms", $request, null, $shards, null );
$response = $solr->getResponse ();
if (is_object ( $response ) && isset ( $response->terms ) && isset ( $response->terms->{$field} )) {
if (is_object ( $response->terms->{$field} )) {
$values = array_keys ( get_object_vars ( $response->terms->{$field} ) );
} else if (is_array ( $response->terms->{$field} )) {
$values = $response->terms->{$field};
foreach ( $values as $key => $value ) {
if ($key & 1) {
unset ( $values [$key] );
}
}
$values = array_values ( $values );
} else {
$values = null;
}
} else {
$values = null;
}
}
} else {
$values = null;
}
return array (
$field,
$values
);
}
/**
* Validate, check existence directories
*/
public static function validate() {
\Broker\Configuration::validatePath ( "Layout-directory", SITE_LAYOUT_DIR, false, false );
\Broker\Configuration::validatePath ( "Layout-directory Smarty", SITE_LAYOUT_SMARTY_DIR, false, false );
\Broker\Configuration::validatePath ( "Layout-directory Smarty - Config", SITE_LAYOUT_SMARTY_CONFIG_DIR, false, false );
\Broker\Configuration::validatePath ( "Layout-directory Smarty - Templates", SITE_LAYOUT_SMARTY_TEMPLATES_DIR, false, false );
\Broker\Configuration::validatePath ( "Cache-directory", SITE_CACHE_DIR, true, true );
\Broker\Configuration::validatePath ( "Cache-directory Configuration", SITE_CACHE_CONFIGURATION_DIR, true, true );
\Broker\Configuration::validatePath ( "Cache-directory Database", SITE_CACHE_DATABASE_DIR, true, true );
\Broker\Configuration::validatePath ( "Cache-directory Smarty", SITE_CACHE_SMARTY_DIR, true, true );
\Broker\Configuration::validatePath ( "Cache-directory Smarty - Cache", SITE_CACHE_SMARTY_CACHE_DIR, true, true );
\Broker\Configuration::validatePath ( "Cache-directory Smarty - Templates", SITE_CACHE_SMARTY_TEMPLATESC_DIR, true, true );
}
/**
* Validate, check existence
*
* @param string $name
* @param string $path
* @param boolean $writeable
* @param boolean $autocreate
*/
private static function validatePath($name, $path, $writeable, $autocreate) {
// check if exists, try to make
if (! file_exists ( $path ) && (! $autocreate || ! @mkdir ( $path ))) {
die ( $name . " : " . $path . " does not exist" );
}
// check access
if (! is_readable ( $path )) {
die ( $name . " : " . $path . " not readable" );
} else if ($writeable && ! is_writeable ( $path )) {
die ( $name . " : " . $path . " not writeable" );
}
}
}
?>