public static function getNewDatasetName ( $datasetUuid, $datasets ) {
        $logicalDatasetUuid = StarSchemaNamingConvention::findFactsOwner($datasetUuid);

        if (isset($logicalDatasetUuid)) {
            $dataset = GD_DatasetMetaModelLoaderHelper::getDatasetByUUID($datasets, $logicalDatasetUuid);
            return StarSchemaNamingConvention::getFactsRelatedName($dataset->name);
        } else {
            $dataset = GD_DatasetMetaModelLoaderHelper::getDatasetByUUID($datasets,$datasetUuid);
            return $dataset->name;
        }
    }
    public static function getExportDatasetName ( $datasetName, MetaModel $metamodel ) {
        $logicalDatasetName = StarSchemaNamingConvention::findFactsOwner($datasetName);

        if (isset($logicalDatasetName)) {
            $dataset = $metamodel->getDataset($logicalDatasetName);
            return isset($dataset->uuid) ? StarSchemaNamingConvention::getFactsRelatedName($dataset->uuid) : null;
        } else {
            $dataset = $metamodel->getDataset($datasetName);
            return isset($dataset->uuid) ? $dataset->uuid : null;
        }
    }
    public function createDimensionStorage(DataControllerCallContext $callcontext, DataSourceStructureHandler $datasourceStructureHandler, DatasetMetaData $logicalDataset, $columnName) {
        parent::createDimensionStorage($callcontext, $datasourceStructureHandler, $logicalDataset, $columnName);

        $lookupDatasetName = StarSchemaNamingConvention::getAttributeRelatedName($logicalDataset->name, $columnName);

        $request = new DatasetStorageRequest($lookupDatasetName);
        LogHelper::log_debug($request);
        $datasourceStructureHandler->createDatasetStorage($callcontext, $request);

        $factsDatasetName = StarSchemaNamingConvention::getFactsRelatedName($logicalDataset->name);
        $request = new UpdateDatasetStorageRequest($factsDatasetName);
        $request->addOperation(new CreateColumnReferenceOperation($columnName, $lookupDatasetName));
        LogHelper::log_debug($request);
        $datasourceStructureHandler->updateDatasetStorage($callcontext, $request);
    }
    protected function submitRecordBatch(RecordMetaData $recordMetaData) {
        $dataManipulationController = data_controller_dml_get_instance();

        $identifierLoader = new StarSchemaLookupIdentifierLoader();
        $identifierLoader->load($this->datasetName, $recordMetaData, $this->recordsHolder);

        $factsDatasetName = StarSchemaNamingConvention::getFactsRelatedName($this->datasetName);

        if ($recordMetaData->findKeyColumns() == NULL) {
            $this->insertedRecordCount += $dataManipulationController->insertDatasetRecordBatch($factsDatasetName, $this->recordsHolder);
        }
        else {
            // even if we truncate the dataset we still need to support several references to the same record
            list($insertedRecordCount, $updatedRecordCount, $deletedRecordCount) =
                $dataManipulationController->insertOrUpdateOrDeleteDatasetRecordBatch($factsDatasetName, $this->recordsHolder);
            $this->insertedRecordCount += $insertedRecordCount;
            $this->updatedRecordCount += $updatedRecordCount;
            $this->deletedRecordCount += $deletedRecordCount;
        }
    }
 public static function initializeFromDataset(MetaModel $metamodel, DatasetMetaData $dataset)
 {
     $cubeName = $dataset->name;
     $cube = $metamodel->unregisterCube($cubeName);
     // preparing cube properties
     $cube->description = $dataset->description;
     // preparing facts dataset
     $factsDataset = $cube->initiateFactsDataset();
     $factsDataset->name = $cube->factsDatasetName;
     $factsDataset->publicName = $dataset->publicName;
     $factsDataset->description = $dataset->description;
     $factsDataset->datasourceName = $dataset->datasourceName;
     $factsDataset->markAsPrivate();
     $factsDataset->source = StarSchemaNamingConvention::getFactsRelatedName($dataset->source);
     // calculating facts dataset aliases
     if (isset($dataset->aliases)) {
         foreach ($dataset->aliases as $alias) {
             $factsDataset->aliases[] = StarSchemaNamingConvention::getFactsRelatedName($alias);
         }
     }
     // preparing facts dataset columns and cube dimensions
     foreach ($dataset->getColumns(FALSE) as $logicalColumn) {
         // we need to preserve original column index
         $column = $factsDataset->initiateColumn();
         $column->name = $logicalColumn->name;
         $column->columnIndex = $logicalColumn->columnIndex;
         $column->publicName = $logicalColumn->publicName;
         $column->description = $logicalColumn->description;
         $column->key = $logicalColumn->key;
         $column->persistence = $logicalColumn->persistence;
         $column->source = $logicalColumn->source;
         $column->visible = $logicalColumn->visible;
         $column->used = $logicalColumn->used;
         $column->branches = ArrayHelper::copy($logicalColumn->branches);
         $factsDataset->registerColumnInstance($column);
         self::initializeDimensionFromColumn($metamodel, $cube, $dataset, $logicalColumn->name);
         if (isset($column->type->applicationType)) {
             $column->type->logicalApplicationType = $logicalColumn->type->applicationType;
         } else {
             // setting column type to original column type
             $column->type->applicationType = $logicalColumn->type->applicationType;
         }
     }
     // preparing cube measures
     // we do that in a separate loop because a calculated column can point to another calculated column with higher column index
     foreach ($dataset->getColumns(FALSE) as $logicalColumn) {
         self::initializeMeasuresFromColumn($cube, $dataset, $logicalColumn->name);
     }
     // marking that the facts dataset object contains complete meta data & registering it in meta model
     $factsDataset->markAsComplete();
     $metamodel->registerDataset($factsDataset);
     // preparing cube measures
     self::registerCubeMeasures($cube);
     $metamodel->registerCube($cube);
     return $cube;
 }