/**
 * Copyright (c) 2013, 2016 - Loetz GmbH&Co.KG, 69115 Heidelberg, Germany
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 */
package org.eclipse.osbp.xtext.datamartdsl.jvmmodel;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.inject.Inject;
import mondrian.rolap.RolapConnection;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.bpm.api.IBPMEngine;
import org.eclipse.osbp.bpm.api.IBPMTaskClient;
import org.eclipse.osbp.core.api.persistence.IPersistenceService;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.dsl.common.xtext.extensions.AnnotationExtension;
import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
import org.eclipse.osbp.dsl.entity.xtext.extensions.NamingExtensions;
import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
import org.eclipse.osbp.dsl.semantic.common.types.LKeyAndValue;
import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
import org.eclipse.osbp.dsl.semantic.entity.LBean;
import org.eclipse.osbp.dsl.semantic.entity.LBeanAttribute;
import org.eclipse.osbp.dsl.semantic.entity.LEntity;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
import org.eclipse.osbp.preferences.EnumDatabaseVendor;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
import org.eclipse.osbp.ui.api.datamart.DatamartPrimary;
import org.eclipse.osbp.ui.api.datamart.IDataMart;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.user.IUser;
import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
import org.eclipse.osbp.utils.common.EntityUtils;
import org.eclipse.osbp.utils.entityhelper.DataType;
import org.eclipse.osbp.xtext.cubedsl.CubeDimension;
import org.eclipse.osbp.xtext.cubedsl.CubeLevel;
import org.eclipse.osbp.xtext.cubedsl.CubePackage;
import org.eclipse.osbp.xtext.cubedsl.CubeTypeEntity;
import org.eclipse.osbp.xtext.datamart.common.ACubeDatamart;
import org.eclipse.osbp.xtext.datamart.common.AEntityDatamart;
import org.eclipse.osbp.xtext.datamart.common.ATaskDatamart;
import org.eclipse.osbp.xtext.datamart.common.DatamartDefinitionUtil;
import org.eclipse.osbp.xtext.datamart.common.DatamartDtoMapper;
import org.eclipse.osbp.xtext.datamart.common.olap.DerivedCellSet;
import org.eclipse.osbp.xtext.datamartdsl.Addition;
import org.eclipse.osbp.xtext.datamartdsl.AxisEnum;
import org.eclipse.osbp.xtext.datamartdsl.ConditionalExpression;
import org.eclipse.osbp.xtext.datamartdsl.Conjunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAggregation;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAggregationFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAggregationFunctionInterface;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAttribute;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAttributeBase;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAxis;
import org.eclipse.osbp.xtext.datamartdsl.DatamartColumn;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCondition;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCube;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCubeAxis;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCubeElement;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLFactory;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefineDerivedMeasure;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDerivedMeasure;
import org.eclipse.osbp.xtext.datamartdsl.DatamartElement;
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
import org.eclipse.osbp.xtext.datamartdsl.DatamartFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartFunctionIntParameter;
import org.eclipse.osbp.xtext.datamartdsl.DatamartFunctionInterface;
import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchy;
import org.eclipse.osbp.xtext.datamartdsl.DatamartMeasure;
import org.eclipse.osbp.xtext.datamartdsl.DatamartMember;
import org.eclipse.osbp.xtext.datamartdsl.DatamartMemberTuple;
import org.eclipse.osbp.xtext.datamartdsl.DatamartNavigation;
import org.eclipse.osbp.xtext.datamartdsl.DatamartOrder;
import org.eclipse.osbp.xtext.datamartdsl.DatamartOwner;
import org.eclipse.osbp.xtext.datamartdsl.DatamartPackage;
import org.eclipse.osbp.xtext.datamartdsl.DatamartParameterFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartReference;
import org.eclipse.osbp.xtext.datamartdsl.DatamartReferenceBase;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetAggregation;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetAggregationFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetFunctionInterface;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetParameterFunction;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetTuple;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSlicer;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSource;
import org.eclipse.osbp.xtext.datamartdsl.DatamartTask;
import org.eclipse.osbp.xtext.datamartdsl.DatamartTaskFilter;
import org.eclipse.osbp.xtext.datamartdsl.Disjunction;
import org.eclipse.osbp.xtext.datamartdsl.Division;
import org.eclipse.osbp.xtext.datamartdsl.Expression;
import org.eclipse.osbp.xtext.datamartdsl.Multiplication;
import org.eclipse.osbp.xtext.datamartdsl.Subtraction;
import org.eclipse.osbp.xtext.datamartdsl.util.DatamartAttributeUtil;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.common.types.JvmAnnotationReference;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.ListExtensions;
import org.eclipse.xtext.xbase.lib.Pair;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.StringExtensions;
import org.junit.Test;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.slf4j.Logger;

/**
 * <p>Infers a JVM model from the source model.</p>
 * 
 * <p>The JVM model should contain all elements that would appear in the Java code
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>
 */
@SuppressWarnings("all")
public class DatamartDSLJvmModelInferrer extends AbstractModelInferrer {
  /**
   * convenience API to build and initialize JVM types and their members.
   */
  @Inject
  @Extension
  private JvmTypesBuilder _jvmTypesBuilder;
  
  @Inject
  @Extension
  private IQualifiedNameProvider _iQualifiedNameProvider;
  
  @Inject
  @Extension
  private NamingExtensions _namingExtensions;
  
  @Inject
  @Extension
  private TypeReferences _typeReferences;
  
  @Inject
  @Extension
  private AnnotationExtension _annotationExtension;
  
  @Inject
  @Extension
  private ModelExtensions _modelExtensions;
  
  @Inject
  @Extension
  private DataType dtType;
  
  private HashMap<String, Integer> sqlAliasCounter = CollectionLiterals.<String, Integer>newHashMap();
  
  private HashMap<String, DatamartAttributeBase> sqlFilterMap = CollectionLiterals.<String, DatamartAttributeBase>newHashMap();
  
  private HashMap<String, LEntity> idMap = CollectionLiterals.<String, LEntity>newHashMap();
  
  private String datamartDtoMapper = ((String) null);
  
  private boolean ignoreEntityGrouping = false;
  
  private boolean sqlHasAggregate = false;
  
  private boolean sqlHasOrder = false;
  
  public static String pckgName = null;
  
  private String binderClassName = "";
  
  private int defaultColumnWeight = 500;
  
  public void generatePckgName(final DatamartPackage pckg, final IJvmDeclaredTypeAcceptor acceptor) {
    DatamartDSLJvmModelInferrer.pckgName = pckg.getName();
  }
  
