public function prepareCountRequest(DataQueryControllerCubeRequest $request) {
        $metamodel = data_controller_get_metamodel();

        $cube = $metamodel->getCubeByDatasetName($request->datasetName);

        $datasourceRequest = new CubeCountRequest($cube->name);

        // needs to be called before any additional methods are called
        $datasourceRequest->addOptions($request->options);

        $this->prepareRequestColumns($datasourceRequest, $cube, $request->columns);
        $this->prepareRequestQueries($datasourceRequest, $cube, $request->parameters);

        return $datasourceRequest;
    }
    public function countCubeRecords(DataControllerCallContext $callcontext, CubeCountRequest $request) {
        $cubeName = $request->getCubeName();
        LogHelper::log_notice(t('Counting SQL-based cube records: @cubeName', array('@cubeName' => $cubeName)));

        $environment_metamodel = data_controller_get_environment_metamodel();
        $metamodel = data_controller_get_metamodel();

        $this->getExtension('adjustRequest')->adjustCubeCountRequest($this, $request);

        $cube = $metamodel->getCube($cubeName);

        $factsDataset = $metamodel->getDataset($cube->factsDatasetName);
        $datasource = $environment_metamodel->getDataSource($factsDataset->datasourceName);

        $statement = $this->prepareCubeQueryStatement($callcontext, $request);
        list($isSubqueryRequired, $assembledSections) = $statement->prepareSections(NULL);

        $statement = new Statement();
        $statement->tables[] = new SubquerySection(Statement::assemble($isSubqueryRequired, NULL, $assembledSections));

        return $this->countRecords($callcontext, $datasource, array($statement));
    }