<?php
/**
* Broker
* @package Broker
*/
namespace Broker;
/**
* Processing response
*/
class Response {
/**
* Response
*
* @var object
*/
private $response;
/**
* Response joins
*
* @var object
*/
private $responseJoins;
/**
* Configuration
*
* @var object
*/
private $configuration = null;
/**
* Collection
*
* @var \Broker\Collection
*/
private $collection = null;
/**
* Cache
*
* @var \Broker\Cache
*/
private $cache = null;
/**
* Constructor
*
* @param object $response
* @param object $responseJoins
* @param object $configuration
* @param \Broker\Cache $cache
* @param \Broker\Collection $collection
*/
public function __construct($response, $responseJoins, $configuration, $cache, $collection) {
$this->response = $response;
$this->configuration = $configuration;
$this->cache = $cache;
$this->collection = $collection;
if (isset ( $this->response ["response"]->responseHeader )) {
unset ( $this->response ["response"]->responseHeader );
}
$this->responseJoins = $responseJoins;
}
/**
* Process
*
* @return array
*/
public function process() {
$this->processFacetFieldJoins ();
$this->processDocumentsJoins ();
return $this->response;
}
/**
* Process facet field joins
*/
private function processFacetFieldJoins() {
if ($this->responseJoins && is_object ( $this->responseJoins ) && isset ( $this->responseJoins->facetfield )) {
$facetfieldJoins = $this->responseJoins->facetfield;
foreach ( $facetfieldJoins as $facetfieldJoin ) {
if (isset ( $this->response ["response"]->facet_counts->facet_fields->{$facetfieldJoin->key} )) {
$values = $this->collectFacetFieldValues ( $this->response ["response"]->facet_counts->facet_fields->{$facetfieldJoin->key} );
$updateValues = $this->collectJoinFacetFieldValues ( $values, $facetfieldJoin );
$this->response ["response"]->facet_counts->facet_fields->{$facetfieldJoin->key} = $this->updateFacetFieldValues ( $this->response ["response"]->facet_counts->facet_fields->{$facetfieldJoin->key}, $facetfieldJoin->to, $updateValues );
}
}
}
}
/**
* Collect facet field values
*
* @param array $list
* @return array
*/
private function collectFacetFieldValues($list) {
$values = array ();
for($i = 0; $i < count ( $list ); $i += 2) {
$values [] = $list [$i];
}
return $values;
}
/**
* Collect join facet field values
*
* @param array $values
* @param object $facetFieldJoin
* @return array
*/
private function collectJoinFacetFieldValues($values, $facetFieldJoin) {
$allFields = $facetFieldJoin->fields;
$allFields [] = $facetFieldJoin->to;
$subRequest = new \stdClass ();
$subRequest->configuration = $facetFieldJoin->configuration;
$subRequest->filter = new \stdClass ();
$subRequest->filter->condition = new \stdClass ();
$subRequest->filter->condition->type = "equals";
$subRequest->filter->condition->field = $facetFieldJoin->to;
$subRequest->filter->condition->value = $values;
$subRequest->response = new \stdClass ();
$subRequest->response->documents = new \stdClass ();
$subRequest->response->documents->start = 0;
$subRequest->response->documents->rows = 1000000;
$subRequest->response->documents->fields = $allFields;
$subParser = new \Broker\Parser ( $subRequest, $this->configuration, $this->cache, $this->collection, null, null );
// get data
try {
$solr = new \Broker\Solr ( $subParser->getConfiguration (), $subParser->getUrl (), "select", $subParser->getRequest (), null, implode ( ",", $subParser->getShards () ), $this->cache );
$solrResponse = $solr->getResponse ();
if ($solrResponse && is_object ( $solrResponse )) {
if (! isset ( $solrResponse->error ) && isset ( $solrResponse->response ) && isset ( $solrResponse->response->docs )) {
$subResponse = array ();
$subResponse ["status"] = "OK";
$subResponse ["response"] = clone $solrResponse;
$subResponseObject = new \Broker\Response ( $subResponse, $subParser->getResponseJoins (), $this->configuration, $this->cache, $this->collection );
$subResponse = $subResponseObject->process ();
return $subResponse ["response"]->response->docs;
}
}
} catch ( \Broker\SolrException $se ) {
// do nothing
} catch ( \Exception $e ) {
// do nothing
}
return array ();
}
/**
* Update facet field values
*
* @param array $list
* @param string $to
* @param array $updates
* @return array
*/
private function updateFacetFieldValues($list, $to, $updates) {
for($i = 0; $i < count ( $list ); $i += 2) {
$key = $list [$i];
$value = array ();
foreach ( $updates as $update ) {
if (isset ( $update->{$to} ) && (is_string ( $update->{$to} ) && $update->{$to} == $key) || (is_array ( $update->{$to} ) && in_array ( $key, $update->{$to} ))) {
$value [] = $update;
}
}
$list [$i] = array (
"key" => $key,
"value" => $value
);
}
return $list;
}
/**
* Process documents joins
*/
private function processDocumentsJoins() {
if ($this->responseJoins && is_object ( $this->responseJoins ) && isset ( $this->responseJoins->documents )) {
$documentsJoins = $this->responseJoins->documents;
foreach ( $documentsJoins as $documentsJoin ) {
if (isset ( $this->response ["response"]->response->docs )) {
$values = $this->collectDocumentsValues ( $this->response ["response"]->response->docs, $documentsJoin->from );
$updateValues = $this->collectJoinDocumentsValues ( $values, $documentsJoin );
$this->response ["response"]->response->docs = $this->updateDocuments ( $this->response ["response"]->response->docs, $documentsJoin->from, $documentsJoin->to, $documentsJoin->name, $updateValues );
}
}
}
}
/**
* Collect documents values
*
* @param array $documents
* @param string $from
* @return array
*/
private function collectDocumentsValues($documents, $from) {
$values = array ();
foreach ( $documents as $document ) {
if (isset ( $document->{$from} ) && is_string ( $document->{$from} )) {
$values [] = $document->{$from};
} else if (isset ( $document->{$from} ) && is_array ( $document->{$from} )) {
foreach($document->{$from} AS $subValue) {
if($subValue && is_string($subValue)) {
$values [] = $subValue;
}
}
}
}
return $values;
}
/**
* Collect join documents values
*
* @param array $values
* @param object $documentsJoin
* @return array
*/
private function collectJoinDocumentsValues($values, $documentsJoin) {
if($values && is_array($values) && count($values)>0) {
$allFields = $documentsJoin->fields;
$allFields [] = $documentsJoin->to;
$subRequest = new \stdClass ();
$subRequest->configuration = $documentsJoin->configuration;
$subRequest->filter = array ();
$filter = new \stdClass ();
$filter->condition = new \stdClass ();
$filter->condition->type = "equals";
$filter->condition->field = $documentsJoin->to;
$filter->condition->value = $values;
$subRequest->filter [] = $filter;
if (isset ( $documentsJoin->filter )) {
$subRequest->filter [] = $documentsJoin->filter;
}
if (isset ( $documentsJoin->condition )) {
$subRequest->condition = $documentsJoin->condition;
}
$subRequest->response = new \stdClass ();
$subRequest->response->documents = new \stdClass ();
$subRequest->response->documents->start = 0;
$subRequest->response->documents->rows = 1000000;
$subRequest->response->documents->fields = $allFields;
$subParser = new \Broker\Parser ( $subRequest, $this->configuration, $this->cache, $this->collection, null, null );
// get data
if (count ( $subParser->getErrors () ) == 0) {
try {
$solr = new \Broker\Solr ( $subParser->getConfiguration (), $subParser->getUrl (), "select", $subParser->getRequest (), null, implode ( ",", $subParser->getShards () ), $this->cache );
$solrResponse = $solr->getResponse ();
if ($solrResponse && is_object ( $solrResponse )) {
if (! isset ( $solrResponse->error ) && isset ( $solrResponse->response ) && isset ( $solrResponse->response->docs )) {
$subResponse = array ();
$subResponse ["status"] = "OK";
$subResponse ["response"] = clone $solrResponse;
$subResponseObject = new \Broker\Response ( $subResponse, $subParser->getResponseJoins (), $this->configuration, $this->cache, $this->collection );
$subResponse = $subResponseObject->process ();
return $subResponse ["response"]->response->docs;
}
}
} catch ( \Broker\SolrException $se ) {
// do nothing
} catch ( \Exception $e ) {
// do nothing
}
}
return array ();
}
}
/**
* Update documents
*
* @param array $documents
* @param string $from
* @param string $to
* @param string $name
* @param array $updates
* @return array
*/
private function updateDocuments($documents, $from, $to, $name, $updates) {
if($updates) {
foreach ( $documents as $document ) {
if (is_object ( $document )) {
if (isset ( $document->{$from} ) && (is_string ( $document->{$from} ) || is_array ( $document->{$from} ))) {
$key = $document->{$from};
if (! isset ( $document->{$name} )) {
$document->{$name} = array ();
}
if (is_array ( $document->{$name} )) {
foreach ( $updates as $update ) {
if (is_string ( $key )) {
if (isset ( $update->{$to} ) && (is_string ( $update->{$to} ) && $update->{$to} == $key) || (is_array ( $update->{$to} ) && in_array ( $key, $update->{$to} ))) {
$document->{$name} [] = $update;
}
} else if (is_array ( $key )) {
if (isset ( $update->{$to} ) && (is_string ( $update->{$to} ) && in_array ( $update->{$to}, $key )) || (is_array ( $update->{$to} ) && count ( array_intersect ( $key, $update->{$to} ) ) > 0)) {
$document->{$name} [] = $update;
}
}
}
}
}
}
}
}
return $documents;
}
/**
* Create solr status
*
* @param string $id
* @param string $description
* @return array
*/
static function createSolrStatus($id, $description) {
$result = array ();
$result ["description"] = $description;
$result ["data"] = array ();
$result ["data"] [$id] = date ( "h:i:s" ) . " - " . $description;
return $result;
}
}
?>