  /**
   * <p>infer method dispatches the neccessary routines to build fields, setter, getter, constructors and methods of the generated code.</p>
   */
  protected void _infer(final DatamartPackage datamart, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
    this.generatePckgName(datamart, acceptor);
    JvmGenericType cls = this._jvmTypesBuilder.toClass(datamart, datamart.getName().toString().concat("TestClass"));
    cls.setSimpleName(StringExtensions.toFirstUpper(cls.getSimpleName()));
    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(SuppressWarnings.class, "serial");
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
      it.setPackageName(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).toString());
      this.toTestCalls(it, datamart);
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(datamart));
    };
    acceptor.<JvmGenericType>accept(cls, _function);
    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(datamart).toString();
    String _plus = (_string + ".");
    String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
    String _plus_1 = (_plus + _firstUpper);
    String _plus_2 = (_plus_1 + "ServiceBinder");
    this.binderClassName = _plus_2;
    cls = this._jvmTypesBuilder.toClass(datamart, datamart.getName().toString().concat("ServiceBinder"));
    cls.setSimpleName(StringExtensions.toFirstUpper(cls.getSimpleName()));
    final Procedure1<JvmGenericType> _function_1 = (JvmGenericType it) -> {
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(SuppressWarnings.class, "serial");
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
      EList<JvmAnnotationReference> _annotations_1 = it.getAnnotations();
      JvmAnnotationReference _annotationRef_1 = this._annotationTypesBuilder.annotationRef(Component.class);
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef_1);
      it.setPackageName(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).toString());
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(datamart));
      this.toBinderFields(it, datamart);
      this.toBinderOperations(it, datamart);
    };
    acceptor.<JvmGenericType>accept(cls, _function_1);
    EList<DatamartDefinition> _definitions = datamart.getDefinitions();
    for (final DatamartDefinition definition : _definitions) {
      QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(definition);
      String _plus_3 = (_fullyQualifiedName + IDataMart.DATAMART_CLASS_POSTFIX);
      final Procedure1<JvmGenericType> _function_2 = (JvmGenericType it) -> {
        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(SuppressWarnings.class, "serial");
        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
        it.setPackageName(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).toString());
        DatamartSource _source = definition.getSource();
        if ((_source instanceof DatamartEntity)) {
          EList<JvmTypeReference> _superTypes = it.getSuperTypes();
          JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(AEntityDatamart.class);
          this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
        }
        DatamartSource _source_1 = definition.getSource();
        if ((_source_1 instanceof DatamartCube)) {
          EList<JvmTypeReference> _superTypes_1 = it.getSuperTypes();
          JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(ACubeDatamart.class);
          this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes_1, _typeRef_1);
        }
        DatamartSource _source_2 = definition.getSource();
        if ((_source_2 instanceof DatamartTask)) {
          EList<JvmTypeReference> _superTypes_2 = it.getSuperTypes();
          JvmTypeReference _typeRef_2 = this._typeReferenceBuilder.typeRef(ATaskDatamart.class);
          this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes_2, _typeRef_2);
        }
        this.toFields(it, definition);
        this.toGetterSetter(it, definition);
        this.toOperations(it, definition, datamart);
      };
      acceptor.<JvmGenericType>accept(this._jvmTypesBuilder.toClass(definition, _plus_3), _function_2);
    }
  }
  
  public void toTestCalls(final JvmGenericType type, final DatamartPackage datamart) {
    JvmOperation operation = null;
    EList<DatamartDefinition> _definitions = datamart.getDefinitions();
    for (final DatamartDefinition definition : _definitions) {
      {
        final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
          EList<JvmAnnotationReference> _annotations = it.getAnnotations();
          JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Test.class);
          this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
          final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder = new StringConcatenation();
            String _allTestcalls = this.getAllTestcalls(definition);
            _builder.append(_allTestcalls);
            it_1.append(_builder);
          };
          this._jvmTypesBuilder.setBody(it, _function_1);
        };
        operation = this._jvmTypesBuilder.toMethod(definition, "test".concat(definition.getName()), this._typeReferenceBuilder.typeRef(Void.TYPE), _function);
        EList<JvmMember> _members = type.getMembers();
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
      }
    }
  }
  
  public String getAllTestcalls(final DatamartDefinition definition) {
    String body = "";
    StringConcatenation _builder = new StringConcatenation();
    _builder.append(body);
    _builder.newLineIfNotEmpty();
    String _name = definition.getName();
    _builder.append(_name);
    _builder.append("Datamart ");
    String _firstLower = StringExtensions.toFirstLower(definition.getName());
    _builder.append(_firstLower);
    _builder.append("Datamart = new ");
    String _name_1 = definition.getName();
    _builder.append(_name_1);
    _builder.append("Datamart();");
    _builder.newLineIfNotEmpty();
    String _firstLower_1 = StringExtensions.toFirstLower(definition.getName());
    _builder.append(_firstLower_1);
    _builder.append("Datamart.setUser(new User(\"");
    _builder.append(IUserAccessService.ADMINISTRATOR);
    _builder.append("\"));");
    _builder.newLineIfNotEmpty();
    _builder.append(body);
    String _firstLower_2 = StringExtensions.toFirstLower(definition.getName());
    _builder.append(_firstLower_2);
    _builder.append("Datamart.Test");
    String _name_2 = definition.getName();
    _builder.append(_name_2);
    _builder.append("();");
    _builder.newLineIfNotEmpty();
    body = _builder.toString();
    return body;
  }
  
  public void toBinderFields(final JvmDeclaredType type, final DatamartPackage datamart) {
    JvmField field = null;
    final Procedure1<JvmField> _function = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("org.slf4j.LoggerFactory.getLogger(\"servicebinder\")");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_1);
    };
    field = this._jvmTypesBuilder.toField(datamart, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function);
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
    field = this._jvmTypesBuilder.toField(datamart, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_1 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
    field = this._jvmTypesBuilder.toField(datamart, "bpmEngine", this._typeReferenceBuilder.typeRef(IBPMEngine.class));
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_2 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_2, field);
    field = this._jvmTypesBuilder.toField(datamart, "userAccessService", this._typeReferenceBuilder.typeRef(IUserAccessService.class));
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_3 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_3, field);
    field = this._jvmTypesBuilder.toField(datamart, "dslMetadataService", this._typeReferenceBuilder.typeRef(IDSLMetadataService.class));
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_4 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_4, field);
    field = this._jvmTypesBuilder.toField(datamart, "taskClient", this._typeReferenceBuilder.typeRef(IBPMTaskClient.class));
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_5 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_5, field);
  }
  
  public void toBinderOperations(final JvmDeclaredType type, final DatamartPackage datamart) {
    EList<JvmMember> _members = type.getMembers();
    final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setStatic(true);
      final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return persistenceService;");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_1);
    };
    JvmOperation _method = this._jvmTypesBuilder.toMethod(datamart, "getPersistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class), _function);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members, _method);
    EList<JvmMember> _members_1 = type.getMembers();
    final Procedure1<JvmOperation> _function_1 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setStatic(true);
      final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return bpmEngine;");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_2);
    };
    JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(datamart, "getBpmEngine", this._typeReferenceBuilder.typeRef(IBPMEngine.class), _function_1);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method_1);
    EList<JvmMember> _members_2 = type.getMembers();
    final Procedure1<JvmOperation> _function_2 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setStatic(true);
      final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return userAccessService;");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_3);
    };
    JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(datamart, "getUserAccessService", this._typeReferenceBuilder.typeRef(IUserAccessService.class), _function_2);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_2);
    EList<JvmMember> _members_3 = type.getMembers();
    final Procedure1<JvmOperation> _function_3 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setStatic(true);
      final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return dslMetadataService;");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_4);
    };
    JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(datamart, "getDSLMetadataService", this._typeReferenceBuilder.typeRef(IDSLMetadataService.class), _function_3);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_3);
    EList<JvmMember> _members_4 = type.getMembers();
    final Procedure1<JvmOperation> _function_4 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setStatic(true);
      final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return taskClient;");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_5);
    };
    JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(datamart, "getTaskClient", this._typeReferenceBuilder.typeRef(IBPMTaskClient.class), _function_4);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method_4);
    EList<JvmMember> _members_5 = type.getMembers();
    final Procedure1<JvmOperation> _function_5 = (JvmOperation it) -> {
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Reference.class);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.MANDATORY);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.STATIC);
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".persistenceService = persistenceService;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart PersistenceService bound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_6);
    };
    JvmOperation _method_5 = this._jvmTypesBuilder.toMethod(datamart, "bindPersistenceMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_5);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_5);
    EList<JvmMember> _members_6 = type.getMembers();
    final Procedure1<JvmOperation> _function_6 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".persistenceService = null;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart PersistenceService unbound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_7);
    };
    JvmOperation _method_6 = this._jvmTypesBuilder.toMethod(datamart, "unbindPersistenceMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_6);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, _method_6);
    EList<JvmMember> _members_7 = type.getMembers();
    final Procedure1<JvmOperation> _function_7 = (JvmOperation it) -> {
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Reference.class);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.OPTIONAL);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.DYNAMIC);
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "bpmEngine", this._typeReferenceBuilder.typeRef(IBPMEngine.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_8 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".bpmEngine = bpmEngine;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart BPMEngine bound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_8);
    };
    JvmOperation _method_7 = this._jvmTypesBuilder.toMethod(datamart, "bindBPMMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_7);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, _method_7);
    EList<JvmMember> _members_8 = type.getMembers();
    final Procedure1<JvmOperation> _function_8 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "bpmEngine", this._typeReferenceBuilder.typeRef(IBPMEngine.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".bpmEngine = null;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart BPMEngine unbound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_9);
    };
    JvmOperation _method_8 = this._jvmTypesBuilder.toMethod(datamart, "unbindBPMMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_8);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, _method_8);
    EList<JvmMember> _members_9 = type.getMembers();
    final Procedure1<JvmOperation> _function_9 = (JvmOperation it) -> {
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Reference.class);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.MANDATORY);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.STATIC);
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "userAccessService", this._typeReferenceBuilder.typeRef(IUserAccessService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".userAccessService = userAccessService;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart UserAccessService bound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_10);
    };
    JvmOperation _method_9 = this._jvmTypesBuilder.toMethod(datamart, "bindUserAccessMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_9);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_9, _method_9);
    EList<JvmMember> _members_10 = type.getMembers();
    final Procedure1<JvmOperation> _function_10 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "userAccessService", this._typeReferenceBuilder.typeRef(IUserAccessService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_11 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".userAccessService = null;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart UserAccessService unbound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_11);
    };
    JvmOperation _method_10 = this._jvmTypesBuilder.toMethod(datamart, "unbindUserAccessMethod", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_10);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_10, _method_10);
    EList<JvmMember> _members_11 = type.getMembers();
    final Procedure1<JvmOperation> _function_11 = (JvmOperation it) -> {
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Reference.class);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.MANDATORY);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.STATIC);
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "dslMetadataService", this._typeReferenceBuilder.typeRef(IDSLMetadataService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_12 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".dslMetadataService = dslMetadataService;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart DSLMetadataService bound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_12);
    };
    JvmOperation _method_11 = this._jvmTypesBuilder.toMethod(datamart, "bindDSLMetadataService", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_11);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_11, _method_11);
    EList<JvmMember> _members_12 = type.getMembers();
    final Procedure1<JvmOperation> _function_12 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "dslMetadataService", this._typeReferenceBuilder.typeRef(IDSLMetadataService.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_13 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".dslMetadataService = null;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart DSLMetadataService unbound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_13);
    };
    JvmOperation _method_12 = this._jvmTypesBuilder.toMethod(datamart, "unbindDSLMetadataService", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_12);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_12, _method_12);
    EList<JvmMember> _members_13 = type.getMembers();
    final Procedure1<JvmOperation> _function_13 = (JvmOperation it) -> {
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Reference.class);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "cardinality", ReferenceCardinality.OPTIONAL);
      this._annotationExtension.addAnnAttr(annotationRef, datamart, "policy", ReferencePolicy.DYNAMIC);
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "taskClient", this._typeReferenceBuilder.typeRef(IBPMTaskClient.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_14 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".taskClient = taskClient;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart BPMTaskClient bound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_14);
    };
    JvmOperation _method_13 = this._jvmTypesBuilder.toMethod(datamart, "bindTaskClient", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_13);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_13, _method_13);
    EList<JvmMember> _members_14 = type.getMembers();
    final Procedure1<JvmOperation> _function_14 = (JvmOperation it) -> {
      it.setVisibility(JvmVisibility.PUBLIC);
      it.setSynchronized(true);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(datamart, "taskClient", this._typeReferenceBuilder.typeRef(IBPMTaskClient.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_15 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
        String _plus = (_firstUpper + "ServiceBinder");
        _builder.append(_plus);
        _builder.append(".taskClient = null;");
        _builder.newLineIfNotEmpty();
        _builder.append("log.debug(\"Datamart BPMTaskClient unbound\");");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_15);
    };
    JvmOperation _method_14 = this._jvmTypesBuilder.toMethod(datamart, "unbindTaskClient", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_14);
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_14, _method_14);
  }
  
  /**
   * <p>build the class variables for each datamart definition.</p>
   */
  public void toFields(final JvmDeclaredType type, final DatamartDefinition definition) {
    final HashMap<String, LAttribute> typesMap = CollectionLiterals.<String, LAttribute>newHashMap();
    final HashMap<String, LEntity> entityMap = CollectionLiterals.<String, LEntity>newHashMap();
    JvmField field = null;
    final Procedure1<JvmField> _function = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("org.slf4j.LoggerFactory.getLogger(\"datamarts\")");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_1);
    };
    field = this._jvmTypesBuilder.toField(definition, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function);
    field.setStatic(true);
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
    field = this._jvmTypesBuilder.toField(definition, "user", this._typeReferenceBuilder.typeRef(IUser.class));
    field.setVisibility(JvmVisibility.PRIVATE);
    EList<JvmMember> _members_1 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_1, field);
    DatamartSource _source = definition.getSource();
    if ((_source instanceof DatamartCube)) {
      final Procedure1<JvmField> _function_1 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("\"");
          String _createMDXStatement = this.createMDXStatement(definition);
          _builder.append(_createMDXStatement);
          _builder.append("\"");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_2);
      };
      field = this._jvmTypesBuilder.toField(definition, "statement", this._typeReferenceBuilder.typeRef(String.class), _function_1);
      EList<JvmMember> _members_2 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_2, field);
      final Procedure1<JvmField> _function_2 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("null");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_3);
      };
      field = this._jvmTypesBuilder.toField(definition, "connection", this._typeReferenceBuilder.typeRef(RolapConnection.class), _function_2);
      EList<JvmMember> _members_3 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_3, field);
      final Procedure1<JvmField> _function_3 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new DatamartDtoMapper()");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_4);
      };
      field = this._jvmTypesBuilder.toField(definition, "datamartDtoMapper", this._typeReferenceBuilder.typeRef(DatamartDtoMapper.class), _function_3);
      EList<JvmMember> _members_4 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_4, field);
    }
    DatamartSource _source_1 = definition.getSource();
    if ((_source_1 instanceof DatamartEntity)) {
      final Procedure1<JvmField> _function_4 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new HashMap<String, Map<String, String>>()");
          DatamartSource _source_2 = definition.getSource();
          String _createFilterAttributeProperties = this.createFilterAttributeProperties(((DatamartEntity) _source_2));
          _builder.append(_createFilterAttributeProperties);
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_5);
      };
      field = this._jvmTypesBuilder.toField(definition, "dateFilterAttributeProperties", 
        this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
          this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
            this._typeReferenceBuilder.typeRef(String.class))), _function_4);
      field.setVisibility(JvmVisibility.PRIVATE);
      EList<JvmMember> _members_5 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_5, field);
      final Procedure1<JvmField> _function_5 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("\"");
          DatamartSource _source_2 = definition.getSource();
          String _createSQLStatements = this.createSQLStatements(definition, ((DatamartEntity) _source_2), typesMap, entityMap);
          _builder.append(_createSQLStatements);
          _builder.append("\"");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_6);
      };
      field = this._jvmTypesBuilder.toField(definition, "statement", 
        this._typeReferenceBuilder.typeRef(String.class), _function_5);
      EList<JvmMember> _members_6 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_6, field);
      final Procedure1<JvmField> _function_6 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(this.datamartDtoMapper);
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_7);
      };
      field = this._jvmTypesBuilder.toField(definition, "datamartDtoMapper", this._typeReferenceBuilder.typeRef(DatamartDtoMapper.class), _function_6);
      EList<JvmMember> _members_7 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_7, field);
      final Procedure1<JvmField> _function_7 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_8 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("null");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_8);
      };
      field = this._jvmTypesBuilder.toField(definition, "connection", this._typeReferenceBuilder.typeRef(Connection.class), _function_7);
      EList<JvmMember> _members_8 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_8, field);
      final Procedure1<JvmField> _function_8 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new HashMap<Integer,ArrayList<String>>() ");
          String _createAxisMap = this.createAxisMap(definition, entityMap);
          _builder.append(_createAxisMap);
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_9);
      };
      field = this._jvmTypesBuilder.toField(definition, "axisMap", 
        this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(Integer.class), 
          this._typeReferenceBuilder.typeRef(ArrayList.class, this._typeReferenceBuilder.typeRef(String.class))), _function_8);
      EList<JvmMember> _members_9 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_9, field);
    }
    DatamartSource _source_2 = definition.getSource();
    if ((_source_2 instanceof DatamartTask)) {
      final Procedure1<JvmField> _function_9 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new HashMap<Integer,ArrayList<String>>() ");
          String _createAxisMap = this.createAxisMap(definition, entityMap);
          _builder.append(_createAxisMap);
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_10);
      };
      field = this._jvmTypesBuilder.toField(definition, "axisMap", 
        this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(Integer.class), 
          this._typeReferenceBuilder.typeRef(ArrayList.class, this._typeReferenceBuilder.typeRef(String.class))), _function_9);
      EList<JvmMember> _members_10 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_10, field);
      final Procedure1<JvmField> _function_10 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_11 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new DatamartDtoMapper()");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_11);
      };
      field = this._jvmTypesBuilder.toField(definition, "datamartDtoMapper", this._typeReferenceBuilder.typeRef(DatamartDtoMapper.class), _function_10);
      EList<JvmMember> _members_11 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_11, field);
    }
    final Procedure1<JvmField> _function_11 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_12 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new HashMap<String,EType>() ");
        String _createIdMap = this.createIdMap(definition);
        _builder.append(_createIdMap);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_12);
    };
    field = this._jvmTypesBuilder.toField(definition, "idMap", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(IDataMart.EType.class)), _function_11);
    EList<JvmMember> _members_12 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_12, field);
    final Procedure1<JvmField> _function_12 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_13 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new ArrayList<DatamartPrimary<?>>() ");
        String _createPrimaryList = this.createPrimaryList(definition);
        _builder.append(_createPrimaryList);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_13);
    };
    field = this._jvmTypesBuilder.toField(definition, "primaryList", 
      this._typeReferenceBuilder.typeRef(ArrayList.class, 
        this._typeReferences.getTypeForName(DatamartPrimary.class, definition, this._typeReferenceBuilder.wildcard())), _function_12);
    EList<JvmMember> _members_13 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_13, field);
    final Procedure1<JvmField> _function_13 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_14 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new HashMap<String,HashMap<String,EType>>() ");
        String _createTypesMaps = this.createTypesMaps(definition, typesMap);
        _builder.append(_createTypesMaps);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_14);
    };
    field = this._jvmTypesBuilder.toField(definition, "typesMap", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
          this._typeReferenceBuilder.typeRef(IDataMart.EType.class))), _function_13);
    EList<JvmMember> _members_14 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_14, field);
    final Procedure1<JvmField> _function_14 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_15 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new HashMap<String, String>() ");
        String _createTypesProps = this.createTypesProps(definition, typesMap);
        _builder.append(_createTypesProps);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_15);
    };
    field = this._jvmTypesBuilder.toField(definition, "typesProp", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(String.class)), _function_14);
    EList<JvmMember> _members_15 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_15, field);
    final Procedure1<JvmField> _function_15 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_16 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new HashMap<String,String>()");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_16);
    };
    field = this._jvmTypesBuilder.toField(definition, "resultAttributes", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(String.class)), _function_15);
    EList<JvmMember> _members_16 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_16, field);
  }
  
  /**
   * <p>build the getters and setters from class variables of datamart definition.</p>
   */
  public void toGetterSetter(final JvmDeclaredType type, final DatamartDefinition definition) {
    JvmOperation operation = null;
    operation = this._jvmTypesBuilder.toGetter(definition, "idMap", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(IDataMart.EType.class)));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
    operation = this._jvmTypesBuilder.toGetter(definition, "primaryList", 
      this._typeReferenceBuilder.typeRef(ArrayList.class, 
        this._typeReferences.getTypeForName(DatamartPrimary.class, definition, this._typeReferenceBuilder.wildcard())));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_1 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
    if (((definition.getSource() instanceof DatamartEntity) || (definition.getSource() instanceof DatamartTask))) {
      operation = this._jvmTypesBuilder.toGetter(definition, "axisMap", 
        this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(Integer.class), 
          this._typeReferenceBuilder.typeRef(ArrayList.class, this._typeReferenceBuilder.typeRef(String.class))));
      operation.setVisibility(JvmVisibility.PUBLIC);
      EList<JvmMember> _members_2 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
    }
    operation = this._jvmTypesBuilder.toGetter(definition, "typesProp", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(String.class)));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_3 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
    operation = this._jvmTypesBuilder.toGetter(definition, "user", this._typeReferenceBuilder.typeRef(IUser.class));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_4 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
    operation = this._jvmTypesBuilder.toSetter(definition, "user", this._typeReferenceBuilder.typeRef(IUser.class));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_5 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
  }
  
  /**
   * <p>build the methods separately for cube, entity and task or SQL and MDX respective.</p>
   */
  public void toOperations(final JvmDeclaredType type, final DatamartDefinition definition, final DatamartPackage datamart) {
    JvmOperation operation = null;
    final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
      final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return new ArrayList<DatamartFilter>() ");
        String _createFilterMap = this.createFilterMap(definition);
        _builder.append(_createFilterMap);
        _builder.append(";");
        _builder.newLineIfNotEmpty();
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_1);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "initializeFilterMap", 
      this._typeReferenceBuilder.typeRef(ArrayList.class, this._typeReferenceBuilder.typeRef(DatamartFilter.class)), _function);
    operation.setVisibility(JvmVisibility.PROTECTED);
    EList<JvmMember> _members = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members, operation);
    final Procedure1<JvmOperation> _function_1 = (JvmOperation it) -> {
      final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return \"");
        String _createPrimaryFilterId = this.createPrimaryFilterId(definition);
        _builder.append(_createPrimaryFilterId);
        _builder.append("\";");
        _builder.newLineIfNotEmpty();
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_2);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "getPrimaryFilterId", this._typeReferenceBuilder.typeRef(String.class), _function_1);
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_1 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
    final Procedure1<JvmOperation> _function_2 = (JvmOperation it) -> {
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
      final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        {
          DatamartSource _source = definition.getSource();
          if ((_source instanceof DatamartCube)) {
            _builder.append("try {");
            _builder.newLine();
            _builder.append("\t");
            _builder.append(this.binderClassName, "\t");
            _builder.append(".getPersistenceService().clearCubeCache(");
            _builder.append(this.binderClassName, "\t");
            _builder.append(".getPersistenceService().getMondrianConnection(getPersistenceUnit(), \"");
            DatamartSource _source_1 = definition.getSource();
            EObject _eContainer = ((DatamartCube) _source_1).getCubeRef().eContainer();
            QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(((CubePackage) _eContainer));
            _builder.append(_fullyQualifiedName, "\t");
            _builder.append("\"), \"");
            DatamartSource _source_2 = definition.getSource();
            String _name = ((DatamartCube) _source_2).getCubeRef().getName();
            _builder.append(_name, "\t");
            _builder.append("\");");
            _builder.newLineIfNotEmpty();
            _builder.append("} catch (SQLException e) {");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("log.error(\"{}\", e);");
            _builder.newLine();
            _builder.append("};");
            _builder.newLine();
            _builder.append("\t\t\t\t");
          }
        }
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_3);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "clearCache", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_2);
    EList<JvmMember> _members_2 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
    final Procedure1<JvmOperation> _function_3 = (JvmOperation it) -> {
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, _annotationRef);
      EList<JvmFormalParameter> _parameters = it.getParameters();
      JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "attributeName", this._typeReferenceBuilder.typeRef(String.class));
      this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
      final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return resultAttributes.get(attributeName);");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_4);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "getResultAttribute", this._typeReferenceBuilder.typeRef(String.class), _function_3);
    EList<JvmMember> _members_3 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
    final Procedure1<JvmOperation> _function_4 = (JvmOperation it) -> {
      final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("return typesMap.get(\"");
        _builder.append(IUserAccessService.ADMINISTRATOR);
        _builder.append("\");");
        _builder.newLineIfNotEmpty();
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_5);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "getTypesMap", 
      this._typeReferenceBuilder.typeRef(HashMap.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(IDataMart.EType.class)), _function_4);
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_4 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
    DatamartSource _source = definition.getSource();
    if ((_source instanceof DatamartTask)) {
      EList<JvmMember> _members_5 = type.getMembers();
      final Procedure1<JvmOperation> _function_5 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("return null;");
          _builder.newLine();
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_6);
      };
      JvmOperation _method = this._jvmTypesBuilder.toMethod(definition, "getPersistenceUnit", this._typeReferenceBuilder.typeRef(String.class), _function_5);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method);
      EList<JvmMember> _members_6 = type.getMembers();
      final Procedure1<JvmOperation> _function_6 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("return null;");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_7);
      };
      JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(definition, "connect", this._typeReferenceBuilder.typeRef(Connection.class), _function_6);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, _method_1);
      EList<JvmMember> _members_7 = type.getMembers();
      final Procedure1<JvmOperation> _function_7 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_8 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_8);
      };
      JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(definition, "disconnect", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_7);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, _method_2);
      final Procedure1<JvmOperation> _function_8 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("for (DatamartFilter filter : getFilters()) {");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("filter.clearData();");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("if (filter.getName().equals(\"Groups\")) {");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append("for(String grp : ");
          _builder.append(this.binderClassName, "\t\t");
          _builder.append(".getBpmEngine().getGroups()) {");
          _builder.newLineIfNotEmpty();
          _builder.append("\t\t\t");
          _builder.append("filter.addItem(grp, true);");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append("}");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("}");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("if (filter.getName().equals(\"Users\")) {");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append("for(String usr : ");
          _builder.append(this.binderClassName, "\t\t");
          _builder.append(".getBpmEngine().getUsers()) {");
          _builder.newLineIfNotEmpty();
          _builder.append("\t\t\t");
          _builder.append("filter.addItem(usr, true);");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append("}");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("}");
          _builder.newLine();
          _builder.append("}");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_9);
      };
      operation = this._jvmTypesBuilder.toMethod(definition, "renderFilters", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_8);
      EList<JvmMember> _members_8 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, operation);
      EList<JvmMember> _members_9 = type.getMembers();
      final Procedure1<JvmOperation> _function_9 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("if(user != null) {");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("List<BPMTaskSummary> tasks = ");
          String _firstUpper = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
          String _plus = (_firstUpper + "ServiceBinder");
          _builder.append(_plus, "\t");
          _builder.append(".getTaskClient().getUserTaskList(user, false);");
          _builder.newLineIfNotEmpty();
          _builder.append("\t");
          _builder.append("if (tasks == null || tasks.size() == 0) {");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append("tasks = ");
          String _firstUpper_1 = StringExtensions.toFirstUpper(this._iQualifiedNameProvider.getFullyQualifiedName(datamart).getLastSegment());
          String _plus_1 = (_firstUpper_1 + "ServiceBinder");
          _builder.append(_plus_1, "\t\t");
          _builder.append(".getTaskClient().getUserTaskList(user, true);");
          _builder.newLineIfNotEmpty();
          _builder.append("\t");
          _builder.append("}");
          _builder.newLine();
          _builder.append("\t");
          _builder.append("return (new DerivedCellSet(new SqlCellSet(tasks, getAxisMap()), null,");
          _builder.newLine();
          _builder.append("\t\t");
          _builder.append(this.binderClassName, "\t\t");
          _builder.append(".getDSLMetadataService(),");
          _builder.newLineIfNotEmpty();
          _builder.append("\t\t");
          _builder.append("user));");
          _builder.newLine();
          _builder.append("}");
          _builder.newLine();
          _builder.append("return null;");
          _builder.newLine();
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_10);
      };
      JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(definition, "getResults", this._typeReferenceBuilder.typeRef(DerivedCellSet.class), _function_9);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_9, _method_3);
      EList<JvmMember> _members_10 = type.getMembers();
      final Procedure1<JvmOperation> _function_10 = (JvmOperation it) -> {
        EList<JvmFormalParameter> _parameters = it.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "client", this._typeReferenceBuilder.typeRef(IBPMTaskClient.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(definition, "taskId", this._typeReferenceBuilder.typeRef(Long.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        final Procedure1<ITreeAppendable> _function_11 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("List<BPMTaskSummary> myTasks = new ArrayList<>(); ");
          _builder.newLine();
          _builder.append("myTasks.add(client.getUserTask(taskId, user));");
          _builder.newLine();
          _builder.append("return (new DerivedCellSet(new SqlCellSet(myTasks, getAxisMap()), null,");
          _builder.newLine();
          _builder.append("\t");
          _builder.append(this.binderClassName, "\t");
          _builder.append(".getDSLMetadataService(), user));");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setBody(it, _function_11);
      };
      JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(definition, "getResultsByTaskId", this._typeReferenceBuilder.typeRef(DerivedCellSet.class), _function_10);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_10, _method_4);
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("Test");
      String _name = definition.getName();
      _builder.append(_name);
      final Procedure1<JvmOperation> _function_11 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_12 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_1 = new StringConcatenation();
          _builder_1.append("renderFilters();");
          _builder_1.newLine();
          _builder_1.append("org.junit.Assert.assertNotNull(getResults());");
          it_1.append(_builder_1);
        };
        this._jvmTypesBuilder.setBody(it, _function_12);
      };
      operation = this._jvmTypesBuilder.toMethod(definition, _builder.toString(), this._typeReferenceBuilder.typeRef(String.class), _function_11);
      operation.setReturnType(this._typeReferenceBuilder.typeRef(Void.TYPE));
      JvmAnnotationReference annRef = this._annotationTypesBuilder.annotationRef(Test.class);
      operation.getAnnotations().add(annRef);
      EList<JvmMember> _members_11 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_11, operation);
    }
    DatamartSource _source_1 = definition.getSource();
    if ((_source_1 instanceof DatamartCube)) {
      DatamartSource _source_2 = definition.getSource();
      CubeTypeEntity _cubeTypeEntity = ((DatamartCube) _source_2).getCubeRef().getCubeTypeEntity();
      boolean _tripleNotEquals = (_cubeTypeEntity != null);
      if (_tripleNotEquals) {
        DatamartSource _source_3 = definition.getSource();
        final LEntity entity = ((DatamartCube) _source_3).getCubeRef().getCubeTypeEntity().getEntityRef().getEntityValue();
        EList<JvmMember> _members_12 = type.getMembers();
        final Procedure1<JvmOperation> _function_12 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_13 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("return \"");
            String _persistenceUnit = ((LEntity) entity).getPersistenceUnit();
            _builder_1.append(_persistenceUnit);
            _builder_1.append("\";");
            _builder_1.newLineIfNotEmpty();
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_13);
        };
        JvmOperation _method_5 = this._jvmTypesBuilder.toMethod(definition, "getPersistenceUnit", this._typeReferenceBuilder.typeRef(String.class), _function_12);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_12, _method_5);
        EList<JvmMember> _members_13 = type.getMembers();
        final Procedure1<JvmOperation> _function_13 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_14 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("if (connection == null) {   \t\t\t");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("try {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("connection = ");
            _builder_1.append(this.binderClassName, "\t\t");
            _builder_1.append(".getPersistenceService().getMondrianConnection(getPersistenceUnit(), \"");
            DatamartSource _source_4 = definition.getSource();
            EObject _eContainer = ((DatamartCube) _source_4).getCubeRef().eContainer();
            QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(((CubePackage) _eContainer));
            _builder_1.append(_fullyQualifiedName, "\t\t");
            _builder_1.append("\");");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t\t");
            _builder_1.append(this.binderClassName, "\t\t");
            _builder_1.append(".getPersistenceService().registerPersistenceUnit(getPersistenceUnit(), ");
            QualifiedName _fullyQualifiedName_1 = this._iQualifiedNameProvider.getFullyQualifiedName(((LEntity) entity));
            _builder_1.append(_fullyQualifiedName_1, "\t\t");
            _builder_1.append(".class);");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t");
            _builder_1.append("} catch (SQLException e) {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("log.error(\"{}\", e);");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("return (connection);");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("return (connection);");
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_14);
        };
        JvmOperation _method_6 = this._jvmTypesBuilder.toMethod(definition, "connect", this._typeReferenceBuilder.typeRef(RolapConnection.class), _function_13);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_13, _method_6);
        EList<JvmMember> _members_14 = type.getMembers();
        final Procedure1<JvmOperation> _function_14 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_15 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("if (connection != null) {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("connection.close();");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("connection = null;");
            _builder_1.newLine();
            _builder_1.append("}");
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_15);
        };
        JvmOperation _method_7 = this._jvmTypesBuilder.toMethod(definition, "disconnect", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_14);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_14, _method_7);
        final Procedure1<JvmOperation> _function_15 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_16 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("connect();");
            _builder_1.newLine();
            _builder_1.append("if (connection != null) {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("for (DatamartFilter filter : getFilters()) {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("filter.clearData();");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("DerivedCellSet cellSet = new DerivedCellSet(");
            _builder_1.append(this.binderClassName, "\t\t");
            _builder_1.append(".getPersistenceService().sendQuery(connection,getVendorSql(filter)),");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t\t\t");
            _builder_1.append(this.binderClassName, "\t\t\t");
            _builder_1.append(".getDSLMetadataService(),");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t\t\t");
            _builder_1.append("user);");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("List<DerivedAxis> axes = cellSet.getAxes();");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("DerivedAxis columnsAxis = axes.get(Axis.COLUMNS.ordinal());");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("for (DerivedPosition position : columnsAxis.getPositions()) {");
            _builder_1.newLine();
            _builder_1.append("\t\t\t");
            _builder_1.append("DerivedMember measure = position.getMembers().get(0);");
            _builder_1.newLine();
            _builder_1.append("\t\t\t");
            _builder_1.append("filter.addOlapItem(measure.getHierarchy().getName(), measure.getUniqueName());");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("disconnect();");
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_16);
        };
        operation = this._jvmTypesBuilder.toMethod(definition, "renderFilters", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_15);
        EList<JvmMember> _members_15 = type.getMembers();
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_15, operation);
        final Procedure1<JvmOperation> _function_16 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_17 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("String filteredStatement = statement;");
            _builder_1.newLine();
            _builder_1.append("computeConditions();");
            _builder_1.newLine();
            _builder_1.append("for (DatamartFilter filter : getFilters()) {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("if(filter.getCondition() != null) {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("filteredStatement = filteredStatement.replace(filter.getDecoratedName(), filter.getCondition().replace(\"\'\",\"\"));");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("filteredStatement = filteredStatement.replace(\"<empty>,\",\"\").replace(\",<empty>\",\"\").replace(\"<empty>\",\"\");");
            _builder_1.newLine();
            _builder_1.append("log.debug(\"");
            String _name_1 = definition.getName();
            _builder_1.append(_name_1);
            _builder_1.append(":\"+filteredStatement);");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("return filteredStatement;");
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_17);
        };
        operation = this._jvmTypesBuilder.toMethod(definition, "applyFilters", this._typeReferenceBuilder.typeRef(String.class), _function_16);
        EList<JvmMember> _members_16 = type.getMembers();
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_16, operation);
        EList<JvmMember> _members_17 = type.getMembers();
        final Procedure1<JvmOperation> _function_17 = (JvmOperation it) -> {
          EList<JvmFormalParameter> _parameters = it.getParameters();
          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "operativeDtoClass", this._typeReferenceBuilder.typeRef(Class.class));
          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
          EList<JvmFormalParameter> _parameters_1 = it.getParameters();
          JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(definition, "operativeDtos", 
            this._typeReferenceBuilder.typeRef(List.class, this._typeReferenceBuilder.typeRef(IDto.class)));
          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
          final Procedure1<ITreeAppendable> _function_18 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("DerivedCellSet derivedCellSet = null;");
            _builder_1.newLine();
            _builder_1.append("connect();");
            _builder_1.newLine();
            _builder_1.append("if (connection != null) {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("derivedCellSet = new DerivedCellSet(");
            _builder_1.append(this.binderClassName, "\t");
            _builder_1.append(".getPersistenceService().sendQuery(connection, applyFilters()),");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t\t\t");
            _builder_1.append(this.binderClassName, "\t\t\t");
            _builder_1.append(".getDSLMetadataService(),");
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("\t\t\t");
            _builder_1.append("user);");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("disconnect();");
            _builder_1.newLine();
            _builder_1.append("return derivedCellSet;");
            it_1.append(_builder_1);
          };
          this._jvmTypesBuilder.setBody(it, _function_18);
        };
        JvmOperation _method_8 = this._jvmTypesBuilder.toMethod(definition, "getResults", this._typeReferenceBuilder.typeRef(DerivedCellSet.class), _function_17);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_17, _method_8);
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append("Test");
        String _name_1 = definition.getName();
        _builder_1.append(_name_1);
        final Procedure1<JvmOperation> _function_18 = (JvmOperation it) -> {
          final Procedure1<ITreeAppendable> _function_19 = (ITreeAppendable it_1) -> {
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("renderFilters();");
            _builder_2.newLine();
            _builder_2.append("org.junit.Assert.assertNotNull(getResults(null, null));");
            it_1.append(_builder_2);
          };
          this._jvmTypesBuilder.setBody(it, _function_19);
        };
        operation = this._jvmTypesBuilder.toMethod(definition, _builder_1.toString(), this._typeReferenceBuilder.typeRef(String.class), _function_18);
        operation.setReturnType(this._typeReferenceBuilder.typeRef(Void.TYPE));
        JvmAnnotationReference annRef_1 = this._annotationTypesBuilder.annotationRef(Test.class);
        operation.getAnnotations().add(annRef_1);
        EList<JvmMember> _members_18 = type.getMembers();
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_18, operation);
      }
    }
    DatamartSource _source_4 = definition.getSource();
    if ((_source_4 instanceof DatamartEntity)) {
      EList<JvmMember> _members_19 = type.getMembers();
      final Procedure1<JvmOperation> _function_19 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_20 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("return \"");
          DatamartSource _source_5 = definition.getSource();
          LEntity _entityRef = null;
          if (((DatamartEntity) _source_5)!=null) {
            _entityRef=((DatamartEntity) _source_5).getEntityRef();
          }
          String _persistenceUnit = null;
          if (_entityRef!=null) {
            _persistenceUnit=_entityRef.getPersistenceUnit();
          }
          _builder_2.append(_persistenceUnit);
          _builder_2.append("\";");
          _builder_2.newLineIfNotEmpty();
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_20);
      };
      JvmOperation _method_9 = this._jvmTypesBuilder.toMethod(definition, "getPersistenceUnit", this._typeReferenceBuilder.typeRef(String.class), _function_19);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_19, _method_9);
      EList<JvmMember> _members_20 = type.getMembers();
      final Procedure1<JvmOperation> _function_20 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_21 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("if (connection == null) {   \t\t\t");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("connection = ");
          _builder_2.append(this.binderClassName, "\t\t");
          _builder_2.append(".getPersistenceService().getPersistenceUnitConnection(getPersistenceUnit());");
          _builder_2.newLineIfNotEmpty();
          _builder_2.append("\t\t");
          _builder_2.append(this.binderClassName, "\t\t");
          _builder_2.append(".getPersistenceService().registerPersistenceUnit(getPersistenceUnit(), ");
          DatamartSource _source_5 = definition.getSource();
          LEntity _entityRef = null;
          if (((DatamartEntity) _source_5)!=null) {
            _entityRef=((DatamartEntity) _source_5).getEntityRef();
          }
          QualifiedName _fullyQualifiedName = null;
          if (_entityRef!=null) {
            _fullyQualifiedName=this._iQualifiedNameProvider.getFullyQualifiedName(_entityRef);
          }
          _builder_2.append(_fullyQualifiedName, "\t\t");
          _builder_2.append(".class);");
          _builder_2.newLineIfNotEmpty();
          _builder_2.append("\t");
          _builder_2.append("} catch (SQLException e) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("log.error(\"{}\", e);");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("return (connection);");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("return (connection);");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_21);
      };
      JvmOperation _method_10 = this._jvmTypesBuilder.toMethod(definition, "connect", this._typeReferenceBuilder.typeRef(Connection.class), _function_20);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_20, _method_10);
      EList<JvmMember> _members_21 = type.getMembers();
      final Procedure1<JvmOperation> _function_21 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_22 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("if (connection != null) {   \t\t\t");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("connection.close();");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("connection = null;");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("} catch (SQLException e) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("log.error(\"{}\", e);");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_22);
      };
      JvmOperation _method_11 = this._jvmTypesBuilder.toMethod(definition, "disconnect", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_21);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_21, _method_11);
      EList<JvmMember> _members_22 = type.getMembers();
      final Procedure1<JvmOperation> _function_22 = (JvmOperation it) -> {
        EList<JvmFormalParameter> _parameters = it.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "filteredStatement", this._typeReferenceBuilder.typeRef(String.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(definition, "condition", this._typeReferenceBuilder.typeRef(String.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        final Procedure1<ITreeAppendable> _function_23 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("int index = filteredStatement.indexOf(\"order by\");");
          _builder_2.newLine();
          _builder_2.append("if(index > -1) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("return filteredStatement.substring(0, index-1) + condition + filteredStatement.substring(index-1); ");
          _builder_2.newLine();
          _builder_2.append("} else {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("return filteredStatement + condition;");
          _builder_2.newLine();
          _builder_2.append("}");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_23);
      };
      JvmOperation _method_12 = this._jvmTypesBuilder.toMethod(definition, "insertCondition", this._typeReferenceBuilder.typeRef(String.class), _function_22);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_22, _method_12);
      final Procedure1<JvmOperation> _function_23 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_24 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("connect();");
          _builder_2.newLine();
          _builder_2.append("if (connection != null) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("for (DatamartFilter filter : getFilters()) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("if((DatamartFilter.FilterType.BY_ID != filter.getType()) && (DatamartFilter.FilterType.BETWEEN != filter.getType()) && (DatamartFilter.FilterType.BETWEEN_DATE != filter.getType())) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("ResultSet rs = null;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("rs = connection.createStatement().executeQuery(getVendorSql(filter));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("if (rs != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("while (rs.next()) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t");
          _builder_2.append("int type = rs.getMetaData().getColumnType(1);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t");
          _builder_2.append("switch (type) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.DATE:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t    ");
          _builder_2.append("Date date = rs.getDate(1);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t    ");
          _builder_2.append("if (date != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("if (user == null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t\t");
          _builder_2.append("filter.addItem(date.toString(), getVendorToDateSQLMethod()+\"(\'\"+date.toString().replace(\".0\",\"\")+\"\',\'YYYY-MM-DD HH24:MI:SS\')\", false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("} else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t\t");
          _builder_2.append("filter.addItem(SimpleDateFormatter.getFormat(\"LONGDATE\", user.getLocale()).format(date), getVendorToDateSQLMethod()+\"(\'\"+date.toString().replace(\".0\",\"\")+\"\',\'YYYY-MM-DD HH24:MI:SS\')\", false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.TIMESTAMP:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("Timestamp timestamp = rs.getTimestamp(1);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("if (timestamp != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("if (user == null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t\t");
          _builder_2.append("filter.addItem(timestamp.toString(), getVendorToTimestampSQLMethod()+\"(\'\"+timestamp.toString().replace(\".0\",\"\")+\"\',\'YYYY-MM-DD HH24:MI:SS\')\", false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("} else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t\t");
          _builder_2.append("filter.addItem(SimpleDateFormatter.getFormat(\"LONGDATE\", user.getLocale()).format(timestamp), getVendorToTimestampSQLMethod()+\"(\'\"+timestamp.toString().replace(\".0\",\"\")+\"\',\'YYYY-MM-DD HH24:MI:SS\')\", false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.DECIMAL:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("BigDecimal bigDecimal = rs.getBigDecimal(1);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("if (bigDecimal != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t\t");
          _builder_2.append("filter.addItem(bigDecimal.toPlainString(), bigDecimal.toPlainString(), false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.NUMERIC:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.DOUBLE:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("filter.addItem(Double.toString(rs.getDouble(1)), Double.toString(rs.getDouble(1)), false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.INTEGER:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.BIGINT:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("filter.addItem(Integer.toString(rs.getInt(1)), Integer.toString(rs.getInt(1)), false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.FLOAT:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("filter.addItem(Float.toString(rs.getFloat(1)), Float.toString(rs.getFloat(1)), false);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.CHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.NCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.NVARCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t \t\t\t");
          _builder_2.append("case java.sql.Types.VARCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t");
          _builder_2.append("case java.sql.Types.LONGVARCHAR: ");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t\t\t\t");
          _builder_2.append("filter.addItem(rs.getString(1), rs.getString(1), true);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("} catch (SQLException e) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("log.error(\"{}\", e);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("} finally {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("rs.close();");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("} catch (java.sql.SQLException e) {}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("disconnect();");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_24);
      };
      operation = this._jvmTypesBuilder.toMethod(definition, "renderFilters", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_23);
      EList<JvmMember> _members_23 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_23, operation);
      final Procedure1<JvmOperation> _function_24 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_25 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("String filteredStatement = statement;");
          _builder_2.newLine();
          _builder_2.append("computeConditions();");
          _builder_2.newLine();
          _builder_2.append("for (DatamartFilter filter : getFilters()) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("if (DatamartFilter.FilterType.BY_ID == filter.getType()) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("if(filter.getCondition() != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("if\t(!filteredStatement.toLowerCase().contains(\" where \")) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("if\t((\" \"+filter.getCondition()).toLowerCase().contains(\"where \")) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("filteredStatement = insertCondition(filteredStatement, \" \"+filter.getCondition());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("filteredStatement = insertCondition(filteredStatement, \" where \"+filter.getCondition());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("if\t(filter.getCondition().trim().toLowerCase().startsWith(\"and \") ||");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t ");
          _builder_2.append("filter.getCondition().trim().toLowerCase().startsWith(\"or \") ) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("filteredStatement = insertCondition(filteredStatement, filter.getCondition());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("filteredStatement = insertCondition(filteredStatement, \" and \"+filter.getCondition());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("else {");
          _builder_2.newLine();
          _builder_2.append("\t   \t");
          _builder_2.append("filteredStatement = filteredStatement.replace(filter.getDecoratedName(), filter.getCondition());");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("log.debug(\"");
          String _name_2 = definition.getName();
          _builder_2.append(_name_2);
          _builder_2.append(":\"+filteredStatement);");
          _builder_2.newLineIfNotEmpty();
          _builder_2.append("return filteredStatement;");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_25);
      };
      operation = this._jvmTypesBuilder.toMethod(definition, "applyFilters", this._typeReferenceBuilder.typeRef(String.class), _function_24);
      EList<JvmMember> _members_24 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_24, operation);
      EList<JvmMember> _members_25 = type.getMembers();
      final Procedure1<JvmOperation> _function_25 = (JvmOperation it) -> {
        EList<JvmFormalParameter> _parameters = it.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "operativeDtoClass", this._typeReferenceBuilder.typeRef(Class.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(definition, "operativeDtos", 
          this._typeReferenceBuilder.typeRef(List.class, this._typeReferenceBuilder.typeRef(IDto.class)));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        final Procedure1<ITreeAppendable> _function_26 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("ResultSet rs = null;");
          _builder_2.newLine();
          _builder_2.append("SqlCellSet cellSet = null;");
          _builder_2.newLine();
          _builder_2.append("java.sql.ResultSetMetaData metaData = null;");
          _builder_2.newLine();
          _builder_2.append("// --- if filler text is enabled ---");
          _builder_2.newLine();
          _builder_2.append("if\t(fFillerTextEnabled) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("// --- try to generate filler text ---");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("rs = generateFillerTextResultSet();");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("// --- if no result set is generated by now ---");
          _builder_2.newLine();
          _builder_2.append("connect();");
          _builder_2.newLine();
          _builder_2.append("if (rs == null) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("if (connection != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("String query = applyFilters();");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("if (query.length()>0) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("rs = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(query);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("} catch (SQLException e) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("log.error(\"Query: \"+query);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("log.error(\"{}\", e);");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("if (rs != null) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("cellSet = new SqlCellSet(rs, getAxisMap(), getIdMap(), datamartDtoMapper, operativeDtoClass, operativeDtos, getPrimaryList());");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("registerFirstLine(rs, user);");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("metaData = rs.getMetaData();");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("rs.close();");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("catch (java.sql.SQLException e) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("try {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("log.error(\"Statement: \"+rs.getStatement().toString());");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("} catch (SQLException e1) {}");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("log.error(\"{}\", e);");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("return (new DerivedCellSet(cellSet,");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("metaData,");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append(this.binderClassName, "\t\t");
          _builder_2.append(".getDSLMetadataService(), user));");
          _builder_2.newLineIfNotEmpty();
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("disconnect();");
          _builder_2.newLine();
          _builder_2.append("return null;");
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_26);
      };
      JvmOperation _method_13 = this._jvmTypesBuilder.toMethod(definition, "getResults", this._typeReferenceBuilder.typeRef(DerivedCellSet.class), _function_25);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_25, _method_13);
      EList<JvmMember> _members_26 = type.getMembers();
      final Procedure1<JvmOperation> _function_26 = (JvmOperation it) -> {
        EList<JvmFormalParameter> _parameters = it.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(definition, "rs", this._typeReferenceBuilder.typeRef(ResultSet.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(definition, "user", this._typeReferenceBuilder.typeRef(IUser.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        EList<JvmTypeReference> _exceptions = it.getExceptions();
        JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(SQLException.class);
        this._jvmTypesBuilder.<JvmTypeReference>operator_add(_exceptions, _typeRef);
        final Procedure1<ITreeAppendable> _function_27 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("if (rs != null && rs.first()) {");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("for (int column = 1; column <= rs.getMetaData().getColumnCount(); column++) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("int type = rs.getMetaData().getColumnType(column);");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("switch (type) {");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.DATE:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("if(rs.getDate(column) != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("if (user == null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getDate(column).toString());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("} else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column),");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t");
          _builder_2.append("SimpleDateFormatter.getFormat(\"LONGDATE\", user.getLocale()).format(rs.getDate(column)));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.TIMESTAMP:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("if(rs.getTimestamp(column) != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("if (user == null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getTimestamp(column).toString());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("} else {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), SimpleDateFormatter");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t\t\t");
          _builder_2.append(".getFormat(\"LONGDATE\", user.getLocale()).format(rs.getTimestamp(column)));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.DECIMAL:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("if(rs.getBigDecimal(column) != null) {");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column),");
          _builder_2.newLine();
          _builder_2.append("\t\t\t\t\t");
          _builder_2.append("rs.getBigDecimal(column).toPlainString());");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.NUMERIC:");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.DOUBLE:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), Double.toString(rs.getDouble(column)));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.FLOAT:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), Float.toString(rs.getFloat(column)));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.CHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.NCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.NVARCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.VARCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("case java.sql.Types.LONGVARCHAR:");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getString(column));");
          _builder_2.newLine();
          _builder_2.append("\t\t\t");
          _builder_2.append("break;");
          _builder_2.newLine();
          _builder_2.append("\t\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("\t");
          _builder_2.append("}");
          _builder_2.newLine();
          _builder_2.append("}");
          _builder_2.newLine();
          it_1.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it, _function_27);
      };
      JvmOperation _method_14 = this._jvmTypesBuilder.toMethod(definition, "registerFirstLine", this._typeReferenceBuilder.typeRef(Void.TYPE), _function_26);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_26, _method_14);
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append("Test");
      String _name_2 = definition.getName();
      _builder_2.append(_name_2);
      final Procedure1<JvmOperation> _function_27 = (JvmOperation it) -> {
        final Procedure1<ITreeAppendable> _function_28 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder_3 = new StringConcatenation();
          _builder_3.append("renderFilters();");
          _builder_3.newLine();
          _builder_3.append("org.junit.Assert.assertNotNull(getResults(null, null));");
          it_1.append(_builder_3);
        };
        this._jvmTypesBuilder.setBody(it, _function_28);
      };
      operation = this._jvmTypesBuilder.toMethod(definition, _builder_2.toString(), this._typeReferenceBuilder.typeRef(String.class), _function_27);
      operation.setReturnType(this._typeReferenceBuilder.typeRef(Void.TYPE));
      JvmAnnotationReference annRef_2 = this._annotationTypesBuilder.annotationRef(Test.class);
      operation.getAnnotations().add(annRef_2);
      EList<JvmMember> _members_27 = type.getMembers();
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_27, operation);
    }
  }
  
  public String createFilterAttributeProperties(final DatamartEntity entity) {
    String text = "";
    EList<DatamartCondition> _conditions = entity.getConditions();
    for (final DatamartCondition condition : _conditions) {
      Expression _condition = condition.getCondition();
      boolean _tripleNotEquals = (_condition != null);
      if (_tripleNotEquals) {
        Expression _condition_1 = condition.getCondition();
        if ((_condition_1 instanceof ConditionalExpression)) {
          Expression _condition_2 = condition.getCondition();
          Expression element = ((ConditionalExpression) _condition_2).getRight();
          Expression _condition_3 = condition.getCondition();
          Expression leftConditionalExpr = ((ConditionalExpression) _condition_3).getLeft();
          if ((leftConditionalExpr instanceof DatamartAttributeBase)) {
            Expression _condition_4 = condition.getCondition();
            Expression _left = ((ConditionalExpression) _condition_4).getLeft();
            DatamartAttributeBase attribute = ((DatamartAttributeBase) _left);
            boolean _isRanged = element.isRanged();
            if (_isRanged) {
              boolean _isDate = this._modelExtensions.getDatatype(attribute.getAttributeRef()).isDate();
              if (_isDate) {
                if (((attribute.getAttributeRef().getProperties() != null) && 
                  (!attribute.getAttributeRef().getProperties().isEmpty()))) {
                  StringConcatenation _builder = new StringConcatenation();
                  _builder.append("{{");
                  _builder.newLine();
                  _builder.append("\t");
                  _builder.append("put(\"");
                  String _attributeName = this.getAttributeName(attribute, entity);
                  _builder.append(_attributeName, "\t");
                  _builder.append("\", new HashMap<String, String>() {{");
                  text = _builder.toString();
                  EList<LKeyAndValue> _properties = attribute.getAttributeRef().getProperties();
                  for (final LKeyAndValue property : _properties) {
                    StringConcatenation _builder_1 = new StringConcatenation();
                    _builder_1.append(text);
                    _builder_1.newLineIfNotEmpty();
                    _builder_1.append("\t\t");
                    _builder_1.append("put(\"");
                    String _key = property.getKey();
                    _builder_1.append(_key, "\t\t");
                    _builder_1.append("\", \"");
                    String _value = property.getValue();
                    _builder_1.append(_value, "\t\t");
                    _builder_1.append("\");");
                    text = _builder_1.toString();
                  }
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append(text);
                  _builder_2.newLineIfNotEmpty();
                  _builder_2.append("\t");
                  _builder_2.append("}});");
                  _builder_2.newLine();
                  _builder_2.append("}}");
                  text = _builder_2.toString();
                }
              }
            }
          }
        }
      }
    }
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      {
        if ((navigation instanceof DatamartMember)) {
          StringConcatenation _builder_3 = new StringConcatenation();
          _builder_3.append(text);
          _builder_3.newLineIfNotEmpty();
          String _createFilterAttributeProperties = this.createFilterAttributeProperties(((DatamartMember) navigation).getDatamartEntity());
          _builder_3.append(_createFilterAttributeProperties);
          text = _builder_3.toString();
        }
        if ((navigation instanceof DatamartOwner)) {
          StringConcatenation _builder_4 = new StringConcatenation();
          _builder_4.append(text);
          _builder_4.newLineIfNotEmpty();
          String _createFilterAttributeProperties_1 = this.createFilterAttributeProperties(((DatamartOwner) navigation).getDatamartEntity());
          _builder_4.append(_createFilterAttributeProperties_1);
          text = _builder_4.toString();
        }
      }
    }
    return text;
  }
  
  /**
   * <p>build the id map as lookup for primary key oriented applications.</p>
   */
  public String createIdMap(final DatamartDefinition definition) {
    String listTxt = "";
    Set<String> _keySet = this.idMap.keySet();
    for (final String idColumn : _keySet) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(listTxt);
      _builder.newLineIfNotEmpty();
      _builder.append("\t\t");
      _builder.append("put(\"");
      _builder.append(idColumn, "\t\t");
      _builder.append("\", EType.");
      LEntityAttribute _primaryKeyAttribute = this.idMap.get(idColumn).getPrimaryKeyAttribute();
      IDataMart.EType _basicType = this.dtType.getBasicType(((LEntityAttribute) _primaryKeyAttribute));
      _builder.append(_basicType, "\t\t");
      _builder.append(");");
      listTxt = _builder.toString();
    }
    StringConcatenation _builder_1 = new StringConcatenation();
    _builder_1.append("{{");
    _builder_1.newLine();
    _builder_1.append("\t");
    _builder_1.append(listTxt, "\t");
    _builder_1.newLineIfNotEmpty();
    _builder_1.append("}}");
    listTxt = _builder_1.toString();
    return listTxt;
  }
  
  public String createPrimaryList(final DatamartDefinition definition) {
    String listTxt = "";
    Set<String> _keySet = this.idMap.keySet();
    for (final String idColumn : _keySet) {
      {
        String typeName = "";
        LScalarType _idAttributeType = this.idMap.get(idColumn).getIdAttributeType();
        if ((_idAttributeType instanceof LDataType)) {
          LScalarType _idAttributeType_1 = this.idMap.get(idColumn).getIdAttributeType();
          JvmTypeReference _jvmTypeReference = ((LDataType) _idAttributeType_1).getJvmTypeReference();
          boolean _tripleNotEquals = (_jvmTypeReference != null);
          if (_tripleNotEquals) {
            LScalarType _idAttributeType_2 = this.idMap.get(idColumn).getIdAttributeType();
            typeName = ((LDataType) _idAttributeType_2).getJvmTypeReference().getType().getSimpleName();
          } else {
            LScalarType _idAttributeType_3 = this.idMap.get(idColumn).getIdAttributeType();
            typeName = ((LDataType) _idAttributeType_3).getName();
          }
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(listTxt);
          _builder.newLineIfNotEmpty();
          _builder.append("\t\t");
          _builder.append("add(new DatamartPrimary<");
          _builder.append(typeName, "\t\t");
          _builder.append(">(\"");
          _builder.append(idColumn, "\t\t");
          _builder.append("\", \"");
          String _name = this.idMap.get(idColumn).getPrimaryKeyAttribute().getName();
          _builder.append(_name, "\t\t");
          _builder.append("\", \"");
          QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(this.idMap.get(idColumn));
          _builder.append(_fullyQualifiedName, "\t\t");
          _builder.append("\"));");
          listTxt = _builder.toString();
        }
      }
    }
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("{{");
    _builder.newLine();
    _builder.append("\t");
    _builder.append(listTxt, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}}");
    listTxt = _builder.toString();
    return listTxt;
  }
  
  public String addPrimaryFilters(final DatamartDefinition definition) {
    String listTxt = "";
    Set<String> _keySet = this.idMap.keySet();
    for (final String idColumn : _keySet) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(listTxt);
      _builder.newLineIfNotEmpty();
      _builder.append("add(new DatamartFilter(");
      _builder.append(this.binderClassName);
      _builder.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.BY_ID, \"");
      String _name = this.idMap.get(idColumn).getName();
      _builder.append(_name);
      _builder.append(".");
      String _name_1 = this.idMap.get(idColumn).getPrimaryKeyAttribute().getName();
      _builder.append(_name_1);
      _builder.append("\",\"\"));");
      listTxt = _builder.toString();
    }
    return listTxt;
  }
  
  /**
   * <p>build the types map as lookup for datatypes.</p>
   */
  public String createTypesMaps(final DatamartDefinition definition, final HashMap<String, LAttribute> typesMap) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("new HashMap<String,EType>()");
    String _createTypesMap = this.createTypesMap(definition, typesMap);
    _builder.append(_createTypesMap);
    _builder.append(";");
    String listTxt = _builder.toString();
    StringConcatenation _builder_1 = new StringConcatenation();
    _builder_1.append("{{");
    _builder_1.newLine();
    _builder_1.append("\t");
    _builder_1.append(listTxt, "\t");
    _builder_1.newLineIfNotEmpty();
    _builder_1.append("}}");
    listTxt = _builder_1.toString();
    return listTxt;
  }
  
  /**
   * <p>build the types map as lookup for datatypes.</p>
   */
  public String createTypesProps(final DatamartDefinition definition, final HashMap<String, LAttribute> typesMap) {
    String listTxt = "";
    Set<String> _keySet = typesMap.keySet();
    for (final String attribute : _keySet) {
      boolean _isEmpty = typesMap.get(attribute).getProperties().isEmpty();
      boolean _not = (!_isEmpty);
      if (_not) {
        String attributeName = attribute.split("\\.")[1];
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(listTxt);
        _builder.newLineIfNotEmpty();
        _builder.append("put(\"");
        _builder.append(attributeName);
        _builder.append("\", \"");
        String _value = typesMap.get(attribute).getProperties().get(0).getValue();
        _builder.append(_value);
        _builder.append("\");");
        listTxt = _builder.toString();
      }
    }
    StringConcatenation _builder_1 = new StringConcatenation();
    _builder_1.append("{{");
    _builder_1.newLine();
    _builder_1.append("\t");
    _builder_1.append(listTxt, "\t");
    _builder_1.newLineIfNotEmpty();
    _builder_1.append("}}");
    listTxt = _builder_1.toString();
    return listTxt;
  }
  
  /**
   * <p>build the types map as lookup for datatypes according to authorization roles.</p>
   */
  public String createTypesMap(final DatamartDefinition definition, final HashMap<String, LAttribute> typesMap) {
    String listTxt = "";
    Set<String> _keySet = typesMap.keySet();
    for (final String attribute : _keySet) {
      {
        final IDataMart.EType type = this.dtType.getBasicType(typesMap.get(attribute));
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(listTxt);
        _builder.newLineIfNotEmpty();
        _builder.append("put(\"");
        _builder.append(attribute);
        _builder.append("\", EType.");
        String _string = type.toString();
        _builder.append(_string);
        _builder.append(");");
        listTxt = _builder.toString();
      }
    }
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("{{");
    _builder.newLine();
    _builder.append("\t");
    _builder.append(listTxt, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}}");
    listTxt = _builder.toString();
    return listTxt;
  }
  
  /**
   * <p>build the axis map.</p>
   */
  public String createAxisMap(final DatamartDefinition definition, final Map<String, LEntity> entityMap) {
    String text = "";
    HashMap<Integer, Map<String, Integer>> map = CollectionLiterals.<Integer, Map<String, Integer>>newHashMap();
    DatamartSource _source = definition.getSource();
    boolean _tripleNotEquals = (_source != null);
    if (_tripleNotEquals) {
      DatamartSource _source_1 = definition.getSource();
      if ((_source_1 instanceof DatamartEntity)) {
        DatamartSource _source_2 = definition.getSource();
        this.createAxisMap(((DatamartEntity) _source_2), map);
      }
      DatamartSource _source_3 = definition.getSource();
      if ((_source_3 instanceof DatamartTask)) {
        DatamartSource _source_4 = definition.getSource();
        this.createAxisMap(((DatamartTask) _source_4), map);
      }
    }
    Set<Integer> _keySet = map.keySet();
    for (final Integer axisNumber : _keySet) {
      {
        if (((definition.getSource() instanceof DatamartEntity) && ((axisNumber).intValue() == AxisEnum.COLUMNS_VALUE))) {
          if ((!this.ignoreEntityGrouping)) {
            Collection<LEntity> _values = entityMap.values();
            for (final LEntity entityRef : _values) {
              {
                String idColumn = DatamartDefinitionUtil.getEntityIdAliasName(entityRef);
                if ((idColumn != null)) {
                  map.get(axisNumber).put(idColumn, Integer.valueOf(0));
                }
              }
            }
          }
        }
        final Function<Map.Entry<String, Integer>, String> _function = (Map.Entry<String, Integer> it) -> {
          String _key = it.getKey();
          String _plus = ("add(\"" + _key);
          return (_plus + "\");");
        };
        String listTxt = map.get(axisNumber).entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).<String>map(_function).collect(Collectors.joining("\n", "{{\n", "\n}}"));
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(text);
        _builder.newLineIfNotEmpty();
        _builder.append("\t");
        _builder.append("put(");
        _builder.append(axisNumber, "\t");
        _builder.append(",new ArrayList<String>() ");
        _builder.append(listTxt, "\t");
        _builder.append(");");
        text = _builder.toString();
      }
    }
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("{{");
    _builder.newLine();
    _builder.append("\t");
    _builder.append(text, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}}");
    text = _builder.toString();
    return text;
  }
  
  /**
   * <p>creates an axis map for tasks.</p>
   */
  public void createAxisMap(final DatamartTask task, final Map<Integer, Map<String, Integer>> map) {
    this.idMap.clear();
    EList<DatamartColumn> _columns = task.getColumns();
    for (final DatamartColumn column : _columns) {
      {
        int axisNumber = 0;
        String name = column.getColumnRef().getLiteral();
        boolean found = false;
        Set<Integer> _keySet = map.keySet();
        for (final Integer axNum : _keySet) {
          if (((axNum).intValue() == axisNumber)) {
            map.get(axNum).put(name, Integer.valueOf(this.defaultColumnWeight));
            found = true;
          }
        }
        if ((!found)) {
          HashMap<String, Integer> columns = CollectionLiterals.<String, Integer>newHashMap();
          columns.put(name, Integer.valueOf(this.defaultColumnWeight));
          map.put(Integer.valueOf(axisNumber), columns);
        }
      }
    }
  }
  
  public void recursAxisMap(final LScalarType type, final DatamartAttribute attribute, final Map<Integer, Map<String, Integer>> map, final int axisNumber) {
    if ((type instanceof LBean)) {
      LBean bean = ((LBean) type);
      List<LBeanAttribute> _allAttributes = bean.getAllAttributes();
      for (final LBeanAttribute attr : _allAttributes) {
        LScalarType _type = attr.getType();
        if ((_type instanceof LBean)) {
          this.recursAxisMap(attr.getType(), attribute, map, axisNumber);
        } else {
          this.addAxisAttribute(attr.getName(), Integer.valueOf(this.defaultColumnWeight), map, axisNumber);
        }
      }
    } else {
      int weight = this.defaultColumnWeight;
      boolean _isHasColumnWeight = attribute.isHasColumnWeight();
      if (_isHasColumnWeight) {
        weight = attribute.getColumnWeight();
      }
      this.addAxisAttribute(DatamartAttributeUtil.getAliasedAttributeName(attribute), Integer.valueOf(weight), map, axisNumber);
    }
  }
  
  /**
   * <p>recursively create an axis map for entities.</p>
   */
  public void createAxisMap(final DatamartEntity entity, final Map<Integer, Map<String, Integer>> map) {
    ArrayList<DatamartAttribute> entityAttributes = this.entityAttributes(entity);
    for (final DatamartAttribute attribute : entityAttributes) {
      {
        int axisNumber = (-1);
        int _value = attribute.getAxis().getName().getValue();
        boolean _equals = (_value == (-1));
        if (_equals) {
          axisNumber = 0;
        } else {
          axisNumber = attribute.getAxis().getName().getValue();
        }
        LScalarType _type = attribute.getAttributeRef().getType();
        LScalarType type = ((LScalarType) _type);
        this.recursAxisMap(type, attribute, map, axisNumber);
      }
    }
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      this.createAxisMap(navigation.getDatamartEntity(), map);
    }
  }
  
  public Map<String, Integer> addAxisAttribute(final String name, final Integer weight, final Map<Integer, Map<String, Integer>> map, final int axisNumber) {
    Map<String, Integer> _xblockexpression = null;
    {
      boolean found = false;
      Set<Integer> _keySet = map.keySet();
      for (final Integer axNum : _keySet) {
        if (((axNum).intValue() == axisNumber)) {
          map.get(axNum).put(name, weight);
          found = true;
        }
      }
      Map<String, Integer> _xifexpression = null;
      if ((!found)) {
        Map<String, Integer> _xblockexpression_1 = null;
        {
          HashMap<String, Integer> columns = CollectionLiterals.<String, Integer>newHashMap();
          columns.put(name, weight);
          _xblockexpression_1 = map.put(Integer.valueOf(axisNumber), columns);
        }
        _xifexpression = _xblockexpression_1;
      }
      _xblockexpression = _xifexpression;
    }
    return _xblockexpression;
  }
  
  public LScalarType getAttributeType(final DatamartAttribute prop) {
    return prop.getAttributeRef().getType();
  }
  
  /**
   * <p>build a map for the filters contained in a datamart depending on a cube.</p>
   */
  public String createFilterMap(final DatamartDefinition definition) {
    String text = "";
    DatamartSource _source = definition.getSource();
    boolean _tripleNotEquals = (_source != null);
    if (_tripleNotEquals) {
      DatamartSource _source_1 = definition.getSource();
      if ((_source_1 instanceof DatamartCube)) {
        DatamartSource _source_2 = definition.getSource();
        DatamartCube cube = ((DatamartCube) _source_2);
        EList<DatamartCubeElement> _axisslicer = cube.getAxisslicer();
        for (final DatamartCubeElement axisslicer : _axisslicer) {
          {
            if (((axisslicer instanceof DatamartCubeAxis) && (((DatamartCubeAxis) axisslicer).getElements() != null))) {
              EList<DatamartElement> _elements = ((DatamartCubeAxis) axisslicer).getElements();
              for (final DatamartElement element : _elements) {
                if ((element instanceof DatamartSetAggregation)) {
                  DatamartSetAggregation setAggregation = ((DatamartSetAggregation) element);
                  Expression _set = setAggregation.getSet();
                  if ((_set instanceof DatamartHierarchy)) {
                    Expression _set_1 = setAggregation.getSet();
                    DatamartHierarchy hierarchy = ((DatamartHierarchy) _set_1);
                    String _createHierarchyFilter = this.createHierarchyFilter(hierarchy, definition);
                    String _plus = (text + _createHierarchyFilter);
                    text = _plus;
                  } else {
                    Expression _set_2 = setAggregation.getLeft().getSet();
                    if ((_set_2 instanceof DatamartHierarchy)) {
                      Expression _set_3 = setAggregation.getLeft().getSet();
                      DatamartHierarchy hierarchy_1 = ((DatamartHierarchy) _set_3);
                      String _createHierarchyFilter_1 = this.createHierarchyFilter(hierarchy_1, definition);
                      String _plus_1 = (text + _createHierarchyFilter_1);
                      text = _plus_1;
                    } else {
                      Expression _set_4 = setAggregation.getSet();
                      if ((_set_4 instanceof DatamartSetTuple)) {
                        Expression _set_5 = setAggregation.getSet();
                        DatamartHierarchy hierarchy_2 = ((DatamartSetTuple) _set_5).getRight();
                        String _createHierarchyFilter_2 = this.createHierarchyFilter(hierarchy_2, definition);
                        String _plus_2 = (text + _createHierarchyFilter_2);
                        text = _plus_2;
                      }
                    }
                  }
                } else {
                  if ((element instanceof DatamartHierarchy)) {
                    DatamartHierarchy hierarchy_3 = ((DatamartHierarchy) element);
                    String _createHierarchyFilter_3 = this.createHierarchyFilter(hierarchy_3, definition);
                    String _plus_3 = (text + _createHierarchyFilter_3);
                    text = _plus_3;
                  }
                }
              }
            }
            if (((axisslicer instanceof DatamartSlicer) && (((DatamartSlicer) axisslicer).getElement() != null))) {
              DatamartElement element_1 = ((DatamartSlicer) axisslicer).getElement();
              if ((element_1 instanceof DatamartHierarchy)) {
                DatamartHierarchy hierarchy_4 = ((DatamartHierarchy) element_1);
                String _createHierarchyFilter_4 = this.createHierarchyFilter(hierarchy_4, definition);
                String _plus_4 = (text + _createHierarchyFilter_4);
                text = _plus_4;
              }
            }
          }
        }
      }
      DatamartSource _source_3 = definition.getSource();
      if ((_source_3 instanceof DatamartEntity)) {
        DatamartSource _source_4 = definition.getSource();
        DatamartEntity entity = ((DatamartEntity) _source_4);
        text = this.createFiltermapCondition(entity, definition);
        String _addPrimaryFilters = this.addPrimaryFilters(definition);
        String _plus = (text + _addPrimaryFilters);
        text = _plus;
      }
      DatamartSource _source_5 = definition.getSource();
      if ((_source_5 instanceof DatamartTask)) {
        DatamartSource _source_6 = definition.getSource();
        DatamartTask task = ((DatamartTask) _source_6);
        String _createFiltermapCondition = this.createFiltermapCondition(task, definition);
        String _plus_1 = (text + _createFiltermapCondition);
        text = _plus_1;
      }
      int _length = text.length();
      boolean _greaterThan = (_length > 0);
      if (_greaterThan) {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("{{");
        _builder.newLine();
        _builder.append(text);
        _builder.newLineIfNotEmpty();
        _builder.append("}}");
        text = _builder.toString();
      }
    }
    return text;
  }
  
  public String createHierarchyFilter(final DatamartHierarchy hierarchy, final DatamartDefinition definition) {
    String text = "";
    String ordering = null;
    EObject _eContainer = hierarchy.getHierarchyRef().eContainer();
    if ((_eContainer instanceof CubeDimension)) {
      EObject _eContainer_1 = hierarchy.getHierarchyRef().eContainer();
      boolean _isTypeTime = ((CubeDimension) _eContainer_1).isTypeTime();
      if (_isTypeTime) {
        ordering = "DESC";
      }
    }
    boolean _isFiltered = hierarchy.isFiltered();
    if (_isFiltered) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(text);
      _builder.newLineIfNotEmpty();
      _builder.append("add(new DatamartFilter(");
      _builder.append(this.binderClassName);
      _builder.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.SINGLEHIERARCHY, \"");
      String _levelName = this.getLevelName(hierarchy, Boolean.valueOf(true), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(true));
      _builder.append(_levelName);
      _builder.append("\",\"");
      String _createMDXFilter = this.createMDXFilter(hierarchy, definition.getSource(), ordering, false);
      _builder.append(_createMDXFilter);
      _builder.append("\"));");
      _builder.newLineIfNotEmpty();
      text = _builder.toString();
    }
    boolean _isSelected = hierarchy.isSelected();
    if (_isSelected) {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append(text);
      _builder_1.newLineIfNotEmpty();
      _builder_1.append("add(new DatamartFilter(");
      _builder_1.append(this.binderClassName);
      _builder_1.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.MULTIPLEHIERARCHY, \"");
      String _levelName_1 = this.getLevelName(hierarchy, Boolean.valueOf(true), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(true));
      _builder_1.append(_levelName_1);
      _builder_1.append("\",\"");
      String _createMDXFilter_1 = this.createMDXFilter(hierarchy, definition.getSource(), ordering, false);
      _builder_1.append(_createMDXFilter_1);
      _builder_1.append("\"));");
      _builder_1.newLineIfNotEmpty();
      text = _builder_1.toString();
    }
    boolean _isExcept = hierarchy.isExcept();
    if (_isExcept) {
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append(text);
      _builder_2.newLineIfNotEmpty();
      _builder_2.append("add(new DatamartFilter(");
      _builder_2.append(this.binderClassName);
      _builder_2.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.EXCEPT, \"");
      String _dimensionName = this.getDimensionName(hierarchy, Boolean.valueOf(true));
      String _plus = (_dimensionName + ".[");
      String _name = hierarchy.getExceptRef().getName();
      String _plus_1 = (_plus + _name);
      String _plus_2 = (_plus_1 + "]");
      _builder_2.append(_plus_2);
      _builder_2.append("\",\"");
      String _createMDXFilter_2 = this.createMDXFilter(hierarchy, definition.getSource(), ordering, true);
      _builder_2.append(_createMDXFilter_2);
      _builder_2.append("\"));");
      _builder_2.newLineIfNotEmpty();
      text = _builder_2.toString();
    }
    return text;
  }
  
  /**
   * <p>build a map for the filters contained in a datamart depending on entity.</p>
   */
  public String createPrimaryFilterId(final DatamartDefinition definition) {
    String text = "";
    if (((definition.getSource() != null) && (definition.getSource() instanceof DatamartEntity))) {
      DatamartSource _source = definition.getSource();
      DatamartEntity entity = ((DatamartEntity) _source);
      StringConcatenation _builder = new StringConcatenation();
      String _name = entity.getEntityRef().getName();
      _builder.append(_name);
      _builder.append(".");
      String _name_1 = entity.getEntityRef().getPrimaryKeyAttribute().getName();
      _builder.append(_name_1);
      text = _builder.toString();
    }
    return text;
  }
  
  /**
   * <p>build a map for the filters contained in a datamart depending on a task.</p>
   */
  public String createFiltermapCondition(final DatamartTask task, final DatamartDefinition definition) {
    String text = "";
    EList<DatamartCondition> _conditions = task.getConditions();
    for (final DatamartCondition condition : _conditions) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(text);
      _builder.newLineIfNotEmpty();
      String _createSQLFilter = this.createSQLFilter(condition, task, definition);
      _builder.append(_createSQLFilter);
      text = _builder.toString();
    }
    return text;
  }
  
  /**
   * <p>build the sql filter condition depending on an entity.</p>
   */
  public String createSQLFilter(final DatamartCondition condition, final DatamartTask task, final DatamartDefinition definition) {
    String text = "";
    Expression _condition = condition.getCondition();
    boolean _tripleNotEquals = (_condition != null);
    if (_tripleNotEquals) {
      Expression _condition_1 = condition.getCondition();
      if ((_condition_1 instanceof ConditionalExpression)) {
        Expression _condition_2 = condition.getCondition();
        Expression element = ((ConditionalExpression) _condition_2).getRight();
        Expression _condition_3 = condition.getCondition();
        Expression _left = ((ConditionalExpression) _condition_3).getLeft();
        if ((_left instanceof DatamartTaskFilter)) {
          Expression _condition_4 = condition.getCondition();
          Expression _left_1 = ((ConditionalExpression) _condition_4).getLeft();
          DatamartTaskFilter taskFilter = ((DatamartTaskFilter) _left_1);
          if ((element.isFiltered() || element.isSelected())) {
            StringConcatenation _builder = new StringConcatenation();
            String _literal = taskFilter.getFilterRef().getLiteral();
            _builder.append(_literal);
            String filter = _builder.toString();
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append(text);
            _builder_1.newLineIfNotEmpty();
            _builder_1.append("add(new DatamartFilter(");
            _builder_1.append(this.binderClassName);
            _builder_1.append(".getDSLMetadataService(), user, ");
            {
              boolean _isFiltered = element.isFiltered();
              if (_isFiltered) {
                _builder_1.append("DatamartFilter.FilterType.SINGLE");
              } else {
                boolean _isSelected = element.isSelected();
                if (_isSelected) {
                  _builder_1.append("DatamartFilter.FilterType.MULTIPLE");
                }
              }
            }
            _builder_1.append(", \"");
            String _literal_1 = taskFilter.getFilterRef().getLiteral();
            _builder_1.append(_literal_1);
            _builder_1.append("\",\"");
            _builder_1.append(filter);
            _builder_1.append("\"));");
            text = _builder_1.toString();
          }
        }
      }
    }
    return text;
  }
  
  /**
   * <p>build a map for the filters contained in a datamart depending on an entity.</p>
   */
  public String createFiltermapCondition(final DatamartEntity entity, final DatamartDefinition definition) {
    String text = "";
    EList<DatamartCondition> _conditions = entity.getConditions();
    for (final DatamartCondition condition : _conditions) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(text);
      _builder.newLineIfNotEmpty();
      String _createSQLFilter = this.createSQLFilter(condition, entity, definition);
      _builder.append(_createSQLFilter);
      text = _builder.toString();
    }
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      {
        if ((navigation instanceof DatamartMember)) {
          StringConcatenation _builder_1 = new StringConcatenation();
          _builder_1.append(text);
          _builder_1.newLineIfNotEmpty();
          String _createFiltermapCondition = this.createFiltermapCondition(((DatamartMember) navigation).getDatamartEntity(), definition);
          _builder_1.append(_createFiltermapCondition);
          text = _builder_1.toString();
        }
        if ((navigation instanceof DatamartOwner)) {
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append(text);
          _builder_2.newLineIfNotEmpty();
          String _createFiltermapCondition_1 = this.createFiltermapCondition(((DatamartOwner) navigation).getDatamartEntity(), definition);
          _builder_2.append(_createFiltermapCondition_1);
          text = _builder_2.toString();
        }
      }
    }
    return text;
  }
  
  /**
   * <p>build the sql filter condition depending on an entity.</p>
   */
  public String createSQLFilter(final DatamartCondition condition, final DatamartEntity entity, final DatamartDefinition definition) {
    String text = "";
    Expression _condition = condition.getCondition();
    boolean _tripleNotEquals = (_condition != null);
    if (_tripleNotEquals) {
      Expression _condition_1 = condition.getCondition();
      if ((_condition_1 instanceof ConditionalExpression)) {
        Expression _condition_2 = condition.getCondition();
        Expression element = ((ConditionalExpression) _condition_2).getRight();
        Expression _condition_3 = condition.getCondition();
        Expression leftCondExpr = ((ConditionalExpression) _condition_3).getLeft();
        if ((leftCondExpr instanceof DatamartAttributeBase)) {
          Expression _condition_4 = condition.getCondition();
          Expression _left = ((ConditionalExpression) _condition_4).getLeft();
          DatamartAttributeBase attribute = ((DatamartAttributeBase) _left);
          String filter = this.createSQLFilter(element, entity, attribute);
          boolean _isFiltered = element.isFiltered();
          if (_isFiltered) {
            StringConcatenation _builder = new StringConcatenation();
            _builder.append(text);
            _builder.append("add(new DatamartFilter(");
            _builder.append(this.binderClassName);
            _builder.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.SINGLE, \"");
            String _attributeName = this.getAttributeName(attribute, entity);
            _builder.append(_attributeName);
            _builder.append("\",\"");
            _builder.append(filter);
            _builder.append("\"));");
            text = _builder.toString();
          }
          boolean _isSelected = element.isSelected();
          if (_isSelected) {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append(text);
            _builder_1.append("add(new DatamartFilter(");
            _builder_1.append(this.binderClassName);
            _builder_1.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.MULTIPLE, \"");
            String _attributeName_1 = this.getAttributeName(attribute, entity);
            _builder_1.append(_attributeName_1);
            _builder_1.append("\",\"");
            _builder_1.append(filter);
            _builder_1.append("\"));");
            text = _builder_1.toString();
          }
          boolean _isRanged = element.isRanged();
          if (_isRanged) {
            boolean _isDate = this._modelExtensions.getDatatype(attribute.getAttributeRef()).isDate();
            if (_isDate) {
              EList<LKeyAndValue> _properties = attribute.getAttributeRef().getProperties();
              boolean _tripleNotEquals_1 = (_properties != null);
              if (_tripleNotEquals_1) {
                StringConcatenation _builder_2 = new StringConcatenation();
                _builder_2.append(text);
                _builder_2.append("add(new DatamartFilter(");
                _builder_2.append(this.binderClassName);
                _builder_2.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN_DATE, dateFilterAttributeProperties.get(\"");
                String _attributeName_2 = this.getAttributeName(attribute, entity);
                _builder_2.append(_attributeName_2);
                _builder_2.append("\"), \"");
                String _attributeName_3 = this.getAttributeName(attribute, entity);
                _builder_2.append(_attributeName_3);
                _builder_2.append("\",\"\"));");
                text = _builder_2.toString();
              } else {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append(text);
                _builder_3.append("add(new DatamartFilter(");
                _builder_3.append(this.binderClassName);
                _builder_3.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN_DATE, \"");
                String _attributeName_4 = this.getAttributeName(attribute, entity);
                _builder_3.append(_attributeName_4);
                _builder_3.append("\",\"\"));");
                text = _builder_3.toString();
              }
            } else {
              StringConcatenation _builder_4 = new StringConcatenation();
              _builder_4.append(text);
              _builder_4.append("add(new DatamartFilter(");
              _builder_4.append(this.binderClassName);
              _builder_4.append(".getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN, \"");
              String _attributeName_5 = this.getAttributeName(attribute, entity);
              _builder_4.append(_attributeName_5);
              _builder_4.append("\",\"\"));");
              text = _builder_4.toString();
            }
          }
        }
      }
    }
    return text;
  }
  
  public String createSQLFilter(final Expression element, final DatamartEntity entity, final DatamartAttributeBase attribute) {
    String tableName = this._namingExtensions.toTableName(entity.getEntityRef());
    boolean _hasSuperType = this.hasSuperType(entity);
    if (_hasSuperType) {
      tableName = this._namingExtensions.toTableName(entity.getEntityRef().getSuperType());
    }
    LScalarType type = attribute.getAttributeRef().getType();
    String filter = "";
    if ((type instanceof LDataType)) {
      if ((element.isOptional() && (!((LDataType)type).isDate()))) {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("select ");
        _builder.append(IDataMart.SQLFILTERNOTHING);
        _builder.append(" from ");
        _builder.append(EnumDatabaseVendor.ONE_ROW_ONE_COLUMN_TABLE);
        _builder.append(" union ");
        filter = _builder.toString();
      }
    }
    StringConcatenation _builder_1 = new StringConcatenation();
    _builder_1.append(filter);
    _builder_1.append("select distinct ");
    String _columnName = this._namingExtensions.toColumnName(attribute.getAttributeRef());
    _builder_1.append(_columnName);
    _builder_1.append(" as \\\"");
    String _aliasedAttributeName = DatamartAttributeUtil.getAliasedAttributeName(attribute);
    _builder_1.append(_aliasedAttributeName);
    _builder_1.append("\\\" from ");
    CharSequence _provideSchemaName = this.getProvideSchemaName(entity.getEntityRef().getPersistenceInfo().getSchemaName());
    _builder_1.append(_provideSchemaName);
    _builder_1.append(tableName);
    _builder_1.append(" order by 1");
    filter = _builder_1.toString();
    return filter;
  }
  
  /**
   * <p>build the mdx filter slice depending on a cube.</p>
   */
  public String createMDXFilter(final DatamartHierarchy hierarchy, final DatamartSource source, final String ordering, final boolean isExcept) {
    String filter = "select {} on columns,";
    if (((hierarchy.getLevelRef() != null) && (!isExcept))) {
      if ((ordering != null)) {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(filter);
        _builder.append("Order(");
        String _levelName = this.getLevelName(hierarchy, Boolean.valueOf(true), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(true));
        _builder.append(_levelName);
        _builder.append(".members,[");
        String _hierarchyName = this.getHierarchyName(hierarchy);
        _builder.append(_hierarchyName);
        _builder.append("].CurrentMember.Properties(\\\"MEMBER_KEY\\\"),");
        _builder.append(ordering);
        _builder.append(") on rows");
        filter = _builder.toString();
      } else {
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append(filter);
        String _levelName_1 = this.getLevelName(hierarchy, Boolean.valueOf(true), Boolean.valueOf(false), Boolean.valueOf(false), Boolean.valueOf(true));
        _builder_1.append(_levelName_1);
        _builder_1.append(".members on rows");
        filter = _builder_1.toString();
      }
    }
    if (((hierarchy.getExceptRef() != null) && isExcept)) {
      if ((ordering != null)) {
        StringConcatenation _builder_2 = new StringConcatenation();
        _builder_2.append(filter);
        _builder_2.append("Order(");
        String _dimensionName = this.getDimensionName(hierarchy, Boolean.valueOf(true));
        String _plus = (_dimensionName + ".[");
        String _name = hierarchy.getExceptRef().getName();
        String _plus_1 = (_plus + _name);
        String _plus_2 = (_plus_1 + "]");
        _builder_2.append(_plus_2);
        _builder_2.append(".members,[");
        String _exceptHierarchyName = this.getExceptHierarchyName(hierarchy);
        _builder_2.append(_exceptHierarchyName);
        _builder_2.append("].CurrentMember.Properties(\\\"MEMBER_KEY\\\"),");
        _builder_2.append(ordering);
        _builder_2.append(") on rows");
        filter = _builder_2.toString();
      } else {
        StringConcatenation _builder_3 = new StringConcatenation();
        _builder_3.append(filter);
        String _dimensionName_1 = this.getDimensionName(hierarchy, Boolean.valueOf(true));
        String _plus_3 = (_dimensionName_1 + ".[");
        String _name_1 = hierarchy.getExceptRef().getName();
        String _plus_4 = (_plus_3 + _name_1);
        String _plus_5 = (_plus_4 + "]");
        _builder_3.append(_plus_5);
        _builder_3.append(".members on rows");
        filter = _builder_3.toString();
      }
    }
    if ((source instanceof DatamartCube)) {
      StringConcatenation _builder_4 = new StringConcatenation();
      _builder_4.append(filter);
      _builder_4.append(" from ");
      String _name_2 = ((DatamartCube) source).getCubeRef().getName();
      _builder_4.append(_name_2);
      filter = _builder_4.toString();
    }
    return filter;
  }
  
  /**
   * <p>helper to get a level name.</p>
   */
  public String getFilterAlias(final DatamartHierarchy level) {
    String text = "";
    CubeLevel _levelRef = level.getLevelRef();
    boolean _tripleNotEquals = (_levelRef != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder = new StringConcatenation();
      String _dimensionName = this.getDimensionName(level, Boolean.valueOf(false));
      _builder.append(_dimensionName);
      String _firstUpper = StringExtensions.toFirstUpper(level.getLevelRef().getName());
      _builder.append(_firstUpper);
      text = _builder.toString();
    }
    return text;
  }
  
  /**
   * <p>mdx syntax part for aggregations on sets.</p>
   */
  public String createSetAggregation(final List<DatamartSetAggregation> usedSetAggregation, final Boolean nonEmpty) {
    String set = "";
    boolean firstTuple = true;
    for (final DatamartSetAggregation element : usedSetAggregation) {
      {
        if (firstTuple) {
          firstTuple = false;
        } else {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(set);
          _builder.append(",");
          set = _builder.toString();
        }
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append(set);
        String _evaluateExpression = this.evaluateExpression(element, null);
        _builder_1.append(_evaluateExpression);
        set = _builder_1.toString();
      }
    }
    int _size = usedSetAggregation.size();
    boolean _greaterThan = (_size > 1);
    if (_greaterThan) {
      StringConcatenation _builder = new StringConcatenation();
      {
        if ((nonEmpty).booleanValue()) {
          _builder.append("Non Empty");
        }
      }
      _builder.append("{");
      _builder.append(set);
      _builder.append("}");
      set = _builder.toString();
    } else {
      int _size_1 = usedSetAggregation.size();
      boolean _greaterThan_1 = (_size_1 > 0);
      if (_greaterThan_1) {
        StringConcatenation _builder_1 = new StringConcatenation();
        {
          if ((nonEmpty).booleanValue()) {
            _builder_1.append("Non Empty ");
          }
        }
        _builder_1.append(set);
        set = _builder_1.toString();
      }
    }
    return set;
  }
  
  /**
   * <p>mdx syntax part for hierarchies.</p>
   */
  public String createHierarchies(final List<DatamartHierarchy> usedHierarchies, final Boolean nonEmpty) {
    String set = "";
    boolean firstTuple = true;
    for (final DatamartHierarchy element : usedHierarchies) {
      {
        if (firstTuple) {
          firstTuple = false;
        } else {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(set);
          _builder.append(",");
          set = _builder.toString();
        }
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append(set);
        String _levelName = this.getLevelName(element, Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
        _builder_1.append(_levelName);
        set = _builder_1.toString();
      }
    }
    int _size = usedHierarchies.size();
    boolean _greaterThan = (_size > 1);
    if (_greaterThan) {
      StringConcatenation _builder = new StringConcatenation();
      {
        if ((nonEmpty).booleanValue()) {
          _builder.append("Non Empty");
        }
      }
      _builder.append("{");
      _builder.append(set);
      _builder.append("}");
      set = _builder.toString();
    } else {
      int _size_1 = usedHierarchies.size();
      boolean _greaterThan_1 = (_size_1 > 0);
      if (_greaterThan_1) {
        StringConcatenation _builder_1 = new StringConcatenation();
        {
          if ((nonEmpty).booleanValue()) {
            _builder_1.append("Non Empty ");
          }
        }
        _builder_1.append(set);
        set = _builder_1.toString();
      }
    }
    return set;
  }
  
  /**
   * <p>mdx syntax part for measures.</p>
   */
  public String createMeasures(final List<DatamartMeasure> usedMeasures, final List<DatamartDerivedMeasure> usedDerived, final Boolean nonEmpty) {
    String set = "";
    boolean firstTuple = true;
    for (final DatamartMeasure element : usedMeasures) {
      {
        if (firstTuple) {
          firstTuple = false;
        } else {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(set);
          _builder.append(",");
          set = _builder.toString();
        }
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append(set);
        String _measureName = this.getMeasureName(element);
        _builder_1.append(_measureName);
        set = _builder_1.toString();
      }
    }
    for (final DatamartDerivedMeasure element_1 : usedDerived) {
      {
        if (firstTuple) {
          firstTuple = false;
        } else {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(set);
          _builder.append(",");
          set = _builder.toString();
        }
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append(set);
        String _derivedMeasureName = this.getDerivedMeasureName(element_1);
        _builder_1.append(_derivedMeasureName);
        set = _builder_1.toString();
      }
    }
    int _size = usedMeasures.size();
    int _size_1 = usedDerived.size();
    int _plus = (_size + _size_1);
    boolean _greaterThan = (_plus > 1);
    if (_greaterThan) {
      StringConcatenation _builder = new StringConcatenation();
      {
        if ((nonEmpty).booleanValue()) {
          _builder.append("Non Empty");
        }
      }
      _builder.append("{");
      _builder.append(set);
      _builder.append("}");
      set = _builder.toString();
    } else {
      int _size_2 = usedMeasures.size();
      int _size_3 = usedDerived.size();
      int _plus_1 = (_size_2 + _size_3);
      boolean _greaterThan_1 = (_plus_1 > 0);
      if (_greaterThan_1) {
        StringConcatenation _builder_1 = new StringConcatenation();
        {
          if ((nonEmpty).booleanValue()) {
            _builder_1.append("Non Empty ");
          }
        }
        _builder_1.append(set);
        set = _builder_1.toString();
      }
    }
    return set;
  }
  
  /**
   * <p>the main function to build a mdx statement.</p>
   */
  public String createMDXStatement(final DatamartDefinition definition) {
    this.sqlAliasCounter.clear();
    this.sqlFilterMap.clear();
    this.ignoreEntityGrouping = false;
    this.sqlHasAggregate = false;
    this.sqlHasOrder = false;
    this.idMap.clear();
    DatamartSource _source = definition.getSource();
    DatamartCube cube = ((DatamartCube) _source);
    String body = "";
    String slice = "";
    String derived = "";
    boolean firstAxis = true;
    boolean firstSlice = true;
    boolean firstderived = true;
    EList<DatamartCubeElement> _axisslicer = cube.getAxisslicer();
    for (final DatamartCubeElement axisslicer : _axisslicer) {
      {
        if ((axisslicer instanceof DatamartCubeAxis)) {
          boolean crossJoinMeasure = false;
          boolean crossJoinHierarchy = false;
          boolean crossJoinSetAggregation = false;
          DatamartCubeAxis axis = ((DatamartCubeAxis) axisslicer);
          if (firstAxis) {
            firstAxis = false;
          } else {
            StringConcatenation _builder = new StringConcatenation();
            _builder.append(body);
            _builder.append(",");
            body = _builder.toString();
          }
          EList<DatamartElement> _elements = axis.getElements();
          boolean _tripleNotEquals = (_elements != null);
          if (_tripleNotEquals) {
            String set = "";
            final ArrayList<DatamartHierarchy> usedHierarchies = CollectionLiterals.<DatamartHierarchy>newArrayList();
            final ArrayList<DatamartMeasure> usedMeasures = CollectionLiterals.<DatamartMeasure>newArrayList();
            final ArrayList<DatamartDerivedMeasure> usedDerivedMeasure = CollectionLiterals.<DatamartDerivedMeasure>newArrayList();
            final ArrayList<DatamartSetAggregation> usedSetAggregation = CollectionLiterals.<DatamartSetAggregation>newArrayList();
            EList<DatamartElement> _elements_1 = axis.getElements();
            for (final DatamartElement element : _elements_1) {
              {
                if ((element instanceof DatamartSetAggregation)) {
                  if (((usedMeasures.size() > 0) || (usedDerivedMeasure.size() > 0))) {
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_1 = new StringConcatenation();
                      _builder_1.append(set);
                      _builder_1.append(",");
                      set = _builder_1.toString();
                    }
                    StringConcatenation _builder_2 = new StringConcatenation();
                    {
                      boolean _isNonEmpty = cube.isNonEmpty();
                      if (_isNonEmpty) {
                        _builder_2.append("NonEmptyCrossjoin");
                      } else {
                        _builder_2.append("CrossJoin");
                      }
                    }
                    _builder_2.append("(");
                    _builder_2.append(set);
                    String _createMeasures = this.createMeasures(usedMeasures, usedDerivedMeasure, Boolean.valueOf(false));
                    _builder_2.append(_createMeasures);
                    set = _builder_2.toString();
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_3 = new StringConcatenation();
                      _builder_3.append(set);
                      _builder_3.append(")");
                      set = _builder_3.toString();
                    }
                    usedMeasures.clear();
                    usedDerivedMeasure.clear();
                    crossJoinSetAggregation = true;
                  }
                  int _size = usedHierarchies.size();
                  boolean _greaterThan = (_size > 0);
                  if (_greaterThan) {
                    if (crossJoinHierarchy) {
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append(set);
                      _builder_4.append(",");
                      set = _builder_4.toString();
                    }
                    StringConcatenation _builder_5 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_1 = cube.isNonEmpty();
                      if (_isNonEmpty_1) {
                        _builder_5.append("NonEmptyCrossjoin");
                      } else {
                        _builder_5.append("CrossJoin");
                      }
                    }
                    _builder_5.append("(");
                    _builder_5.append(set);
                    String _createHierarchies = this.createHierarchies(usedHierarchies, Boolean.valueOf(false));
                    _builder_5.append(_createHierarchies);
                    set = _builder_5.toString();
                    if (crossJoinHierarchy) {
                      StringConcatenation _builder_6 = new StringConcatenation();
                      _builder_6.append(set);
                      _builder_6.append(")");
                      set = _builder_6.toString();
                    }
                    usedHierarchies.clear();
                    crossJoinSetAggregation = true;
                  }
                  DatamartSetAggregation setAggregation = ((DatamartSetAggregation) element);
                  usedSetAggregation.add(setAggregation);
                }
                if ((element instanceof DatamartHierarchy)) {
                  if (((usedMeasures.size() > 0) || (usedDerivedMeasure.size() > 0))) {
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_7 = new StringConcatenation();
                      _builder_7.append(set);
                      _builder_7.append(",");
                      set = _builder_7.toString();
                    }
                    StringConcatenation _builder_8 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_2 = cube.isNonEmpty();
                      if (_isNonEmpty_2) {
                        _builder_8.append("NonEmptyCrossjoin");
                      } else {
                        _builder_8.append("CrossJoin");
                      }
                    }
                    _builder_8.append("(");
                    _builder_8.append(set);
                    String _createMeasures_1 = this.createMeasures(usedMeasures, usedDerivedMeasure, Boolean.valueOf(false));
                    _builder_8.append(_createMeasures_1);
                    set = _builder_8.toString();
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_9 = new StringConcatenation();
                      _builder_9.append(set);
                      _builder_9.append(")");
                      set = _builder_9.toString();
                    }
                    usedMeasures.clear();
                    usedDerivedMeasure.clear();
                    crossJoinMeasure = true;
                  }
                  int _size_1 = usedSetAggregation.size();
                  boolean _greaterThan_1 = (_size_1 > 0);
                  if (_greaterThan_1) {
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_10 = new StringConcatenation();
                      _builder_10.append(set);
                      _builder_10.append(",");
                      set = _builder_10.toString();
                    }
                    StringConcatenation _builder_11 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_3 = cube.isNonEmpty();
                      if (_isNonEmpty_3) {
                        _builder_11.append("NonEmptyCrossjoin");
                      } else {
                        _builder_11.append("CrossJoin");
                      }
                    }
                    _builder_11.append("(");
                    _builder_11.append(set);
                    String _createSetAggregation = this.createSetAggregation(usedSetAggregation, Boolean.valueOf(false));
                    _builder_11.append(_createSetAggregation);
                    set = _builder_11.toString();
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_12 = new StringConcatenation();
                      _builder_12.append(set);
                      _builder_12.append(")");
                      set = _builder_12.toString();
                    }
                    usedSetAggregation.clear();
                    crossJoinSetAggregation = true;
                  }
                  DatamartHierarchy hierarchyLevel = ((DatamartHierarchy) element);
                  DatamartHierarchy lastHierarchy = IterableExtensions.<DatamartHierarchy>last(usedHierarchies);
                  if (((!crossJoinHierarchy) && ((lastHierarchy == null) || 
                    this.getHierarchyName(hierarchyLevel).equals(this.getHierarchyName(lastHierarchy))))) {
                    usedHierarchies.add(hierarchyLevel);
                  } else {
                    if (crossJoinHierarchy) {
                      StringConcatenation _builder_13 = new StringConcatenation();
                      _builder_13.append(set);
                      _builder_13.append(",");
                      set = _builder_13.toString();
                    }
                    StringConcatenation _builder_14 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_4 = cube.isNonEmpty();
                      if (_isNonEmpty_4) {
                        _builder_14.append("NonEmptyCrossjoin");
                      } else {
                        _builder_14.append("CrossJoin");
                      }
                    }
                    _builder_14.append("(");
                    _builder_14.append(set);
                    String _createHierarchies_1 = this.createHierarchies(usedHierarchies, Boolean.valueOf(false));
                    _builder_14.append(_createHierarchies_1);
                    set = _builder_14.toString();
                    if (crossJoinHierarchy) {
                      StringConcatenation _builder_15 = new StringConcatenation();
                      _builder_15.append(set);
                      _builder_15.append(")");
                      set = _builder_15.toString();
                    }
                    usedHierarchies.clear();
                    usedHierarchies.add(hierarchyLevel);
                    crossJoinHierarchy = true;
                  }
                }
                if ((element instanceof DatamartMeasure)) {
                  int _size_2 = usedHierarchies.size();
                  boolean _greaterThan_2 = (_size_2 > 0);
                  if (_greaterThan_2) {
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_16 = new StringConcatenation();
                      _builder_16.append(set);
                      _builder_16.append(",");
                      set = _builder_16.toString();
                    }
                    StringConcatenation _builder_17 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_5 = cube.isNonEmpty();
                      if (_isNonEmpty_5) {
                        _builder_17.append("NonEmptyCrossjoin");
                      } else {
                        _builder_17.append("CrossJoin");
                      }
                    }
                    _builder_17.append("(");
                    _builder_17.append(set);
                    String _createHierarchies_2 = this.createHierarchies(usedHierarchies, Boolean.valueOf(false));
                    _builder_17.append(_createHierarchies_2);
                    set = _builder_17.toString();
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_18 = new StringConcatenation();
                      _builder_18.append(set);
                      _builder_18.append(")");
                      set = _builder_18.toString();
                    }
                    usedHierarchies.clear();
                    crossJoinMeasure = true;
                  }
                  int _size_3 = usedSetAggregation.size();
                  boolean _greaterThan_3 = (_size_3 > 0);
                  if (_greaterThan_3) {
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_19 = new StringConcatenation();
                      _builder_19.append(set);
                      _builder_19.append(",");
                      set = _builder_19.toString();
                    }
                    StringConcatenation _builder_20 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_6 = cube.isNonEmpty();
                      if (_isNonEmpty_6) {
                        _builder_20.append("NonEmptyCrossjoin");
                      } else {
                        _builder_20.append("CrossJoin");
                      }
                    }
                    _builder_20.append("(");
                    _builder_20.append(set);
                    String _createSetAggregation_1 = this.createSetAggregation(usedSetAggregation, Boolean.valueOf(false));
                    _builder_20.append(_createSetAggregation_1);
                    set = _builder_20.toString();
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_21 = new StringConcatenation();
                      _builder_21.append(set);
                      _builder_21.append(")");
                      set = _builder_21.toString();
                    }
                    usedSetAggregation.clear();
                    crossJoinSetAggregation = true;
                  }
                  DatamartMeasure measure = ((DatamartMeasure) element);
                  usedMeasures.add(measure);
                }
                if ((element instanceof DatamartDerivedMeasure)) {
                  int _size_4 = usedHierarchies.size();
                  boolean _greaterThan_4 = (_size_4 > 0);
                  if (_greaterThan_4) {
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_22 = new StringConcatenation();
                      _builder_22.append(set);
                      _builder_22.append(",");
                      set = _builder_22.toString();
                    }
                    StringConcatenation _builder_23 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_7 = cube.isNonEmpty();
                      if (_isNonEmpty_7) {
                        _builder_23.append("NonEmptyCrossjoin");
                      } else {
                        _builder_23.append("CrossJoin");
                      }
                    }
                    _builder_23.append("(");
                    _builder_23.append(set);
                    String _createHierarchies_3 = this.createHierarchies(usedHierarchies, Boolean.valueOf(false));
                    _builder_23.append(_createHierarchies_3);
                    set = _builder_23.toString();
                    if (crossJoinMeasure) {
                      StringConcatenation _builder_24 = new StringConcatenation();
                      _builder_24.append(set);
                      _builder_24.append(")");
                      set = _builder_24.toString();
                    }
                    usedHierarchies.clear();
                    crossJoinMeasure = true;
                  }
                  int _size_5 = usedSetAggregation.size();
                  boolean _greaterThan_5 = (_size_5 > 0);
                  if (_greaterThan_5) {
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_25 = new StringConcatenation();
                      _builder_25.append(set);
                      _builder_25.append(",");
                      set = _builder_25.toString();
                    }
                    StringConcatenation _builder_26 = new StringConcatenation();
                    {
                      boolean _isNonEmpty_8 = cube.isNonEmpty();
                      if (_isNonEmpty_8) {
                        _builder_26.append("NonEmptyCrossjoin");
                      } else {
                        _builder_26.append("CrossJoin");
                      }
                    }
                    _builder_26.append("(");
                    _builder_26.append(set);
                    String _createSetAggregation_2 = this.createSetAggregation(usedSetAggregation, Boolean.valueOf(false));
                    _builder_26.append(_createSetAggregation_2);
                    set = _builder_26.toString();
                    if (crossJoinSetAggregation) {
                      StringConcatenation _builder_27 = new StringConcatenation();
                      _builder_27.append(set);
                      _builder_27.append(")");
                      set = _builder_27.toString();
                    }
                    usedSetAggregation.clear();
                    crossJoinSetAggregation = true;
                  }
                  DatamartDerivedMeasure measure_1 = ((DatamartDerivedMeasure) element);
                  usedDerivedMeasure.add(measure_1);
                }
              }
            }
            if (((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation)) {
              StringConcatenation _builder_1 = new StringConcatenation();
              _builder_1.append(set);
              _builder_1.append(",");
              set = _builder_1.toString();
            }
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append(set);
            String _createHierarchies = this.createHierarchies(usedHierarchies, 
              Boolean.valueOf((cube.isNonEmpty() && (!((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation)))));
            _builder_2.append(_createHierarchies);
            set = _builder_2.toString();
            usedHierarchies.clear();
            StringConcatenation _builder_3 = new StringConcatenation();
            _builder_3.append(set);
            String _createMeasures = this.createMeasures(usedMeasures, usedDerivedMeasure, 
              Boolean.valueOf((cube.isNonEmpty() && (!((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation)))));
            _builder_3.append(_createMeasures);
            set = _builder_3.toString();
            usedMeasures.clear();
            usedDerivedMeasure.clear();
            StringConcatenation _builder_4 = new StringConcatenation();
            _builder_4.append(set);
            String _createSetAggregation = this.createSetAggregation(usedSetAggregation, 
              Boolean.valueOf((cube.isNonEmpty() && (!((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation)))));
            _builder_4.append(_createSetAggregation);
            set = _builder_4.toString();
            usedMeasures.clear();
            if (((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation)) {
              StringConcatenation _builder_5 = new StringConcatenation();
              _builder_5.append(set);
              _builder_5.append(")");
              set = _builder_5.toString();
            }
            StringConcatenation _builder_6 = new StringConcatenation();
            _builder_6.append(body);
            _builder_6.append(set);
            _builder_6.append(" on ");
            AxisEnum _name = axis.getAxis().getName();
            _builder_6.append(_name);
            body = _builder_6.toString();
          }
        }
        if ((axisslicer instanceof DatamartSlicer)) {
          if (firstSlice) {
            firstSlice = false;
          } else {
            StringConcatenation _builder_7 = new StringConcatenation();
            _builder_7.append(slice);
            _builder_7.append(",");
            slice = _builder_7.toString();
          }
          DatamartElement element_1 = ((DatamartSlicer) axisslicer).getElement();
          if ((element_1 instanceof DatamartHierarchy)) {
            DatamartHierarchy hierarchyLevel = ((DatamartHierarchy) element_1);
            StringConcatenation _builder_8 = new StringConcatenation();
            _builder_8.append(slice);
            String _levelName = this.getLevelName(hierarchyLevel, Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true));
            _builder_8.append(_levelName);
            slice = _builder_8.toString();
          }
          if ((element_1 instanceof DatamartMeasure)) {
            StringConcatenation _builder_9 = new StringConcatenation();
            _builder_9.append(slice);
            String _measureName = this.getMeasureName(((DatamartMeasure) element_1));
            _builder_9.append(_measureName);
            slice = _builder_9.toString();
          }
        }
        if ((axisslicer instanceof DatamartDefineDerivedMeasure)) {
          if (firstderived) {
            firstderived = false;
          }
          DatamartDefineDerivedMeasure derivedMeasure = ((DatamartDefineDerivedMeasure) axisslicer);
          StringConcatenation _builder_10 = new StringConcatenation();
          _builder_10.append(derived);
          _builder_10.append(" member [Measures].[");
          String _name_1 = derivedMeasure.getName();
          _builder_10.append(_name_1);
          _builder_10.append("] as ");
          String _buildDerivedFormula = this.buildDerivedFormula(derivedMeasure);
          _builder_10.append(_buildDerivedFormula);
          derived = _builder_10.toString();
        }
      }
    }
    if ((!firstSlice)) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(" ");
      _builder.append("where (");
      _builder.append(slice, " ");
      _builder.append(")");
      slice = _builder.toString();
    }
    if ((!firstderived)) {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("with");
      _builder_1.append(derived);
      _builder_1.append(" ");
      derived = _builder_1.toString();
    }
    StringConcatenation _builder_2 = new StringConcatenation();
    _builder_2.append(derived);
    _builder_2.append("select ");
    _builder_2.append(body);
    _builder_2.append(" from ");
    String _name = cube.getCubeRef().getName();
    _builder_2.append(_name);
    _builder_2.append(slice);
    return _builder_2.toString();
  }
  
  public boolean isCrossJoined(final DatamartDefinition definition) {
    DatamartSource _source = definition.getSource();
    boolean _not = (!(_source instanceof DatamartCube));
    if (_not) {
      return false;
    }
    DatamartSource _source_1 = definition.getSource();
    DatamartCube cube = ((DatamartCube) _source_1);
    boolean firstAxis = true;
    EList<DatamartCubeElement> _axisslicer = cube.getAxisslicer();
    for (final DatamartCubeElement axisslicer : _axisslicer) {
      if ((axisslicer instanceof DatamartCubeAxis)) {
        boolean crossJoinMeasure = false;
        boolean crossJoinHierarchy = false;
        boolean crossJoinSetAggregation = false;
        DatamartCubeAxis axis = ((DatamartCubeAxis) axisslicer);
        if (firstAxis) {
          firstAxis = false;
        }
        EList<DatamartElement> _elements = axis.getElements();
        boolean _tripleNotEquals = (_elements != null);
        if (_tripleNotEquals) {
          final ArrayList<DatamartHierarchy> usedHierarchies = CollectionLiterals.<DatamartHierarchy>newArrayList();
          final ArrayList<DatamartMeasure> usedMeasures = CollectionLiterals.<DatamartMeasure>newArrayList();
          final ArrayList<DatamartDerivedMeasure> usedDerivedMeasure = CollectionLiterals.<DatamartDerivedMeasure>newArrayList();
          final ArrayList<DatamartSetAggregation> usedSetAggregation = CollectionLiterals.<DatamartSetAggregation>newArrayList();
          EList<DatamartElement> _elements_1 = axis.getElements();
          for (final DatamartElement element : _elements_1) {
            {
              if ((element instanceof DatamartSetAggregation)) {
                if (((usedMeasures.size() > 0) || (usedDerivedMeasure.size() > 0))) {
                  usedMeasures.clear();
                  usedDerivedMeasure.clear();
                  crossJoinSetAggregation = true;
                }
                int _size = usedHierarchies.size();
                boolean _greaterThan = (_size > 0);
                if (_greaterThan) {
                  usedHierarchies.clear();
                  crossJoinSetAggregation = true;
                }
                DatamartSetAggregation setAggregation = ((DatamartSetAggregation) element);
                usedSetAggregation.add(setAggregation);
              }
              if ((element instanceof DatamartHierarchy)) {
                if (((usedMeasures.size() > 0) || (usedDerivedMeasure.size() > 0))) {
                  usedMeasures.clear();
                  usedDerivedMeasure.clear();
                  crossJoinMeasure = true;
                }
                int _size_1 = usedSetAggregation.size();
                boolean _greaterThan_1 = (_size_1 > 0);
                if (_greaterThan_1) {
                  usedSetAggregation.clear();
                  crossJoinSetAggregation = true;
                }
                DatamartHierarchy hierarchyLevel = ((DatamartHierarchy) element);
                DatamartHierarchy lastHierarchy = IterableExtensions.<DatamartHierarchy>last(usedHierarchies);
                if (((!crossJoinHierarchy) && ((lastHierarchy == null) || 
                  this.getHierarchyName(hierarchyLevel).equals(this.getHierarchyName(lastHierarchy))))) {
                  usedHierarchies.add(hierarchyLevel);
                } else {
                  usedHierarchies.clear();
                  usedHierarchies.add(hierarchyLevel);
                  crossJoinHierarchy = true;
                }
              }
              if ((element instanceof DatamartMeasure)) {
                int _size_2 = usedHierarchies.size();
                boolean _greaterThan_2 = (_size_2 > 0);
                if (_greaterThan_2) {
                  usedHierarchies.clear();
                  crossJoinMeasure = true;
                }
                int _size_3 = usedSetAggregation.size();
                boolean _greaterThan_3 = (_size_3 > 0);
                if (_greaterThan_3) {
                  usedSetAggregation.clear();
                  crossJoinSetAggregation = true;
                }
                DatamartMeasure measure = ((DatamartMeasure) element);
                usedMeasures.add(measure);
              }
              if ((element instanceof DatamartDerivedMeasure)) {
                int _size_4 = usedHierarchies.size();
                boolean _greaterThan_4 = (_size_4 > 0);
                if (_greaterThan_4) {
                  usedHierarchies.clear();
                  crossJoinMeasure = true;
                }
                int _size_5 = usedSetAggregation.size();
                boolean _greaterThan_5 = (_size_5 > 0);
                if (_greaterThan_5) {
                  usedSetAggregation.clear();
                  crossJoinSetAggregation = true;
                }
                DatamartDerivedMeasure measure_1 = ((DatamartDerivedMeasure) element);
                usedDerivedMeasure.add(measure_1);
              }
            }
          }
          usedMeasures.clear();
          usedDerivedMeasure.clear();
          usedMeasures.clear();
        }
        return ((crossJoinMeasure || crossJoinHierarchy) || crossJoinSetAggregation);
      }
    }
    return false;
  }
  
  /**
   * <p>mdx syntax part for hierarchy names. If a hierarchy itself has no name in the cube definition, the dimension name is used instead</p>
   */
  public String getHierarchyName(final DatamartHierarchy hierarchy) {
    String _xifexpression = null;
    String _name = hierarchy.getHierarchyRef().getName();
    boolean _tripleEquals = (_name == null);
    if (_tripleEquals) {
      EObject _eContainer = hierarchy.getHierarchyRef().eContainer();
      return ((CubeDimension) _eContainer).getName();
    } else {
      _xifexpression = hierarchy.getHierarchyRef().getName();
    }
    return _xifexpression;
  }
  
  /**
   * <p>mdx syntax part for hierarchy names of execpt keyword. If a hierarchy itself has no name in the cube definition, the dimension name is used instead</p>
   */
  public String getExceptHierarchyName(final DatamartHierarchy hierarchy) {
    String _xifexpression = null;
    String _name = hierarchy.getExceptRef().getName();
    boolean _tripleEquals = (_name == null);
    if (_tripleEquals) {
      EObject _eContainer = hierarchy.getExceptRef().eContainer();
      return ((CubeDimension) _eContainer).getName();
    } else {
      _xifexpression = hierarchy.getExceptRef().getName();
    }
    return _xifexpression;
  }
  
  /**
   * <p>mdx syntax part for derived measure expressions.</p>
   */
  public String buildDerivedFormula(final DatamartDefineDerivedMeasure derivedMeasure) {
    String formula = "";
    EList<Expression> _derivedElement = derivedMeasure.getDerivedElement();
    for (final Expression element : _derivedElement) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(formula);
      String _evaluateExpression = this.evaluateExpression(element, null);
      _builder.append(_evaluateExpression);
      formula = _builder.toString();
    }
    return "\'".concat(formula).concat("\'");
  }
  
  /**
   * <p>as the grammar makes use of expressions along an abstract syntax tree, we need this recursive dispatcher to synthesize resulting code.</p>
   */
  public String evaluateExpression(final Expression element, final DatamartEntity entity) {
    String evaluation = "";
    String _value = element.getValue();
    boolean _tripleNotEquals = (_value != null);
    if (_tripleNotEquals) {
      evaluation = element.getValue();
    }
    String _numberValue = element.getNumberValue();
    boolean _tripleNotEquals_1 = (_numberValue != null);
    if (_tripleNotEquals_1) {
      evaluation = element.getNumberValue();
    }
    String _stringValue = element.getStringValue();
    boolean _tripleNotEquals_2 = (_stringValue != null);
    if (_tripleNotEquals_2) {
      evaluation = "\'".concat(element.getStringValue()).concat("\'");
    }
    if (((element.isFiltered() || element.isSelected()) || element.isRanged())) {
      StringConcatenation _builder = new StringConcatenation();
      EObject _eContainer = element.eContainer();
      Expression _left = ((ConditionalExpression) _eContainer).getLeft();
      String _decorate = DatamartFilter.decorate(this.getAttributeName(((DatamartAttributeBase) _left), entity));
      _builder.append(_decorate);
      evaluation = _builder.toString();
    }
    boolean _isUnreferenced = element.isUnreferenced();
    if (_isUnreferenced) {
      EObject _eContainer_1 = element.eContainer();
      Expression leftConditionExpression = ((ConditionalExpression) _eContainer_1).getLeft();
      LEntityFeature entityF = null;
      if ((leftConditionExpression instanceof DatamartReferenceBase)) {
        EObject _eContainer_2 = element.eContainer();
        Expression _left_1 = ((ConditionalExpression) _eContainer_2).getLeft();
        entityF = ((DatamartReferenceBase) _left_1).getReferenceRef();
      } else {
        if ((leftConditionExpression instanceof DatamartAttributeBase)) {
          EObject _eContainer_3 = element.eContainer();
          Expression _left_2 = ((ConditionalExpression) _eContainer_3).getLeft();
          entityF = ((DatamartAttributeBase) _left_2).getAttributeRef();
        }
      }
      if ((entityF != null)) {
        StringConcatenation _builder_1 = new StringConcatenation();
        String _name = entityF.getEntity().getName();
        _builder_1.append(_name);
        _builder_1.append(".");
        String _columnName = this._namingExtensions.toColumnName(entityF);
        _builder_1.append(_columnName);
        _builder_1.append(" is null");
        evaluation = _builder_1.toString();
      }
    }
    DatamartFunctionInterface _function = element.getFunction();
    boolean _tripleNotEquals_3 = (_function != null);
    if (_tripleNotEquals_3) {
      DatamartFunctionInterface _function_1 = element.getFunction();
      if ((_function_1 instanceof DatamartFunction)) {
        StringConcatenation _builder_2 = new StringConcatenation();
        _builder_2.append(evaluation);
        String _levelName = this.getLevelName(element.getHierarchy(), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
        _builder_2.append(_levelName);
        _builder_2.append(".");
        DatamartFunctionInterface _function_2 = element.getFunction();
        String _name_1 = ((DatamartFunction) _function_2).getFunction().name();
        _builder_2.append(_name_1);
        evaluation = _builder_2.toString();
      }
      DatamartFunctionInterface _function_3 = element.getFunction();
      if ((_function_3 instanceof DatamartParameterFunction)) {
        StringConcatenation _builder_3 = new StringConcatenation();
        _builder_3.append(evaluation);
        String _levelName_1 = this.getLevelName(element.getHierarchy(), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
        _builder_3.append(_levelName_1);
        _builder_3.append(".");
        DatamartFunctionInterface _function_4 = element.getFunction();
        String _name_2 = ((DatamartParameterFunction) _function_4).getFunction().name();
        _builder_3.append(_name_2);
        _builder_3.append("(");
        DatamartFunctionInterface _function_5 = element.getFunction();
        int _value_1 = ((DatamartParameterFunction) _function_5).getParameter().getValue();
        _builder_3.append(_value_1);
        _builder_3.append(")");
        evaluation = _builder_3.toString();
      }
    }
    if (((element.getHierarchy() != null) && (element.getFunction() == null))) {
      StringConcatenation _builder_4 = new StringConcatenation();
      _builder_4.append(evaluation);
      String _levelName_2 = this.getLevelName(element.getHierarchy(), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
      _builder_4.append(_levelName_2);
      evaluation = _builder_4.toString();
    }
    if ((element instanceof DatamartSetTuple)) {
      DatamartSetFunctionInterface _setFunction = ((DatamartSetTuple) element).getLeft().getSetFunction();
      boolean _tripleNotEquals_4 = (_setFunction != null);
      if (_tripleNotEquals_4) {
        DatamartSetFunctionInterface _setFunction_1 = ((DatamartSetTuple) element).getLeft().getSetFunction();
        if ((_setFunction_1 instanceof DatamartSetFunction)) {
          StringConcatenation _builder_5 = new StringConcatenation();
          _builder_5.append(evaluation);
          DatamartSetFunctionInterface _setFunction_2 = ((DatamartSetTuple) element).getLeft().getSetFunction();
          String _name_3 = ((DatamartSetFunction) _setFunction_2).getSetFunction().name();
          _builder_5.append(_name_3);
          _builder_5.append("(");
          String _levelName_3 = this.getLevelName(((DatamartSetTuple) element).getRight(), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
          _builder_5.append(_levelName_3);
          _builder_5.append(")");
          evaluation = _builder_5.toString();
        }
        DatamartSetFunctionInterface _setFunction_3 = ((DatamartSetTuple) element).getLeft().getSetFunction();
        if ((_setFunction_3 instanceof DatamartSetParameterFunction)) {
          StringConcatenation _builder_6 = new StringConcatenation();
          _builder_6.append(evaluation);
          DatamartSetFunctionInterface _setFunction_4 = ((DatamartSetTuple) element).getLeft().getSetFunction();
          String _name_4 = ((DatamartSetParameterFunction) _setFunction_4).getSetFunction().name();
          _builder_6.append(_name_4);
          _builder_6.append("(");
          String _levelName_4 = this.getLevelName(((DatamartSetTuple) element).getRight(), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
          _builder_6.append(_levelName_4);
          _builder_6.append(",");
          DatamartSetFunctionInterface _setFunction_5 = ((DatamartSetTuple) element).getLeft().getSetFunction();
          DatamartFunctionIntParameter _parameter = ((DatamartSetParameterFunction) _setFunction_5).getParameter();
          int _value_2 = ((DatamartFunctionIntParameter) _parameter).getValue();
          _builder_6.append(_value_2);
          _builder_6.append(")");
          evaluation = _builder_6.toString();
        }
      }
    }
    if ((element instanceof DatamartMeasure)) {
      StringConcatenation _builder_7 = new StringConcatenation();
      String _measureName = this.getMeasureName(((DatamartMeasure) element));
      _builder_7.append(_measureName);
      evaluation = _builder_7.toString();
    }
    if ((element instanceof DatamartDerivedMeasure)) {
      StringConcatenation _builder_8 = new StringConcatenation();
      String _derivedMeasureName = this.getDerivedMeasureName(((DatamartDerivedMeasure) element));
      _builder_8.append(_derivedMeasureName);
      evaluation = _builder_8.toString();
    }
    if ((element instanceof DatamartHierarchy)) {
      StringConcatenation _builder_9 = new StringConcatenation();
      String _levelName_5 = this.getLevelName(((DatamartHierarchy) element), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
      _builder_9.append(_levelName_5);
      evaluation = _builder_9.toString();
    }
    if ((element instanceof DatamartAttributeBase)) {
      StringConcatenation _builder_10 = new StringConcatenation();
      String _attributeName = this.getAttributeName(((DatamartAttributeBase) element), entity);
      _builder_10.append(_attributeName);
      evaluation = _builder_10.toString();
    }
    if ((element instanceof Multiplication)) {
      StringConcatenation _builder_11 = new StringConcatenation();
      String _evaluateExpression = this.evaluateExpression(((Multiplication) element).getLeft(), entity);
      _builder_11.append(_evaluateExpression);
      evaluation = _builder_11.toString();
      StringConcatenation _builder_12 = new StringConcatenation();
      _builder_12.append(evaluation);
      _builder_12.append("*");
      evaluation = _builder_12.toString();
      StringConcatenation _builder_13 = new StringConcatenation();
      _builder_13.append(evaluation);
      String _evaluateExpression_1 = this.evaluateExpression(((Multiplication) element).getRight(), entity);
      _builder_13.append(_evaluateExpression_1);
      evaluation = _builder_13.toString();
    }
    if ((element instanceof Division)) {
      StringConcatenation _builder_14 = new StringConcatenation();
      String _evaluateExpression_2 = this.evaluateExpression(((Division) element).getLeft(), entity);
      _builder_14.append(_evaluateExpression_2);
      evaluation = _builder_14.toString();
      StringConcatenation _builder_15 = new StringConcatenation();
      _builder_15.append(evaluation);
      _builder_15.append("/");
      evaluation = _builder_15.toString();
      StringConcatenation _builder_16 = new StringConcatenation();
      _builder_16.append(evaluation);
      String _evaluateExpression_3 = this.evaluateExpression(((Division) element).getRight(), entity);
      _builder_16.append(_evaluateExpression_3);
      evaluation = _builder_16.toString();
    }
    if ((element instanceof Addition)) {
      StringConcatenation _builder_17 = new StringConcatenation();
      _builder_17.append("(");
      String _evaluateExpression_4 = this.evaluateExpression(((Addition) element).getLeft(), entity);
      _builder_17.append(_evaluateExpression_4);
      evaluation = _builder_17.toString();
      StringConcatenation _builder_18 = new StringConcatenation();
      _builder_18.append(evaluation);
      _builder_18.append("+");
      evaluation = _builder_18.toString();
      StringConcatenation _builder_19 = new StringConcatenation();
      _builder_19.append(evaluation);
      String _evaluateExpression_5 = this.evaluateExpression(((Addition) element).getRight(), entity);
      _builder_19.append(_evaluateExpression_5);
      _builder_19.append(")");
      evaluation = _builder_19.toString();
    }
    if ((element instanceof Subtraction)) {
      StringConcatenation _builder_20 = new StringConcatenation();
      _builder_20.append("(");
      String _evaluateExpression_6 = this.evaluateExpression(((Subtraction) element).getLeft(), entity);
      _builder_20.append(_evaluateExpression_6);
      evaluation = _builder_20.toString();
      StringConcatenation _builder_21 = new StringConcatenation();
      _builder_21.append(evaluation);
      _builder_21.append("-");
      evaluation = _builder_21.toString();
      StringConcatenation _builder_22 = new StringConcatenation();
      _builder_22.append(evaluation);
      String _evaluateExpression_7 = this.evaluateExpression(((Subtraction) element).getRight(), entity);
      _builder_22.append(_evaluateExpression_7);
      _builder_22.append(")");
      evaluation = _builder_22.toString();
    }
    if ((element instanceof Conjunction)) {
      StringConcatenation _builder_23 = new StringConcatenation();
      String _evaluateExpression_8 = this.evaluateExpression(((Conjunction) element).getLeft(), entity);
      _builder_23.append(_evaluateExpression_8);
      evaluation = _builder_23.toString();
      StringConcatenation _builder_24 = new StringConcatenation();
      _builder_24.append(evaluation);
      _builder_24.append(" and ");
      evaluation = _builder_24.toString();
      StringConcatenation _builder_25 = new StringConcatenation();
      _builder_25.append(evaluation);
      String _evaluateExpression_9 = this.evaluateExpression(((Conjunction) element).getRight(), entity);
      _builder_25.append(_evaluateExpression_9);
      evaluation = _builder_25.toString();
    }
    if ((element instanceof Disjunction)) {
      StringConcatenation _builder_26 = new StringConcatenation();
      _builder_26.append("(");
      String _evaluateExpression_10 = this.evaluateExpression(((Disjunction) element).getLeft(), entity);
      _builder_26.append(_evaluateExpression_10);
      evaluation = _builder_26.toString();
      StringConcatenation _builder_27 = new StringConcatenation();
      _builder_27.append(evaluation);
      _builder_27.append(" or ");
      evaluation = _builder_27.toString();
      StringConcatenation _builder_28 = new StringConcatenation();
      _builder_28.append(evaluation);
      String _evaluateExpression_11 = this.evaluateExpression(((Disjunction) element).getRight(), entity);
      _builder_28.append(_evaluateExpression_11);
      _builder_28.append(")");
      evaluation = _builder_28.toString();
    }
    if ((element instanceof ConditionalExpression)) {
      StringConcatenation _builder_29 = new StringConcatenation();
      String _evaluateExpression_12 = this.evaluateExpression(((ConditionalExpression) element).getLeft(), entity);
      _builder_29.append(_evaluateExpression_12);
      evaluation = _builder_29.toString();
      boolean optionalAllowed = true;
      Expression _left_3 = ((ConditionalExpression) element).getLeft();
      if ((_left_3 instanceof DatamartAttributeBase)) {
        Expression _left_4 = ((ConditionalExpression) element).getLeft();
        LScalarType type = ((DatamartAttributeBase) _left_4).getAttributeRef().getType();
        if ((type instanceof LDataType)) {
          boolean _isDate = ((LDataType)type).isDate();
          boolean _not = (!_isDate);
          optionalAllowed = _not;
        }
      }
      boolean _isSelected = ((ConditionalExpression) element).getRight().isSelected();
      if (_isSelected) {
        StringConcatenation _builder_30 = new StringConcatenation();
        _builder_30.append(evaluation);
        _builder_30.append(" in ");
        evaluation = _builder_30.toString();
        StringConcatenation _builder_31 = new StringConcatenation();
        _builder_31.append(evaluation);
        _builder_31.append("(");
        String _evaluateExpression_13 = this.evaluateExpression(((ConditionalExpression) element).getRight(), entity);
        _builder_31.append(_evaluateExpression_13);
        _builder_31.append(")");
        evaluation = _builder_31.toString();
      } else {
        boolean _isRanged = ((ConditionalExpression) element).getRight().isRanged();
        if (_isRanged) {
          StringConcatenation _builder_32 = new StringConcatenation();
          String _evaluateExpression_14 = this.evaluateExpression(((ConditionalExpression) element).getRight(), entity);
          _builder_32.append(_evaluateExpression_14);
          evaluation = _builder_32.toString();
        } else {
          boolean _isUnreferenced_1 = ((ConditionalExpression) element).getRight().isUnreferenced();
          if (_isUnreferenced_1) {
            StringConcatenation _builder_33 = new StringConcatenation();
            String _evaluateExpression_15 = this.evaluateExpression(((ConditionalExpression) element).getRight(), entity);
            _builder_33.append(_evaluateExpression_15);
            evaluation = _builder_33.toString();
          } else {
            StringConcatenation _builder_34 = new StringConcatenation();
            _builder_34.append(evaluation);
            _builder_34.append(" ");
            String _literal = ((ConditionalExpression) element).getOperator().getLiteral();
            _builder_34.append(_literal);
            _builder_34.append(" ");
            evaluation = _builder_34.toString();
            StringConcatenation _builder_35 = new StringConcatenation();
            _builder_35.append(evaluation);
            String _evaluateExpression_16 = this.evaluateExpression(((ConditionalExpression) element).getRight(), entity);
            _builder_35.append(_evaluateExpression_16);
            evaluation = _builder_35.toString();
          }
        }
      }
      if ((((ConditionalExpression) element).getRight().isOptional() && optionalAllowed)) {
        StringConcatenation _builder_36 = new StringConcatenation();
        _builder_36.append("(");
        String _evaluateExpression_17 = this.evaluateExpression(((ConditionalExpression) element).getRight(), entity);
        _builder_36.append(_evaluateExpression_17);
        _builder_36.append("=");
        _builder_36.append(IDataMart.SQLFILTERNOTHING);
        _builder_36.append(" or ");
        _builder_36.append(evaluation);
        _builder_36.append(")");
        evaluation = _builder_36.toString();
      }
    }
    if ((element instanceof DatamartMemberTuple)) {
      StringConcatenation _builder_37 = new StringConcatenation();
      _builder_37.append("(");
      String _evaluateExpression_18 = this.evaluateExpression(((DatamartMemberTuple) element).getRight(), entity);
      _builder_37.append(_evaluateExpression_18);
      evaluation = _builder_37.toString();
      StringConcatenation _builder_38 = new StringConcatenation();
      _builder_38.append(evaluation);
      _builder_38.append(",");
      evaluation = _builder_38.toString();
      StringConcatenation _builder_39 = new StringConcatenation();
      _builder_39.append(evaluation);
      String _evaluateExpression_19 = this.evaluateExpression(((DatamartMemberTuple) element).getLeft(), entity);
      _builder_39.append(_evaluateExpression_19);
      _builder_39.append(")");
      evaluation = _builder_39.toString();
    }
    if ((element instanceof DatamartAggregation)) {
      DatamartAggregationFunctionInterface _aggregation = ((DatamartAggregation) element).getLeft().getAggregation();
      boolean _tripleNotEquals_5 = (_aggregation != null);
      if (_tripleNotEquals_5) {
        DatamartAggregationFunctionInterface _aggregation_1 = ((DatamartAggregation) element).getLeft().getAggregation();
        if ((_aggregation_1 instanceof DatamartAggregationFunction)) {
          StringConcatenation _builder_40 = new StringConcatenation();
          DatamartAggregationFunctionInterface _aggregation_2 = ((DatamartAggregation) element).getLeft().getAggregation();
          String _name_5 = ((DatamartAggregationFunction) _aggregation_2).getAggregation().name();
          _builder_40.append(_name_5);
          _builder_40.append("(");
          evaluation = _builder_40.toString();
          Expression _set = ((DatamartAggregation) element).getLeft().getSet();
          if ((_set instanceof DatamartHierarchy)) {
            StringConcatenation _builder_41 = new StringConcatenation();
            _builder_41.append(evaluation);
            Expression _set_1 = ((DatamartAggregation) element).getLeft().getSet();
            String _levelName_6 = this.getLevelName(((DatamartHierarchy) _set_1), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
            _builder_41.append(_levelName_6);
            evaluation = _builder_41.toString();
          }
          Expression _set_2 = ((DatamartAggregation) element).getLeft().getSet();
          if ((_set_2 instanceof DatamartSetTuple)) {
            StringConcatenation _builder_42 = new StringConcatenation();
            _builder_42.append(evaluation);
            Expression _set_3 = ((DatamartAggregation) element).getLeft().getSet();
            String _evaluateExpression_20 = this.evaluateExpression(((DatamartSetTuple) _set_3), entity);
            _builder_42.append(_evaluateExpression_20);
            evaluation = _builder_42.toString();
          }
        }
      }
      StringConcatenation _builder_43 = new StringConcatenation();
      _builder_43.append(evaluation);
      _builder_43.append(",");
      evaluation = _builder_43.toString();
      StringConcatenation _builder_44 = new StringConcatenation();
      _builder_44.append(evaluation);
      String _evaluateExpression_21 = this.evaluateExpression(((DatamartAggregation) element).getRight(), entity);
      _builder_44.append(_evaluateExpression_21);
      _builder_44.append(")");
      evaluation = _builder_44.toString();
    }
    if ((element instanceof DatamartSetAggregation)) {
      DatamartAggregationFunctionInterface _aggregation_3 = ((DatamartSetAggregation) element).getLeft().getAggregation();
      boolean _tripleNotEquals_6 = (_aggregation_3 != null);
      if (_tripleNotEquals_6) {
        DatamartAggregationFunctionInterface _aggregation_4 = ((DatamartSetAggregation) element).getLeft().getAggregation();
        if ((_aggregation_4 instanceof DatamartSetAggregationFunction)) {
          StringConcatenation _builder_45 = new StringConcatenation();
          DatamartAggregationFunctionInterface _aggregation_5 = ((DatamartSetAggregation) element).getLeft().getAggregation();
          String _name_6 = ((DatamartSetAggregationFunction) _aggregation_5).getAggregation().name();
          _builder_45.append(_name_6);
          _builder_45.append("(");
          evaluation = _builder_45.toString();
          Expression _set_4 = ((DatamartSetAggregation) element).getLeft().getSet();
          if ((_set_4 instanceof DatamartHierarchy)) {
            StringConcatenation _builder_46 = new StringConcatenation();
            _builder_46.append(evaluation);
            Expression _set_5 = ((DatamartSetAggregation) element).getLeft().getSet();
            String _levelName_7 = this.getLevelName(((DatamartHierarchy) _set_5), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(true), Boolean.valueOf(false));
            _builder_46.append(_levelName_7);
            evaluation = _builder_46.toString();
          }
          Expression _set_6 = ((DatamartSetAggregation) element).getLeft().getSet();
          if ((_set_6 instanceof DatamartSetTuple)) {
            StringConcatenation _builder_47 = new StringConcatenation();
            _builder_47.append(evaluation);
            Expression _set_7 = ((DatamartSetAggregation) element).getLeft().getSet();
            String _evaluateExpression_22 = this.evaluateExpression(((DatamartSetTuple) _set_7), entity);
            _builder_47.append(_evaluateExpression_22);
            evaluation = _builder_47.toString();
          }
        }
      }
      StringConcatenation _builder_48 = new StringConcatenation();
      _builder_48.append(evaluation);
      _builder_48.append(",");
      DatamartAggregationFunctionInterface _aggregation_6 = ((DatamartSetAggregation) element).getLeft().getAggregation();
      DatamartFunctionIntParameter _parameter_1 = ((DatamartSetAggregationFunction) _aggregation_6).getParameter();
      int _value_3 = ((DatamartFunctionIntParameter) _parameter_1).getValue();
      _builder_48.append(_value_3);
      _builder_48.append(",");
      evaluation = _builder_48.toString();
      StringConcatenation _builder_49 = new StringConcatenation();
      _builder_49.append(evaluation);
      String _evaluateExpression_23 = this.evaluateExpression(((DatamartSetAggregation) element).getRight(), entity);
      _builder_49.append(_evaluateExpression_23);
      _builder_49.append(")");
      evaluation = _builder_49.toString();
    }
    return evaluation;
  }
  
  /**
   * <p>mdx syntax part for attribute names, full qualified and aliased>
   */
  public String getAttributeName(final DatamartAttributeBase attribute, final DatamartEntity entity) {
    if ((entity != null)) {
      StringConcatenation _builder = new StringConcatenation();
      String _entityAlias = this.getEntityAlias(entity);
      _builder.append(_entityAlias);
      _builder.append(".");
      String _columnName = this._namingExtensions.toColumnName(attribute.getAttributeRef());
      _builder.append(_columnName);
      return _builder.toString();
    } else {
      StringConcatenation _builder_1 = new StringConcatenation();
      EObject _eContainer = attribute.getAttributeRef().eContainer();
      String _name = ((LEntity) _eContainer).getName();
      _builder_1.append(_name);
      _builder_1.append(".");
      String _columnName_1 = this._namingExtensions.toColumnName(attribute.getAttributeRef());
      _builder_1.append(_columnName_1);
      return _builder_1.toString();
    }
  }
  
  /**
   * <p>mdx syntax part for measure names.</p>
   */
  public String getMeasureName(final DatamartMeasure measure) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("[Measures].[");
    String _name = measure.getMeasureRef().getName();
    _builder.append(_name);
    _builder.append("]");
    return _builder.toString();
  }
  
  /**
   * <p>mdx syntax part for derived measure names.</p>
   */
  public String getDerivedMeasureName(final DatamartDerivedMeasure measure) {
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("[Measures].[");
    String _name = measure.getDerivedRef().getName();
    _builder.append(_name);
    _builder.append("]");
    return _builder.toString();
  }
  
  /**
   * <p>mdx syntax part for dimension names.</p>
   */
  public String getDimensionName(final DatamartHierarchy hierarchy, final Boolean withBrackets) {
    String dim = "";
    EObject _eContainer = hierarchy.getHierarchyRef().eContainer();
    boolean _tripleNotEquals = (_eContainer != null);
    if (_tripleNotEquals) {
      String _name = hierarchy.getHierarchyRef().getName();
      boolean _tripleEquals = (_name == null);
      if (_tripleEquals) {
        StringConcatenation _builder = new StringConcatenation();
        {
          if ((withBrackets).booleanValue()) {
            _builder.append("[");
          }
        }
        EObject _eContainer_1 = hierarchy.getHierarchyRef().eContainer();
        String _name_1 = ((CubeDimension) _eContainer_1).getName();
        _builder.append(_name_1);
        {
          if ((withBrackets).booleanValue()) {
            _builder.append("]");
          }
        }
        dim = _builder.toString();
      } else {
        StringConcatenation _builder_1 = new StringConcatenation();
        {
          if ((withBrackets).booleanValue()) {
            _builder_1.append("[");
          }
        }
        String _name_2 = hierarchy.getHierarchyRef().getName();
        _builder_1.append(_name_2);
        {
          if ((withBrackets).booleanValue()) {
            _builder_1.append("]");
          }
        }
        dim = _builder_1.toString();
      }
    }
    return dim;
  }
  
  /**
   * <p>mdx syntax part for level names.</p>
   */
  public String getLevelName(final DatamartHierarchy hierarchy, final Boolean withBrackets, final Boolean withFiltermask, final Boolean withFunctions, final Boolean isFilter) {
    StringConcatenation _builder = new StringConcatenation();
    String _dimensionName = this.getDimensionName(hierarchy, withBrackets);
    _builder.append(_dimensionName);
    String text = _builder.toString();
    CubeLevel _levelRef = hierarchy.getLevelRef();
    boolean _tripleNotEquals = (_levelRef != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append(text);
      _builder_1.append(".");
      text = _builder_1.toString();
      if ((hierarchy.isFiltered() && (withFiltermask).booleanValue())) {
        StringConcatenation _builder_2 = new StringConcatenation();
        _builder_2.append(DatamartFilter.FILTER_PLACEHOLDER);
        _builder_2.append(text);
        text = _builder_2.toString();
      }
      if ((hierarchy.isSelected() && (withFiltermask).booleanValue())) {
        StringConcatenation _builder_3 = new StringConcatenation();
        _builder_3.append(DatamartFilter.FILTER_PLACEHOLDER);
        _builder_3.append(text);
        text = _builder_3.toString();
      }
      if ((withBrackets).booleanValue()) {
        StringConcatenation _builder_4 = new StringConcatenation();
        _builder_4.append(text);
        _builder_4.append("[");
        text = _builder_4.toString();
      }
      StringConcatenation _builder_5 = new StringConcatenation();
      _builder_5.append(text);
      String _name = hierarchy.getLevelRef().getName();
      _builder_5.append(_name);
      text = _builder_5.toString();
      if ((withBrackets).booleanValue()) {
        StringConcatenation _builder_6 = new StringConcatenation();
        _builder_6.append(text);
        _builder_6.append("]");
        text = _builder_6.toString();
      }
      if ((hierarchy.isFiltered() && (withFiltermask).booleanValue())) {
        StringConcatenation _builder_7 = new StringConcatenation();
        _builder_7.append(text);
        _builder_7.append(DatamartFilter.FILTER_PLACEHOLDER);
        text = _builder_7.toString();
      }
      if ((hierarchy.isSelected() && (withFiltermask).booleanValue())) {
        StringConcatenation _builder_8 = new StringConcatenation();
        _builder_8.append(text);
        _builder_8.append(DatamartFilter.FILTER_PLACEHOLDER);
        text = _builder_8.toString();
      }
      if ((hierarchy.isFiltered() || hierarchy.isSelected())) {
        if ((hierarchy.isAll() && (withFunctions).booleanValue())) {
          StringConcatenation _builder_9 = new StringConcatenation();
          _builder_9.append(text);
          _builder_9.append(".Children");
          text = _builder_9.toString();
        }
      } else {
        if ((withFunctions).booleanValue()) {
          StringConcatenation _builder_10 = new StringConcatenation();
          _builder_10.append(text);
          _builder_10.append(".Members");
          text = _builder_10.toString();
        }
      }
    }
    CubeLevel _levelRef_1 = hierarchy.getLevelRef();
    boolean _tripleEquals = (_levelRef_1 == null);
    if (_tripleEquals) {
      if (((hierarchy.getHierarchyRef().eContainer() != null) && 
        (!((CubeDimension) hierarchy.getHierarchyRef().eContainer()).isTypeTime()))) {
        boolean _isAll = hierarchy.isAll();
        if (_isAll) {
          if ((hierarchy.isExcept() && (!(isFilter).booleanValue()))) {
            StringConcatenation _builder_11 = new StringConcatenation();
            _builder_11.append(text);
            _builder_11.append(".Children");
            text = _builder_11.toString();
          } else {
            StringConcatenation _builder_12 = new StringConcatenation();
            _builder_12.append(text);
            _builder_12.append(".Members");
            text = _builder_12.toString();
          }
        } else {
          if ((hierarchy.isAllMember() && hierarchy.getHierarchyRef().isAllMemberName())) {
            StringConcatenation _builder_13 = new StringConcatenation();
            _builder_13.append(text);
            _builder_13.append(".[");
            String _replaceAll = hierarchy.getHierarchyRef().getAllMemberNameValue().replaceAll("\"", "");
            _builder_13.append(_replaceAll);
            _builder_13.append("]");
            text = _builder_13.toString();
          } else {
            boolean _isAllLevels = hierarchy.isAllLevels();
            if (_isAllLevels) {
              StringConcatenation _builder_14 = new StringConcatenation();
              _builder_14.append(text);
              _builder_14.append(".AllMembers");
              text = _builder_14.toString();
            } else {
              if ((hierarchy.isDefaultMember() && hierarchy.getHierarchyRef().isDefaultMember())) {
                StringConcatenation _builder_15 = new StringConcatenation();
                _builder_15.append(text);
                _builder_15.append(".Defaultmember");
                text = _builder_15.toString();
              } else {
                boolean _isDefaultMember = hierarchy.getHierarchyRef().isDefaultMember();
                if (_isDefaultMember) {
                  StringConcatenation _builder_16 = new StringConcatenation();
                  _builder_16.append(text);
                  _builder_16.append(".Defaultmember");
                  text = _builder_16.toString();
                } else {
                  StringConcatenation _builder_17 = new StringConcatenation();
                  _builder_17.append(text);
                  _builder_17.append(".Members");
                  text = _builder_17.toString();
                }
              }
            }
          }
        }
      }
    }
    if ((hierarchy.isExcept() && (!(isFilter).booleanValue()))) {
      StringConcatenation _builder_18 = new StringConcatenation();
      _builder_18.append("Except(");
      _builder_18.append(text);
      _builder_18.append(",{");
      _builder_18.append(DatamartFilter.FILTER_PLACEHOLDER);
      String _dimensionName_1 = this.getDimensionName(hierarchy, Boolean.valueOf(true));
      _builder_18.append(_dimensionName_1);
      _builder_18.append(".");
      {
        if ((withBrackets).booleanValue()) {
          _builder_18.append("[");
        }
      }
      String _name_1 = hierarchy.getExceptRef().getName();
      _builder_18.append(_name_1);
      {
        if ((withBrackets).booleanValue()) {
          _builder_18.append("]");
        }
      }
      _builder_18.append(DatamartFilter.FILTER_PLACEHOLDER);
      _builder_18.append("})");
      text = _builder_18.toString();
    }
    boolean _isOrdered = hierarchy.isOrdered();
    if (_isOrdered) {
      DatamartElement _orderRef = hierarchy.getOrderRef();
      if ((_orderRef instanceof DatamartMeasure)) {
        StringConcatenation _builder_19 = new StringConcatenation();
        _builder_19.append("Order(");
        _builder_19.append(text);
        _builder_19.append(",");
        DatamartElement _orderRef_1 = hierarchy.getOrderRef();
        String _measureName = this.getMeasureName(((DatamartMeasure) _orderRef_1));
        _builder_19.append(_measureName);
        _builder_19.append(",");
        {
          boolean _isDescending = hierarchy.isDescending();
          if (_isDescending) {
            _builder_19.append("Desc");
          } else {
            _builder_19.append("Asc");
          }
        }
        _builder_19.append(")");
        text = _builder_19.toString();
      } else {
        StringConcatenation _builder_20 = new StringConcatenation();
        _builder_20.append("Order(");
        _builder_20.append(text);
        _builder_20.append(",");
        DatamartElement _orderRef_2 = hierarchy.getOrderRef();
        String _derivedMeasureName = this.getDerivedMeasureName(((DatamartDerivedMeasure) _orderRef_2));
        _builder_20.append(_derivedMeasureName);
        _builder_20.append(",");
        {
          boolean _isDescending_1 = hierarchy.isDescending();
          if (_isDescending_1) {
            _builder_20.append("Desc");
          } else {
            _builder_20.append("Asc");
          }
        }
        _builder_20.append(")");
        text = _builder_20.toString();
      }
    }
    StringConcatenation _builder_21 = new StringConcatenation();
    _builder_21.append(text);
    return _builder_21.toString();
  }
  
  /**
   * <p>helper for entity names.</p>
   */
  public String getEntityAlias(final DatamartEntity entity) {
    return this.getEntityAlias(entity.getEntityRef());
  }
  
  /**
   * <p>helper for entity names including aliases when used in recursive join relations.</p>
   */
  public String getEntityAlias(final LEntity entityRef) {
    String name = "";
    boolean _hasSuperType = this.hasSuperType(entityRef);
    if (_hasSuperType) {
      name = entityRef.getSuperType().getName();
    } else {
      name = entityRef.getName();
    }
    String alias = name;
    boolean _containsKey = this.sqlAliasCounter.containsKey(name);
    if (_containsKey) {
      Integer newId = this.sqlAliasCounter.get(name);
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(alias);
      {
        if (((newId).intValue() > 0)) {
          _builder.append(newId);
        }
      }
      alias = _builder.toString();
    }
    return alias;
  }
  
  /**
   * <p>helper for entity names including aliases when used in recursive join relations.</p>
   */
  public String entityAlias2(final DatamartEntity entity) {
    return this.entityAlias2(entity.getEntityRef());
  }
  
  public String entityAlias2(final LEntity entityRef) {
    String name = "";
    boolean _hasSuperType = this.hasSuperType(entityRef);
    if (_hasSuperType) {
      name = entityRef.getSuperType().getName();
    } else {
      name = entityRef.getName();
    }
    String alias = name;
    boolean _containsKey = this.sqlAliasCounter.containsKey(name);
    if (_containsKey) {
      Integer newId = this.sqlAliasCounter.get(name);
      this.sqlAliasCounter.put(name, Integer.valueOf(((newId).intValue() + 1)));
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(alias);
      _builder.append(((newId).intValue() + 1));
      alias = _builder.toString();
    } else {
      this.sqlAliasCounter.put(name, Integer.valueOf(0));
    }
    return alias;
  }
  
  /**
   * <p>main method to build sql statements bases on entities and roles.</p>
   */
  public String createSQLStatements(final DatamartDefinition definition, final DatamartEntity entity, final Map<String, LAttribute> typesMap, final Map<String, LEntity> entityMap) {
    return this.createSQLStatement(definition, typesMap, entityMap);
  }
  
  /**
   * <p>main method to build sql statements bases on entities and a role.</p>
   */
  public String createSQLStatement(final DatamartDefinition definition, final Map<String, LAttribute> typesMap, final Map<String, LEntity> entityMap) {
    this.sqlAliasCounter.clear();
    this.sqlFilterMap.clear();
    this.sqlHasAggregate = false;
    this.sqlHasOrder = false;
    ArrayList<String> groupingList = CollectionLiterals.<String>newArrayList();
    this.idMap.clear();
    this.ignoreEntityGrouping = false;
    HashMap<String, Pair<String, Integer>> attributes = CollectionLiterals.<String, Pair<String, Integer>>newHashMap();
    ArrayList<String> conditions = CollectionLiterals.<String>newArrayList();
    LinkedHashMap<String, Integer> orderings = CollectionLiterals.<String, Integer>newLinkedHashMap();
    DatamartSource _source = definition.getSource();
    DatamartEntity entity = ((DatamartEntity) _source);
    String used = this.createEntity(entity, null, null, entityMap, attributes, conditions, orderings, typesMap, groupingList);
    String select = this.createSelect(attributes, definition, entityMap);
    String condition = this.createCondition(conditions);
    String ordering = this.createOrdering(orderings);
    String grouping = this.createGrouping(groupingList);
    boolean _isEmpty = select.isEmpty();
    if (_isEmpty) {
      return "";
    }
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("select ");
    _builder.append(select);
    _builder.append(" from ");
    _builder.append(used);
    {
      int _size = conditions.size();
      boolean _greaterThan = (_size > 0);
      if (_greaterThan) {
        _builder.append(" where ");
        _builder.append(condition);
      }
    }
    {
      if (this.sqlHasAggregate) {
        _builder.append(" group by ");
        _builder.append(grouping);
      }
    }
    {
      if (this.sqlHasOrder) {
        _builder.append(" order by ");
        _builder.append(ordering);
      }
    }
    return _builder.toString();
  }
  
  /**
   * <p>sql syntax part for group by.</p>
   */
  public String createGrouping(final List<String> grouping) {
    String groupingString = "";
    for (final String groupBy : grouping) {
      StringConcatenation _builder = new StringConcatenation();
      {
        boolean _isEmpty = groupingString.isEmpty();
        boolean _not = (!_isEmpty);
        if (_not) {
          _builder.append(groupingString);
          _builder.append(",");
        }
      }
      _builder.append(groupBy);
      groupingString = _builder.toString();
    }
    return groupingString;
  }
  
  /**
   * <p>sql syntax part for where.</p>
   */
  public String createCondition(final ArrayList<String> conditions) {
    String conditionString = "";
    for (final String condition : conditions) {
      StringConcatenation _builder = new StringConcatenation();
      {
        boolean _isEmpty = conditionString.isEmpty();
        boolean _not = (!_isEmpty);
        if (_not) {
          _builder.append(conditionString);
          _builder.append(" and ");
        }
      }
      _builder.append("(");
      _builder.append(condition);
      _builder.append(")");
      conditionString = _builder.toString();
    }
    return conditionString;
  }
  
  /**
   * <p>sql syntax part for order.</p>
   */
  public String createOrdering(final Map<String, Integer> orderings) {
    int _size = orderings.size();
    boolean _greaterThan = (_size > 0);
    this.sqlHasOrder = _greaterThan;
    final Function<Map.Entry<String, Integer>, String> _function = (Map.Entry<String, Integer> it) -> {
      return it.getKey();
    };
    return orderings.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).<String>map(_function).collect(
      Collectors.joining(","));
  }
  
  /**
   * <p>sql syntax part for select.</p>
   */
  public String createSelect(final Map<String, Pair<String, Integer>> attributes, final DatamartDefinition definition, final Map<String, LEntity> entityMap) {
    String selectString = "";
    DatamartSource _source = definition.getSource();
    if ((_source instanceof DatamartEntity)) {
      DatamartSource _source_1 = definition.getSource();
      boolean _isSuppressAttributes = ((DatamartEntity) _source_1).isSuppressAttributes();
      boolean _not = (!_isSuppressAttributes);
      if (_not) {
        final Comparator<Map.Entry<String, Pair<String, Integer>>> _function = (Map.Entry<String, Pair<String, Integer>> e1, Map.Entry<String, Pair<String, Integer>> e2) -> {
          Integer _value = e2.getValue().getValue();
          Integer _value_1 = e1.getValue().getValue();
          return ((_value).intValue() - (_value_1).intValue());
        };
        final Function1<Map.Entry<String, Pair<String, Integer>>, String> _function_1 = (Map.Entry<String, Pair<String, Integer>> it) -> {
          String _key = it.getKey();
          String _plus = (_key + " as \\\"");
          String _key_1 = it.getValue().getKey();
          String _plus_1 = (_plus + _key_1);
          return (_plus_1 + "\\\"");
        };
        selectString = IterableExtensions.join(ListExtensions.<Map.Entry<String, Pair<String, Integer>>, String>map(IterableExtensions.<Map.Entry<String, Pair<String, Integer>>>sortWith(attributes.entrySet(), _function), _function_1), ",");
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(selectString);
        selectString = _builder.toString();
      }
    }
    this.datamartDtoMapper = "new DatamartDtoMapper()";
    if ((definition != null)) {
      if ((!this.ignoreEntityGrouping)) {
        Collection<LEntity> _values = entityMap.values();
        for (final LEntity entityRef : _values) {
          {
            String entityName = "";
            boolean _hasSuperType = this.hasSuperType(entityRef);
            if (_hasSuperType) {
              entityName = entityRef.getSuperType().getName();
            } else {
              entityName = entityRef.getName();
            }
            String dtoFqn = EntityUtils.getDtoFQNForLEntity(entityRef);
            String idColumn = DatamartDefinitionUtil.getEntityIdAliasName(entityRef);
            LEntityAttribute _primaryKeyAttribute = entityRef.getPrimaryKeyAttribute();
            boolean _tripleNotEquals = (_primaryKeyAttribute != null);
            if (_tripleNotEquals) {
              StringConcatenation _builder_1 = new StringConcatenation();
              _builder_1.append(selectString);
              {
                boolean _isEmpty = selectString.isEmpty();
                boolean _not_1 = (!_isEmpty);
                if (_not_1) {
                  _builder_1.append(",");
                }
              }
              _builder_1.append(entityName);
              _builder_1.append(".");
              String _name = entityRef.getPrimaryKeyAttribute().getName();
              _builder_1.append(_name);
              _builder_1.append(" as \\\"");
              _builder_1.append(idColumn);
              _builder_1.append("\\\"");
              selectString = _builder_1.toString();
              boolean _hasSuperType_1 = this.hasSuperType(entityRef);
              if (_hasSuperType_1) {
                this.idMap.put(idColumn, entityRef.getSuperType());
              } else {
                this.idMap.put(idColumn, entityRef);
              }
              StringConcatenation _builder_2 = new StringConcatenation();
              _builder_2.append(this.datamartDtoMapper);
              _builder_2.newLineIfNotEmpty();
              _builder_2.append(".add(\"");
              _builder_2.append(dtoFqn);
              _builder_2.append("\", \"");
              String _name_1 = entityRef.getPrimaryKeyAttribute().getName();
              _builder_2.append(_name_1);
              _builder_2.append("\", EType.");
              IDataMart.EType _basicType = this.dtType.getBasicType(this.idMap.get(idColumn).getPrimaryKeyAttribute());
              _builder_2.append(_basicType);
              _builder_2.append(", \"");
              _builder_2.append(idColumn);
              _builder_2.append("\")");
              this.datamartDtoMapper = _builder_2.toString();
            }
          }
        }
      }
    }
    return selectString;
  }
  
  public boolean hasSuperType(final DatamartEntity entity) {
    return this.hasSuperType(entity.getEntityRef());
  }
  
  public boolean hasSuperType(final LEntity entityRef) {
    return (((entityRef.getSuperType() != null) && (!entityRef.getSuperType().isMappedSuperclass())) && 
      (!entityRef.getSuperType().equals(entityRef)));
  }
  
  /**
   * <p>recursive entity relation builder.</p>
   */
  public String createEntity(final DatamartEntity entity, final DatamartEntity parent, final DatamartNavigation parentNavigation, final Map<String, LEntity> entityMap, final Map<String, Pair<String, Integer>> attributes, final List<String> conditions, final LinkedHashMap<String, Integer> orderings, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    String body = "";
    String tableName = this._namingExtensions.toTableName(entity.getEntityRef());
    boolean _hasSuperType = this.hasSuperType(entity);
    if (_hasSuperType) {
      StringConcatenation _builder = new StringConcatenation();
      String _entityAlias = this.getEntityAlias(entity);
      _builder.append(_entityAlias);
      _builder.append(".disc=\'");
      String _tableName = this._namingExtensions.toTableName(entity.getEntityRef());
      _builder.append(_tableName);
      _builder.append("\' ");
      conditions.add(_builder.toString());
      tableName = this._namingExtensions.toTableName(entity.getEntityRef().getSuperType());
    }
    StringConcatenation _builder_1 = new StringConcatenation();
    _builder_1.append(body);
    CharSequence _provideSchemaName = this.getProvideSchemaName(entity.getEntityRef().getPersistenceInfo().getSchemaName());
    _builder_1.append(_provideSchemaName);
    _builder_1.append(tableName);
    _builder_1.append(" ");
    String _entityAlias2 = this.entityAlias2(entity);
    _builder_1.append(_entityAlias2);
    body = _builder_1.toString();
    if (((parent != null) && (parentNavigation != null))) {
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append(" ");
      _builder_2.append("left join ");
      _builder_2.append(body, " ");
      String _createJoin = this.createJoin(entity, parent, parentNavigation);
      _builder_2.append(_createJoin, " ");
      body = _builder_2.toString();
    }
    boolean _hasSuperType_1 = this.hasSuperType(entity);
    if (_hasSuperType_1) {
      StringConcatenation _builder_3 = new StringConcatenation();
      _builder_3.append(body);
      _builder_3.append(" left join ");
      String _createSupertypeJoin = this.createSupertypeJoin(entity);
      _builder_3.append(_createSupertypeJoin);
      body = _builder_3.toString();
    }
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      {
        if ((navigation instanceof DatamartMember)) {
          StringConcatenation _builder_4 = new StringConcatenation();
          _builder_4.append(body);
          String _createEntity = this.createEntity(((DatamartMember) navigation).getDatamartEntity(), entity, navigation, entityMap, attributes, conditions, orderings, typesMap, groupingList);
          _builder_4.append(_createEntity);
          body = _builder_4.toString();
        }
        if ((navigation instanceof DatamartOwner)) {
          StringConcatenation _builder_5 = new StringConcatenation();
          _builder_5.append(body);
          String _createEntity_1 = this.createEntity(((DatamartOwner) navigation).getDatamartEntity(), entity, navigation, entityMap, attributes, conditions, orderings, typesMap, groupingList);
          _builder_5.append(_createEntity_1);
          body = _builder_5.toString();
        }
      }
    }
    entityMap.put(this.getEntityAlias(entity), entity.getEntityRef());
    if ((entity.getAttributes().isEmpty() && (!entity.isSuppressAttributes()))) {
      List<LEntityAttribute> _allAttributes = entity.getEntityRef().getAllAttributes();
      for (final LEntityAttribute attr : _allAttributes) {
        if (((((!attr.isId()) && (!attr.isUuid())) && (!attr.isVersion())) && (!attr.isTransient()))) {
          DatamartAttribute datamartAttr = DatamartDSLFactory.eINSTANCE.createDatamartAttribute();
          datamartAttr.setAttributeRef(attr);
          this.recurAttribute(entity, datamartAttr, false, "", Integer.valueOf(this.defaultColumnWeight), attributes, typesMap, groupingList);
        }
      }
    } else {
      EList<DatamartAttribute> _attributes = entity.getAttributes();
      for (final DatamartAttribute attribute : _attributes) {
        {
          int columnWeight = this.defaultColumnWeight;
          boolean _isHasColumnWeight = attribute.isHasColumnWeight();
          if (_isHasColumnWeight) {
            columnWeight = attribute.getColumnWeight();
          }
          this.recurAttribute(entity, attribute, attribute.isAggregated(), attribute.getAggregate().getName(), Integer.valueOf(columnWeight), attributes, typesMap, groupingList);
        }
      }
    }
    EList<DatamartCondition> _conditions = entity.getConditions();
    for (final DatamartCondition condition : _conditions) {
      conditions.add(this.evaluateExpression(condition.getCondition(), entity));
    }
    EList<DatamartOrder> _ordering = entity.getOrdering();
    for (final DatamartOrder order : _ordering) {
      {
        Integer columnWeight = null;
        boolean _isHasColumnWeight = order.isHasColumnWeight();
        if (_isHasColumnWeight) {
          columnWeight = Integer.valueOf(order.getColumnWeight());
        } else {
          columnWeight = Integer.valueOf(this.defaultColumnWeight);
        }
        String _entityAlias_1 = this.getEntityAlias(entity);
        String _plus = (_entityAlias_1 + ".");
        String _columnName = this._namingExtensions.toColumnName(order.getOrderBy());
        String _plus_1 = (_plus + _columnName);
        String _plus_2 = (_plus_1 + " ");
        String _name = order.getOrderHow().getName();
        String _plus_3 = (_plus_2 + _name);
        orderings.put(_plus_3, columnWeight);
      }
    }
    return body;
  }
  
  public void recurAttribute(final DatamartEntity entity, final DatamartAttribute datamartAttr, final boolean aggregated, final String aggregateName, final Integer columnWeight, final Map<String, Pair<String, Integer>> attributes, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    LEntityAttribute attr = datamartAttr.getAttributeRef();
    LScalarType type = attr.getType();
    if ((type instanceof LBean)) {
      LBean bean = ((LBean) type);
      List<LBeanAttribute> _allAttributes = bean.getAllAttributes();
      for (final LBeanAttribute battr : _allAttributes) {
        LScalarType _type = battr.getType();
        if ((_type instanceof LBean)) {
          this.recurAttribute(entity, battr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
        } else {
          this.addAttribute(entity, battr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
        }
      }
    } else {
      this.addAttribute(entity, datamartAttr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
    }
  }
  
  private void recurAttribute(final DatamartEntity entity, final LAttribute attr, final boolean aggregated, final String aggregateName, final Integer columnWeight, final Map<String, Pair<String, Integer>> attributes, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    LScalarType type = attr.getType();
    if ((type instanceof LBean)) {
      LBean bean = ((LBean) type);
      List<LBeanAttribute> _allAttributes = bean.getAllAttributes();
      for (final LBeanAttribute battr : _allAttributes) {
        LScalarType _type = battr.getType();
        if ((_type instanceof LBean)) {
          this.recurAttribute(entity, battr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
        } else {
          this.addAttribute(entity, battr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
        }
      }
    } else {
      this.addAttribute(entity, attr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
    }
  }
  
  public String aliasedColumnName(final LEntity entityRef, final LAttribute attr) {
    String name = "";
    boolean _hasSuperType = this.hasSuperType(entityRef);
    if (_hasSuperType) {
      boolean _contains = entityRef.getSuperType().getAllAttributes().contains(attr);
      if (_contains) {
        name = entityRef.getSuperType().getName();
      } else {
        name = entityRef.getName();
      }
    } else {
      name = entityRef.getName();
    }
    String alias = name;
    boolean _containsKey = this.sqlAliasCounter.containsKey(name);
    if (_containsKey) {
      Integer newId = this.sqlAliasCounter.get(name);
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(alias);
      {
        if (((newId).intValue() > 0)) {
          _builder.append(newId);
        }
      }
      alias = _builder.toString();
    }
    String _columnName = this._namingExtensions.toColumnName(attr);
    return ((alias + ".") + _columnName);
  }
  
  public void addAttribute(final DatamartEntity datamartEntity, final DatamartAttribute datamartAttr, final boolean aggregated, final String aggregateName, final Integer columnWeight, final Map<String, Pair<String, Integer>> attributes, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    LEntityAttribute attr = datamartAttr.getAttributeRef();
    this.addAttribute(datamartEntity, attr, DatamartAttributeUtil.getAliasedAttributeName(datamartAttr), aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
  }
  
  public void addAttribute(final DatamartEntity datamartEntity, final LAttribute attr, final boolean aggregated, final String aggregateName, final Integer columnWeight, final Map<String, Pair<String, Integer>> attributes, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    StringConcatenation _builder = new StringConcatenation();
    String _name = null;
    if (attr!=null) {
      _name=attr.getName();
    }
    String _replace = null;
    if (_name!=null) {
      _replace=_name.replace("^", "");
    }
    _builder.append(_replace);
    String attributeName = _builder.toString();
    this.addAttribute(datamartEntity, attr, attributeName, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList);
  }
  
  private void addAttribute(final DatamartEntity datamartEntity, final LAttribute attr, final String attributeName, final boolean aggregated, final String aggregateName, final Integer columnWeight, final Map<String, Pair<String, Integer>> attributes, final Map<String, LAttribute> typesMap, final List<String> groupingList) {
    LEntity entity = datamartEntity.getEntityRef();
    String key = this.aliasedColumnName(entity, attr);
    String attrName = "";
    String typesAttr = "";
    boolean _hasSuperType = this.hasSuperType(entity);
    if (_hasSuperType) {
      boolean _contains = entity.getSuperType().getAllAttributes().contains(attr);
      if (_contains) {
        String _name = entity.getSuperType().getName();
        String _plus = (_name + ".");
        String _plus_1 = (_plus + attributeName);
        attrName = _plus_1;
        String _name_1 = entity.getSuperType().getName();
        String _plus_2 = (_name_1 + ".");
        String _plus_3 = (_plus_2 + attributeName);
        typesAttr = _plus_3;
      } else {
        String _name_2 = entity.getName();
        String _plus_4 = (_name_2 + ".");
        String _plus_5 = (_plus_4 + attributeName);
        attrName = _plus_5;
        String _name_3 = entity.getName();
        String _plus_6 = (_name_3 + ".");
        String _plus_7 = (_plus_6 + attributeName);
        typesAttr = _plus_7;
      }
    } else {
      String _name_4 = entity.getName();
      String _plus_8 = (_name_4 + ".");
      String _plus_9 = (_plus_8 + attributeName);
      attrName = _plus_9;
      String _name_5 = entity.getName();
      String _plus_10 = (_name_5 + ".");
      String _plus_11 = (_plus_10 + attributeName);
      typesAttr = _plus_11;
    }
    typesMap.put(typesAttr, attr);
    if (aggregated) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(aggregateName);
      _builder.append("(");
      _builder.append(key);
      _builder.append(")");
      key = _builder.toString();
      this.sqlHasAggregate = true;
      String _string = key.toString();
      Pair<String, Integer> _pair = new Pair<String, Integer>(attributeName, columnWeight);
      attributes.put(_string, _pair);
      this.ignoreEntityGrouping = true;
    } else {
      groupingList.add(key.toString());
      String _string_1 = key.toString();
      Pair<String, Integer> _pair_1 = new Pair<String, Integer>(attributeName, columnWeight);
      attributes.put(_string_1, _pair_1);
    }
  }
  
  public CharSequence getProvideSchemaName(final String schemaName) {
    StringConcatenation _builder = new StringConcatenation();
    {
      if (((schemaName != null) && (schemaName.length() > 0))) {
        _builder.append(schemaName);
        _builder.append(".");
      }
    }
    return _builder;
  }
  
  /**
   * <p>sql syntax part for joined relations.</p>
   */
  public String createJoin(final DatamartEntity entity, final DatamartEntity parent, final DatamartNavigation navigation) {
    String _xblockexpression = null;
    {
      String join = "";
      DatamartReference joinRef = navigation.getJoinRef();
      String _xifexpression = null;
      if ((joinRef instanceof DatamartReference)) {
        String _xblockexpression_1 = null;
        {
          String name = this._namingExtensions.toColumnName(joinRef.getRef());
          if ((navigation instanceof DatamartMember)) {
            List<LEntityReference> refs = ((DatamartMember)navigation).getDatamartEntity().getEntityRef().getAllReferences();
            for (final LEntityReference ref : refs) {
              if ((((ref.getType() != null) && ref.getType().equals(parent.getEntityRef())) && ref.getOpposite().getName().equals(joinRef.getRef().getName()))) {
                name = this._namingExtensions.toColumnName(ref);
              }
            }
            StringConcatenation _builder = new StringConcatenation();
            String _entityAlias = this.getEntityAlias(entity);
            _builder.append(_entityAlias);
            _builder.append(".");
            _builder.append(name);
            _builder.append("=");
            String _entityAlias_1 = this.getEntityAlias(parent);
            _builder.append(_entityAlias_1);
            _builder.append(".");
            String _idAttributeName = parent.getEntityRef().getIdAttributeName();
            _builder.append(_idAttributeName);
            join = _builder.toString();
          } else {
            if ((navigation instanceof DatamartOwner)) {
              StringConcatenation _builder_1 = new StringConcatenation();
              String _entityAlias_2 = this.getEntityAlias(entity);
              _builder_1.append(_entityAlias_2);
              _builder_1.append(".");
              String _idAttributeName_1 = entity.getEntityRef().getIdAttributeName();
              _builder_1.append(_idAttributeName_1);
              _builder_1.append("=");
              String _entityAlias_3 = this.getEntityAlias(parent);
              _builder_1.append(_entityAlias_3);
              _builder_1.append(".");
              _builder_1.append(name);
              join = _builder_1.toString();
            }
          }
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append(" ");
          _builder_2.append("on(");
          _builder_2.append(join, " ");
          _builder_2.append(")");
          _xblockexpression_1 = join = _builder_2.toString();
        }
        _xifexpression = _xblockexpression_1;
      }
      _xblockexpression = _xifexpression;
    }
    return _xblockexpression;
  }
  
  public String createSupertypeJoin(final DatamartEntity entity) {
    String _xblockexpression = null;
    {
      String subTypeAlias = entity.getEntityRef().getName();
      boolean _containsKey = this.sqlAliasCounter.containsKey(entity.getEntityRef().getName());
      if (_containsKey) {
        Integer newId = this.sqlAliasCounter.get(entity.getEntityRef().getName());
        StringConcatenation _builder = new StringConcatenation();
        _builder.append(subTypeAlias);
        {
          if (((newId).intValue() > 0)) {
            _builder.append(newId);
          }
        }
        subTypeAlias = _builder.toString();
      }
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append(subTypeAlias);
      _builder_1.append(".");
      String _idAttributeName = entity.getEntityRef().getIdAttributeName();
      _builder_1.append(_idAttributeName);
      _builder_1.append("=");
      String _entityAlias = this.getEntityAlias(entity.getEntityRef().getSuperType());
      _builder_1.append(_entityAlias);
      _builder_1.append(".");
      String _idAttributeName_1 = entity.getEntityRef().getSuperType().getIdAttributeName();
      _builder_1.append(_idAttributeName_1);
      String join = _builder_1.toString();
      StringConcatenation _builder_2 = new StringConcatenation();
      CharSequence _provideSchemaName = this.getProvideSchemaName(entity.getEntityRef().getPersistenceInfo().getSchemaName());
      _builder_2.append(_provideSchemaName);
      String _tableName = this._namingExtensions.toTableName(entity.getEntityRef());
      _builder_2.append(_tableName);
      _builder_2.append(" ");
      _builder_2.append(subTypeAlias);
      _builder_2.append(" on(");
      _builder_2.append(join);
      _builder_2.append(")");
      _xblockexpression = join = _builder_2.toString();
    }
    return _xblockexpression;
  }
  
  /**
   * get a set of entities used by the datamart
   */
  public Set<LEntity> findAllEntities(final DatamartDefinition datamart) {
    HashSet<LEntity> entities = new HashSet<LEntity>();
    DatamartSource _source = datamart.getSource();
    boolean _matched = false;
    if (_source instanceof DatamartEntity) {
      _matched=true;
      DatamartSource _source_1 = datamart.getSource();
      this.findAllEntites(((DatamartEntity) _source_1), entities);
    }
    if (!_matched) {
      if (_source instanceof DatamartCube) {
        _matched=true;
        DatamartSource _source_1 = datamart.getSource();
        this.findAllEntites(((DatamartCube) _source_1), entities);
      }
    }
    return entities;
  }
  
  /**
   * add all entities used by the datamart entity into the given set of entities
   */
  public void findAllEntites(final DatamartEntity datamartEntity, final Set<LEntity> entities) {
    entities.add(datamartEntity.getEntityRef());
    EList<DatamartNavigation> _navigations = datamartEntity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      this.findAllEntites(navigation.getDatamartEntity(), entities);
    }
  }
  
  /**
   * add all entities used by the datamart cube into the given set of entities
   */
  public void findAllEntites(final DatamartCube datamartCube, final Set<LEntity> entities) {
    entities.add(datamartCube.getCubeRef().getCubeTypeEntity().getEntityRef().getEntityValue());
  }
  
  public List<DatamartAttribute> allEntityAttributes(final DatamartDefinition datamart) {
    ArrayList<DatamartAttribute> attributes = CollectionLiterals.<DatamartAttribute>newArrayList();
    DatamartSource _source = datamart.getSource();
    if ((_source instanceof DatamartEntity)) {
      DatamartSource _source_1 = datamart.getSource();
      attributes = this.allEntityAttributes(((DatamartEntity) _source_1), "");
    }
    return attributes;
  }
  
  /**
   * add all entities used by the datamart entity into the given set of entities
   */
  public ArrayList<DatamartAttribute> allEntityAttributes(final DatamartEntity datamartEntity, final String refPrefix) {
    ArrayList<DatamartAttribute> _xblockexpression = null;
    {
      ArrayList<DatamartAttribute> entityAttributes = this.entityAttributes(datamartEntity);
      EList<DatamartNavigation> _navigations = datamartEntity.getNavigations();
      for (final DatamartNavigation navigation : _navigations) {
        this.allEntityAttributes(navigation.getDatamartEntity(), navigation.getJoinRef().getRef().getName());
      }
      LEntityAttribute primary = datamartEntity.getEntityRef().getPrimaryKeyAttribute();
      DatamartAttribute attribute = DatamartDSLFactory.eINSTANCE.createDatamartAttribute();
      attribute.setAttributeRef(primary);
      attribute.setAliased(true);
      StringConcatenation _builder = new StringConcatenation();
      _builder.append(refPrefix);
      {
        if ((primary != null)) {
          {
            boolean _isEmpty = refPrefix.isEmpty();
            if (_isEmpty) {
              String _firstLower = StringExtensions.toFirstLower(primary.getName());
              _builder.append(_firstLower);
            } else {
              String _firstUpper = StringExtensions.toFirstUpper(primary.getName());
              _builder.append(_firstUpper);
            }
          }
        }
      }
      attribute.setAliasName(_builder.toString());
      entityAttributes.add(attribute);
      _xblockexpression = entityAttributes;
    }
    return _xblockexpression;
  }
  
  private ArrayList<DatamartAttribute> entityAttributes(final DatamartEntity entity) {
    ArrayList<DatamartAttribute> _xblockexpression = null;
    {
      ArrayList<DatamartAttribute> entityAttributes = CollectionLiterals.<DatamartAttribute>newArrayList();
      EList<DatamartAttribute> _attributes = entity.getAttributes();
      for (final DatamartAttribute attribute : _attributes) {
        entityAttributes.add(attribute);
      }
      if ((entityAttributes.isEmpty() && (!entity.isSuppressAttributes()))) {
        List<LEntityAttribute> _allAttributes = entity.getEntityRef().getAllAttributes();
        for (final LEntityAttribute attr : _allAttributes) {
          if (((((!attr.isId()) && (!attr.isUuid())) && (!attr.isVersion())) && (!attr.isTransient()))) {
            entityAttributes.add(this.createDatamartAttribute(attr));
          }
        }
      }
      _xblockexpression = entityAttributes;
    }
    return _xblockexpression;
  }
  
  private DatamartAttribute createDatamartAttribute(final LEntityAttribute attr) {
    DatamartAttribute _xblockexpression = null;
    {
      DatamartAttribute datamartAttr = DatamartDSLFactory.eINSTANCE.createDatamartAttribute();
      datamartAttr.setAttributeRef(attr);
      DatamartAxis datamartAxis = DatamartDSLFactory.eINSTANCE.createDatamartAxis();
      datamartAxis.setName(AxisEnum.COLUMNS);
      datamartAttr.setAxis(datamartAxis);
      _xblockexpression = datamartAttr;
    }
    return _xblockexpression;
  }
  
  public void infer(final EObject datamart, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
    if (datamart instanceof DatamartPackage) {
      _infer((DatamartPackage)datamart, acceptor, isPreIndexingPhase);
      return;
    } else if (datamart != null) {
      _infer(datamart, acceptor, isPreIndexingPhase);
      return;
    } else {
      throw new IllegalArgumentException("Unhandled parameter types: " +
        Arrays.<Object>asList(datamart, acceptor, isPreIndexingPhase).toString());
    }
  }
}
