public function queryCube(DataControllerCallContext $callcontext, CubeQueryRequest $request, ResultFormatter $resultFormatter) { $records = NULL; $environment_metamodel = data_controller_get_environment_metamodel(); $metamodel = data_controller_get_metamodel(); $cubeName = $request->getCubeName(); $cube = $metamodel->getCube($cubeName); $cubeDatasetName = $cube->sourceDatasetName; $cubeDataset = $metamodel->getDataset($cubeDatasetName); $datasource = $environment_metamodel->getDataSource($cubeDataset->datasourceName); $designDocumentName = NameSpaceHelper::removeNameSpace($cubeName); $viewName = NameSpaceHelper::removeNameSpace($cubeName); $url = '/' . $cubeDataset->source->database . "/_design/$designDocumentName/_view/$viewName"; $dimensionCount = $cube->getDimensionCount(); $queryKeys = NULL; // TODO list of dimensions could be empty foreach ($cube->dimensions as $dimension) { $queryDimension = $request->findDimensionQuery($dimension->name); if (isset($queryDimension)) { $queryKeys[] = $queryDimension->values; } else { $queryKeys[] = NULL; } } // TODO develop more comprehensive validation or mapping if ($cube->getMeasureCount() != 1) { throw new UnsupportedOperationException(t('Only one measure is supported')); } $cubeMeasurePropertyName = NULL; foreach ($cube->measures as $measureName => $measure) { $cubeMeasurePropertyName = $measureName; } // preparing set of keys to access data $requestKeys = NULL; $this->prepareCubeRequestKeys($requestKeys, $queryKeys, 0, NULL); // preparing server requests if (isset($requestKeys)) { foreach ($requestKeys as $requestKey) { $parameterKey = ''; foreach ($requestKey as $dimensionKey) { $parameterKey .= self::prepareSingleValue($dimensionKey); } $parameterKey = '[' . substr($parameterKey, 0, strlen($parameterKey) - 1) . ']'; $serverRequest = NULL; $serverRequest->url = $url . "?key=$parameterKey"; // executing the server request $serverResponse = $this->communicateWithServer($datasource, $serverRequest); $this->checkDocumentExistence($serverResponse, TRUE); if (isset($serverResponse->rows[0])) { $record = NULL; // adding dimension-related properties for ($i = 0; $i < $dimensionCount; $i++) { // we should have data for a dimension to report related property if (!isset($requestKey[$i])) { continue; } $dimension = $cube->dimensions[$i]; $dimensionKey = $requestKey[$i]; // FIXME there is no support for targetKey any more $record[$dimension->targetKey] = $dimensionKey; } // adding measure value $record[$cubeMeasurePropertyName] = $serverResponse->rows[0]->value; $records[] = $record; } } } return $records; }