public function finalize(DataControllerCallContext $callcontext, DatasetMetaData $dataset) {
        if ($this->datasetStructureModified) {
            $assembler = new DatasetUIMetaDataAssembler();
            // preparing possible combinations of cache names for the dataset
            $cacheEntryNames = array(
                $assembler->prepareCacheEntryName($dataset->name, FALSE),
                $assembler->prepareCacheEntryName($dataset->name, TRUE));
            // removing assembled UI Meta Data from cache
            $assembler->cache->expireCacheEntries($cacheEntryNames);
        }

        parent::finalize($callcontext, $dataset);
    }
    /**
     * @static
     * @param $datasetName
     * @param $columns
     * @param $parameters
     * @param $orderBy
     * @param $options
     * @return DataControllerQueryObject[]
     */
    public static function prepareDataQueryControllerRequest($datasetName, $columns, $parameters, $orderBy, array $options = NULL) {
        $metamodel = data_controller_get_metamodel();

        list($cleanedColumns, $cleanedParameters, $cleanedOrderBy, $cleanedOptions) = self::cleanFunctionParameters($datasetName, $columns, $parameters, $orderBy, $options);

        // preparing list of columns which are used to filter data

        $parsedUIMetaDataNames = NULL;
        $parameterColumnNames = NULL;
        if (isset($cleanedParameters)) {
            ArrayHelper::addUniqueValues($parameterColumnNames, array_keys($cleanedParameters));
            if (isset($parameterColumnNames)) {
                foreach ($parameterColumnNames as $uiMetaDataName) {
                    $parsedUIMetaDataNames[$uiMetaDataName] = self::parseUIMetaDataName($datasetName, $uiMetaDataName, $cleanedOptions);
                }
            }
        }

        // looking for all datasets/[cubes] we need to work with
        $connectedDatasetNames = array($datasetName);

        $cubes = NULL;

        $wereColumnNamesRequested = isset($cleanedColumns);
        // if no columns were selected we need to use all columns available
        $isCube = FALSE;
        if (!$wereColumnNamesRequested) {
            $assembler = new DatasetUIMetaDataAssembler();
            $uiMetaData = $assembler->assemble($datasetName);

            if (isset($parameterColumnNames)) {
                ArrayHelper::addUniqueValues($connectedDatasetNames, self::detectConnectedDatasetsBySelectedColumns($parsedUIMetaDataNames));

                foreach ($connectedDatasetNames as $connectedDatasetName) {
                    $cube = $metamodel->findCubeByDatasetName($connectedDatasetName);
                    if (isset($cube)) {
                        $cubes[$connectedDatasetName] = $cube;
                    }
                }

                $isCube = self::detectRequestTypeBySelectedColumns($cubes, $parsedUIMetaDataNames, NULL, $parameterColumnNames);
            }

            // we need to load list of all available columns from requested dataset
            $uiMetaData->prepareElementNames($cleanedColumns, FALSE);
        }

        // adding requested columns to list of parsed columns
        if (isset($cleanedColumns)) {
            foreach ($cleanedColumns as $uiMetaDataName) {
                $parsedUIMetaDataNames[$uiMetaDataName] = self::parseUIMetaDataName($datasetName, $uiMetaDataName, $cleanedOptions);
            }
        }

        // updating list of datasets/[cubes] we need to work with
        ArrayHelper::addUniqueValues($connectedDatasetNames, self::detectConnectedDatasetsBySelectedColumns($parsedUIMetaDataNames));

        // loading meta data for additional participating cubes
        foreach ($connectedDatasetNames as $connectedDatasetName) {
            if (!isset($cubes[$connectedDatasetName])) {
                $cube = $metamodel->findCubeByDatasetName($connectedDatasetName);
                if (isset($cube)) {
                    $cubes[$connectedDatasetName] = $cube;
                }
            }
        }

        if ($wereColumnNamesRequested) {
            $isCube = self::detectRequestTypeBySelectedColumns($cubes, $parsedUIMetaDataNames, $cleanedColumns, $parameterColumnNames);
        }

        $request = $isCube ? new DataQueryControllerCubeRequest() : new DataQueryControllerDatasetRequest();
        $request->datasetName = $datasetName;
        $request->options = $cleanedOptions;

        $columnMappings = $isCube
            ? self::prepareCubeColumnMappings($cubes, $parsedUIMetaDataNames)
            : self::prepareListColumnMappings($cubes, $parsedUIMetaDataNames);

        $request->columns = self::mapColumns($parsedUIMetaDataNames, $columnMappings, $cleanedColumns, $isCube);
        $request->parameters = self::mapParameters($parsedUIMetaDataNames, $columnMappings, $cleanedParameters, $isCube);
        $request->orderBy = self::mapOrderBy($parsedUIMetaDataNames, $columnMappings, $cleanedOrderBy, $isCube);
        $request->resultFormatter = new ColumnMappingResultFormatter(array_flip($columnMappings));

        return $request;
    }