public function __clone() {
        parent::__clone();

        $this->datasets = ArrayHelper::copy($this->datasets);
        $this->references = ArrayHelper::copy($this->references);
        $this->cubes = ArrayHelper::copy($this->cubes);
    }
    public function __clone() {
        parent::__clone();

        $this->groupByColumnNames = ArrayHelper::copy($this->groupByColumnNames);
        $this->subjectColumnNames = ArrayHelper::copy($this->subjectColumnNames);
        $this->formattedGroupByColumnNames = ArrayHelper::copy($this->formattedGroupByColumnNames);
        $this->formattedSubjectColumnNames = ArrayHelper::copy($this->formattedSubjectColumnNames);
    }
    public function __clone() {
        parent::__clone();

        $this->formattedColumnNames = ArrayHelper::copy($this->formattedColumnNames);

        if (isset($this->parent)) {
            $this->parent = clone $this->parent;
        }
    }
    public function __clone() {
        parent::__clone();

        $this->datasources = ArrayHelper::copy($this->datasources);
    }
    public function __clone() {
        parent::__clone();

        $this->type = clone $this->type;
        $this->branches = ArrayHelper::copy($this->branches);
    }
    public function __clone() {
        parent::__clone();

        $this->keyColumnNames = ArrayHelper::copy($this->keyColumnNames);
    }
 public function __clone() {
     parent::__clone();
     $this->queries = ArrayHelper::copy($this->queries);
     $this->sortingConfigurations = ArrayHelper::copy($this->sortingConfigurations);
 }
 public function __clone() {
     parent::__clone();
     $this->segmentLinkIds = ArrayHelper::copy($this->segmentLinkIds);
 }
    public function __clone() {
        parent::__clone();

        $this->dimensions = ArrayHelper::copy($this->dimensions);
        $this->measures = ArrayHelper::copy($this->measures);
    }
 public function __clone() {
     parent::__clone();
     $this->referencedRequests = ArrayHelper::copy($this->referencedRequests);
 }
 public function __clone() {
     parent::__clone();
     $this->points = ArrayHelper::copy($this->points);
 }
    public function __clone() {
        parent::__clone();

        $this->columnMappings = ArrayHelper::copy($this->columnMappings);
    }
    public static function cleanFunctionParameters($datasetName, $columns, $parameters, $orderBy, array $options = NULL) {
        $metamodel = data_controller_get_metamodel();
        $dataset = $metamodel->getDataset($datasetName);

        $cleanedColumns = ArrayHelper::trim($columns);

        $cleanedParameters = NULL;
        if (isset($parameters)) {
            foreach ($parameters as $key => $value) {
                $key = StringHelper::trim($key);

                // ignoring system parameters
                list($elementNameSpace) = AbstractDatasetUIMetaDataGenerator::splitElementUIMetaDataName($key);
                if (!isset($elementNameSpace)) {
                    continue;
                }

                $cleanedParameters[$key] = $value;
            }
        }

        $cleanedOrderBy = NULL;
        ArrayHelper::addUniqueValues($cleanedOrderBy, ArrayHelper::trim($orderBy));

        $cleanedOptions = NULL;
        if (isset($options)) {
            foreach ($options as $name => $option) {
                $cleanedOption = NULL;
                if (isset($option)) {
                    if ($name == AbstractQueryRequest::OPTION__FORMULA_DEF) {
                        // cleaning all formulas
                        foreach ($option as $index => $formula) {
                            $cleanedFormula = clone $formula;

                            $parser = new FormulaExpressionParser($cleanedFormula->expressionLanguage);
                            $cleanedFormula->source = $parser->parse($cleanedFormula->source, 'DatasetUIMetaDataQueryHelper::cleanFormulaExpressionColumnNames');

                            $cleanedOption[$index] = $cleanedFormula;
                        }

                        // assembling clean formulas to calculate 'measure' flag
                        if (isset($cleanedOption)) {
                            $columnReferenceFactory = new CompositeColumnReferenceFactory(array(
                                $dataset,
                                new FormulaReferenceFactory($cleanedOption)));

                            $expressionAssembler = new FormulaExpressionAssembler($columnReferenceFactory);
                            foreach ($cleanedOption as $index => $cleanedFormula) {
                                // assembling full expressions to detect if any aggregation function present
                                $expression = $expressionAssembler->assemble($cleanedFormula);
                                // process the formula expression
                                $handler = FormulaExpressionLanguageFactory::getInstance()->getHandler($cleanedFormula->expressionLanguage);
                                $lexemes = $handler->lex($expression);
                                $syntaxTree = $handler->parse($lexemes);
                                // checking if the formula expression contains references to any aggregation functions
                                $cleanedFormula->isMeasure = $handler->isMeasure($syntaxTree);
                            }
                        }
                    }
                    elseif (is_array($option)) {
                        $cleanedOption = ArrayHelper::copy($option);
                    }
                    elseif (is_object($option)) {
                        $cleanedOption = clone $option;
                    }
                    else {
                        $cleanedOption = $option;
                    }
                }

                if (isset($cleanedOption)) {
                    $cleanedOptions[$name] = $cleanedOption;
                }
            }
        }

        // adjusting list of columns we need to return
        $requestedColumnNames = NULL;
        // preparing list of unique column names
        ArrayHelper::addUniqueValues($requestedColumnNames, $cleanedColumns);
        // adding columns which are used to sort result
        if ($cleanedOrderBy) {
            foreach ($cleanedOrderBy as $directionalColumnName) {
                list($columnName, $isSortAscending) = ColumnBasedComparator_AbstractSortingConfiguration::parseDirectionalColumnName($directionalColumnName);
                ArrayHelper::addUniqueValue($requestedColumnNames, $columnName);
            }
        }

        return array($requestedColumnNames, $cleanedParameters, $cleanedOrderBy, $cleanedOptions);
    }
    public function prepareRequest4Total(AbstractQueryRequest $request) {
        $expressions = $this->collectTotalExpressions($request);
        if (!isset($expressions)) {
            return NULL;
        }

        $uniqueExpressions = NULL;
        foreach ($expressions as $formulaName => $totalExpressions) {
            ArrayHelper::addUniqueValues($uniqueExpressions, $totalExpressions);
        }

        // initializing request object
        $request4Total = $this->initializeRequest4Total($request);

        // preparing options
        $request4Total->addOptions(ArrayHelper::copy($request->options));
        // adding total expressions
        $totalExpressionColumnMapping = NULL;
        foreach ($uniqueExpressions as $index => $expression) {
            $expressionColumnName = 'sm_total_' . $index;

            $formula = new FormulaMetaData();
            $formula->name = $expressionColumnName;
            $formula->type->applicationType = NumberDataTypeHandler::DATA_TYPE;
            $formula->source = $expression;

            $request4Total->addFormula($formula);

            $totalExpressionColumnMapping[$expressionColumnName] = $expression;
        }
        $request4Total->addOption(self::OPTION__TOTAL_FORMULA_EXPRESSION, $expressions);
        $request4Total->addOption(self::OPTION__TOTAL_EXPRESSION_COLUMN_MAPPING, $totalExpressionColumnMapping);

        // finalizing the request
        $this->finalizeRequest4Total($request, $request4Total, array_keys($totalExpressionColumnMapping));

        return $request4Total;
    }
 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;
 }