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;
    }
    protected function processConfig ( &$config ) {
        $metamodel = data_controller_get_metamodel();

        if ( !empty($config->model->datasets) ) {
            foreach ( $config->model->datasets as $key => $datasetName ) {
                $dataset = $metamodel->getDataset($datasetName);
                if (isset($dataset->uuid)) {
                    $config->model->datasets[$key] = $dataset->uuid;
                } else {
                    $config->model->datasets[$key] = NameSpaceHelper::removeNameSpace($dataset->name);
                }
            }
        }

        // update columns
        if ( !empty($config->model->columns) ) {
            foreach ( $config->model->columns as $key => $value ) {
                $config->model->columns[$key] = DatasetExportHelper::getExportColumnName($value,$metamodel);
            }
        }

        // update column configs
        if ( !empty($config->columnConfigs) ) {
            foreach ( $config->columnConfigs as $key => $value ) {
                $config->columnConfigs[$key]->columnId = DatasetExportHelper::getExportColumnName($value->columnId,$metamodel);
            }
        }

        // update column orders
        if ( !empty($config->model->columnOrder) ) {
            foreach ( $config->model->columnOrder as $key => $value ) {
                $config->model->columnOrder[$key] = DatasetExportHelper::getExportColumnName($value,$metamodel);
            }
        }

        // update column sorts
        if ( !empty($config->model->orderBy) ) {
            foreach ( $config->model->orderBy as $key => $value ) {
                $config->model->orderBy[$key]->column = DatasetExportHelper::getExportColumnName($value->column,$metamodel);
            }
        }

        // update visual series
        if ( !empty($config->visual->series) ) {
            $newSeries = array();
            foreach ( $config->visual->series as $key => $value ) {
                $newSeries[DatasetExportHelper::getExportColumnName($key,$metamodel)] = $value;
            }
            $config->visual->series = $newSeries;
        }

        // update traffic column
        if ( !empty($config->visual->trafficColumn) ) {
            $config->visual->trafficColumn = DatasetExportHelper::getExportColumnName($config->visual->trafficColumn,$metamodel);
        }

        // update color column
        if ( !empty($config->visual->useColumnDataForColor) ) {
            $config->visual->useColumnDataForColor = DatasetExportHelper::getExportColumnName($config->visual->useColumnDataForColor,$metamodel);
        }

        // update traffic columns
        if ( !empty($config->visual->traffic) ) {
            $newTraffic = array();
            foreach ( $config->visual->traffic as $key => $value ) {
                $value->trafficColumn = DatasetExportHelper::getExportColumnName($key,$metamodel);
                $newTraffic[DatasetExportHelper::getExportColumnName($key,$metamodel)] = $value;
            }
            $config->visual->traffic = $newTraffic;
        }

        // update filters
        if ( !empty($config->model->filters) ) {
            foreach ( $config->model->filters as $key => $value ) {
                $config->model->filters[$key]->column = DatasetExportHelper::getExportColumnName($value->column,$metamodel);
            }
        }
    }
    public function getQueryFormulas() {
        $formulas = $this->getFormulas();
        $f = array();

        if (!empty($formulas)) {
            foreach($formulas as $formula) {
                $form = $this->getFormula($formula['name']);
                $form->name = NameSpaceHelper::removeNameSpace($form->name);
                $f[] = $form;
            }
        }

        return array(AbstractQueryRequest::OPTION__FORMULA_DEF => $f);
    }