public function assemble(AbstractSQLDataSourceQueryHandler $datasourceHandler, AbstractQueryRequest $request, DatasetMetaData $dataset, array $columnNames = NULL) {
        $engine = QueryEngineFactory::getInstance()->getHandler();

        $statement = $engine->newSelectStatement();

        // FIXME use the following code
/*      // the following code was commended out because functionality in Statement::findColumnTableByReferencePath() $table->dataset->name
        $tableName = assemble_database_entity_name($datasourceHandler, $dataset->datasourceName, $dataset->source);

        $table = $statement->newTable($tableName);
*/
        $table = new DatasetSection($dataset);
        $statement->tables[] = $table;

        if (isset($columnNames)) {
            $columnReferenceFactory = new CompositeColumnReferenceFactory(array(
                $dataset,
                new FormulaReferenceFactory($request->getFormulas())));

            $expressionAssembler = new FormulaExpressionAssembler($columnReferenceFactory);

            foreach ($columnNames as $columnName) {
                $column = $columnReferenceFactory->findColumn($columnName);

                if (isset($column) && ($column->persistence == FormulaMetaData::PERSISTENCE__CALCULATED)) {
                    $table->newCalculatedColumn($expressionAssembler->assemble($column), $columnName);
                }
                else {
                    $table->newColumn($columnName);
                }
            }
        }

        return $statement;
    }
    protected function assembleUsedFormulaExpressions(AbstractQueryRequest $request) {
        $usedFormulaExpressions = NULL;

        // assembling all used formulas to find all referenced formulas
        $usedFormulaNames = $this->collectReferencedFormulaNames($request);
        if (isset($usedFormulaNames)) {
            $columnReferenceFactory = new CompositeColumnReferenceFactory(array(
                $this->prepareRequestDataset($request),
                new FormulaReferenceFactory($request->getFormulas())));

            $index = 0;
            while (count($usedFormulaNames) > $index) {
                $formulaName = $usedFormulaNames[$index];

                $formula = $columnReferenceFactory->getColumn($formulaName);

                $expressionAssembler = new __TotalInFormulaExpressionRequestPreparer__FormulaExpressionAssembler($columnReferenceFactory);
                $usedFormulaExpressions[$formulaName] = $expressionAssembler->assemble($formula);
                ArrayHelper::addUniqueValues($usedFormulaNames, $expressionAssembler->usedFormulaNames);

                $index++;
            }
        }

        return $usedFormulaExpressions;
    }