<?php
/**
* Broker
* @package Broker
*/
namespace Broker;
/**
* Parser json request
*/
class Parser {
/**
* Request to broker
*
* @var string
*/
private $brokerRequest = null;
/**
* Status key
*
* @var string
*/
private $statusKey = null;
/**
* Url solr
*
* @var string
*/
private $solrUrl = null;
/**
* Solr shards
*
* @var array
*/
private $solrShards = null;
/**
* Solr request
*
* @var string
*/
private $solrRequest = null;
/**
* Solr request addition
*
* @var string
*/
private $solrRequestAddition = null;
/**
* Solr configuration
*
* @var string
*/
private $solrConfiguration = null;
/**
* Collection ids
*
* @var array
*/
private $collectionIds = array ();
/**
* Response joins
*
* @var array
*/
private $responseJoins = null;
/**
* Warnings
*
* @var array
*/
private $warnings = array ();
/**
* Errors
*
* @var array errors
*/
private $errors = array ();
/**
* Cache
*
* @var \Broker\Cache
*/
private $cache = null;
/**
* Cache enables
*
* @var boolean
*/
private $cacheEnabled = true;
/**
* Configuration
*
* @var object
*/
private $configuration = null;
/**
* Expansion cache
*
* @var \Broker\ExpansionCache
*/
private $expansionCache = null;
/**
* Configurations
*
* @var array
*/
private $__configurations = array ();
/**
* Collection
*
* @var \Broker\Collection
*/
private $collection = null;
/**
* Constructor
*
* @param object $request
* @param array $configuration
* @param \Broker\Cache $cache
* @param \Broker\Collection $collection
* @param \Broker\ExpansionCache $expansionCache
* @param string $statusKey
* @throws \Exception
*/
public function __construct($request, $configuration, $cache, $collection, $expansionCache, $statusKey) {
if ($collection != null) {
$this->collection = $collection;
}
$this->cache = $cache;
$this->brokerRequest = is_string ( $request ) ? json_decode ( $request, false ) : $request;
if ($statusKey != null && (! is_string ( $statusKey ) || strlen ( $statusKey ) < 10)) {
throw new \Exception ( "Could not parse request: invalid key" );
} else if($statusKey!=null) {
$this->statusKey = $statusKey;
}
$this->configuration = $configuration;
$this->responseJoins = new \stdClass ();
if ($this->brokerRequest != null && json_last_error () == JSON_ERROR_NONE) {
$this->parse ();
} else {
throw new \Exception ( "Could not parse request: invalid or empty json" );
}
}
/**
* Get solr request
*
* @return string
*/
public function getRequest() {
if (count ( $this->errors ) == 0) {
return $this->solrRequest;
} else {
return null;
}
}
/**
* Get addition solr request
*
* @return string
*/
public function getRequestAddition() {
if (count ( $this->errors ) == 0) {
return $this->solrRequestAddition;
} else {
return null;
}
}
/**
* Get status key
*
* @return string
*/
public function getStatusKey() {
return $this->statusKey;
}
/**
* Get solr url
*
* @return string
*/
public function getUrl() {
if (count ( $this->errors ) == 0) {
return $this->solrUrl;
} else {
return null;
}
}
/**
* Get (or create) cache
*
* @return \Broker\Cache
*/
public function getCache() {
if ($this->cache == null && $this->cacheEnabled) {
$this->cache = new \Broker\Cache ( SITE_CACHE_DATABASE_DIR, $this->configuration );
}
return $this->cache;
}
/**
* Get shards
*
* @return array
*/
public function getShards() {
if (count ( $this->errors ) == 0) {
return $this->solrShards;
} else {
return null;
}
}
/**
* Get solr configuration
*
* @return array
*/
public function getConfiguration() {
if (count ( $this->errors ) == 0) {
return $this->solrConfiguration;
} else {
return null;
}
}
/**
* Get errors
*
* @return array
*/
public function getErrors() {
return $this->errors;
}
/**
* Get warnings
*
* @return array
*/
public function getWarnings() {
return $this->warnings;
}
/**
* Get (or create) collection
*
* @return \Broker\Collection
*/
public function getCollection() {
if ($this->collection == null) {
$this->collection = new \Broker\Collection ( SITE_CACHE_DATABASE_DIR, $this->configuration );
}
return $this->collection;
}
/**
* Get collection ids
*
* @return array
*/
public function getCollectionIds() {
return $this->collectionIds;
}
/**
* Get response joins
*
* @return object
*/
public function getResponseJoins() {
return $this->responseJoins;
}
/**
* parse
*/
private function parse() {
$this->solrConfiguration = null;
$__facetQueries = array ();
$__mtasStats = array ();
$requestList = array ();
$requestAdditionalList = array ();
//$requestAdditionalList[] = "debug=true";
foreach ( $this->brokerRequest as $key => $value ) {
if ($key == "condition") {
$this->brokerRequest->condition = $this->checkCondition ( $value );
} else if ($key == "filter") {
$this->brokerRequest->filter = $this->checkFilters ( $value );
} else if ($key == "response") {
$this->brokerRequest->response = $this->checkResponse ( $value );
} else if ($key == "sort") {
$this->brokerRequest->sort = $this->checkSort ( $value );
} else if ($key == "debug") {
$this->brokerRequest->debug = $this->checkDebug ( $value );
} else if ($key == "cache") {
$this->brokerRequest->cache = $this->checkCache ( $value );
} else if ($key == "timeAllowed") {
$this->brokerRequest->timeAllowed = $this->checkTimeAllowed ( $value );
} else if ($key == "configuration") {
if ($value && is_string ( $value )) {
$this->solrConfiguration = $value;
} else {
$this->errors [] = "configuration - configuration should be a string";
}
} else {
$this->warnings [] = "request - '{$key}' not recognized";
}
}
if (count ( $this->errors ) == 0) {
// compute configuration
if (($config = $this->computeConfiguration ( $this->solrConfiguration )) == null) {
if ($this->solrConfiguration) {
$this->errors [] = "solr - configuration '{$this->solrConfiguration}' does not match all requirements";
} else {
$this->errors [] = "solr - could not find configuration matching all requirements";
}
$this->solrUrl = null;
$this->solrShards = null;
} else {
$tmpList = $this->configuration->getConfig ( "solr" );
$__config = $tmpList [$config];
$this->solrUrl = isset ( $__config ["url"] ) ? $__config ["url"] : "";
$this->solrShards = isset ( $__config ["shards"] ) ? $__config ["shards"] : "";
$this->solrConfiguration = $config;
//check timeAllowed for configuration
if(isset($this->brokerRequest->timeAllowed)) {
if(isset($__config ["timeAllowed"]) && (intval($__config ["timeAllowed"])>0)) {
$this->brokerRequest->timeAllowed = min($this->brokerRequest->timeAllowed, intval($__config ["timeAllowed"]));
}
} else if(isset($__config ["timeAllowed"]) && (intval($__config ["timeAllowed"])>0)) {
$this->brokerRequest->timeAllowed = intval($__config ["timeAllowed"]);
}
}
// compute query
if (isset ( $this->brokerRequest->filter )) {
list ( $this->brokerRequest->filter, $filter_requestList, $filter_facetQueries, $filter_mtasStats ) = $this->parseFilters ( $this->brokerRequest->filter, $this->solrConfiguration );
if ($filter_requestList && count ( $filter_requestList ) > 0) {
$requestList = array_merge ( $requestList, $filter_requestList );
$__facetQueries = array_merge ( $__facetQueries, $filter_facetQueries );
$__mtasStats = array_merge ( $__mtasStats, $filter_mtasStats );
}
}
if (isset ( $this->brokerRequest->condition )) {
$this->brokerRequest->condition = $this->parseCondition ( $this->brokerRequest->condition, $this->solrConfiguration );
if ($this->brokerRequest->condition && is_object ( $this->brokerRequest->condition ) && isset ( $this->brokerRequest->condition->__query )) {
$requestList [] = "q=" . urlencode ( $this->brokerRequest->condition->__query );
$__facetQueries = array_merge ( $__facetQueries, $this->brokerRequest->condition->__facetQueries );
$__mtasStats = array_merge ( $__mtasStats, $this->brokerRequest->condition->__mtasStats );
}
} else {
$requestList [] = "q=*:*";
}
$__facetQueriesKeyList = array ();
$this->checkResponseFacetQueries ( $__facetQueries, $__facetQueriesKeyList );
if (count ( $this->errors ) == 0) {
if (isset ( $this->brokerRequest->response ) || $this->statusKey != null) {
if (! isset ( $this->brokerRequest->response )) {
$this->brokerRequest->response = null;
}
$this->brokerRequest->response = $this->parseResponse ( $this->brokerRequest->response, $__facetQueries, $__mtasStats );
if ($this->brokerRequest->response) {
$requestList = array_merge ( $requestList, $this->brokerRequest->response->__requestList );
$requestAdditionalList = array_merge ( $requestAdditionalList, $this->brokerRequest->response->__requestAdditionalList );
}
}
if (isset ( $this->brokerRequest->sort )) {
$requestSort = $this->parseSort ( $this->brokerRequest->sort );
if ($requestSort) {
$requestList [] = $requestSort;
}
}
if (isset ( $this->brokerRequest->debug )) {
$requestDebug = $this->parseDebug ( $this->brokerRequest->debug );
if ($requestDebug) {
$requestList [] = $requestDebug;
}
}
if (isset ( $this->brokerRequest->cache )) {
$requestCache = $this->parseCache ( $this->brokerRequest->cache );
if ($requestCache) {
$requestList [] = $requestCache;
}
}
if (isset ( $this->brokerRequest->timeAllowed )) {
$requestTimeAllowed = $this->parseTimeAllowed ( $this->brokerRequest->timeAllowed );
if ($requestTimeAllowed) {
$requestAdditionalList [] = $requestTimeAllowed;
}
}
}
}
$requestList [] = "wt=json";
$requestList [] = "echoParams=none";
$this->solrRequest = implode ( "&", $requestList );
$this->solrRequestAddition = (count($requestAdditionalList)>0)?implode("&", $requestAdditionalList):null;
}
/**
* Check cache in request
*
* @param object $object
* @return object
*/
private function checkCache($object) {
if (is_bool ( $object )) {
$this->cacheEnabled = $object;
return $object;
} else {
$this->errors [] = "cache - unexpected type";
return null;
}
}
/**
* Check timeAllowed in request
*
* @param object $object
* @return object
*/
private function checkTimeAllowed($object) {
if (is_numeric ( $object )) {
$this->timeAllowed = $object;
return $object;
} else {
$this->errors [] = "timeAllowed - unexpected type";
return null;
}
}
/**
* Check debug in request
*
* @param object $object
* @return object
*/
private function checkDebug($object) {
if ($object && is_string ( $object )) {
return $object;
} else {
$this->errors [] = "debug - unexpected type";
return null;
}
}
/**
* Check sort in request
*
* @param object $object
* @return object
*/
private function checkSort($object) {
if ($object && is_array ( $object ) && count ( $object ) > 0) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->checkSortitem ( $object [$i] );
}
return $object;
} else {
$this->errors [] = "sort - unexpected type";
return null;
}
}
/**
* Check sortItem in sort
*
* @param object $object
* @return object
*/
private function checkSortitem($object) {
if ($object && is_object ( $object )) {
if (isset ( $object->field ) && is_string ( $object->field )) {
$configurations = $this->getConfigurationsForField ( $object->field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else if (preg_match ( "/^(\"[^\"]+\"|'[^']+')$/", $object->field ) || preg_match ( "/^[^\(]+\(.*\)$/", $object->field )) {
// ignore, function
} else if ($object->field !== "score") {
$this->warnings [] = "sort - sortitem - field '" . $object->field . "' not found in any configuration";
}
$ignoreItems = array (
"field"
);
if (isset ( $object->direction )) {
$ignoreItems [] = "direction";
if (! is_string ( $object->direction ) || ($object->direction != "asc" && $object->direction != "desc")) {
$this->warnings [] = "sort - sortitem - direction should be \"asc\" or \desc\"";
unset ( $object->direction );
}
}
foreach ( $object as $key => $value ) {
if (! in_array ( $key, $ignoreItems )) {
$this->warnings [] = "sort - sortitem - {$key} not expected";
}
}
} else {
$this->errors [] = "sort - sortitem - no (valid) field";
}
return $object;
} else {
$this->errors [] = "sort - sortitem - unexpected type";
return null;
}
}
/**
* Check response in request
*
* @param object $object
* @return object
*/
private function checkResponse($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "documents") {
$object->documents = $this->checkResponseDocuments ( $value );
} else if ($key == "facets") {
$object->facets = $this->checkResponseFacets ( $value );
} else if ($key == "stats") {
$object->stats = $this->checkResponseStats ( $value );
} else if ($key == "mtas") {
$object->mtas = $this->checkResponseMtas ( $value );
} else {
$this->warnings [] = "response - {$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = "response - unexpected type";
return null;
}
}
/**
* Check documents in response
*
* @param object $object
* @return object
*/
private function checkResponseDocuments($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "fields") {
if ($value != null && is_array ( $value )) {
$__fields = array ();
for($i = 0; $i < count ( $value ); $i ++) {
$item = $value [$i];
if ($item != null) {
if (is_string ( $item )) {
$__fields [] = $item;
if ($item == "*" || preg_match ( "/^\[[^\]]*\]$/", $item )) {
// do nothing
} else {
if (preg_match ( "/^([^:]+):([^:]+)$/", $item, $match )) {
$checkItem = $match [2];
} else {
$checkItem = $item;
}
if (filter_var ( $checkItem, FILTER_VALIDATE_INT ) !== false || filter_var ( $checkItem, FILTER_VALIDATE_FLOAT ) !== false || preg_match ( "/^(\"[^\"]+\"|'[^']+')$/", $checkItem ) || preg_match ( "/^[^\(]+\(.*\)$/", $checkItem )) {
// function, do nothing
} else {
$configurations = $this->getConfigurationsForField ( $checkItem );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else if ($checkItem !== "score") {
$this->warnings [] = "documents - field '" . $checkItem . "' not found in any configuration";
}
}
}
} else if (is_object ( $item )) {
$value [$i] = $this->checkResponseDocumentsJoin ( $item );
} else {
$this->errors [] = "documents - unrecognized field type";
}
}
}
} else {
$this->errors [] = "documents - fields should be array";
}
} else if ($key == "start") {
if ($value === null || ! is_int ( $value )) {
$this->errors [] = "documents - start should be integer";
}
} else if ($key == "rows") {
if ($value === null || ! is_int ( $value )) {
$this->errors [] = "documents - rows should be integer";
}
} else {
$this->warnings [] = "documents - {$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = "documents - unexpected type";
return null;
}
}
/**
* Check documents join in response
*
* @param object $object
* @return object
*/
private function checkResponseDocumentsJoin($object) {
if (is_object ( $object ) && isset ( $object->type ) && is_string ( $object->type ) && $object->type == "join") {
if (! isset ( $object->name ) || ! is_string ( $object->name )) {
$this->errors [] = "documents - join - no (valid) name provided for join";
}
if (! isset ( $object->to ) || ! is_string ( $object->to )) {
$this->errors [] = "documents - join - no (valid) to field provided for join";
}
if (! isset ( $object->from ) || ! is_string ( $object->from )) {
$this->errors [] = "documents - join - no (valid) from field provided for join";
}
if (! isset ( $object->fields ) || ! is_array ( $object->fields ) || count ( $object->fields ) == 0) {
$this->errors [] = "documents - join - no (valid) fields provided for join";
} else {
foreach ( $object->fields as $fieldsItem ) {
if (! is_string ( $fieldsItem ) && ! is_object ( $fieldsItem )) {
$this->errors [] = "documents - join - invalid field provided for join";
}
}
}
foreach ( $object as $key => $value ) {
if ($key == "type" || $key == "name" || $key == "to" || $key == "from" || $key == "fields") {
// ignore
} else if ($key == "configuration") {
if (! is_string ( $value )) {
$this->errors [] = "documents - join - invalid configuration provided for join";
}
} else if ($key == "filter" || $key == "condition") {
if (! is_object ( $value )) {
$this->errors [] = "documents - join - invalid {$key} provided for join";
}
} else {
$this->warnings [] = "documents - join - {$key} not expected in join";
}
}
return $object;
} else {
return null;
}
}
/**
* Check facets in response
*
* @param object $object
* @return object
*/
private function checkResponseFacets($object) {
if (($object && is_object ( $object ))) {
$facetFieldKeyList = array ();
$facetQueryKeyList = array ();
$facetRangeKeyList = array ();
$facetPivotKeyList = array ();
$facetHeatmapKeyList = array ();
foreach ( $object as $key => $value ) {
if ($key == "facetfields") {
if ($value != null && is_array ( $value )) {
list ( $object->facetfields, $facetFieldKeyList ) = $this->checkResponseFacetFields ( $object->facetfields, $facetFieldKeyList );
} else {
$this->errors [] = "facets - facetfields should be array";
unset ( $object->{$key} );
}
} else if ($key == "facetqueries") {
if ($value != null && is_array ( $value )) {
list ( $object->facetqueries, $facetQueryKeyList ) = $this->checkResponseFacetQueries ( $object->facetqueries, $facetQueryKeyList );
} else {
$this->errors [] = "facets - facetqueries should be array";
unset ( $object->{$key} );
}
} else if ($key == "facetranges") {
if ($value != null && is_array ( $value )) {
list ( $object->facetranges, $facetRangeKeyList ) = $this->checkResponseFacetRanges ( $object->facetranges, $facetRangeKeyList );
} else {
$this->errors [] = "facets - facetranges should be array";
unset ( $object->{$key} );
}
} else if ($key == "facetpivots") {
if ($value != null && is_array ( $value )) {
list ( $object->facetpivots, $facetPivotKeyList ) = $this->checkResponseFacetPivots ( $object->facetpivots, $facetPivotKeyList );
} else {
$this->errors [] = "facets - facetpivots should be array";
unset ( $object->{$key} );
}
} else if ($key == "facetheatmaps") {
if ($value != null && is_array ( $value )) {
list ( $object->facetheatmaps, $facetHeatmapKeyList ) = $this->checkResponseFacetHeatmaps ( $object->facetheatmaps, $facetHeatmapKeyList );
} else {
$this->errors [] = "facets - facetheatmaps should be array";
unset ( $object->{$key} );
}
} else if ($key == "prefix" || $key == "sort" || $key == "method" || $key == "contains") {
if ($value != null && is_string ( $value )) {
if ($key == "sort" && ($value != "index" && $value != "count")) {
$this->warnings [] = "facets - sort \"" . $value . "\" should be \"index\" or \"count\"";
} else if ($key == "method" && ($value != "enum" && $value != "fc" && $value != "fcs")) {
$this->warnings [] = "facets - method \"" . $value . "\" should be \"enum\", \"fc\" or \"fcs\"";
}
} else {
$this->warnings [] = "facets - {$key} should be a string";
unset ( $object->{$key} );
}
} else if ($key == "limit" || $key == "offset" || $key == "mincount") {
if ($value == null || ! is_integer ( $value )) {
$this->warnings [] = "facets - {$key} should be an integer";
unset ( $object->{$key} );
}
} else if ($key == "missing") {
if ($value == null || ! is_bool ( $value )) {
$this->warnings [] = "facets - {$key} should be a boolean";
unset ( $object->{$key} );
}
} else if ($key == "excludeTerms") {
if ($value == null || ! is_array ( $value ) || count ( $value ) == 0) {
$this->warnings [] = "facets - {$key} should be an non-empty array";
unset ( $object->{$key} );
} else {
foreach ( $value as $valueItem ) {
if (! is_string ( $valueItem )) {
$this->warnings [] = "facets - {$key} - items in array should be string";
unset ( $object->{$key} );
break;
}
}
}
} else {
$this->warnings [] = "facets - {$key} not expected";
}
}
$object->__facetqueriesKeylist = $facetQueryKeyList;
return $object;
} else {
$this->warnings [] = "facets - unexpected type";
return null;
}
}
/**
* Check facet fields in response
*
* @param array $facetfields
* @param array $keyList
*/
private function checkResponseFacetFields($facetfields, $keyList) {
if (count ( $facetfields ) > 0) {
for($i = 0; $i < count ( $facetfields ); $i ++) {
list ( $facetfields [$i], $keyList ) = $this->checkResponseFacetField ( $facetfields [$i], $keyList );
}
}
return array (
$facetfields,
$keyList
);
}
/**
* Check facet field
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseFacetField($object, $keyList) {
if ($object && is_object ( $object )) {
if (isset ( $object->field ) && is_string ( $object->field )) {
$configurations = $this->getConfigurationsForField ( $object->field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
if (isset ( $object->__options )) {
$this->warnings [] = "facets - facetfields - __options not expected";
}
$object->__options = array ();
if (isset ( $object->key )) {
if (is_string ( $object->key )) {
$counter = 0;
if (in_array ( $object->key, $keyList )) {
$this->warnings [] = "facets - facetfields - key " . $object->key . " already exists";
$counter = 0;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
} else {
unset ( $object->key );
$this->warnings [] = "facets - facetfields - key should be a string";
}
}
if (! isset ( $object->key )) {
$counter = 0;
$object->key = $object->field;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
$object->__options [] = "key=\"" . str_replace ( "\"", "\\\"", $object->key ) . "\"";
$keyList [] = $object->key;
if (isset ( $object->ex )) {
if (is_string ( $object->ex )) {
$object->__options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
} else {
$this->warnings [] = "facets - facetfields - ex should be a string";
}
}
foreach ( $object as $key => $value ) {
if ($key == "field" || $key == "key" || $key == "ex" || $key == "__options") {
// ignore
} else if ($key == "prefix" || $key == "sort" || $key == "method" || $key == "contains") {
if (is_string ( $value )) {
if ($key == "sort" && ($value != "index" && $value != "count")) {
$this->warnings [] = "facets - facetfields - sort \"" . $value . "\" should be \"index\" or \"count\"";
} else if ($key == "method" && ($value != "enum" && $value != "fc" && $value != "fcs")) {
$this->warnings [] = "facets - facetfields - method \"" . $value . "\" should be \"enum\", \"fc\" or \"fcs\"";
} else {
$object->__options [] = "facet." . $key . "=\"" . str_replace ( "\"", "\\\"", $value ) . "\"";
}
} else {
$this->warnings [] = "facets - facetfields - {$key} should be a string";
}
} else if ($key == "limit" || $key == "offset" || $key == "mincount") {
if (! is_integer ( $value )) {
$this->warnings [] = "facets - facetfields - {$key} should be an integer";
}
} else if ($key == "missing") {
if (! is_bool ( $value )) {
$this->warnings [] = "facets - facetfields - {$key} should be a boolean";
} else {
$object->__options [] = "facet." . $key . "=\"" . ($value ? "true" : "false") . "\"";
}
} else if ($key == "excludeTerms") {
if ($value == null || ! is_array ( $value ) || count ( $value ) == 0) {
$this->warnings [] = "facets - facetfields - {$key} should be an non-empty array";
} else {
$validArrayOfStrings = true;
foreach ( $value as $valueItem ) {
if (! is_string ( $valueItem )) {
$this->warnings [] = "facets - {$key} - items in array should be string";
$validArrayOfStrings = false;
break;
}
}
if ($validArrayOfStrings) {
$object->__options [] = "facet." . $key . "=\"" . str_replace ( "\"", "\\\"", implode ( ",", $value ) ) . "\"";
}
}
} else if ($key == "join") {
if (! is_object ( $value )) {
$this->warnings [] = "facets - facetfields - {$key} should be an object";
} else {
$object->join = $this->checkResponseFacetFieldJoin ( $value );
}
} else {
$this->warnings [] = "facets - facetfields - {$key} not expected";
}
}
return array (
$object,
$keyList
);
} else {
$this->errors [] = "facets - facetfields - field '" . $object->field . "' not found in any configuration";
return array (
null,
$keyList
);
}
} else {
$this->errors [] = "facets - facetfields - no (valid) field provided";
return array (
null,
$keyList
);
}
} else {
$this->warnings [] = "facets - facetfields - unexpected type";
return array (
null,
$keyList
);
}
}
/**
* Check join facet field
*
* @param object $object
* @return object
*/
private function checkResponseFacetFieldJoin($object) {
if (is_object ( $object )) {
if (! isset ( $object->to ) || ! is_string ( $object->to )) {
$this->errors [] = "facets - facetfields - no (valid) to field provided for join";
return null;
} else if (! isset ( $object->fields ) || ! is_array ( $object->fields ) || count ( $object->fields ) == 0) {
$this->errors [] = "facets - facetfields - no (valid) fields provided for join";
return null;
} else {
foreach ( $object->fields as $fieldsItem ) {
if (! is_string ( $fieldsItem ) && ! is_object ( $fieldsItem )) {
$this->errors [] = "facets - facetfields - invalid field provided for join";
}
}
}
foreach ( $object as $key => $value ) {
if ($key == "to" || $key == "fields") {
// ignore
} else if ($key == "configuration") {
if (! is_string ( $value )) {
$this->errors [] = "facets - facetfields - invalid configuration provided for join";
}
} else {
$this->warnings [] = "facets - facetfields - {$key} not expected in join";
}
}
return $object;
} else {
return null;
}
}
/**
* Check facet queries
*
* @param array $facetqueries
* @param array $keyList
* @return array
*/
private function checkResponseFacetQueries($facetqueries, $keyList) {
if (count ( $facetqueries ) > 0) {
for($i = 0; $i < count ( $facetqueries ); $i ++) {
list ( $facetqueries [$i], $keyList ) = $this->checkResponseFacetQuery ( $facetqueries [$i], $keyList );
}
}
return array (
$facetqueries,
$keyList
);
}
/**
* Check facet query
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseFacetQuery($object, $keyList) {
if ($object && is_object ( $object )) {
// generated
if (isset ( $object->__query ) && $object->__query && is_string ( $object->__query )) {
foreach ( $object as $key => $value ) {
if ($key == "key") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery (generated) - key should be a string";
} else {
if (in_array ( $value, $keyList )) {
$this->errors [] = "facets - facetquery (generated) - key '" . $value . "' already used";
} else {
$keyList [] = $value;
}
}
} else if ($key == "ex") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery (generated) - ex should be a string";
}
} else if ($key == "tag") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery (generated) - tag should be a string";
}
} else if ($key == "__query") {
if ($value == null || ! is_string ( $value )) {
$this->errors [] = "facets - facetquery (generated) - no query";
}
}
}
if (! isset ( $object->__query )) {
$this->errors [] = "facets - facetqueries (generated) - no (valid) query provided";
return array (
null,
$keyList
);
} else {
return array (
$object,
$keyList
);
}
// provided
} else {
foreach ( $object as $key => $value ) {
if ($key == "key") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery - key should be a string";
} else {
if (in_array ( $value, $keyList )) {
$this->errors [] = "facets - facetquery - key '" . $value . "' already used";
} else {
$keyList [] = $value;
}
}
} else if ($key == "ex") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery - ex should be a string";
}
} else if ($key == "tag") {
if ($value == null || ! is_string ( $value )) {
$this->warnings [] = "facets - facetquery - tag should be a string";
}
} else if ($key == "condition") {
$object->condition = $this->checkCondition ( $object->condition );
}
}
if (! isset ( $object->condition ) || $object->condition == null) {
$this->errors [] = "facets - facetqueries - no (valid) condition provided" . var_export ( $object, true );
return array (
null,
$keyList
);
} else {
return array (
$object,
$keyList
);
}
}
} else {
$this->warnings [] = "facets - facetqueries - unexpected type";
return array (
null,
$keyList
);
}
}
/**
* Check facet ranges
*
* @param array $facetranges
* @param array $keyList
* @return array
*/
private function checkResponseFacetRanges($facetranges, $keyList) {
if (count ( $facetranges ) > 0) {
for($i = 0; $i < count ( $facetranges ); $i ++) {
list ( $facetranges [$i], $keyList ) = $this->checkResponseFacetRange ( $facetranges [$i], $keyList );
}
}
return array (
$facetranges,
$keyList
);
}
/**
* Check facet range
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseFacetRange($object, $keyList) {
if ($object && is_object ( $object )) {
if (isset ( $object->field ) && is_string ( $object->field )) {
$configurations = $this->getConfigurationsForField ( $object->field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
if (isset ( $object->__options )) {
$this->warnings [] = "facets - facetranges - __options not expected";
}
$object->__options = array ();
$ignoreList = array (
"__options",
"field",
"key"
);
$optionalItems = array (
"include",
"other",
"tag"
);
foreach ( $optionalItems as $optionalItem ) {
if (isset ( $object->{$optionalItem} )) {
$ignoreList [] = $optionalItem;
if (is_string ( $object->{$optionalItem} )) {
$object->__options [] = $optionalItem . "=\"" . str_replace ( "\"", "\\\"", $object->{$optionalItem} ) . "\"";
} else {
$this->warnings [] = "facets - facetranges - " . $optionalItem . " should be a string";
}
}
}
if (isset ( $object->ex )) {
$ignoreList [] = "ex";
if (is_string ( $object->ex )) {
$object->__options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
} else {
$this->warnings [] = "facets - facetranges - ex should be a string";
}
}
if (isset ( $object->other )) {
$ignoreList [] = "other";
if (is_string ( $object->other )) {
$object->__options [] = "facet.range.other=\"" . str_replace ( "\"", "\\\"", $object->other) . "\"";
} else {
$this->warnings [] = "facets - facetranges - ex should be a string";
}
}
// disabled: solr-problem with sharding
// if (isset ( $object->mincount )) {
// $ignoreList [] = "mincount";
// if (is_numeric ( $object->mincount )) {
// $object->__options [] = "facet.mincount=".$object->mincount;
// } else {
// $this->warnings [] = "facets - facetranges - mincount should be numeric";
// }
// }
if (isset ( $object->key )) {
if (is_string ( $object->key )) {
$counter = 0;
if (in_array ( $object->key, $keyList )) {
$this->warnings [] = "facets - facetranges - key " . $object->key . " already exists";
$counter = 0;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
} else {
unset ( $object->key );
$this->warnings [] = "facets - facetranges - key should be a string";
}
}
if (! isset ( $object->key )) {
$counter = 0;
$object->key = $object->field;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
$object->__options [] = "key=\"" . str_replace ( "\"", "\\\"", $object->key ) . "\"";
$keyList [] = $object->key;
$obligatoryOptions = array (
"start",
"end",
"gap"
);
foreach ( $obligatoryOptions as $obligatoryOption ) {
$ignoreList [] = $obligatoryOption;
if (isset ( $object->{$obligatoryOption} )) {
if (is_string ( $object->{$obligatoryOption} ) || is_int ( $object->{$obligatoryOption} )) {
$object->__options [] = "facet.range." . $obligatoryOption . "=\"" . str_replace ( "\"", "\\\"", $object->{$obligatoryOption} ) . "\"";
} else {
$this->errors [] = "facets - facetranges - " . $obligatoryOption . " should be a string or an integer";
}
} else {
$this->errors [] = "facets - facetranges - " . $obligatoryOption . " not set";
}
}
foreach ( $object as $key => $value ) {
if (in_array ( $key, $ignoreList )) {
// ignore
} else {
$this->warnings [] = "facets - facetranges - {$key} not expected";
}
}
return array (
$object,
$keyList
);
} else {
$this->warnings [] = "facets - facetranges - unexpected type";
return array (
null,
$keyList
);
}
} else {
$this->errors [] = "facets - facetranges - no (valid) field provided";
return array (
null,
$keyList
);
}
} else {
$this->warnings [] = "facets - facetranges - unexpected type";
return array (
null,
$keyList
);
}
}
/**
* Check facet pivots
*
* @param array $facetpivots
* @param array $keyList
* @return array
*/
private function checkResponseFacetPivots($facetpivots, $keyList) {
if (count ( $facetpivots ) > 0) {
for($i = 0; $i < count ( $facetpivots ); $i ++) {
list ( $facetpivots [$i], $keyList ) = $this->checkResponseFacetPivot ( $facetpivots [$i], $keyList );
}
}
return array (
$facetpivots,
$keyList
);
}
/**
* Check facet pivot
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseFacetPivot($object, $keyList) {
if ($object && is_object ( $object )) {
if (isset ( $object->pivot ) && is_array ( $object->pivot )) {
if (isset ( $object->__options )) {
$this->warnings [] = "facets - facetpivots - __options not expected";
}
$object->__options = array ();
foreach ( $object->pivot as $pivot ) {
if (is_string ( $pivot )) {
$configurations = $this->getConfigurationsForField ( $pivot );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
}
} else {
$this->errors [] = "facets - facetpivots - pivot should be a string";
}
}
$ignoreList = array (
"__options",
"pivot",
"key"
);
if (isset ( $object->ex )) {
$ignoreList [] = "ex";
if (is_string ( $object->ex )) {
$object->__options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
} else {
$this->warnings [] = "facets - facetpivots - ex should be a string";
}
}
$stringSpecialList = array (
"query",
"range",
"stats"
);
$integerList = array (
"limit",
"offset"
);
foreach ( $stringSpecialList as $stringItem ) {
if (isset ( $object->{$stringItem} )) {
$ignoreList [] = $stringItem;
if (is_string ( $object->{$stringItem} )) {
$object->__options [] = $stringItem . "=\"" . str_replace ( "\"", "\\\"", $object->{$stringItem} ) . "\"";
} else {
unset ( $object->{$stringItem} );
}
}
}
foreach ( $integerList as $integerItem ) {
if (isset ( $object->{$integerItem} )) {
$ignoreList [] = $integerItem;
if (is_int ( $object->{$integerItem} )) {
$object->__options [] = "facet." . $integerItem . "=" . $object->{$integerItem};
} else {
unset ( $object->{$stringItem} );
}
}
}
if (isset ( $object->key )) {
if (is_string ( $object->key )) {
$counter = 0;
if (in_array ( $object->key, $keyList )) {
$this->warnings [] = "facets - facetpivots - key " . $object->key . " already exists";
$counter = 0;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
} else {
unset ( $object->key );
$this->warnings [] = "facets - facetpivots - key should be a string";
}
}
if (! isset ( $object->key )) {
$counter = 0;
$object->key = implode ( ",", $object->pivot );
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
$object->__options [] = "key=\"" . str_replace ( "\"", "\\\"", $object->key ) . "\"";
$keyList [] = $object->key;
foreach ( $object as $key => $value ) {
if (in_array ( $key, $ignoreList )) {
// ignore
} else if ($key == "sort") {
if (is_string ( $value )) {
if ($key == "sort" && ($value != "index" && $value != "count")) {
$this->warnings [] = "facets - facetpivots - sort \"" . $value . "\" should be \"index\" or \"count\"";
} else {
$object->__options [] = "facet." . $key . "=\"" . str_replace ( "\"", "\\\"", $value ) . "\"";
}
} else {
unset ( $object->key );
$this->warnings [] = "facets - facetpivots - {$key} should be a string";
}
} else {
$this->warnings [] = "facets - facetpivots - {$key} not expected";
}
}
return array (
$object,
$keyList
);
} else {
$this->warnings [] = "facets - facetpivots - unexpected type";
return array (
null,
$keyList
);
}
} else {
$this->errors [] = "facets - facetpivots - no (valid) pivot provided";
return array (
null,
$keyList
);
}
}
/**
* Check facet heatmaps
*
* @param array $facetheatmaps
* @param array $keyList
* @return array
*/
private function checkResponseFacetHeatmaps($facetheatmaps, $keyList) {
if (count ( $facetheatmaps ) > 0) {
for($i = 0; $i < count ( $facetheatmaps ); $i ++) {
list ( $facetheatmaps [$i], $keyList ) = $this->checkResponseFacetHeatmap ( $facetheatmaps [$i], $keyList );
}
}
return array (
$facetheatmaps,
$keyList
);
}
/**
* Check facet pivot
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseFacetHeatmap($object, $keyList) {
if ($object && is_object ( $object )) {
if (isset ( $object->field ) && is_string ( $object->field )) {
$configurations = $this->getConfigurationsForField ( $object->field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
if (isset ( $object->__options )) {
$this->warnings [] = "facets - facetheatmaps - __options not expected";
}
$object->__options = array ();
$ignoreList = array (
"__options",
"field",
"key"
);
if (isset ( $object->geom )) {
$ignoreList [] = "geom";
if (is_string ( $object->geom )) {
$object->__options [] = "facet.heatmap.geom=\"" . str_replace ( "\"", "\\\"", $object->geom ) . "\"";
} else {
$this->warnings [] = "facets - facetranges - geom should be a string";
}
}
if (isset ( $object->gridLevel )) {
$ignoreList [] = "gridLevel";
if (is_int ( $object->gridLevel )) {
$object->__options [] = "facet.heatmap.gridLevel=".$object->gridLevel;
} else {
$this->warnings [] = "facets - facetheatmaps - gridLevel should be an integer";
}
}
if (isset ( $object->distErrPct )) {
$ignoreList [] = "distErrPct";
if (is_numeric ( $object->distErrPct )) {
$object->__options [] = "facet.heatmap.distErrPct=".$object->distErrPct;
} else {
$this->warnings [] = "facets - facetranges - distErrPct should be numeric";
}
}
if (isset ( $object->distErr )) {
$ignoreList [] = "distErr";
if (is_numeric ( $object->distErr )) {
$object->__options [] = "facet.heatmap.distErr=".$object->distErr;
} else {
$this->warnings [] = "facets - facetheatmaps - distErr should be numeric";
}
}
if (isset ( $object->maxCells )) {
$ignoreList [] = "maxCells";
if (is_numeric ( $object->maxCells )) {
$object->__options [] = "facet.heatmap.maxCells=".$object->maxCells;
} else {
$this->warnings [] = "facets - facetheatmaps - maxCells should be numeric";
}
}
if (isset ( $object->ex )) {
$ignoreList [] = "ex";
if (is_string ( $object->ex )) {
$object->__options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
} else {
$this->warnings [] = "facets - facetheatmaps - ex should be a string";
}
}
if (isset ( $object->key )) {
if (is_string ( $object->key )) {
$counter = 0;
if (in_array ( $object->key, $keyList )) {
$this->warnings [] = "facets - facetheatmaps - key " . $object->key . " already exists";
$counter = 0;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
} else {
unset ( $object->key );
$this->warnings [] = "facets - facetheatmaps - key should be a string";
}
}
if (! isset ( $object->key )) {
$counter = 0;
$object->key = $object->field;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
$object->__options [] = "key=\"" . str_replace ( "\"", "\\\"", $object->key ) . "\"";
$keyList [] = $object->key;
foreach ( $object as $key => $value ) {
if (in_array ( $key, $ignoreList )) {
// ignore
} else {
$this->warnings [] = "facets - facetheatmaps - {$key} not expected";
}
}
return array (
$object,
$keyList
);
} else {
$this->warnings [] = "facets - facetheatmaps - unexpected field (type)";
return array (
null,
$keyList
);
}
} else {
$this->errors [] = "facets - facetheatmaps - no (valid) heatmap provided";
return array (
null,
$keyList
);
}
} else {
$this->warnings [] = "facets - facetheatmaps - unexpected type";
return array (
null,
$keyList
);
}
}
/**
* Check stats in response
*
* @param object $object
* @return object
*/
private function checkResponseStats($object) {
if ($object && is_object ( $object )) {
$statsFieldKeyList = array ();
foreach ( $object as $key => $value ) {
if ($key == "statsfields") {
if ($value != null && is_array ( $value )) {
list ( $object->statsfields, $statsFieldKeyList ) = $this->checkResponseStatsFields ( $object->statsfields, $statsFieldKeyList );
} else {
$this->errors [] = "stats - statsfields should be array";
unset ( $object->{$key} );
}
} else {
$this->warnings [] = "stats - {$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = "stats - unexpected type";
return null;
}
}
/**
* Check stats fields in response
*
* @param array $statsfields
* @param array $keyList
* @return array
*/
private function checkResponseStatsFields($statsfields, $keyList) {
if (count ( $statsfields ) > 0) {
for($i = 0; $i < count ( $statsfields ); $i ++) {
list ( $statsfields [$i], $keyList ) = $this->checkResponseStatsField ( $statsfields [$i], $keyList );
}
}
return array (
$statsfields,
$keyList
);
}
/**
* Check stats field
*
* @param object $object
* @param array $keyList
* @return array
*/
private function checkResponseStatsField($object, $keyList) {
if ($object && is_object ( $object )) {
if (isset ( $object->field ) && is_string ( $object->field )) {
if (isset ( $object->__options )) {
$this->warnings [] = "stats - statsfields - __options not expected";
}
$object->__options = array ();
// check field
$validField = false;
if (preg_match ( "/^(\"[^\"]+\"|'[^']+')$/", $object->field ) || preg_match ( "/^[^\(]+\(.*\)$/", $object->field )) {
// function
$validField = true;
$object->__options [] = "func";
} else {
$configurations = $this->getConfigurationsForField ( $object->field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
$validField = true;
}
}
if ($validField) {
if (isset ( $object->key )) {
if (is_string ( $object->key )) {
$counter = 0;
if (in_array ( $object->key, $keyList )) {
$this->warnings [] = "stats - statsfields - key " . $object->key . " already exists";
$counter = 0;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
} else {
unset ( $object->key );
$this->warnings [] = "stats - statsfields - key should be a string";
}
}
if (! isset ( $object->key )) {
$counter = 0;
$object->key = $object->field;
$originalKey = $object->key;
while ( in_array ( $object->key, $keyList ) ) {
$counter ++;
$object->key = $originalKey . " (" . $counter . ")";
}
}
$object->__options [] = "key=\"" . str_replace ( "\"", "\\\"", $object->key ) . "\"";
$keyList [] = $object->key;
foreach ( $object as $key => $value ) {
if ($key == "field" || $key == "key" || $key == "__options") {
// ignore
} else if ($key == "countDistinct") {
if (is_bool ( $value )) {
$object->__options [] = $key . "=" . ($value ? "true" : "false");
} else {
$this->warnings [] = "stats - statsfields - {$key} should be a boolean";
}
} else if ($key == "tag") {
if (is_string ( $value )) {
$object->__options [] = $key . "=\"" . str_replace ( "\"", "\\\"", $value ) . "\"";
} else {
$this->warnings [] = "stats - statsfields - {$key} should be a string";
}
} else if ($key == "ex") {
if (is_string ( $value )) {
$object->__options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
} else {
$this->warnings [] = "stats - statsfields - {$key} should be a string";
}
} else {
$this->warnings [] = "stats - statsfields - {$key} not expected";
}
}
return array (
$object,
$keyList
);
} else {
$this->errors [] = "stats - statsfields - field '" . $object->field . "' not found in any configuration";
return array (
null,
$keyList
);
}
} else {
$this->errors [] = "stats - statsfields - no (valid) field provided";
return array (
null,
$keyList
);
}
} else {
$this->warnings [] = "stats - statsfields - unexpected type";
return array (
null,
$keyList
);
}
}
/**
* Check mtas in response
*
* @param object $object
* @return object
*/
private function checkResponseMtas($object) {
if (($object && is_object ( $object ))) {
foreach ( $object as $key => $value ) {
if ($key == "stats") {
if (!is_null($value) && is_object ( $value )) {
$object->{$key} = $this->checkResponseMtasStats ( $value );
} else {
$this->errors [] = "mtas - {$key} should be object";
unset ( $object->{$key} );
}
} else if ($key == "document") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasDocument ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "kwic" || $key == "list") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasKwicAndList ( $key, $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "page") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasPage ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "heatmap") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasHeatmap ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "termvector") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasTermvector ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "facet") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasFacet ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "group") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasGroup ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "prefix") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasPrefix ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "collection") {
if (!is_null($value) && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->collection [$i] = $this->checkResponseMtasCollection ( $value [$i] );
}
} else {
$this->errors [] = "mtas - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "version") {
if (!is_null($value) && is_bool ( $value )) {
$object->version = $this->checkResponseMtasVersion ( $value );
} else {
$this->errors [] = "mtas - {$key} should be boolean";
unset ( $object->{$key} );
}
} else {
$this->warnings [] = "mtas - {$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = "mtas - unexpected type";
return null;
}
}
/**
* Check mtas stats
*
* @param object $object
* @return object
*/
private function checkResponseMtasStats($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "positions") {
if ($value != null && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasStatsPositions ( $value [$i], $i );
}
} else {
$this->errors [] = "mtas - stats - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "tokens") {
if ($value != null && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasStatsTokens ( $value [$i], $i );
}
} else {
$this->errors [] = "mtas - stats - {$key} should be array";
unset ( $object->{$key} );
}
} else if ($key == "spans") {
if ($value != null && is_array ( $value )) {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasStatsSpans ( $value [$i], $i );
}
} else {
$this->errors [] = "mtas - stats - {$key} should be array";
unset ( $object->{$key} );
}
} else {
$this->warnings [] = "mtas - stats - {$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = "mtas - stats - unexpected type";
return null;
}
}
/**
* Check mtas stats positions
*
* @param object $object
* @return object
*/
private function checkResponseMtasStatsPositions($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - positions - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - stats - positions - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - positions - {$key} should be string";
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - stats - positions - {$key} should be integer";
}
} else {
$this->warnings [] = "mtas - stats - positions - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - stats - positions - field is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - stats - positions unexpected type";
return null;
}
}
/**
* Check mtas stats tokens
*
* @param object $object
* @return object
*/
private function checkResponseMtasStatsTokens($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - tokens - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - stats - tokens - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - tokens - {$key} should be string";
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - stats - tokens - {$key} should be integer";
}
} else {
$this->warnings [] = "mtas - stats - tokens - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - stats - tokens - field is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - stats - tokens unexpected type";
return null;
}
}
/**
* Check mtas stats spans
*
* @param object $object
* @return object
*/
private function checkResponseMtasStatsSpans($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - spans - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - stats - spans - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - stats - spans - {$key} should be string";
}
} else if ($key == "queries") {
if (! is_array ( $value ) || count ( $object->queries ) == 0) {
$this->errors [] = "mtas - stats - spans - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasQuery ( $value [$i], "mtas - stats - spans - query - " );
}
}
} else if ($key == "functions") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - stats - spans - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkMtasStatsFunction ( $value [$i], "mtas - stats - spans - query - " );
}
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - stats - spans - {$key} should be integer";
}
} else {
$this->warnings [] = "mtas - stats - spans - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - stats - spans - field is obligatory";
}
if (! isset ( $object->queries )) {
$this->errors [] = "mtas - stats - spans - queries is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - stats - tokens unexpected type";
return null;
}
}
/**
* Check mtas documents
*
* @param object $object
* @return object
*/
private function checkResponseMtasDocument($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - document - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - document - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "prefix" || $key == "key" || $key == "type" || $key == "regexp" || $key == "ignoreRegexp") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - document - {$key} should be string";
}
} else if ($key == "number" || $key == "listExpandNumber") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - document - {$key} should be integer";
}
} else if ($key == "listRegexp" || $key == "listExpand" || $key == "ignoreListRegexp") {
if (! is_bool ( $value )) {
$this->errors [] = "mtas - document - {$key} should be boolean";
}
} else if ($key == "list" || $key == "ignoreList") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - document - {$key} should be non empty array of strings";
} else {
foreach ( $value as $valueItem ) {
if (! is_string ( $valueItem )) {
$this->errors [] = "mtas - document - {$key} array should contain only strings";
break;
}
}
}
} else {
$this->warnings [] = "mtas - document - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - document - field is obligatory";
}
if (! isset ( $object->prefix )) {
$this->errors [] = "mtas - document - prefix is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - document - unexpected type";
return null;
}
}
/**
* Check mtas kwic and list
*
* @param string $type
* @param object $object
* @return object
*/
private function checkResponseMtasKwicAndList($type, $object) {
if ($type != "list" && $type != "kwic") {
die ( "incorrect call" );
}
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - {$type} - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "prefix" || $key == "key" || $key == "output") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be string";
}
} else if ($key == "number" || $key == "start" || $key == "left" || $key == "right") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be integer";
}
} else if ($key == "query") {
if (! is_object ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be object";
} else {
$object->{$key} = $this->checkResponseMtasQuery ( $value, "mtas - {$type} - {$key} - " );
}
} else if ($type=="kwic" && $key == "page") {
if (! is_object ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be object";
} else {
$object->{$key} = $this->checkPage ( $value, "mtas - {$type} - " );
}
} else if ($type=="list" && $key == "fields") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - {$type} - {$key} should be list";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$item = $value [$i];
if ($item != null) {
if (is_string ( $item )) {
if ($item == "*" || preg_match ( "/^\[[^\]]*\]$/", $item )) {
// do nothing
} else {
if (preg_match ( "/^([^:]+):([^:]+)$/", $item, $match )) {
$checkItem = $match [2];
} else {
$checkItem = $item;
}
$configurations = $this->getConfigurationsForField ( $checkItem );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->warnings [] = "mtas - {$type} - field '" . $checkItem . "' not found in any configuration";
}
}
} else {
$this->errors [] = "mtas - {$type} - unrecognized field type";
}
}
}
}
} else {
$this->warnings [] = "mtas - {$type} - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - {$type} - field is obligatory";
}
if (! isset ( $object->query )) {
$this->errors [] = "mtas - {$type} - query is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - {$type} unexpected type";
return null;
}
}
/**
* Check mtas page
*
* @param object $object
* @return object
*/
private function checkResponseMtasPage($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - page - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - page - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "prefix" || $key == "key") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - page - {$key} should be string";
}
} else if ($key == "start" || $key == "end") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - page - {$key} should be integer";
}
} else {
$this->warnings [] = "mtas - page - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - page - field is obligatory";
}
if (! isset ( $object->start )) {
$this->errors [] = "mtas - page - start is obligatory";
}
if (! isset ( $object->end )) {
$this->errors [] = "mtas - page - end is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - page - unexpected type";
return null;
}
}
/**
* Check mtas heatmap
*
* @param object $object
* @return object
*/
private function checkResponseMtasHeatmap($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "heatmapField" || $key == "queryField") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - heatmap - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - heatmap - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "queries") {
if (! is_array ( $value ) || count ( $object->queries ) == 0) {
$this->errors [] = "mtas - heatmap - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasQuery ( $value [$i], "mtas - heatmap - query - " );
}
}
} else if ($key == "key" || $key == "geom" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - heatmap - {$key} should be string";
}
} else if ($key == "gridLevel" || $key == "maxCells") {
if (! is_numeric ( $value )) {
$this->errors [] = "mtas - heatmap - {$key} should be string";
}
} else if ($key == "functions") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - heatmap - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkMtasStatsFunction ( $value [$i], "mtas - heatmap - query - " );
}
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - heatmap - {$key} should be integer";
}
} else {
$this->warnings [] = "mtas - heatmap - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->heatmapField )) {
$this->errors [] = "mtas - heatmap - heatmapField is obligatory";
}
if (! isset ( $object->queryField )) {
$this->errors [] = "mtas - heatmap - queryField is obligatory";
}
if (! isset ( $object->queries)) {
$this->errors [] = "mtas - heatmap - queryies is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - page - unexpected type";
return null;
}
}
/**
* Check mtas termvector
*
* @param object $object
* @return object
*/
private function checkResponseMtasTermvector($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - termvector - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "prefix" || $key == "key" || $key == "type" || $key == "regexp" || $key == "ignoreRegexp") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be string";
}
} else if ($key == "number" || $key == "start") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be integer";
}
} else if ($key == "full" || $key == "listRegexp" || $key == "ignoreListRegexp") {
if (! is_bool ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be boolean";
}
} else if ($key == "sort") {
if (! is_object ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be object";
} else {
foreach ( $value as $subKey => $subValue ) {
if ($subKey == "type" || $subKey == "direction") {
if (! is_string ( $subValue )) {
$this->errors [] = "mtas - termvector - {$key} - {$subKey} should be string";
}
} else {
$this->warnings [] = "mtas - termvector - {$key} - {$subKey} not expected";
}
}
}
} else if ($key == "list" || $key == "ignoreList") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be non empty array of strings";
} else {
foreach ( $value as $subValue ) {
if (! is_string ( $subValue )) {
$this->errors [] = "mtas - termvector - {$key} should be array of only strings";
}
}
}
} else if ($key == "functions") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$value [$i] = $this->checkResponseMtasFunction ( $value [$i], "mtas - termvector - function - " );
}
}
} else if ($key == "distances") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - termvector - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$value [$i] = $this->checkResponseMtasDistance ( $value [$i], "mtas - termvector - distance - " );
}
}
} else {
$this->warnings [] = "mtas - termvector - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - termvector - field is obligatory";
}
if (! isset ( $object->prefix )) {
$this->errors [] = "mtas - termvector - prefix is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - termvector - unexpected type";
return null;
}
}
/**
* Check mtas facet
*
* @param object $object
* @return object
*/
private function checkResponseMtasFacet($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - facet - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - facet - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - facet - {$key} should be string";
}
} else if ($key == "queries") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - facet - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasQuery ( $value [$i], "mtas - facet - {$key} - " );
}
}
} else if ($key == "base") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - facet - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasBase ( $value [$i], "mtas - facet - {$key} - " );
}
}
} else {
$this->warnings [] = "mtas - facet - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - facet - field is obligatory";
}
if (! isset ( $object->queries )) {
$this->errors [] = "mtas - facet - queries is obligatory";
}
if (! isset ( $object->base )) {
$this->errors [] = "mtas - facet - base is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - facet - unexpected type";
return null;
}
}
/**
* Check mtas group
*
* @param object $object
* @return object
*/
private function checkResponseMtasGroup($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - group - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - group - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - group - {$key} should be string";
}
} else if ($key == "number" || $key == "start") {
if (! is_int ( $value )) {
$this->errors [] = "mtas - group - {$key} should be integer";
}
} else if ($key == "query") {
$object->{$key} = $this->checkResponseMtasQuery ( $value, "mtas - group - {$key} - " );
} else if ($key == "grouping") {
if (! is_object ( $value )) {
$this->errors [] = "mtas - group - {$key} should be object";
} else {
$items = 0;
foreach ( $value as $subKey => $subValue ) {
if ($subKey == "hit") {
if (! is_object ( $subValue )) {
$this->warnings [] = "mtas - group - {$key} - {$subKey} should be object";
} else {
foreach ( $subValue as $subSubKey => $subSubValue ) {
if ($subSubKey == "inside") {
if (! is_string ( $subSubValue )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} - {$subSubKey} should be string";
} else {
$items ++;
}
} else if ($subSubKey == "insideLeft" || $subSubKey == "insideRight" || $subSubKey == "left" || $subSubKey == "right") {
if (! is_array ( $subSubValue )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} - {$subSubKey} should be non empty array";
} else {
for($i = 0; $i < count ( $subSubValue ); $i ++) {
if (! is_object ( $subSubValue [$i] )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} - {$subSubKey}[{$i}] should be an object";
} else if (! isset ( $subSubValue [$i]->prefixes ) || ! is_string ( $subSubValue [$i]->prefixes )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} - {$subSubKey}[{$i}] - prefixes should be defined (as string)";
} else if (! isset ( $subSubValue [$i]->position ) || (! is_string ( $subSubValue [$i]->position ) && ! is_int ( $subSubValue [$i]->position ))) {
$this->errors [] = "mtas - group - {$key} - {$subKey} - {$subSubKey}[{$i}] - position should be defined (as string or integer)";
} else {
$items ++;
}
}
}
} else {
$this->warnings [] = "mtas - group - {$key} - {$subKey} - {$subSubKey} not expected";
}
}
}
} else if ($subKey == "left" || $subKey == "right") {
if (! is_array ( $subValue )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} should be non empty array";
} else {
for($i = 0; $i < count ( $subValue ); $i ++) {
if (! is_object ( $subValue [$i] )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} [{$i}] should be an object";
} else if (! isset ( $subValue [$i]->prefixes ) || ! is_string ( $subValue [$i]->prefixes )) {
$this->errors [] = "mtas - group - {$key} - {$subKey} [{$i}] - prefixes should be defined (as string)";
} else if (! isset ( $subValue [$i]->position ) || (! is_string ( $subValue [$i]->position ) && ! is_int ( $subValue [$i]->position ))) {
$this->errors [] = "mtas - group - {$key} - {$subKey} [{$i}] - position should be defined (as string or integer)";
} else {
$items ++;
}
}
}
} else {
$this->warnings [] = "mtas - group - {$key} - {$subKey} not expected";
}
}
if (! $items) {
$this->errors [] = "mtas - group - {$key} - no (valid) groupings defined";
}
}
} else {
$this->warnings [] = "mtas - group - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - group - field is obligatory";
}
if (! isset ( $object->query )) {
$this->errors [] = "mtas - group - query is obligatory";
}
if (! isset ( $object->grouping )) {
$this->errors [] = "mtas - group - grouping is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - group - unexpected type";
return null;
}
}
/**
* Check mtas prefix
*
* @param object $object
* @return object
*/
private function checkResponseMtasPrefix($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - prefix - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - prefix - {$key} : '" . $value . "' not found in any configuration";
}
}
} else if ($key == "key") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - prefix - {$key} should be string";
}
} else {
$this->warnings [] = "mtas - prefix - {$key} not expected";
}
}
if (count ( $this->errors ) == 0) {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - prefix - field is obligatory";
}
}
return $object;
} else {
$this->warnings [] = "mtas - prefix - unexpected type";
return null;
}
}
/**
* Check mtas collection
*
* @param object $object
* @return object
*/
private function checkResponseMtasCollection($object) {
if ($object && is_object ( $object )) {
if (isset ( $object->action ) && is_string ( $object->action )) {
if ($object->action == "create" || $object->action == "post" || $object->action == "list" || $object->action == "check" || $object->action == "empty" || $object->action == "get" || $object->action == "import" || $object->action == "delete") {
foreach ( $object as $key => $value ) {
if ($key == "action") {
// ignore
} else if ($key == "key") {
if (! is_string ( $value )) {
$this->errors [] = "mtas - collection - {$key} should be string";
}
} else if ($key == "field") {
if ($object->action != "create") {
$this->warnings [] = "mtas - collection - {$key} not expected for " . $object->action;
} else if (! is_string ( $value )) {
$this->errors [] = "mtas - collection - {$key} should be string";
} else {
$fields = explode ( ",", $value );
foreach ( $fields as $field ) {
$configurations = $this->getConfigurationsForField ( $field );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "mtas - collection - {$key} : '" . $field . "' not found in any configuration";
}
}
}
} else if ($key == "post") {
if ($object->action != "post") {
$this->warnings [] = "mtas - collection - {$key} not expected for " . $object->action;
} else if (! is_array ( $value ) || count ( $value ) == 0) {
$this->errors [] = "mtas - collection - {$key} should be array of strings or integers";
} else {
foreach ( $value as $valueItem ) {
if (! is_string ( $valueItem ) && ! is_int ( $valueItem )) {
$this->errors [] = "mtas - collection - {$key} should be array of strings or integers";
}
}
}
} else if ($key == "id") {
if ($object->action != "create" && $object->action != "post" && $object->action != "delete" && $object->action != "check" && $object->action != "import" && $object->action != "get") {
$this->warnings [] = "mtas - collection - {$key} not expected for " . $object->action;
} else if (! is_string ( $value )) {
$this->errors [] = "mtas - collection - {$key} should be string";
}
} else if ($key == "configuration" || $key == "collection" || $key == "url") {
if ($object->action != "import") {
$this->warnings [] = "mtas - collection - {$key} not expected for " . $object->action;
} else if (! is_string ( $value )) {
$this->errors [] = "mtas - collection - {$key} should be string";
}
} else {
$this->warnings [] = "mtas - collection - {$key} not expected";
}
}
if ($object->action == "create") {
if (! isset ( $object->field )) {
$this->errors [] = "mtas - collection - field is obligatory for action {$object->action}";
}
} else if ($object->action == "post") {
if (! isset ( $object->post )) {
$this->errors [] = "mtas - collection - post is obligatory for action {$object->action}";
}
} else if ($object->action == "get" || $object->action == "delete" || $object->action == "check") {
if (! isset ( $object->id )) {
$this->errors [] = "mtas - collection - id is obligatory for action {$object->action}";
}
}
return $object;
} else {
$this->errors [] = "mtas - collection - no (valid) action provided";
}
} else {
$this->errors [] = "mtas - collection - no (valid) action provided";
return null;
}
} else {
$this->warnings [] = "mtas - collection - unexpected type";
return null;
}
}
/**
* Check mtas collection
*
* @param object $object
* @return object
*/
private function checkResponseMtasVersion($object) {
return $object;
}
/**
* Check query mtas
*
* @param object $object
* @param string $prefix
* @return object
*/
private function checkResponseMtasQuery($object, $prefix) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "type" || $key == "value" || $key == "prefix" || $key == "ignore") {
if (! is_string ( $value )) {
$this->errors [] = $prefix . "{$key} should be string";
}
} else if ($key == "maximumIgnoreLength") {
if (! is_int ( $value )) {
$this->errors [] = $prefix . "{$key} should be integer";
}
} else if ($key == "variables") {
$object->{$key} = $this->checkVariables ( $value, false, $prefix );
} else {
$this->warnings [] = $prefix . "{$key} not expected";
}
}
if (! isset ( $object->type )) {
$this->errors [] = $prefix . "type is obligatory";
} else if($object->type=="simple") {
if (! isset ( $object->prefix )) {
$this->errors [] = $prefix . "prefix is obligatory for type ".$object->type;
}
}
if (! isset ( $object->value )) {
$this->errors [] = $prefix . "value is obligatory";
}
return $object;
} else {
$this->warnings [] = $prefix . "unexpected type";
return null;
}
}
/**
* Check mtas base (facets)
*
* @param object $object
* @param string $prefix
* @return object
*/
private function checkResponseMtasBase($object, $prefix) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "field" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = $prefix . "{$key} should be string";
}
} else if ($key == "number" || $key == "maximum" || $key == "minimum") {
if (! is_int ( $value )) {
$this->errors [] = $prefix . "{$key} should be integer";
}
} else if ($key == "sort") {
if (! is_object ( $value )) {
$this->errors [] = $prefix . "{$key} should be object";
} else {
foreach ( $value as $subKey => $subValue ) {
if ($subKey == "type" || $subKey == "direction") {
if (! is_string ( $subValue )) {
$this->errors [] = $prefix . "{$key} - {$subKey} should be string";
}
} else {
$this->warnings [] = $prefix . "{$key} - {$subkey} not expected";
}
}
}
} else if ($key == "range") {
if (! is_object ( $value )) {
$this->errors [] = $prefix . "{$key} should be object";
} else {
foreach ( $value as $subKey => $subValue ) {
if ($subKey == "size" || $subKey == "base") {
if (! is_int ( $subValue )) {
$this->errors [] = $prefix . "{$key} - {$subKey} should be integer";
}
} else {
$this->warnings [] = $prefix . "{$key} - {$subkey} not expected";
}
}
}
} else if ($key == "functions") {
if (! is_array ( $value )) {
$this->errors [] = "mtas - facet - {$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkResponseMtasFunction ( $value [$i], "mtas - facet - {$key} - " );
}
}
} else {
$this->warnings [] = $prefix . "{$key} not expected";
}
}
if (! isset ( $object->field )) {
$this->errors [] = $prefix . "value is obligatory";
}
return $object;
} else {
$this->warnings [] = $prefix . "unexpected type";
return null;
}
}
/**
* Check mtas function
*
* @param object $object
* @param string $prefix
* @return object
*/
private function checkResponseMtasFunction($object, $prefix) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "expression" || $key == "key" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = $prefix . "{$key} should be string";
}
} else {
$this->warnings [] = $prefix . "{$key} not expected";
}
}
if (! isset ( $object->expression )) {
$this->errors [] = $prefix . "expression is obligatory";
}
return $object;
} else {
$this->warnings [] = $prefix . "unexpected type";
return null;
}
}
/**
* Check mtas distance
*
* @param object $object
* @param string $prefix
* @return object
*/
private function checkResponseMtasDistance($object, $prefix) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "type" || $key == "key" || $key == "base") {
if (! is_string ( $value )) {
$this->errors [] = $prefix . "{$key} should be string";
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_numeric ( $value )) {
$this->errors [] = $prefix . "{$key} should be numeric";
}
} else if ($key == "parameter") {
if (! is_object ( $value )) {
$this->errors [] = $prefix . "{$key} should be an object";
} else {
foreach ( $value as $subKey => $subValue ) {
if (! preg_match ( "/^[a-z0-9]+$/i", $subKey )) {
$this->errors [] = $prefix . "parameter - {$subKey} not allowed";
} else if (! is_string ( $subValue ) && ! is_numeric ( $subValue )) {
$this->errors [] = $prefix . "parameter - {$subKey} should be string or numeric";
}
}
}
} else {
$this->warnings [] = $prefix . "{$key} not expected";
}
}
if (! isset ( $object->type )) {
$this->errors [] = $prefix . "type is obligatory";
}
if (! isset ( $object->base )) {
$this->errors [] = $prefix . "base is obligatory";
}
return $object;
} else {
$this->warnings [] = $prefix . "unexpected type";
return null;
}
}
/**
* Check condition
*
* @param object $object
* @return object
*/
private function checkCondition($object) {
static $availableTypes = array (
"and",
"or",
"collection",
"equals",
"phrase",
"wildcard",
"regexp",
"cql",
"simple",
"geojson",
"range",
"join"
);
static $basicTypes = array (
"equals",
"phrase",
"wildcard",
"regexp",
"cql",
"simple",
"range",
"geojson"
);
static $valueTypes = array (
"equals",
"phrase",
"wildcard",
"regexp",
"cql",
"simple"
);
if ($object && is_object ( $object )) {
$keys = array ();
// first checks key/values
foreach ( $object as $key => $value ) {
$keys [] = $key;
if ($key == "type") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
} else if (! in_array ( $value, $availableTypes )) {
$this->errors [] = "condition - unknown {$key} '" . $value . "'";
}
} else if (isset ( $object->type ) && is_string ( $object->type )) {
if ($key == "field") {
if (in_array ( $object->type, $basicTypes )) {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
} else {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "condition - {$key} '" . $value . "' not found in any configuration";
}
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "value") {
if (in_array ( $object->type, $valueTypes )) {
if (is_array ( $value )) {
if (count ( $value ) == 0) {
$this->errors [] = "condition - array {$key} should not be empty";
}
foreach ( $value as $valueItem ) {
if (! is_string ( $valueItem ) && ! (is_bool ( $value ) && $object->type == "equals")) {
$this->errors [] = "condition - item in array {$key} should be string" . (($object->type == "equals") ? " or boolean" : "");
break;
}
}
} else if (! is_string ( $value ) && ! (is_bool ( $value ) && $object->type == "equals")) {
$this->errors [] = "condition - {$key} should be string" . (($object->type == "equals") ? " or boolean" : "") . ", or list of them";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "not" || $key == "facetquery") {
if (in_array ( $object->type, $basicTypes )) {
if (! is_bool ( $value )) {
$this->errors [] = "condition - {$key} should be boolean";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "expansion") {
if ($object->type == "equals" || $object->type == "phrase") {
if (! is_object ( $value )) {
$this->errors [] = "condition - {$key} should be an object";
} else if (! isset ( $value->type )) {
$this->errors [] = "condition - {$key} should have a type defined";
} else if (! is_string ( $value->type )) {
$this->errors [] = "condition - {$key} - type should be a string";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "start" || $key == "end") {
if ($object->type == "range") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "geometry") {
if ($object->type == "geojson") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "predicate") {
if ($object->type == "geojson") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
} else if(!in_array($value, array("intersects", "iswithin", "contains", "isdisjointto"))) {
$this->errors [] = "condition - {$key} cannot be ".$value;
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "list") {
if ($object->type == "and" || $object->type == "or") {
if (is_array ( $value )) {
if (count ( $value ) == 0) {
$this->errors [] = "condition - list should not be empty";
} else {
$newvalue = array ();
for($i = 0; $i < count ( $value ); $i ++) {
$newvalue [$i] = $this->checkCondition ( $value [$i] );
if (! $newvalue [$i] || ! is_object ( $newvalue [$i] )) {
$this->errors [] = "condition - could not check condition from {$object->type} list";
}
}
$object->{$key} = $newvalue;
}
} else {
$this->errors [] = "condition - {$key} should be array";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "ignore" || $key == "prefix") {
if ($object->type == "cql" || $object->type == "simple") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be string";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "maximumIgnoreLength") {
if ($object->type == "cql" || $object->type == "simple") {
if (! is_int ( $value )) {
$this->errors [] = "condition - {$key} should be integer";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "variables") {
if ($object->type == "cql") {
if (! is_object ( $value )) {
$this->errors [] = "condition - {$key} should be an object";
} else {
$object->{$key} = $this->checkVariables ( $value, true, "condition - " );
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "from" || $key == "to") {
if ($object->type == "join") {
if (! is_string ( $value ) && (!is_array($value) || count($value)==0)) {
$this->errors [] = "condition - {$key} should be a string or non-empty array of strings";
} else {
if(is_array($value)) {
foreach($value AS $valueItem) {
if (! is_string ( $valueItem )) {
$this->errors [] = "condition - {$key} should be a string or array of strings";
}
}
}
if ($key == "to") {
if(is_array($value) && count($this->errors)==0) {
foreach($value AS $valueItem) {
$configurations = $this->getConfigurationsForField ( $valueItem );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "condition - {$key} '" . $valueItem . "' not found in any configuration";
}
}
} else if(is_string($value)) {
$configurations = $this->getConfigurationsForField ( $value );
if (count ( $configurations ) > 0) {
$this->__configurations [] = $configurations;
} else {
$this->errors [] = "condition - {$key} '" . $value . "' not found in any configuration";
}
}
}
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "configuration") {
if ($object->type == "join") {
if (! is_string ( $value )) {
$this->errors [] = "condition - {$key} should be a string";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "condition" || $key == "filter") {
if ($object->type == "join") {
if (! is_object ( $value )) {
$this->errors [] = "condition - {$key} should be an object";
}
} else {
$this->warnings [] = "condition - {$key} not expected for type '{$object->type}'";
}
} else if ($key == "key") {
if (! isset ( $object->facetquery ) || ! $object->facetquery) {
$this->warnings [] = "condition - {$key} not expected without 'facetquery'";
}
} else {
$this->warnings [] = "condition - {$key} not expected";
}
}
}
// check obligatory keys
if (! in_array ( "type", $keys )) {
$this->errors [] = "condition - no type defined";
} else {
if (in_array ( $object->type, $basicTypes ) && ! in_array ( "field", $keys )) {
$this->errors [] = "condition - no field defined";
}
if (in_array ( $object->type, $valueTypes ) && ! in_array ( "value", $keys )) {
$this->errors [] = "condition - no value defined";
}
if ($object->type == "and" || $object->type == "or") {
if (! in_array ( "list", $keys )) {
$this->errors [] = "condition - no list defined";
}
} else if ($object->type == "geojson") {
if (! in_array ( "predicate", $keys )) {
$this->errors [] = "condition - no predicate defined";
}
if (! in_array ( "geometry", $keys )) {
$this->errors [] = "condition - no geometry defined";
}
} else if ($object->type == "collection") {
if (! in_array ( "url", $keys )) {
$this->errors [] = "condition - no url defined";
}
if (! in_array ( "id", $keys )) {
$this->errors [] = "condition - no id defined";
}
} else if ($object->type == "join") {
if (! in_array ( "from", $keys )) {
$this->errors [] = "condition - no from defined";
}
if (! in_array ( "to", $keys )) {
$this->errors [] = "condition - no to defined";
}
} else if ($object->type == "simple") {
if (! in_array ( "prefix", $keys )) {
$this->errors [] = "condition - no prefix defined";
}
}
}
return $object;
} else {
$this->warnings [] = "condition - unexpected type";
return null;
}
}
/**
* Check page
*
* @param object $object
* @param string $prefix
* * @return object
*/
private function checkPage($object, $prefix) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "start" || $key == "end") {
if (! is_int ( $value )) {
$this->warnings [] = $prefix."page - '{$key}' should be an integer";
}
} else {
$this->warnings [] = $prefix."page - key '{$key}' not expected";
}
}
if (! isset ( $object->start )) {
$this->errors [] = $prefix."page - no start defined";
}
if (! isset ( $object->end )) {
$this->errors [] = $prefix."page - no end defined";
}
return $object;
} else {
$this->warnings [] = $prefix."page - unexpected type";
return null;
}
}
/**
* Check filter
*
* @param object $object
* @return object
*/
private function checkFilter($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "tag") {
if (! is_string ( $value )) {
$this->warnings [] = "filter - tag should be a string";
}
} else if ($key == "condition") {
$this->checkCondition ( $value );
} else {
$this->warnings [] = "filter - key '{$key}' not expected";
}
}
if (! isset ( $object->condition )) {
$this->errors [] = "filter - no condition";
}
return $object;
} else {
$this->warnings [] = "filter - unexpected type";
return null;
}
}
/**
* Check filters
*
* @param object $object
* @return object
*/
private function checkFilters($object) {
if ($object && is_object ( $object )) {
return $this->checkFilter ( $object );
} else if ($object && is_array ( $object ) && count ( $object ) > 0) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->checkFilter ( $object [$i] );
}
return $object;
} else {
$this->warnings [] = "filter - unexpected type";
return null;
}
}
/**
* Check variables
*
* @param object $object
* @param object $fromCondition
* @param string $prefixMessage
* @return object
*/
private function checkVariables($object, $fromCondition, $prefixMessage = "") {
if ($object && is_object ( $object )) {
$variables = array ();
$stats = null;
foreach ( $object as $subkey => $subvalue ) {
if ($subkey == "definitions") {
if (! is_array ( $subvalue )) {
$this->errors [] = $prefixMessage . "definitions in variables should be an array";
} else {
foreach ( $subvalue as $subitem ) {
if ($subitem && is_object ( $subitem )) {
foreach ( $subitem as $subsubitem => $subsubvalue ) {
if ($subsubitem == "name") {
if (! is_string ( $subsubvalue )) {
$this->errors [] = $prefixMessage . "name in definition for variables should be a string";
} else if (! preg_match ( "/^[a-z0-9]+$/i", $subsubvalue )) {
$this->errors [] = $prefixMessage . "name '" . $subsubvalue . "' in definition for variables not valid";
}
} else if ($subsubitem == "value") {
if (! is_string ( $subsubvalue )) {
$this->errors [] = $prefixMessage . "value in definition for variables should be a string";
}
} else if ($subsubitem == "expansion") {
if (! is_object ( $subsubvalue )) {
$this->errors [] = $prefixMessage . "expansion in definition for variables should be an object";
}
} else {
$this->warnings [] = $prefixMessage . "unexpected " . $subsubitem . " in definition for variables";
}
}
if (! isset ( $subitem->name )) {
$this->errors [] = $prefixMessage . "no name defined in definition for variables";
$name = null;
} else {
$name = $subitem->name;
}
if (! isset ( $subitem->value )) {
$this->errors [] = $prefixMessage . "no value defined in definition for variables";
$value = null;
} else {
$value = $subitem->value;
}
if (! isset ( $subitem->expansion )) {
$this->errors [] = $prefixMessage . "no expansion defined in definition for variables";
$expansion = null;
} else {
$expansion = $subitem->expansion;
}
if ($name != null && $value != null && $expansion != null) {
if (isset ( $variables [$name] )) {
$this->errors [] = $prefixMessage . "variable '" . $name . "' in definition for variables already defined";
} else {
$variables [$name] = $this->computeExpansionValues ( $value, $expansion, $prefixMessage );
}
}
} else {
$this->errors [] = $prefixMessage . "definition for variables should be an object";
}
}
}
} else if ($subkey == "stats") {
if (! is_object ( $subvalue )) {
$this->errors [] = $prefixMessage . "stats in variables should be object";
} else {
$object->{$subkey} = $this->checkMtasStats ( $subvalue, $prefixMessage );
if ($object->{$subkey} && count ( $this->errors ) == 0) {
$stats = new \stdClass ();
if (isset ( $object->{$subkey}->key )) {
$stats->key = $object->{$subkey}->key;
}
if (isset ( $object->{$subkey}->type )) {
$stats->type = $object->{$subkey}->type;
}
if (isset ( $object->{$subkey}->minimum )) {
$stats->minimum = $object->{$subkey}->minimum;
}
if (isset ( $object->{$subkey}->maximum )) {
$stats->maximum = $object->{$subkey}->maximum;
}
if (isset ( $object->{$subkey}->functions )) {
$stats->functions = array ();
for($i = 0; $i < count ( $object->{$subkey}->functions ); $i ++) {
$stats->functions [$i] = clone $object->{$subkey}->functions [$i];
}
}
}
}
} else {
$this->warnings [] = $prefixMessage . $subkey . " not expected in variables";
}
}
$object->__stats = array ();
$object->__variables = $variables;
if ($stats) {
if ($fromCondition) {
$statsItem = clone $stats;
$statsItem->__variables = $variables;
$object->__stats [] = $statsItem;
}
$variableCombinations = $this->createVariableCombinations ( $variables, array () );
foreach ( $variableCombinations as $variableCombination ) {
$statsItem = clone $stats;
$itemKeyList = array ();
foreach ( $variableCombination as $combinationKey => $combinationValue ) {
$itemKeyList [] = $combinationKey . ":" . implode ( ",", $combinationValue );
}
if (isset ( $statsItem->key )) {
$statsItem->key .= " - " . implode ( ",", $itemKeyList );
} else {
$statsItem->key = implode ( ",", $itemKeyList );
}
$statsItem->__variables = $variableCombination;
$object->__stats [] = $statsItem;
}
}
return $object;
} else {
$this->errors [] = $prefixMessage . "variables should be an object";
return null;
}
}
/**
* Check mtas stats
*
* @param object $object
* @param string $prefixMessage
* @return object
*/
private function checkMtasStats($object, $prefixMessage = "") {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "key" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = $prefixMessage . "{$key} should be string";
}
} else if ($key == "functions") {
if (! is_array ( $value )) {
$this->errors [] = $prefixMessage . "{$key} should be array";
} else {
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->checkMtasStatsFunction ( $value [$i] );
}
}
} else if ($key == "minimum" || $key == "maximum") {
if (! is_int ( $value )) {
$this->errors [] = $prefixMessage . "{$key} should be integer";
}
} else {
$this->warnings [] = $prefixMessage . "{$key} not expected";
}
}
return $object;
} else {
$this->warnings [] = $prefixMessage . "unexpected type";
return null;
}
}
/**
* Check mtas stats functions
*
* @param object $object
* @param string $prefixMessage
* @return object
*/
private function checkMtasStatsFunction($object, $prefixMessage = "") {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "key" || $key == "expression" || $key == "type") {
if (! is_string ( $value )) {
$this->errors [] = $prefixMessage . "{$key} should be string";
}
} else {
$this->warnings [] = $prefixMessage . "{$key} not expected";
}
}
if (! isset ( $object->expression )) {
$this->errors [] = $prefixMessage . "expression is obligatory";
}
return $object;
} else {
$this->warnings [] = $prefixMessage . "unexpected type";
return null;
}
}
/**
* Parse cache
*
* @param object $object
* @return null
*/
private function parseCache($object) {
return null;
}
/**
* Parse timeAllowed
*
* @param object $object
* @return null
*/
private function parseTimeAllowed($object) {
if ($object && is_numeric ( $object )) {
return "timeAllowed=" . urlencode ( $object );
}
return null;
}
/**
* Parse debug
*
* @param object $object
* @return string|NULL
*/
private function parseDebug($object) {
if ($object && is_string ( $object )) {
return "debug=" . urlencode ( $object );
}
return null;
}
/**
* parse Sort
*
* @param object $object
* @return string|NULL
*/
private function parseSort($object) {
if ($object && is_array ( $object )) {
$sortList = array ();
foreach ( $object as $sortItem ) {
if (isset ( $sortItem->direction ) && ($sortItem->direction == "asc")) {
$sortList [] = $sortItem->field . " ASC";
} else if (isset ( $sortItem->direction ) && ($sortItem->direction == "desc")) {
$sortList [] = $sortItem->field . " DESC";
} else if ($sortItem->field == "sort") {
$sortList [] = $sortItem->field . " DESC";
} else {
$sortList [] = $sortItem->field . " ASC";
}
}
if (count ( $sortList ) > 0) {
return "sort=" . urlencode ( implode ( ",", $sortList ) );
}
}
return null;
}
/**
* Parse response
*
* @param object $object
* @param array $facetQueries
* @param array $mtasStats
* @return object
*/
private function parseResponse($object, $facetQueries, $mtasStats) {
if ($object && is_object ( $object )) {
$requestList = array ();
$requestAdditionalList = array ();
if (! isset ( $object->documents )) {
$requestList [] = "rows=0";
} else {
$object->documents = $this->parseResponseDocuments ( $object->documents );
if ($object->documents != null && isset ( $object->documents->__requestList )) {
$requestList = array_merge ( $requestList, $object->documents->__requestList );
}
}
if (isset ( $object->facets ) || count ( $facetQueries ) > 0) {
if (! isset ( $object->facets )) {
$object->facets = new \stdClass ();
}
$object->facets = $this->parseResponseFacets ( $object->facets, $facetQueries );
if ($object->facets != null && isset ( $object->facets->__requestList )) {
$requestList = array_merge ( $requestList, $object->facets->__requestList );
}
}
if (isset ( $object->stats )) {
$object->stats = $this->parseResponseStats ( $object->stats );
if ($object->stats != null && isset ( $object->stats->__requestList )) {
$requestList = array_merge ( $requestList, $object->stats->__requestList );
}
}
if (isset ( $object->mtas ) || count ( $mtasStats ) > 0 || $this->statusKey != null) {
if(isset ( $object->mtas ) || count ( $mtasStats ) > 0) {
if(!isset ( $object->mtas )) {
$object->mtas = new \stdClass();
}
$object->mtas = $this->parseResponseMtas ( $object->mtas, $mtasStats);
} else {
$object->mtas = $this->parseResponseMtas ( null, $mtasStats);
}
if ($object->mtas != null) {
if (isset ( $object->mtas->__requestList )) {
$requestList = array_merge ( $requestList, $object->mtas->__requestList );
}
if (isset ( $object->mtas->__requestAdditionalList )) {
$requestAdditionalList = array_merge ( $requestAdditionalList, $object->mtas->__requestAdditionalList );
}
}
}
$object->__requestList = $requestList;
$object->__requestAdditionalList = $requestAdditionalList;
return $object;
} else if ($this->statusKey != null) {
$object = new \stdClass ();
$object->mtas = new \stdClass ();
$object->mtas = $this->parseResponseMtas ( $object->mtas, $mtasStats);
if ($object->mtas != null) {
if (isset ( $object->mtas->__requestList )) {
$object->__requestList = $object->mtas->__requestList;
}
if (isset ( $object->mtas->__requestAdditionalList )) {
$object->__requestAdditionalList = $object->mtas->__requestAdditionalList;
}
}
return $object;
} else {
return null;
}
}
/**
* Parse documents in response
*
* @param object $object
* @return object
*/
private function parseResponseDocuments($object) {
if ($object && is_object ( $object )) {
foreach ( $object as $key => $value ) {
if ($key == "fields") {
$fields = array ();
foreach ( $value as $fieldItem ) {
if (is_string ( $fieldItem )) {
$fields [] = $fieldItem;
} else if (is_object ( $fieldItem ) && isset ( $fieldItem->type ) && is_string ( $fieldItem->type )) {
if ($fieldItem->type == "join") {
$fields [] = $fieldItem->from;
$object->{$key} = $this->parseResponseDocumentsJoin ( $fieldItem );
}
}
}
$requestList [] = "fl=" . urlencode ( implode ( ",", array_unique ( $fields ) ) );
} else if ($key == "start") {
$requestList [] = "start=" . $value;
} else if ($key == "rows") {
$requestList [] = "rows=" . $value;
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse join in documents
*
* @param object $object
* @return object
*/
private function parseResponseDocumentsJoin($object) {
if ($object && is_object ( $object )) {
if (! isset ( $this->responseJoins->documents )) {
$this->responseJoins->documents = array ();
}
$responseJoinItem = new \stdClass ();
$responseJoinItem->to = $object->to;
$responseJoinItem->from = $object->from;
$responseJoinItem->fields = $object->fields;
$responseJoinItem->name = $object->name;
$responseJoinItem->configuration = isset ( $object->configuration ) ? $object->configuration : $this->solrConfiguration;
if (isset ( $object->condition ) && is_object ( $object->condition )) {
$responseJoinItem->condition = clone $object->condition;
}
if (isset ( $object->filter ) && is_object ( $object->filter )) {
$responseJoinItem->filter = clone $object->filter;
}
$this->responseJoins->documents [] = $responseJoinItem;
}
return $object;
}
/**
* Parse facets in response
*
* @param object $object
* @param object $facetqueries
* @return object
*/
private function parseResponseFacets($object, $facetqueries) {
if (($object && is_object ( $object ))) {
$requestList = array ();
$requestList [] = "facet=true";
$keyListFacetQueries = array ();
// create defined facetqueries
foreach ( $object as $key => $value ) {
if ($key == "facetfields") {
$requestList = $this->parseResponseFacetFields ( $value, $requestList );
} else if ($key == "facetqueries") {
list ( $requestList, $keyListFacetQueries ) = $this->parseResponseFacetQueries ( $value, $requestList, $keyListFacetQueries );
} else if ($key == "facetranges") {
$requestList = $this->parseResponseFacetRanges ( $value, $requestList );
} else if ($key == "facetpivots") {
$requestList = $this->parseResponseFacetPivots ( $value, $requestList );
} else if ($key == "facetheatmaps") {
$requestList = $this->parseResponseFacetHeatmaps ( $value, $requestList );
} else if ($key == "prefix" || $key == "sort" || $key == "method" || $key == "contains") {
$requestList [] = "facet.{$key}=" . urlencode ( $value );
} else if ($key == "limit" || $key == "offset" || $key == "mincount") {
$requestList [] = "facet.{$key}=" . intval ( $value );
} else if ($key == "missing") {
$requestList [] = "facet.{$key}=" . ($value ? "true" : "false");
} else if ($key == "excludeTerms") {
$requestList [] = "facet.{$key}=" . urlencode ( implode ( ",", $value ) );
}
}
// add automatically generated facetqueries
if ($facetqueries && is_array ( $facetqueries ) && count ( $facetqueries ) > 0) {
list ( $requestList, $keyListFacetQueries ) = $this->parseResponseFacetQueries ( $facetqueries, $requestList, $keyListFacetQueries );
}
// return results
$object->__requestList = $requestList;
return $object;
} else {
$this->warnings [] = "facets - unexpected type";
return null;
}
}
/**
* Parse facet fields
*
* @param object $object
* @param array $requestList
* @return array
*/
private function parseResponseFacetFields($object, array $requestList) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->parseResponseFacetField ( $object [$i], $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
}
}
}
return $requestList;
}
/**
* Parse facet field
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseFacetField($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->__options ) && is_array ( $object->__options ) && count ( $object->__options ) > 0) {
$requestList [] = "facet.field=" . urlencode ( "{!" . implode ( " ", $object->__options ) . "}" . $object->field );
} else {
$requestList [] = "facet.field=" . urlencode ( $object->field );
}
$ignoreList = array (
"field",
"ex",
"key",
"prefix",
"sort",
"method",
"contains",
"missing"
);
foreach ( $object as $key => $value ) {
if (in_array ( $key, $ignoreList )) {
// ignore
} else if ($key == "limit" || $key == "offset" || $key == "mincount") {
if (is_integer ( $value )) {
$requestList [] = "f." . urlencode ( $object->field ) . ".facet.{$key}=" . $value;
}
} else if ($key == "join") {
$object->join = $this->parseResponseFacetFieldJoin ( $value, isset ( $object->key ) ? $object->key : $object->field, $i );
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse join facet field
*
* @param object $object
* @param string $key
* @param number $i
* @return object
*/
private function parseResponseFacetFieldJoin($object, $key, $i) {
if ($object && is_object ( $object )) {
if (! isset ( $this->responseJoins->facetfield )) {
$this->responseJoins->facetfield = array ();
}
$responseJoinItem = new \stdClass ();
$responseJoinItem->to = $object->to;
$responseJoinItem->fields = $object->fields;
$responseJoinItem->key = $key;
$responseJoinItem->configuration = isset ( $object->configuration ) ? $object->configuration : $this->solrConfiguration;
$this->responseJoins->facetfield [] = $responseJoinItem;
}
return $object;
}
/**
* Parse facet queries
*
* @param object $object
* @param array $requestList
* @param array $keyListFacetQueries
* @return array
*/
private function parseResponseFacetQueries($object, $requestList, $keyListFacetQueries) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
list ( $object [$i], $keyItem ) = $this->parseResponseFacetQuery ( $object [$i], $keyListFacetQueries, $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
$keyListFacetQueries [] = $keyItem;
}
}
}
return array (
$requestList,
$keyListFacetQueries
);
}
/**
* Parse facet query
*
* @param object $object
* @param array $keyListFacetQueries
* @param number $i
* @return array
*/
private function parseResponseFacetQuery($object, $keyListFacetQueries, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
$key = null;
if (isset ( $object->__query ) && $object->__query && is_string ( $object->__query )) {
$options = array ();
// check provided key
if (isset ( $object->key ) && is_string ( $object->key )) {
$key = $object->key;
}
// define key to be used
$key = ($key == null) ? $object->__query : $key;
// check uniqueness
$counter = 0;
if (in_array ( $key, $keyListFacetQueries )) {
$counter ++;
while ( in_array ( $key . " (" . $counter . ")", $keyListFacetQueries ) ) {
$counter ++;
}
$key = $key . " (" . $counter . ")";
}
// decide to set key
if ($counter > 0 || (isset ( $object->key ) && is_string ( $object->key ))) {
$options [] = "key=\"" . str_replace ( "\"", "\\\"", $key ) . "\"";
}
// check provided exclusion of filters
if (isset ( $object->ex ) && is_string ( $object->ex )) {
$options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
}
if (isset ( $object->tag ) && is_string ( $object->tag )) {
$options [] = "tag=\"" . str_replace ( "\"", "\\\"", $object->tag ) . "\"";
}
// create request
if (count ( $options ) > 0) {
$requestList [] = "facet.query=" . urlencode ( "{!" . implode ( " ", $options ) . "}" . $object->__query );
} else {
$requestList [] = "facet.query=" . urlencode ( $object->__query );
}
} else if (is_object ( $object ) && isset ( $object->condition ) && $object->condition && is_object ( $object->condition )) {
$object->condition = $this->parseCondition ( $object->condition );
if (isset ( $object->condition->__query )) {
$options = array ();
// check provided key
if (isset ( $object->key ) && is_string ( $object->key )) {
$key = $object->key;
} else {
$key = null;
}
// define key to be used
$key = ($key == null) ? $object->condition->__query : $key;
// check uniqueness
$counter = 0;
if (in_array ( $key, $keyListFacetQueries )) {
$counter ++;
while ( in_array ( $key . " (" . $counter . ")", $keyListFacetQueries ) ) {
$counter ++;
}
$key = $key . " (" . $counter . ")";
}
$options [] = "key=\"" . str_replace ( "\"", "\\\"", $key ) . "\"";
// check provided exclusion of filters
if (isset ( $object->ex ) && is_string ( $object->ex )) {
$options [] = "ex=\"" . implode ( ",", array_map ( "base64_encode", explode ( ",", $object->ex ) ) ) . "\"";
}
if (isset ( $object->tag ) && is_string ( $object->tag )) {
$options [] = "tag=\"" . str_replace ( "\"", "\\\"", $object->tag ) . "\"";
}
// create request
if (count ( $options ) > 0) {
$requestList [] = "facet.query=" . urlencode ( "{!" . implode ( " ", $options ) . "}" . $object->condition->__query );
} else {
$requestList [] = "facet.query=" . urlencode ( $object->condition->__query );
}
if (count ( $object->condition->__facetQueries ) > 0) {
$this->warnings [] = "facets - facetqueries - condition in facetquery should not produce facetqueries";
}
if (count ( $object->condition->__mtasStats ) > 0) {
$this->warnings [] = "facets - facetqueries - condition in facetquery should not produce mtasStats";
}
}
}
if (is_object ( $object )) {
$object->__requestList = $requestList;
}
return array (
$object,
$key
);
} else {
return array (
null,
null
);
}
}
/**
* Parse facet range
*
* @param object $object
* @param array $requestList
* @return array
*/
private function parseResponseFacetRanges($object, $requestList) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->parseResponseFacetRange ( $object [$i], $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
}
}
}
return $requestList;
}
/**
* Parse facet range
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseFacetRange($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->__options ) && is_array ( $object->__options ) && count ( $object->__options ) > 0) {
$requestList [] = "facet.range=" . urlencode ( "{!" . implode ( " ", $object->__options ) . "}" . $object->field );
} else {
$requestList [] = "facet.range=" . urlencode ( $object->field );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse facet pivots
*
* @param object $object
* @param array $requestList
* @return array
*/
private function parseResponseFacetPivots($object, array $requestList) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->parseResponseFacetPivot ( $object [$i], $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
}
}
}
return $requestList;
}
/**
* Parse facet pivot
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseFacetPivot($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->__options ) && is_array ( $object->__options ) && count ( $object->__options ) > 0) {
$requestList [] = "facet.pivot=" . urlencode ( "{!" . implode ( " ", $object->__options ) . "}" . implode ( ",", $object->pivot ) );
} else {
$requestList [] = "facet.pivot=" . urlencode ( implode ( ",", $object->pivot ) );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse facet heatmaps
*
* @param object $object
* @param array $requestList
* @return array
*/
private function parseResponseFacetHeatmaps($object, array $requestList) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->parseResponseFacetHeatmap ( $object [$i], $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
}
}
}
return $requestList;
}
/**
* Parse facet heatmap
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseFacetHeatmap($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->__options ) && is_array ( $object->__options ) && count ( $object->__options ) > 0) {
$requestList [] = "facet.heatmap=" . urlencode ( "{!" . implode ( " ", $object->__options ) . "}" . $object->field );
} else {
$requestList [] = "facet.heatmap=" . urlencode ( $object->field );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse stats in response
*
* @param object $object
* return unknown
*/
private function parseResponseStats($object) {
if (($object && is_object ( $object ))) {
$requestList = array ();
$requestList [] = "stats=true";
foreach ( $object as $key => $value ) {
if ($key == "statsfields") {
$requestList = $this->parseResponseStatsFields ( $value, $requestList );
}
}
// return results
$object->__requestList = $requestList;
return $object;
} else {
$this->warnings [] = "stats - unexpected type";
return null;
}
}
/**
* Parse stats fields
*
* @param object $object
* @param array $requestList
* @return array
*/
private function parseResponseStatsFields($object, array $requestList) {
if ($object != null && is_array ( $object )) {
for($i = 0; $i < count ( $object ); $i ++) {
$object [$i] = $this->parseResponseStatsField ( $object [$i], $i );
if ($object [$i] && is_object ( $object [$i] ) && isset ( $object [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object [$i]->__requestList );
}
}
}
return $requestList;
}
/**
* Parse stats field
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseStatsField($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->__options ) && is_array ( $object->__options ) && count ( $object->__options ) > 0) {
$requestList [] = "stats.field=" . urlencode ( "{!" . implode ( " ", $object->__options ) . "}" . $object->field );
} else {
$requestList [] = "stats.field=" . urlencode ( $object->field );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas in response
*
* @param object $object
* @param array $mtasStats
* @return object
*/
private function parseResponseMtas($object, $mtasStats) {
$localErrors = array ();
$localWarnings = array ();
if ($object && is_object ( $object )) {
$requestList = array ();
$requestAdditionalList = array ();
$requestList [] = "mtas=true";
// add status key
if ($this->statusKey != null) {
$requestAdditionalList [] = "mtas.status=true";
$requestAdditionalList [] = "mtas.status.key=".urlencode($this->statusKey);
}
// check response
foreach ( $object as $key => $value ) {
if ($key == "stats") {
if ($value && is_object ( $value )) {
$object->{$key} = $this->parseResponseMtasStats ( $value, $mtasStats );
$requestList = array_merge ( $requestList, $object->{$key}->__requestList );
}
} else if ($key == "document") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasDocument ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "kwic" || $key == "list") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasKwicAndList ( $key, $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "page") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasPage ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "heatmap") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasHeatmap ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "termvector") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasTermvector ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "facet") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasFacet ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "group") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasGroup ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "prefix") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.{$key}=true";
for($i = 0; $i < count ( $value ); $i ++) {
$object->{$key} [$i] = $this->parseResponseMtasPrefix ( $object->{$key} [$i], $i );
if ($object->{$key} [$i] && is_object ( $object->{$key} [$i] ) && isset ( $object->{$key} [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->{$key} [$i]->__requestList );
}
}
}
} else if ($key == "collection") {
if ($value && is_array ( $value )) {
$requestList [] = "mtas.collection=true";
for($i = 0; $i < count ( $value ); $i ++) {
$value [$i] = $this->parseResponseMtasCollection ( $value [$i], $i );
if ($value [$i] && is_object ( $value [$i] ) && isset ( $value [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $value [$i]->__requestList );
}
}
}
} else if ($key == "version") {
if ($value && is_bool ( $value )) {
$requestList [] = "mtas.version=".($value?"true":"false");
}
}
}
if (! isset ( $object->stats ) && $mtasStats && count ( $mtasStats ) > 0) {
$object->stats = $this->parseResponseMtasStats ( new \stdClass (), $mtasStats );
$requestList = array_merge ( $requestList, $object->stats->__requestList );
}
$object->__requestList = $requestList;
$object->__requestAdditionalList = $requestAdditionalList;
$this->errors = array_merge ( $this->errors, $localErrors );
$this->warnings = array_merge ( $this->warnings, $localWarnings );
return $object;
} else if($this->statusKey!=null) {
$object = new \stdClass();
$requestAdditionalList = array();
$requestAdditionalList [] = "mtas=true";
$requestAdditionalList [] = "mtas.status=true";
$requestAdditionalList [] = "mtas.status.key=".urlencode($this->statusKey);
$object->__requestList = array();
$object->__requestAdditionalList = $requestAdditionalList;
return $object;
} else {
$localWarnings [] = "mtas - unexpected type";
return null;
}
}
/**
* Parse mtas stats
*
* @param object $object
* @param array $mtasStats
* @return object
*/
private function parseResponseMtasStats($object, $mtasStats) {
if ($object && is_object ( $object )) {
$requestList = array ();
$requestList [] = "mtas.stats=true";
if (isset ( $object->positions ) && is_array ( $object->positions )) {
$requestList [] = "mtas.stats.positions=true";
for($i = 0; $i < count ( $object->positions ); $i ++) {
$object->positions [$i] = $this->parseResponseMtasStatsPositions ( $object->positions [$i], $i );
if ($object->positions [$i] && is_object ( $object->positions [$i] ) && isset ( $object->positions [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->positions [$i]->__requestList );
}
}
}
if (isset ( $object->tokens ) && is_array ( $object->tokens )) {
$requestList [] = "mtas.stats.tokens=true";
for($i = 0; $i < count ( $object->tokens ); $i ++) {
$object->tokens [$i] = $this->parseResponseMtasStatsTokens ( $object->tokens [$i], $i );
if ($object->tokens [$i] && is_object ( $object->tokens [$i] ) && isset ( $object->tokens [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->tokens [$i]->__requestList );
}
}
}
if (isset ( $object->spans ) && is_array ( $object->spans ) || ($mtasStats && is_array ( $mtasStats ) && count ( $mtasStats ) > 0)) {
$requestList [] = "mtas.stats.spans=true";
if (isset ( $object->spans ) && is_array ( $object->spans )) {
for($i = 0; $i < count ( $object->spans ); $i ++) {
$object->spans [$i] = $this->parseResponseMtasStatsSpans ( $object->spans [$i], $i );
if ($object->spans [$i] && is_object ( $object->spans [$i] ) && isset ( $object->spans [$i]->__requestList )) {
$requestList = array_merge ( $requestList, $object->spans [$i]->__requestList );
}
}
} else {
$object->spans = array ();
}
if ($mtasStats && is_array ( $mtasStats )) {
$base = count ( $object->spans );
for($i = 0; $i < count ( $mtasStats ); $i ++) {
$object->spans [($i + $base)] = $this->parseResponseMtasStatsSpans ( $mtasStats [$i], ($i + $base) );
if ($object->spans [($i + $base)] && is_object ( $object->spans [($i + $base)] ) && isset ( $object->spans [($i + $base)]->__requestList )) {
$requestList = array_merge ( $requestList, $object->spans [($i + $base)]->__requestList );
}
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas stats positions
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasStatsPositions($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.stats.positions." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.stats.positions." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.stats.positions." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->minimum ) && is_int ( $object->minimum )) {
$requestList [] = "mtas.stats.positions." . $i . ".minimum=" . urlencode ( $object->minimum );
}
if (isset ( $object->maximum ) && is_int ( $object->maximum )) {
$requestList [] = "mtas.stats.positions." . $i . ".maximum=" . urlencode ( $object->maximum );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas stats tokens
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasStatsTokens($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.stats.tokens." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.stats.tokens." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.stats.tokens." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->minimum ) && is_int ( $object->minimum )) {
$requestList [] = "mtas.stats.tokens." . $i . ".minimum=" . urlencode ( $object->minimum );
}
if (isset ( $object->maximum ) && is_int ( $object->maximum )) {
$requestList [] = "mtas.stats.tokens." . $i . ".maximum=" . urlencode ( $object->maximum );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas stats spans
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasStatsSpans($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.stats.spans." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.stats.spans." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.stats.spans." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->minimum ) && is_int ( $object->minimum )) {
$requestList [] = "mtas.stats.spans." . $i . ".minimum=" . urlencode ( $object->minimum );
}
if (isset ( $object->maximum ) && is_int ( $object->maximum )) {
$requestList [] = "mtas.stats.spans." . $i . ".maximum=" . urlencode ( $object->maximum );
}
if (isset ( $object->queries ) && is_array ( $object->queries )) {
for($j = 0; $j < count ( $object->queries ); $j ++) {
if (isset ( $object->queries [$j]->type ) && is_string ( $object->queries [$j]->type )) {
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".type=" . urlencode ( $object->queries [$j]->type );
}
if (isset ( $object->queries [$j]->value ) && is_string ( $object->queries [$j]->value )) {
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".value=" . urlencode ( $object->queries [$j]->value );
}
if (isset ( $object->queries [$j]->prefix ) && is_string ( $object->queries [$j]->prefix )) {
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".prefix=" . urlencode ( $object->queries [$j]->prefix );
}
if (isset ( $object->queries [$j]->ignore ) && is_string ( $object->queries [$j]->ignore )) {
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".ignore=" . urlencode ( $object->queries [$j]->ignore );
}
if (isset ( $object->queries [$j]->maximumIgnoreLength ) && is_int ( $object->queries [$j]->maximumIgnoreLength )) {
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".maximumIgnoreLength=" . urlencode ( $object->queries [$j]->maximumIgnoreLength );
}
if (isset ( $object->queries [$j]->variables )) {
$counter = 0;
foreach ( $object->queries [$j]->variables->__variables as $key => $value ) {
$values = $this->createVariablesList($value);
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".variable." . $counter . ".name=" . urlencode ( $key );
$requestList [] = "mtas.stats.spans." . $i . ".query." . $j . ".variable." . $counter . ".value=" . urlencode ( implode ( ",", $values ) );
$counter ++;
}
for($k = 0; $k < count ( $object->queries [$j]->variables->__stats ); $k ++) {
$stats = $object->queries [$j]->variables->__stats [$k];
if (isset ( $object->field ) && is_string ( $object->field )) {
$stats->field = $object->field;
}
$stats->queries = array ();
$stats->queries [0] = new \stdClass ();
if (isset ( $stats->__variables )) {
$stats->queries [0]->variables = new \stdClass ();
$stats->queries [0]->variables->__variables = $stats->__variables;
unset ( $stats->__variables );
$stats->queries [0]->variables->__stats = array ();
}
if (isset ( $object->queries [$j]->type ) && is_string ( $object->queries [$j]->type )) {
$stats->queries [0]->type = $object->queries [$j]->type;
}
if (isset ( $object->queries [$j]->value ) && is_string ( $object->queries [$j]->value )) {
$stats->queries [0]->value = $object->queries [$j]->value;
}
if (isset ( $object->queries [$j]->prefix ) && is_string ( $object->queries [$j]->prefix )) {
$stats->queries [0]->prefix = $object->queries [$j]->prefix;
}
if (isset ( $object->queries [$j]->ignore ) && is_string ( $object->queries [$j]->ignore )) {
$stats->queries [0]->ignore = $object->queries [$j]->ignore;
}
if (isset ( $object->queries [$j]->maximumIgnoreLength ) && is_int ( $object->queries [$j]->maximumIgnoreLength )) {
$stats->queries [0]->maximumIgnoreLength = $object->queries [$j]->maximumIgnoreLength;
}
if ($stats = $this->parseResponseMtasStatsSpans ( $stats, $i . "_" . $j . "_" . $k )) {
$requestList = array_merge ( $requestList, $stats->__requestList );
}
}
}
}
}
if (isset ( $object->functions ) && is_array ( $object->functions )) {
for($j = 0; $j < count ( $object->functions ); $j ++) {
if (isset ( $object->functions [$j]->key ) && is_string ( $object->functions [$j]->key )) {
$requestList [] = "mtas.stats.spans." . $i . ".function." . $j . ".key=" . urlencode ( $object->functions [$j]->key );
}
if (isset ( $object->functions [$j]->expression ) && is_string ( $object->functions [$j]->expression )) {
$requestList [] = "mtas.stats.spans." . $i . ".function." . $j . ".expression=" . urlencode ( $object->functions [$j]->expression );
}
if (isset ( $object->functions [$j]->type ) && is_string ( $object->functions [$j]->type )) {
$requestList [] = "mtas.stats.spans." . $i . ".function." . $j . ".type=" . urlencode ( $object->functions [$j]->type );
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas documents
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasDocument($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.document." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.document." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->prefix ) && is_string ( $object->prefix )) {
$requestList [] = "mtas.document." . $i . ".prefix=" . urlencode ( $object->prefix );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.document." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->regexp ) && is_string ( $object->regexp )) {
$requestList [] = "mtas.document." . $i . ".regexp=" . urlencode ( $object->regexp );
}
if (isset ( $object->ignoreRegexp ) && is_string ( $object->ignoreRegexp )) {
$requestList [] = "mtas.document." . $i . ".ignoreRegexp=" . urlencode ( $object->ignoreRegexp );
}
if (isset ( $object->list ) && is_array ( $object->list ) && count($object->list)>0) {
$requestList [] = "mtas.document." . $i . ".list=" . urlencode ( implode ( ",", str_replace ( ",", "\\,", str_replace ( "\\", "\\\\", $object->list ) ) ) );
}
if (isset ( $object->listRegexp ) && is_bool ( $object->listRegexp )) {
$requestList [] = "mtas.document." . $i . ".listRegexp=" . urlencode ( $object->listRegexp ? "true" : "false" );
}
if (isset ( $object->listExpand ) && is_bool ( $object->listExpand )) {
$requestList [] = "mtas.document." . $i . ".listExpand=" . urlencode ( $object->listExpand ? "true" : "false" );
}
if (isset ( $object->listExpandNumber ) && is_int ( $object->listExpandNumber )) {
$requestList [] = "mtas.document." . $i . ".listExpandNumber=" . urlencode ( $object->listExpandNumber );
}
if (isset ( $object->ignoreList ) && is_array ( $object->ignoreList ) && count($object->ignoreList)>0) {
$requestList [] = "mtas.document." . $i . ".ignoreList=" . urlencode ( implode ( ",", $object->ignoreList ) );
}
if (isset ( $object->ignoreListRegexp ) && is_bool ( $object->ignoreListRegexp )) {
$requestList [] = "mtas.document." . $i . ".ignoreListRegexp=" . urlencode ( $object->ignoreListRegexp ? "true" : "false" );
}
if (isset ( $object->number ) && is_int ( $object->number )) {
$requestList [] = "mtas.document." . $i . ".number=" . urlencode ( $object->number );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas kwic and list
*
* @param string $type
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasKwicAndList($type, $object, $i) {
if ($type != "list" && $type != "kwic") {
die ( "incorrect call" );
}
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.{$type}." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.{$type}." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->prefix ) && is_string ( $object->prefix )) {
$requestList [] = "mtas.{$type}." . $i . ".prefix=" . urlencode ( $object->prefix );
}
if (isset ( $object->output ) && is_string ( $object->output )) {
$requestList [] = "mtas.{$type}." . $i . ".output=" . urlencode ( $object->output );
}
if (isset ( $object->number ) && is_int ( $object->number )) {
$requestList [] = "mtas.{$type}." . $i . ".number=" . urlencode ( $object->number );
}
if (isset ( $object->start ) && is_int ( $object->start )) {
$requestList [] = "mtas.{$type}." . $i . ".start=" . urlencode ( $object->start );
}
if ($type=="kwic" && isset ( $object->page ) && is_object ( $object->page )) {
$requestList [] = "mtas.{$type}." . $i . ".page.start=" . urlencode ( $object->page->start );
$requestList [] = "mtas.{$type}." . $i . ".page.end=" . urlencode ( $object->page->end );
}
if ($type=="list" && isset ( $object->fields ) && is_array ( $object->fields )) {
$requestList [] = "mtas.{$type}." . $i . ".fields=" . urlencode ( implode ( ",", array_unique ( $object->fields ) ) );
}
if (isset ( $object->left ) && is_int ( $object->left )) {
$requestList [] = "mtas.{$type}." . $i . ".left=" . urlencode ( $object->left );
}
if (isset ( $object->right ) && is_int ( $object->right )) {
$requestList [] = "mtas.{$type}." . $i . ".right=" . urlencode ( $object->right );
}
if (isset ( $object->query ) && is_object ( $object->query )) {
if (isset ( $object->query->type ) && is_string ( $object->query->type )) {
$requestList [] = "mtas.{$type}." . $i . ".query.type=" . urlencode ( $object->query->type );
}
if (isset ( $object->query->value ) && is_string ( $object->query->value )) {
$requestList [] = "mtas.{$type}." . $i . ".query.value=" . urlencode ( $object->query->value );
}
if (isset ( $object->query->prefix ) && is_string ( $object->query->prefix )) {
$requestList [] = "mtas.{$type}." . $i . ".query.prefix=" . urlencode ( $object->query->prefix );
}
if (isset ( $object->query->ignore ) && is_string ( $object->query->ignore )) {
$requestList [] = "mtas.{$type}." . $i . ".query.ignore=" . urlencode ( $object->query->ignore );
}
if (isset ( $object->query->maximumIgnoreLength ) && is_int ( $object->query->maximumIgnoreLength )) {
$requestList [] = "mtas.{$type}." . $i . ".query.maximumIgnoreLength=" . urlencode ( $object->query->maximumIgnoreLength );
}
if (isset ( $object->query->variables )) {
$counter = 0;
foreach ( $object->query->variables->__variables as $key => $value ) {
$values = $this->createVariablesList($value);
$requestList [] = "mtas.{$type}." . $i . ".query.variable." . $counter . ".name=" . urlencode ( $key );
$requestList [] = "mtas.{$type}." . $i . ".query.variable." . $counter . ".value=" . urlencode ( implode ( ",", $values ) );
$counter ++;
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas page
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasPage($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.page." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.page." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->prefix ) && is_string ( $object->prefix )) {
$requestList [] = "mtas.page." . $i . ".prefix=" . urlencode ( $object->prefix );
}
if (isset ( $object->start ) && is_int ( $object->start )) {
$requestList [] = "mtas.page." . $i . ".start=" . urlencode ( $object->start );
}
if (isset ( $object->start ) && is_int ( $object->start )) {
$requestList [] = "mtas.page." . $i . ".end=" . urlencode ( $object->end );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas heatmap
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasHeatmap($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.heatmap." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->heatmapField ) && is_string ( $object->heatmapField )) {
$requestList [] = "mtas.heatmap." . $i . ".heatmapField=" . urlencode ( $object->heatmapField );
}
if (isset ( $object->queryField ) && is_string ( $object->queryField )) {
$requestList [] = "mtas.heatmap." . $i . ".queryField=" . urlencode ( $object->queryField );
}
if (isset ( $object->geom) && is_string ( $object->geom )) {
$requestList [] = "mtas.heatmap." . $i . ".geom=" . urlencode ( $object->geom );
}
if (isset ( $object->gridLevel ) && is_numeric ( $object->gridLevel )) {
$requestList [] = "mtas.heatmap." . $i . ".gridLevel=" . intval ( $object->gridLevel );
}
if (isset ( $object->maxCells ) && is_numeric ( $object->maxCells )) {
$requestList [] = "mtas.heatmap." . $i . ".maxCells=" . intval ( $object->maxCells );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.heatmap." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->minimum ) && is_int ( $object->minimum )) {
$requestList [] = "mtas.heatmap." . $i . ".minimum=" . urlencode ( $object->minimum );
}
if (isset ( $object->functions ) && is_array ( $object->functions )) {
for($k = 0; $k < count ( $object->functions ); $k ++) {
if (is_object ( $object->functions [$k] )) {
if (isset ( $object->functions [$k]->key ) && is_string ( $object->functions [$k]->key )) {
$requestList [] = "mtas.heatmap." . $i . ".function." . $k . ".key=" . urlencode ( $object->functions [$k]->key );
}
if (isset ( $object->functions [$k]->expression ) && is_string ( $object->functions [$k]->expression )) {
$requestList [] = "mtas.heatmap." . $i . ".function." . $k . ".expression=" . urlencode ( $object->functions [$k]->expression );
}
if (isset ( $object->functions [$k]->type ) && is_string ( $object->functions [$k]->type )) {
$requestList [] = "mtas.heatmap." . $i . ".function." . $k . ".type=" . urlencode ( $object->functions [$k]->type );
}
}
}
}
if (isset ( $object->maximum ) && is_int ( $object->maximum )) {
$requestList [] = "mtas.heatmap." . $i . ".maximum=" . urlencode ( $object->maximum );
}
if (isset ( $object->queries ) && is_array ( $object->queries )) {
for($j = 0; $j < count ( $object->queries ); $j ++) {
if (isset ( $object->queries [$j]->type ) && is_string ( $object->queries [$j]->type )) {
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".type=" . urlencode ( $object->queries [$j]->type );
}
if (isset ( $object->queries [$j]->value ) && is_string ( $object->queries [$j]->value )) {
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".value=" . urlencode ( $object->queries [$j]->value );
}
if (isset ( $object->queries [$j]->prefix ) && is_string ( $object->queries [$j]->prefix )) {
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".prefix=" . urlencode ( $object->queries [$j]->prefix );
}
if (isset ( $object->queries [$j]->ignore ) && is_string ( $object->queries [$j]->ignore )) {
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".ignore=" . urlencode ( $object->queries [$j]->ignore );
}
if (isset ( $object->queries [$j]->maximumIgnoreLength ) && is_int ( $object->queries [$j]->maximumIgnoreLength )) {
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".maximumIgnoreLength=" . urlencode ( $object->queries [$j]->maximumIgnoreLength );
}
if (isset ( $object->queries [$j]->variables )) {
$counter = 0;
foreach ( $object->queries [$j]->variables->__variables as $key => $value ) {
$values = $this->createVariablesList($value);
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".variable." . $counter . ".name=" . urlencode ( $key );
$requestList [] = "mtas.heatmap." . $i . ".query." . $j . ".variable." . $counter . ".value=" . urlencode ( implode ( ",", $values ) );
$counter ++;
}
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas termvector
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasTermvector($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.termvector." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.termvector." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->prefix ) && is_string ( $object->prefix )) {
$requestList [] = "mtas.termvector." . $i . ".prefix=" . urlencode ( $object->prefix );
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$requestList [] = "mtas.termvector." . $i . ".type=" . urlencode ( $object->type );
}
if (isset ( $object->full ) && is_bool ( $object->full )) {
$requestList [] = "mtas.termvector." . $i . ".full=" . urlencode ( $object->full ? "true" : "false" );
}
if (isset ( $object->regexp ) && is_string ( $object->regexp )) {
$requestList [] = "mtas.termvector." . $i . ".regexp=" . urlencode ( $object->regexp );
}
if (isset ( $object->ignorRegexp ) && is_string ( $object->ignoreRegexp )) {
$requestList [] = "mtas.termvector." . $i . ".ignoreRegexp=" . urlencode ( $object->ignoreRegexp );
}
if (isset ( $object->list ) && is_array ( $object->list ) && count($object->list)>0) {
$requestList [] = "mtas.termvector." . $i . ".list=" . urlencode ( implode ( ",", str_replace ( ",", "\\,", str_replace ( "\\", "\\\\", $object->list ) ) ) );
}
if (isset ( $object->listRegexp ) && is_bool ( $object->listRegexp )) {
$requestList [] = "mtas.termvector." . $i . ".listRegexp=" . urlencode ( $object->listRegexp ? "true" : "false" );
}
if (isset ( $object->ignoreList ) && is_array ( $object->ignoreList ) && count($object->ignoreList)>0) {
$requestList [] = "mtas.termvector." . $i . ".ignoreList=" . urlencode ( implode ( ",", $object->ignoreList ) );
}
if (isset ( $object->ignoreListRegexp ) && is_bool ( $object->ignoreListRegexp )) {
$requestList [] = "mtas.termvector." . $i . ".ignoreListRegexp=" . urlencode ( $object->ignoreListRegexp ? "true" : "false" );
}
if (isset ( $object->start ) && is_int ( $object->start )) {
$requestList [] = "mtas.termvector." . $i . ".start=" . urlencode ( $object->start );
}
if (isset ( $object->number ) && is_int ( $object->number )) {
$requestList [] = "mtas.termvector." . $i . ".number=" . urlencode ( $object->number );
}
if (isset ( $object->distances ) && is_array ( $object->distances )) {
for($j = 0; $j < count ( $object->distances ); $j ++) {
if (isset ( $object->distances [$j]->key ) && is_string ( $object->distances [$j]->key )) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".key=" . urlencode ( $object->distances [$j]->key );
}
if (isset ( $object->distances [$j]->type ) && is_string ( $object->distances [$j]->type )) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".type=" . urlencode ( $object->distances [$j]->type );
}
if (isset ( $object->distances [$j]->base ) && is_string ( $object->distances [$j]->base )) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".base=" . urlencode ( $object->distances [$j]->base );
}
if (isset ( $object->distances [$j]->minimum ) && is_numeric ( $object->distances [$j]->minimum )) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".minimum=" . urlencode ( $object->distances [$j]->minimum );
}
if (isset ( $object->distances [$j]->maximum ) && is_numeric ( $object->distances [$j]->maximum )) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".maximum=" . urlencode ( $object->distances [$j]->maximum );
}
if (isset ( $object->distances [$j]->parameter ) && is_object ( $object->distances [$j]->parameter )) {
foreach ( $object->distances [$j]->parameter as $parameterKey => $parameterValue ) {
$requestList [] = "mtas.termvector." . $i . ".distance." . $j . ".parameter." . $parameterKey . "=" . urlencode ( $parameterValue );
}
}
}
}
if (isset ( $object->functions ) && is_array ( $object->functions )) {
for($j = 0; $j < count ( $object->functions ); $j ++) {
if (isset ( $object->functions [$j]->key ) && is_string ( $object->functions [$j]->key )) {
$requestList [] = "mtas.termvector." . $i . ".function." . $j . ".key=" . urlencode ( $object->functions [$j]->key );
}
if (isset ( $object->functions [$j]->expression ) && is_string ( $object->functions [$j]->expression )) {
$requestList [] = "mtas.termvector." . $i . ".function." . $j . ".expression=" . urlencode ( $object->functions [$j]->expression );
}
if (isset ( $object->functions [$j]->type ) && is_string ( $object->functions [$j]->type )) {
$requestList [] = "mtas.termvector." . $i . ".function." . $j . ".type=" . urlencode ( $object->functions [$j]->type );
}
}
}
if (isset ( $object->sort ) && is_object ( $object->sort )) {
if (isset ( $object->sort->type ) && is_string ( $object->sort->type )) {
$requestList [] = "mtas.termvector." . $i . ".sort.type=" . urlencode ( $object->sort->type );
}
if (isset ( $object->sort->direction ) && is_string ( $object->sort->direction )) {
$requestList [] = "mtas.termvector." . $i . ".sort.direction=" . urlencode ( $object->sort->direction );
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas facet
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasFacet($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.facet." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.facet." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->queries ) && is_array ( $object->queries )) {
for($j = 0; $j < count ( $object->queries ); $j ++) {
if (isset ( $object->queries [$j]->type ) && is_string ( $object->queries [$j]->type )) {
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".type=" . urlencode ( $object->queries [$j]->type );
}
if (isset ( $object->queries [$j]->value ) && is_string ( $object->queries [$j]->value )) {
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".value=" . urlencode ( $object->queries [$j]->value );
}
if (isset ( $object->queries [$j]->prefix ) && is_string ( $object->queries [$j]->prefix )) {
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".prefix=" . urlencode ( $object->queries [$j]->prefix );
}
if (isset ( $object->queries [$j]->ignore ) && is_string ( $object->queries [$j]->ignore )) {
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".ignore=" . urlencode ( $object->queries [$j]->ignore );
}
if (isset ( $object->queries [$j]->maximumIgnoreLength ) && is_int ( $object->queries [$j]->maximumIgnoreLength )) {
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".maximumIgnoreLength=" . urlencode ( $object->queries [$j]->maximumIgnoreLength );
}
if (isset ( $object->queries [$j]->variables ) && is_object ( $object->queries [$j]->variables )) {
$counter = 0;
foreach ( $object->queries [$j]->variables->__variables as $key => $value ) {
$values = $this->createVariablesList($value);
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".variable." . $counter . ".name=" . urlencode ( $key );
$requestList [] = "mtas.facet." . $i . ".query." . $j . ".variable." . $counter . ".value=" . urlencode ( implode ( ",", $values ) );
$counter ++;
}
}
}
}
if (isset ( $object->base ) && is_array ( $object->base )) {
for($j = 0; $j < count ( $object->base ); $j ++) {
if (isset ( $object->base [$j]->field ) && is_string ( $object->base [$j]->field )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".field=" . urlencode ( $object->base [$j]->field );
}
if (isset ( $object->base [$j]->type ) && is_string ( $object->base [$j]->type )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".type=" . urlencode ( $object->base [$j]->type );
}
if (isset ( $object->base [$j]->sort ) && is_object ( $object->base [$j]->sort )) {
if (isset ( $object->base [$j]->sort->type ) && is_string ( $object->base [$j]->sort->type )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".sort.type=" . urlencode ( $object->base [$j]->sort->type );
}
if (isset ( $object->base [$j]->sort->direction ) && is_string ( $object->base [$j]->sort->direction )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".sort.direction=" . urlencode ( $object->base [$j]->sort->direction );
}
}
if (isset ( $object->base [$j]->number ) && is_int ( $object->base [$j]->number )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".number=" . urlencode ( $object->base [$j]->number );
}
if (isset ( $object->base [$j]->minimum ) && is_int ( $object->base [$j]->minimum )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".minimum=" . urlencode ( $object->base [$j]->minimum );
}
if (isset ( $object->base [$j]->maximum ) && is_int ( $object->base [$j]->maximum )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".maximum=" . urlencode ( $object->base [$j]->maximum );
}
if (isset ( $object->base [$j]->range ) && is_object ( $object->base [$j]->range )) {
if (isset ( $object->base [$j]->range->size ) && is_int ( $object->base [$j]->range->size )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".range.size=" . urlencode ( $object->base [$j]->range->size );
}
if (isset ( $object->base [$j]->range->base ) && is_int ( $object->base [$j]->range->base )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".range.base=" . urlencode ( $object->base [$j]->range->base );
}
}
if (isset ( $object->base [$j]->functions ) && is_array ( $object->base [$j]->functions )) {
for($k = 0; $k < count ( $object->base [$j]->functions ); $k ++) {
if (is_object ( $object->base [$j]->functions [$k] )) {
if (isset ( $object->base [$j]->functions [$k]->key ) && is_string ( $object->base [$j]->functions [$k]->key )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".function." . $k . ".key=" . urlencode ( $object->base [$j]->functions [$k]->key );
}
if (isset ( $object->base [$j]->functions [$k]->expression ) && is_string ( $object->base [$j]->functions [$k]->expression )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".function." . $k . ".expression=" . urlencode ( $object->base [$j]->functions [$k]->expression );
}
if (isset ( $object->base [$j]->functions [$k]->type ) && is_string ( $object->base [$j]->functions [$k]->type )) {
$requestList [] = "mtas.facet." . $i . ".base." . $j . ".function." . $k . ".type=" . urlencode ( $object->base [$j]->functions [$k]->type );
}
}
}
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas group
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasGroup($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.group." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.group." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->number ) && is_int ( $object->number )) {
$requestList [] = "mtas.group." . $i . ".number=" . urlencode ( $object->number );
}
if (isset ( $object->start ) && is_int ( $object->start )) {
$requestList [] = "mtas.group." . $i . ".start=" . urlencode ( $object->start );
}
if (isset ( $object->query ) && is_object ( $object->query )) {
if (isset ( $object->query->type ) && is_string ( $object->query->type )) {
$requestList [] = "mtas.group." . $i . ".query.type=" . urlencode ( $object->query->type );
}
if (isset ( $object->query->value ) && is_string ( $object->query->value )) {
$requestList [] = "mtas.group." . $i . ".query.value=" . urlencode ( $object->query->value );
}
if (isset ( $object->query->prefix ) && is_string ( $object->query->prefix )) {
$requestList [] = "mtas.group." . $i . ".query.prefix=" . urlencode ( $object->query->prefix );
}
if (isset ( $object->query->ignore ) && is_string ( $object->query->ignore )) {
$requestList [] = "mtas.group." . $i . ".query.ignore=" . urlencode ( $object->query->ignore );
}
if (isset ( $object->query->maximumIgnoreLength ) && is_int ( $object->query->maximumIgnoreLength )) {
$requestList [] = "mtas.group." . $i . ".query.maximumIgnoreLength=" . urlencode ( $object->query->maximumIgnoreLength );
}
if (isset ( $object->query->variables ) && is_object ( $object->query->variables )) {
$counter = 0;
foreach ( $object->query->variables->__variables as $key => $value ) {
$values = $this->createVariablesList($value);
$requestList [] = "mtas.group." . $i . ".query.variable." . $counter . ".name=" . urlencode ( $key );
$requestList [] = "mtas.group." . $i . ".query.variable." . $counter . ".value=" . urlencode ( implode ( ",", $values ) );
$counter ++;
}
}
}
if (isset ( $object->grouping ) && is_object ( $object->grouping )) {
if (isset ( $object->grouping->hit ) && is_object ( $object->grouping->hit )) {
if (isset ( $object->grouping->hit->inside ) && is_string ( $object->grouping->hit->inside )) {
$requestList [] = "mtas.group." . $i . ".grouping.hit.inside.prefixes=" . urlencode ( $object->grouping->hit->inside );
}
if (isset ( $object->grouping->hit->insideLeft ) && is_array ( $object->grouping->hit->insideLeft )) {
for($j = 0; $j < count ( $object->grouping->hit->insideLeft ); $j ++) {
if (isset ( $object->grouping->hit->insideLeft [$j]->prefixes ) && is_string ( $object->grouping->hit->insideLeft [$j]->prefixes )) {
$requestList [] = "mtas.group." . $i . ".grouping.hit.insideLeft." . $j . ".prefixes=" . urlencode ( $object->grouping->hit->insideLeft [$j]->prefixes );
}
if (isset ( $object->grouping->hit->insideLeft [$j]->position ) && (is_string ( $object->grouping->hit->insideLeft [$j]->position ) || is_int ( $object->grouping->hit->insideLeft [$j]->position ))) {
$requestList [] = "mtas.group." . $i . ".grouping.hit.insideLeft." . $j . ".position=" . urlencode ( $object->grouping->hit->insideLeft [$j]->position );
}
}
}
if (isset ( $object->grouping->hit->insideRight ) && is_array ( $object->grouping->hit->insideRight )) {
for($j = 0; $j < count ( $object->grouping->hit->insideRight ); $j ++) {
if (isset ( $object->grouping->hit->insideRight [$j]->prefixes ) && is_string ( $object->grouping->hit->insideRight [$j]->prefixes )) {
$requestList [] = "mtas.group." . $i . ".grouping.hit.insideRight." . $j . ".prefixes=" . urlencode ( $object->grouping->hit->insideRight [$j]->prefixes );
}
if (isset ( $object->grouping->hit->insideRight [$j]->position ) && (is_string ( $object->grouping->hit->insideRight [$j]->position ) || is_int ( $object->grouping->hit->insideRight [$j]->position ))) {
$requestList [] = "mtas.group." . $i . ".grouping.hit.insideRight." . $j . ".position=" . urlencode ( $object->grouping->hit->insideRight [$j]->position );
}
}
}
}
if (isset ( $object->grouping->right ) && is_array ( $object->grouping->right )) {
for($j = 0; $j < count ( $object->grouping->right ); $j ++) {
if (isset ( $object->grouping->right [$j]->prefixes ) && is_string ( $object->grouping->right [$j]->prefixes )) {
$requestList [] = "mtas.group." . $i . ".grouping.right." . $j . ".prefixes=" . urlencode ( $object->grouping->right [$j]->prefixes );
}
if (isset ( $object->grouping->right [$j]->position ) && (is_string ( $object->grouping->right [$j]->position ) || is_int ( $object->grouping->right [$j]->position ))) {
$requestList [] = "mtas.group." . $i . ".grouping.right." . $j . ".position=" . urlencode ( $object->grouping->right [$j]->position );
}
}
}
if (isset ( $object->grouping->left ) && is_array ( $object->grouping->left )) {
for($j = 0; $j < count ( $object->grouping->left ); $j ++) {
if (isset ( $object->grouping->left [$j]->prefixes ) && is_string ( $object->grouping->left [$j]->prefixes )) {
$requestList [] = "mtas.group." . $i . ".grouping.left." . $j . ".prefixes=" . urlencode ( $object->grouping->left [$j]->prefixes );
}
if (isset ( $object->grouping->left [$j]->position ) && (is_string ( $object->grouping->left [$j]->position ) || is_int ( $object->grouping->left [$j]->position ))) {
$requestList [] = "mtas.group." . $i . ".grouping.left." . $j . ".position=" . urlencode ( $object->grouping->left [$j]->position );
}
}
}
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas prefix
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasPrefix($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.prefix." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.prefix." . $i . ".field=" . urlencode ( $object->field );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse mtas collection
*
* @param object $object
* @param number $i
* @return object
*/
private function parseResponseMtasCollection($object, $i) {
if ($object && is_object ( $object )) {
$requestList = array ();
if (isset ( $object->key ) && is_string ( $object->key )) {
$requestList [] = "mtas.collection." . $i . ".key=" . urlencode ( $object->key );
}
if (isset ( $object->action ) && is_string ( $object->action )) {
$requestList [] = "mtas.collection." . $i . ".action=" . urlencode ( $object->action );
}
if (isset ( $object->id ) && is_string ( $object->id )) {
$requestList [] = "mtas.collection." . $i . ".id=" . urlencode ( $object->id );
}
if (isset ( $object->field ) && is_string ( $object->field )) {
$requestList [] = "mtas.collection." . $i . ".field=" . urlencode ( $object->field );
}
if (isset ( $object->post ) && is_array ( $object->post )) {
$requestList [] = "mtas.collection." . $i . ".post=" . urlencode ( json_encode ( $object->post ) );
}
if (isset ( $object->collection ) && is_string ( $object->collection )) {
$requestList [] = "mtas.collection." . $i . ".collection=" . urlencode ( $object->collection );
}
if (isset ( $object->configuration ) && is_string ( $object->configuration )) {
if (isset ( $this->configuration->config ["solr"] [$object->configuration] ) && isset ( $this->configuration->config ["solr"] [$object->configuration] ["url"] )) {
$requestList [] = "mtas.collection." . $i . ".url=" . urlencode ( $this->configuration->config ["solr"] [$object->configuration] ["url"] );
}
}
if (isset ( $object->url ) && is_string ( $object->url )) {
$requestList [] = "mtas.collection." . $i . ".url=" . urlencode ( $object->url );
}
$object->__requestList = $requestList;
return $object;
} else {
return null;
}
}
/**
* Parse condition
*
* @param object $object
* @return object
*/
private function parseCondition($object) {
if ($object && is_object ( $object )) {
// initialise
$object->__query = "*:* NOT *:*";
$object->__facetQueries = array ();
$object->__mtasStats = array ();
// and + or
if ($object->type == "and" || $object->type == "or") {
$subqueries = array ();
for($i = 0; $i < count ( $object->list ); $i ++) {
$object->list [$i] = $this->parseCondition($object->list [$i]);
$subquery = $object->list [$i]->__query;
$object->__facetQueries = array_merge ( $object->__facetQueries, $object->list [$i]->__facetQueries );
$object->__mtasStats = array_merge ( $object->__mtasStats, $object->list [$i]->__mtasStats );
$subqueries [] = $subquery;
}
if ($object->type == "and") {
if (count ( $subqueries ) > 1) {
$object->__query = "(" . implode ( ") AND (", $subqueries ) . ")";
} else {
$object->__query = $subqueries [0];
}
} else {
if (count ( $subqueries ) > 1) {
$object->__query = "(" . implode ( ") OR (", $subqueries ) . ")";
} else {
$object->__query = $subqueries [0];
}
}
// equals/phrase + expansion
} else if (($object->type == "equals" || $object->type == "phrase") && isset ( $object->expansion )) {
$values = $this->computeExpansionValues ( $object->value, $object->expansion, "condition - " );
if (count ( $values ) > 0) {
$queries = array ();
foreach ( $values as $value ) {
$subquery = $object->field . ":" . $this->solrEncode ( $value, $object->type );
if (isset ( $object->facetquery ) && $object->facetquery) {
$facetQuery = new \stdClass ();
if (isset ( $object->not ) && $object->not) {
$facetQuery->__query = "(*:* NOT {$subquery})";
} else {
$facetQuery->__query = $subquery;
}
if (isset ( $object->key ) && is_string ( $object->key )) {
$facetQuery->key = $object->key . " - '" . $value . "'";
}
$object->__facetQueries [] = $facetQuery;
}
$queries [] = $subquery;
}
if (count ( $queries ) > 1) {
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT (" . implode ( ") AND (", $queries ) . "))";
} else {
$object->__query = "(" . implode ( ") OR (", $queries ) . ")";
}
} else {
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT {$queries [0]})";
} else {
$object->__query = $queries [0];
}
}
} else {
if (isset ( $object->not ) && $object->not) {
$object->__query = "*:*";
} else {
$object->__query = "(*:* NOT *:*)";
}
}
} else if (($object->type == "equals" || $object->type == "phrase" || $object->type == "wildcard" || $object->type == "regexp") && is_array ( $object->value )) {
$subqueries = array ();
foreach ( $object->value as $valueItem ) {
$subquery = $object->field . ":" . $this->solrEncode ( $valueItem, $object->type );
$subqueries [] = $subquery;
// create facetQuery
if (isset ( $object->facetquery ) && $object->facetquery) {
$facetQuery = new \stdClass ();
if (isset ( $object->not ) && $object->not) {
$facetQuery->__query = "(*:* NOT {$subquery})";
} else {
$facetQuery->__query = $subquery;
}
if (isset ( $object->key ) && is_string ( $object->key )) {
$facetQuery->key = $object->key . " - '" . $valueItem . "'";
}
$object->__facetQueries [] = $facetQuery;
}
}
if (isset ( $object->not ) && $object->not) {
if (count ( $subqueries ) > 1) {
$object->__query = "(*:* NOT (" . implode ( ") AND (", $subqueries ) . "))";
} else {
$object->__query = "(*:* NOT {$subqueries [0]})";
}
} else {
if (count ( $subqueries ) > 1) {
$object->__query = "(" . implode ( ") OR (", $subqueries ) . ")";
} else {
$object->__query = $subqueries [0];
}
}
// equals, phrase, wildcard or regexp
} else if ($object->type == "equals" || $object->type == "phrase" || $object->type == "wildcard" || $object->type == "regexp") {
$object->__query = $object->field . ":" . $this->solrEncode ( $object->value, $object->type );
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT {$object->__query})";
}
} else if ($object->type == "range") {
$start = isset ( $object->start ) ? $object->start : "*";
$end = isset ( $object->end ) ? $object->end : "*";
$object->__query = $object->field . ":[" . $this->solrEncode ( $start, $object->type ) . " TO " . $this->solrEncode ( $end, $object->type ) . "]";
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT " . $object->__query . ")";
}
} else if ($object->type == "geojson") {
if($object->predicate=="intersects") {
$value = "Intersects(".$object->geometry.")";
} else if($object->predicate=="iswithin") {
$value = "IsWithin(".$object->geometry.")";
} else if($object->predicate=="contains") {
$value = "Contains(".$object->geometry.")";
} else if($object->predicate=="isdisjointto") {
$value = "IsDisjointTo(".$object->geometry.")";
}
$object->__query = $object->field . ":".$this->solrEncode ( $value, $object->type );
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT " . $object->__query . ")";
}
} else if ($object->type == "cql" || $object->type == "simple") {
if (isset ( $object->ignore ) && (trim ( $object->ignore ) != "")) {
$ignore = $object->ignore;
if (isset ( $object->maximumIgnoreLength ) && is_int ( $object->maximumIgnoreLength )) {
$maximumIgnoreLength = $object->maximumIgnoreLength;
} else {
$maximumIgnoreLength = null;
}
} else {
$ignore = null;
$maximumIgnoreLength = null;
}
if (isset ( $object->prefix ) && (trim ( $object->prefix ) != "")) {
$prefix = $object->prefix;
} else {
$prefix = null;
}
if ($object->type == "cql" && isset ( $object->variables )) {
$variables = $object->variables->__variables;
$stats = $object->variables->__stats;
} else {
$variables = null;
$stats = null;
}
if ($object->type == "cql") {
$object->__query = "{!" . $this->configuration->solr [$this->solrConfiguration] ["queryParserCql"] . " field=\"" . $object->field . "\" query=" . $this->solrEncode ( $object->value, $object->type ) . " " . ($prefix != null ? "prefix=" . $this->solrEncode ( $prefix, "equals" ) : "") . " " . ($ignore != null ? ("ignore=" . $this->solrEncode ( $ignore, $object->type )) : "") . " " . ($maximumIgnoreLength != null ? ("maximumIgnoreLength=" . $maximumIgnoreLength) : "") . " " . $this->createVariablesString ( $variables ) . "}";
} else if ($object->type == "simple") {
$object->__query = "{!" . $this->configuration->solr [$this->solrConfiguration] ["queryParserSimple"] . " field=\"" . $object->field . "\" query=" . $this->solrEncode ( $object->value, $object->type ) . " prefix=" . $this->solrEncode ( $prefix, "equals" ) . " " . ($ignore != null ? ("ignore=" . $this->solrEncode ( $ignore, $object->type )) : "") . " " . ($maximumIgnoreLength != null ? ("maximumIgnoreLength=" . $maximumIgnoreLength) : "") . "}";
}
if (isset ( $object->not ) && $object->not) {
$object->__query = "(*:* NOT " . $object->__query . ")";
}
if ($stats) {
foreach ( $stats as $statsItem ) {
$statsItem->queries = array ();
$statsItem->queries [0] = new \stdClass ();
if (isset ( $object->field ) && is_string ( $object->field )) {
$statsItem->field = $object->field;
}
if (isset ( $object->type ) && is_string ( $object->type )) {
$statsItem->queries [0]->type = $object->type;
}
if (isset ( $object->value ) && is_string ( $object->value )) {
$statsItem->queries [0]->value = $object->value;
}
if (isset ( $object->prefix ) && is_string ( $object->prefix )) {
$statsItem->queries [0]->prefix = $object->prefix;
}
if (isset ( $object->ignore ) && is_string ( $object->ignore )) {
$statsItem->queries [0]->ignore = $object->ignore;
}
if (isset ( $object->maximumIgnoreLength ) && is_int ( $object->maximumIgnoreLength )) {
$statsItem->queries [0]->maximumIgnoreLength = $object->maximumIgnoreLength;
}
if (isset ( $statsItem->__variables )) {
$statsItem->queries [0]->variables = new \stdClass ();
$statsItem->queries [0]->variables->__variables = $statsItem->__variables;
$statsItem->queries [0]->variables->__stats = array ();
unset ( $statsItem->__variables );
}
$object->__mtasStats [] = $statsItem;
}
}
} else if ($object->type == "join") {
$object->_collectionId = $this->createCollectionIdFromJoin ( $object, $this->solrConfiguration );
$this->collectionIds [] = $object->_collectionId;
if(is_string($object->to)) {
$queryToPart = "field=\"".$object->to."\"";
} else if(is_array($object->to)) {
$queryToPart = array();
foreach($object->to AS $toItem) {
$queryToPart[] = "field=\"".$toItem."\"";
}
$queryToPart = implode(" ", $queryToPart);
} else {
die("unexpected to field in join");
}
$object->__query = "{!" . $this->configuration->solr [$this->solrConfiguration] ["queryParserJoin"] . " ".$queryToPart." collection=\"" . $object->_collectionId . "\"}";
} else {
// should not happen
die ( "unknown type: " . $object->type );
}
// create (main) facetquery
if (isset ( $object->facetquery ) && $object->facetquery) {
$facetQuery = new \stdClass ();
$facetQuery->__query = $object->__query;
if (isset ( $object->key ) && is_string ( $object->key )) {
$facetQuery->key = $object->key;
}
$object->__facetQueries [] = $facetQuery;
}
}
return $object;
}
/**
* Parse filters
*
* @param object $object
* @return array
*/
private function parseFilters($object) {
$localErrors = array ();
$localWarnings = array ();
$requestList = array ();
$facetQueries = array ();
$mtasStats = array ();
if ($object && is_object ( $object )) {
list ( $object, $requestList, $facetQueries, $mtasStats ) = $this->parseFilter ( $object, $requestList, $facetQueries, $mtasStats );
} else if ($object && is_array ( $object ) && count ( $object ) > 0) {
for($i = 0; $i < count ( $object ); $i ++) {
list ( $object [$i], $requestList, $facetQueries, $mtasStats ) = $this->parseFilter ( $object [$i], $requestList, $facetQueries, $mtasStats );
}
} else {
$localWarnings [] = "filter - unexpected type";
}
$this->errors = array_merge ( $this->errors, $localErrors );
$this->warnings = array_merge ( $this->warnings, $localWarnings );
return array (
$object,
$requestList,
$facetQueries,
$mtasStats
);
}
/**
* Parse filter
*
* @param object $object
* @param array $requestList
* @param array $facetQueries
* @param array $mtasStats
* @return array
*/
private function parseFilter($object, array $requestList, array $facetQueries, array $mtasStats) {
$localErrors = array ();
$localWarnings = array ();
if ($object && is_object ( $object )) {
$options = array ();
if (isset ( $object->tag ) && is_string ( $object->tag )) {
$options [] = "tag=\"" . base64_encode ( $object->tag ) . "\"";
}
if ($object->condition && is_object ( $object->condition )) {
$object->condition = $this->parseCondition ( $object->condition );
if ($object->condition && is_object ( $object->condition ) && isset ( $object->condition->__query )) {
$requestList [] = "fq=" . urlencode ( (count ( $options ) > 0 ? "{!" . implode ( " ", $options ) . "}" : "") . $object->condition->__query );
$facetQueries = array_merge ( $facetQueries, $object->condition->__facetQueries );
$mtasStats = array_merge ( $mtasStats, $object->condition->__mtasStats );
}
} else {
$localErrors [] = "filter - condition should be an object";
}
} else {
$localWarnings [] = "filter - unexpected type";
}
$this->errors = array_merge ( $this->errors, $localErrors );
$this->warnings = array_merge ( $this->warnings, $localWarnings );
return array (
$object,
$requestList,
$facetQueries,
$mtasStats
);
}
/**
* Create collectionId from join
*
* @param object $object
* @param object $configuration
* @return string
*/
private function createCollectionIdFromJoin($object, $configuration) {
$collectionId = null;
if (count ( $this->errors ) == 0) {
if (isset ( $object->configuration )) {
$subConfiguration = $object->configuration;
} else {
$subConfiguration = null;
}
if (isset ( $object->filter )) {
$subFilter = clone $object->filter;
} else {
$subFilter = null;
}
if (isset ( $object->condition )) {
$subCondition = clone $object->condition;
} else {
$subCondition = null;
}
if ($this->collection == null) {
$this->getCollection ();
}
$collectionId = $this->collection->create ( $subConfiguration, $subFilter, $subCondition, $object->from );
return $this->finishCollectionIdFromJoin ( $collectionId, $configuration );
}
return $collectionId;
}
/**
* Finish collectionId from join
*
* @param object $collectionId
* @param object $configuration
* @return string
*/
private function finishCollectionIdFromJoin($collectionId, $configuration) {
if ($collectionId) {
$checkInfo = $this->collection->check ( $collectionId );
if (! $checkInfo || $checkInfo ["key"] != $collectionId) {
$this->errors [] = "collection - couldn't check collection " . $collectionId;
} else {
// initialise if necessary
if (! $checkInfo ["initialised"]) {
list ( $localWarnings, $localErrors ) = $this->collection->doInitialise ( $collectionId );
foreach ( $localErrors as $localError ) {
$this->errors [] = "collection " . $collectionId . " - " . $localError;
}
foreach ( $localWarnings as $localWarning ) {
$this->warnings [] = "collection " . $collectionId . " - " . $localWarning;
}
$checkInfo = $this->collection->check ( $collectionId );
if (! $checkInfo || ! $checkInfo ["initialised"]) {
$this->errors [] = "collection - couldn't initialise collection " . $collectionId;
}
}
// check if necessary
if ($checkInfo && $checkInfo ["check"] && ! $this->collection->check ( $collectionId )) {
$this->errors [] = "collection - collection " . $collectionId . " couldn't be checked";
}
if ($checkInfo ["configuration"] != $configuration) {
return $this->finishCollectionIdFromJoin ( $this->collection->createFromCollection ( $configuration, $collectionId ), $checkInfo ["configuration"] );
}
}
}
return $collectionId;
}
/**
* Create variables string
*
* @param array $variables
* @return string
*/
private function createVariablesString($variables) {
$result = "";
if ($variables && is_array ( $variables )) {
foreach ( $variables as $key => $item ) {
$value = "";
if (is_array ( $item ) && count ( $item ) > 0) {
for($i = 0; $i < count ( $item ); $i ++) {
if ($i > 0) {
$value .= ",";
}
$escapedItem = str_replace ( ",", "\\\\\\,", str_replace ( "\\", "\\\\", $item [$i] ) );
if(strpos($item[$i], "\"")!==false) {
$escapedItem = str_replace ( "\"", "\\\\\\\"", $escapedItem );
//only for cql?
$escapeList = array("<","(","[","{","^","-","=","$","!","|","]","}",")","?","*","+",".",">");
foreach($escapeList AS $escapeItem) {
$escapedItem = str_replace ( $escapeItem, "\\\\\\".$escapeItem, $escapedItem );
}
$escapedItem = "\\\"".$escapedItem."\\\"";
}
$value .= $escapedItem;
}
}
$result .= "variable_{$key}=\"" . $value . "\" ";
}
}
return $result;
}
/**
* Create variables list
*
* @param array $variables
* @return array
*/
private function createVariablesList($variables) {
foreach ( $variables as $valueItem ) {
$escapedItem = str_replace ( ",", "\\,", str_replace ( "\\", "\\\\", $valueItem ) );
if(strpos($valueItem, "\"")!==false) {
$escapedItem = str_replace ( "\"", "\\\"", $escapedItem );
//only for cql?
$escapeList = array("<","(","[","{","^","-","=","$","!","|","]","}",")","?","*","+",".",">");
foreach($escapeList AS $escapeItem) {
$escapedItem = str_replace ( $escapeItem, "\\".$escapeItem, $escapedItem );
}
$escapedItem = "\"".$escapedItem."\"";
}
$values [] = $escapedItem;
}
return $values;
}
/**
* Create variable combinations
*
* @param array $variables
* @param array $combinations
* @return array
*/
private function createVariableCombinations($variables, $combinations) {
$list = array ();
$combinationKeys = array_keys ( $combinations );
if (count ( $combinationKeys ) == count ( $variables )) {
$list [] = $combinations;
return $list;
} else {
foreach ( $variables as $key => $value ) {
if (! in_array ( $key, $combinationKeys )) {
foreach ( $value as $valueItem ) {
$combinations [$key] = array (
$valueItem
);
$list = array_merge ( $list, $this->createVariableCombinations ( $variables, $combinations ) );
}
return $list;
}
}
}
}
/**
* Get configurations for field
*
* @param object $field
* @return array
*/
private function getConfigurationsForField($field) {
$list = array ();
if ($this->configuration->getConfig ( "solr" ) != null) {
$configurations = array_keys ( $this->configuration->getConfig ( "solr" ) );
foreach ( $configurations as $configuration ) {
$data = $this->configuration->getSolrConfig ( $configuration );
if ($data != null) {
if (in_array ( $field, $data ["fields"] )) {
$list [] = $configuration;
} else {
// do nothing
}
}
}
}
return array_unique ( $list );
}
/**
* Compute expansions values
*
* @param array|string $value
* @param object $expansion
* @param string $prefixMessage
* @return array
*/
private function computeExpansionValues($value, $expansion, $prefixMessage = "") {
$values = array ();
if ($expansion && is_object ( $expansion )) {
foreach ( $expansion as $key => $item ) {
if ($key != "type" && $key != "parameters") {
$this->warnings [] = $prefixMessage . "expansion - unexpected key '{$key}'";
}
}
if (! isset ( $expansion->type ) || ! is_string ( $expansion->type )) {
$this->errors [] = $prefixMessage . "expansion - no (valid) type provided";
} else if (isset ( $expansion->parameters ) && ! is_object ( $expansion->parameters )) {
$this->errors [] = $prefixMessage . "expansion - invalid parameters provided";
} else {
$expansionObjectClass = "\\BrokerExpansion\\" . ucfirst ( $expansion->type ) . "Expansion";
if (! class_exists ( $expansionObjectClass, true )) {
$this->errors [] = $prefixMessage . "expansion - could not find expansion module '" . $expansion->type . "'";
} else if (! in_array ( "Broker\\Expansion", class_implements ( $expansionObjectClass, true ) )) {
$this->errors [] = $prefixMessage . "expansion - expansion module '" . $expansion->type . "' does not implement Extension interface";
} else {
if (isset ( $expansion->parameters )) {
$parameters = $expansionObjectClass::parameters ();
foreach ( $expansion->parameters as $parameter => $parameterValue ) {
if (! isset ( $parameters [$parameter] )) {
$this->warnings [] = $prefixMessage . "expansion - unexpected parameter '{$parameter}'";
}
}
}
if (is_array ( $value )) {
foreach ( $value as $valueItem ) {
$expansionObject = new $expansionObjectClass ( $valueItem, $expansion , $this->configuration, $this->solrConfiguration);
$values = array_merge ( $values, $expansionObject->getValues () );
}
} else {
$expansionObject = new $expansionObjectClass ( $value, $expansion, $this->configuration, $this->solrConfiguration );
// check cache
if ($expansionObject->cached ()) {
if (! $this->expansionCache) {
$this->expansionCache = new \Broker\ExpansionCache ( SITE_CACHE_DATABASE_DIR );
}
list ( $id, $cachedValues ) = $this->expansionCache->check ( $expansion->type, $value, isset ( $expansion->parameters ) ? array($this->solrConfiguration, $expansion->parameters) : $this->solrConfiguration );
if ($id) {
$values = $cachedValues;
} else {
$values = $expansionObject->getValues ();
if (! ($expansionErrors = $expansionObject->getErrors ())) {
$this->expansionCache->create ( $expansion->type, $value, isset ( $expansion->parameters ) ? array($this->solrConfiguration, $expansion->parameters) : $this->solrConfiguration, $values );
} else {
foreach ( $expansionErrors as $expansionError ) {
$this->warnings [] = $prefixMessage . "expansion - " . $expansionError;
}
}
}
} else {
$values = $expansionObject->getValues ();
if ($expansionErrors = $expansionObject->getErrors ()) {
foreach ( $expansionErrors as $expansionError ) {
$this->warnings [] = $prefixMessage . "expansion - " . $expansionError;
}
}
}
}
}
}
}
return $values;
}
/**
* Compute configuration
*
* @param string $config
* @return object
*/
private function computeConfiguration($config) {
$availableConfigs = array_keys ( $this->configuration->getConfig ( "solr" ) );
if ($config != null) {
if (! in_array ( $config, $availableConfigs )) {
$this->errors [] = "configuration - configuration '{$config}' unknown";
return null;
}
} else if (count ( $this->__configurations ) == 0) {
if (count ( $availableConfigs ) > 0) {
return $availableConfigs [0];
} else {
// continue
}
}
if (count ( $this->__configurations ) == 0) {
if ($config != null) {
return $config;
} else {
return null;
}
} else {
$candidates = $this->__configurations [0];
for($i = 1; $i < count ( $this->__configurations ); $i ++) {
$candidates = array_intersect ( $candidates, $this->__configurations [$i] );
if (count ( $candidates ) == 0) {
return null;
}
}
if (count ( $candidates ) == 0) {
return null;
} else {
if ($config == null) {
return $candidates [0];
} else if (in_array ( $config, $candidates )) {
return $config;
} else {
return null;
}
}
}
}
/**
* Solr encode
*
* @param object $value
* @param string $type
* @return string
*/
private function solrEncode($value, $type = null) {
if (($type == "equals") && is_bool ( $value )) {
if ($value) {
$string = "true";
} else {
$string = "false";
}
} else if ($type == "query") {
$match = array (
'\\'
);
$replace = array (
'\\\\'
);
$string = "\"" . str_replace ( $match, $replace, $value ) . "\"";
} else if ($type == "range") {
$match = array (
'\\',
'+',
'-',
'&',
'|',
'!',
'(',
')',
'{',
'}',
'[',
']',
'^',
'~',
'?',
':',
'"',
';',
' '
);
$replace = array (
'\\\\',
'\\+',
'\\-',
'\\&',
'\\|',
'\\!',
'\\(',
'\\)',
'\\{',
'\\}',
'\\[',
'\\]',
'\\^',
'\\~',
'\\?',
'\\:',
'\\"',
'\\;',
'\\ '
);
$string = str_replace ( $match, $replace, $value );
} else if ($type == "wildcard") {
$match = array (
'\\',
'+',
'-',
'&',
'|',
'!',
'(',
')',
'{',
'}',
'[',
']',
'^',
'~',
':',
'"',
';',
' '
);
$replace = array (
'\\\\',
'\\+',
'\\-',
'\\&',
'\\|',
'\\!',
'\\(',
'\\)',
'\\{',
'\\}',
'\\[',
'\\]',
'\\^',
'\\~',
'\\:',
'\\"',
'\\;',
'\\ '
);
$string = str_replace ( $match, $replace, $value );
} else if ($type == "phrase") {
$match = array (
'\\',
'+',
'-',
'&',
'|',
'!',
'(',
')',
'{',
'}',
'[',
']',
'^',
'~',
'*',
'?',
':',
'"',
';',
' '
);
$replace = array (
'\\\\',
'\\+',
'\\-',
'\\&',
'\\|',
'\\!',
'\\(',
'\\)',
'\\{',
'\\}',
'\\[',
'\\]',
'\\^',
'\\~',
'\\*',
'\\?',
'\\:',
'\\"',
'\\;',
'\\ '
);
$string = str_replace ( $match, $replace, $value );
$string = "\"" . $string . "\"";
} else if ($type == "regexp") {
$match = array (
'/'
);
$replace = array (
'\\/'
);
$string = str_replace ( $match, $replace, $value );
$string = "/" . $string . "/";
} else if ($type == "cql" || $type == "simple") {
$match = array (
'\\',
'"'
);
$replace = array (
'\\\\',
'\\"'
);
$string = str_replace ( $match, $replace, $value );
$string = "\"" . $string . "\"";
} else {
$match = array (
'\\',
'+',
'-',
'&',
'|',
'!',
'(',
')',
'{',
'}',
'[',
']',
'^',
'~',
'*',
'?',
':',
'"',
';',
' '
);
$replace = array (
'\\\\',
'\\+',
'\\-',
'\\&',
'\\|',
'\\!',
'\\(',
'\\)',
'\\{',
'\\}',
'\\[',
'\\]',
'\\^',
'\\~',
'\\*',
'\\?',
'\\:',
'\\"',
'\\;',
'\\ '
);
$string = str_replace ( $match, $replace, $value );
if (! preg_match ( "/ /", $string )) {
$string = "\"" . $string . "\"";
}
}
return $string;
}
}
?>