protected function finalizeRequest4Total(AbstractQueryRequest $request, AbstractQueryRequest $request4Total, array $columnNames4Total) { $totalExpressions = $request4Total->getOption(self::OPTION__TOTAL_FORMULA_EXPRESSION); // preparing returned columns $columnIndex = 0; // ... TODO existing dimensions (to support non-additive measures) /* if (isset($request->dimensions)) { foreach ($request->dimensions as $dimension) { if (isset($dimension->columns)) { foreach ($dimension->columns as $column) { $request4Total->addDimensionColumn($columnIndex++, $dimension->name, $column->name); } } else { $formula = $request->getFormula($dimension->name); if (isset($formula)) { // checking if the formula contains reference to TOTAL function if (isset($totalExpressions[$formula->name])) { // excluding the formula continue; } } $request4Total->addDimension($columnIndex++, $dimension->name); } } } */ // ... measures to calculate total foreach ($columnNames4Total as $measureName) { $formula = $request4Total->getFormula($measureName); // TODO checking if the formula expression contains any aggregation functions (eliminate when non-additive measures are supported) $handler = FormulaExpressionLanguageFactory::getInstance()->getHandler($formula->expressionLanguage); $lexemes = $handler->lex($formula->source); $syntaxTree = $handler->parse($lexemes); $isMeasure = $handler->isMeasure($syntaxTree); if (!isset($isMeasure) || !$isMeasure) { // updating expression to summarize data for the expression $formula->source = 'SUM(' . $formula->source . ')'; } $formula->isMeasure = TRUE; $request4Total->addMeasure($columnIndex++, $measureName); } // preparing data querying $dimensionQueries = $request->findDimensionQueries(); if (isset($dimensionQueries)) { foreach ($dimensionQueries as $query) { foreach ($query->columns as $queryColumn) { $request4Total->addDimensionColumnQueryValues($query->name, $queryColumn->name, $queryColumn->values); } } } $factsDatasetColumnQueries = $request->findFactsDatasetColumnQueries(); if (isset($factsDatasetColumnQueries)) { foreach ($factsDatasetColumnQueries as $query) { $request4Total->addFactsDatasetColumnQueryValues($query->name, $query->values); } } $measureQueries = $request->findMeasureQueries(); if (isset($measureQueries)) { foreach ($measureQueries as $query) { $formula = $request->getFormula($query->name); if (isset($formula)) { // checking if the formula contains reference to TOTAL function if (isset($totalExpressions[$formula->name])) { // excluding the condition continue; } } $request4Total->addMeasureQueryValues($query->name, $query->values); } } }
public function __construct($expressionLanguage = NULL) { parent::__construct(); $this->expressionLanguageHandler = FormulaExpressionLanguageFactory::getInstance()->getHandler($expressionLanguage); }
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 __construct() { parent::__construct(); $this->handlerConfigurations = module_invoke_all('dp_formula_expression_language'); }