function testDatasetUploader_registerDatasetStorage($dataset)
{
    $dataController = data_controller_get_instance();
    echo "<h2>Registering dataset</h2>\n";
    $nameSuffix = uniqid();
    $dataset->name = NameSpaceHelper::addNameSpace(DrupalDataSourceHandler::$NAME_SPACE__DEFAULT, $nameSuffix);
    $dataset->source = TABLE_PREFIX . $nameSuffix;
    $dataset->datasourceName = DrupalDataSourceHandler::$DATASOURCE__DEFAULT;
    $dataController->registerDatasetStorage(DrupalDataSourceHandler::$NAME_SPACE__DEFAULT, $dataset);
    $cube = StarSchemaCubeMetaData::initializeFromDataset(DrupalDataSourceHandler::$DATASOURCE__DEFAULT, $dataset);
    $dataController->registerCubeStorage(DrupalDataSourceHandler::$NAME_SPACE__DEFAULT, $cube);
    echo "{$dataset->name}\n";
}
    protected function generateCubes(SystemTableMetaModelLoaderCallContext $callcontext, AbstractMetaModel $metamodel) {
        $cubeCount = 0;

        $loaderName = $this->getName();

        foreach ($callcontext->logicalDatasets as $tableAccessKey => $logicalDataset) {
            $dataset = $callcontext->datasets[$tableAccessKey];

            $cubeName = $logicalDataset->name;
            $cube = new CubeMetaData();
            $cube->name = $cubeName;
            $cube->publicName = $logicalDataset->publicName;
            $cube->description = $logicalDataset->description;
            $cube->factsDatasetName = $dataset->name;
            $cube->factsDataset = $dataset;

            foreach ($logicalDataset->columns as $logicalColumn) {
                StarSchemaCubeMetaData::initializeDimensionFromColumn($metamodel, $cube, $logicalDataset, $logicalColumn->name);

                // FIXME fixing dimensions and pointing to physical datasets instead. Remove the following block once we remove support for logical datasets in cubes
                // FIXME remove support for $callcontext->logicalDatasetNameMappings property as well
                $dimension = $cube->findDimension($logicalColumn->name);
                if (isset($dimension) && isset($dimension->datasetName)) {
                    $dimensionLogicalDatasetName = $dimension->datasetName;
                    $dimensionTableAccessKey = $callcontext->logicalDatasetNameMappings[$dimensionLogicalDatasetName];
                    $dimensionDataset = $callcontext->datasets[$dimensionTableAccessKey];
                    $dimension->datasetName = $dimensionDataset->name;
                    $dimension->dataset = $dimensionDataset;
                }
            }

            foreach ($logicalDataset->columns as $logicalColumn) {
                StarSchemaCubeMetaData::initializeMeasuresFromColumn($cube, $logicalDataset, $logicalColumn->name);
            }

            StarSchemaCubeMetaData::registerCubeMeasures($cube);

            $cube->loaderName = $loaderName;
            $cube->markAsComplete();

            $metamodel->registerCube($cube);
            $cubeCount++;
        }

        LogHelper::log_info(t('Generated and registered @cubeCount cubes', array('@cubeCount' => $cubeCount)));
    }
    public function finalize(AbstractMetaModel $metamodel) {
        parent::finalize($metamodel);

        $loaderName = $this->getName();

        // initializing all cubes. We separated registration from initialization to support inter-cube references
        $loadedDatasets = NULL;
        foreach ($metamodel->datasets as $dataset) {
            // working only with datasets which are created by this loader
            if ($dataset->loaderName != $loaderName) {
                continue;
            }

            StarSchemaCubeMetaData::registerFromDataset($metamodel, $dataset);

            $loadedDatasets[$dataset->nid] = $dataset;
        }

        if (isset($loadedDatasets)) {
            $dataset_nids = array_keys($loadedDatasets);

            // loading measures
            $measureNodes = gd_measure_get_measures_4_dataset($dataset_nids, LOAD_ENTITY);
            // grouping measures in context of dataset
            $datasetsMeasureNodes = $this->groupNodesByDataset($measureNodes, 'field_measure_dataset');

            // creating cubes for all datasets
            foreach ($loadedDatasets as $dataset) {
                // preparing corresponding cube
                $cube = StarSchemaCubeMetaData::initializeFromDataset($metamodel, $dataset);
                // assigning a loader which created the cube
                $cube->factsDataset->loaderName = $loaderName;
                $cube->loaderName = $loaderName;
                // preparing additional measures
                $datasetMeasureNodes = isset($datasetsMeasureNodes[$dataset->nid]) ? $datasetsMeasureNodes[$dataset->nid] : NULL;
                if (isset($datasetMeasureNodes)) {
                    foreach ($datasetMeasureNodes as $measureNode) {
                        $measure = $cube->registerMeasure(get_node_field_value($measureNode, 'field_measure_sysname', 0, 'value', TRUE));
                        $measure->publicName = $measureNode->title;
                        $measure->description = get_node_field_value($measureNode, 'field_measure_desc');
                        $measure->function = get_node_field_value($measureNode, 'field_measure_function', 0, 'value', TRUE);
                    }
                }
            }
        }

        // processing references
        $referenceNodes = gd_reference_get_references(LOAD_ENTITY);
        $referencePointNodes = isset($referenceNodes) ? gd_reference_get_reference_points(LOAD_ENTITY) : NULL;
        if (isset($referencePointNodes)) {
            foreach ($referenceNodes as $referenceNode) {
                GD_DatasetMetaModelLoaderHelper::prepareReference($metamodel, $referenceNode, $referencePointNodes);
            }
        }
    }
    public function createColumnStorage(DataControllerCallContext $callcontext, DataSourceStructureHandler $datasourceStructureHandler, DatasetMetaData $dataset, $columnName, $stage) {
        switch ($stage) {
            case DatasetStorageObserver::STAGE__BEFORE:
                StarSchemaCubeMetaData::deinitializeByColumn($this->originalCube, $this->originalLogicalDataset, $columnName);
                break;
            case DatasetStorageObserver::STAGE__AFTER:
                $metamodel = data_controller_get_metamodel();

                $newLogicalColumn = $this->newLogicalDataset->getColumn($columnName);
                $newColumn = $dataset->getColumn($columnName);

                $originalLogicalColumn = $this->originalLogicalDataset->getColumn($columnName);

                // Note: storing logical data type for the column
                $originalLogicalColumn->initializeTypeFrom($newLogicalColumn->type, TRUE);
                $originalLogicalColumn->persistence = $newColumn->persistence;

                StarSchemaCubeMetaData::initializeFromColumn($metamodel, $this->originalCube, $this->originalLogicalDataset, $columnName);
                break;
        }

        parent::createColumnStorage($callcontext, $datasourceStructureHandler, $dataset, $columnName, $stage);
    }