/**
 * 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.CubeDimensionUsage;
import org.eclipse.osbp.xtext.cubedsl.CubeHierarchy;
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(Map.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);
      final Procedure1<JvmField> _function_9 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_1) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("new HashMap<String,String>() ");
          String _createAliasMap = this.createAliasMap(definition, entityMap);
          _builder.append(_createAliasMap);
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_10);
      };
      field = this._jvmTypesBuilder.toField(definition, "aliasMap", 
        this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
          this._typeReferenceBuilder.typeRef(String.class)), _function_9);
      EList<JvmMember> _members_10 = type.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members_10, field);
    }
    DatamartSource _source_2 = definition.getSource();
    if ((_source_2 instanceof DatamartTask)) {
      final Procedure1<JvmField> _function_10 = (JvmField it) -> {
        final Procedure1<ITreeAppendable> _function_11 = (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_11);
      };
      field = this._jvmTypesBuilder.toField(definition, "axisMap", 
        this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(Integer.class), 
          this._typeReferenceBuilder.typeRef(ArrayList.class, this._typeReferenceBuilder.typeRef(String.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 DatamartDtoMapper()");
          it_1.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it, _function_12);
      };
      field = this._jvmTypesBuilder.toField(definition, "datamartDtoMapper", this._typeReferenceBuilder.typeRef(DatamartDtoMapper.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 HashMap<String,EType>() ");
        String _createIdMap = this.createIdMap(definition);
        _builder.append(_createIdMap);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_13);
    };
    field = this._jvmTypesBuilder.toField(definition, "idMap", 
      this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(IDataMart.EType.class)), _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 ArrayList<DatamartPrimary<?>>() ");
        String _createPrimaryList = this.createPrimaryList(definition);
        _builder.append(_createPrimaryList);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_14);
    };
    field = this._jvmTypesBuilder.toField(definition, "primaryList", 
      this._typeReferenceBuilder.typeRef(ArrayList.class, 
        this._typeReferences.getTypeForName(DatamartPrimary.class, definition, this._typeReferenceBuilder.wildcard())), _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,EType>() ");
        String _createTypesMaps = this.createTypesMaps(definition, typesMap);
        _builder.append(_createTypesMaps);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_15);
    };
    field = this._jvmTypesBuilder.toField(definition, "typesMap", 
      this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(IDataMart.EType.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>() ");
        String _createTypesProps = this.createTypesProps(definition, typesMap);
        _builder.append(_createTypesProps);
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_16);
    };
    field = this._jvmTypesBuilder.toField(definition, "typesProp", 
      this._typeReferenceBuilder.typeRef(Map.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);
    final Procedure1<JvmField> _function_16 = (JvmField it) -> {
      final Procedure1<ITreeAppendable> _function_17 = (ITreeAppendable it_1) -> {
        StringConcatenation _builder = new StringConcatenation();
        _builder.append("new HashMap<String,String>()");
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setInitializer(it, _function_17);
    };
    field = this._jvmTypesBuilder.toField(definition, "resultAttributes", 
      this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(String.class)), _function_16);
    EList<JvmMember> _members_17 = type.getMembers();
    this._jvmTypesBuilder.<JvmField>operator_add(_members_17, 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(Map.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(List.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(Map.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);
    }
    DatamartSource _source = definition.getSource();
    if ((_source instanceof DatamartEntity)) {
      operation = this._jvmTypesBuilder.toGetter(definition, "aliasMap", 
        this._typeReferenceBuilder.typeRef(Map.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, "typesProp", 
      this._typeReferenceBuilder.typeRef(Map.class, this._typeReferenceBuilder.typeRef(String.class), 
        this._typeReferenceBuilder.typeRef(String.class)));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_4 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
    operation = this._jvmTypesBuilder.toGetter(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);
    operation = this._jvmTypesBuilder.toSetter(definition, "user", this._typeReferenceBuilder.typeRef(IUser.class));
    operation.setVisibility(JvmVisibility.PUBLIC);
    EList<JvmMember> _members_6 = type.getMembers();
    this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, 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;");
        _builder.newLine();
        it_1.append(_builder);
      };
      this._jvmTypesBuilder.setBody(it, _function_5);
    };
    operation = this._jvmTypesBuilder.toMethod(definition, "getTypesMap", 
      this._typeReferenceBuilder.typeRef(Map.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(), getAliasMap(), datamartDtoMapper, operativeDtoClass, operativeDtos, getPrimaryList(), ");
          _builder_2.append(this.binderClassName, "\t\t");
          _builder_2.append(".getUserAccessService());");
          _builder_2.newLineIfNotEmpty();
          _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("{{");
    _builder.newLine();
    _builder.append("\t");
    String _createTypesMap = this.createTypesMap(definition, typesMap);
    _builder.append(_createTypesMap, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}}");
    String listTxt = _builder.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();
      }
    }
    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);
    }
  }
  
  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;
  }
  
  /**
   * <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);
    }
  }
  
  /**
   * <p>build the alias map.</p>
   */
  public String createAliasMap(final DatamartDefinition definition, final Map<String, LEntity> entityMap) {
    HashMap<String, String> aliases = CollectionLiterals.<String, String>newHashMap();
    if (((definition.getSource() != null) && (definition.getSource() instanceof DatamartEntity))) {
      DatamartSource _source = definition.getSource();
      this.createAliasMap(((DatamartEntity) _source), aliases);
    }
    StringConcatenation _builder = new StringConcatenation();
    _builder.append("{{");
    _builder.newLine();
    _builder.append("\t");
    final Function1<Map.Entry<String, String>, String> _function = (Map.Entry<String, String> it) -> {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("put(\"");
      String _key = it.getKey();
      _builder_1.append(_key);
      _builder_1.append("\",\"");
      String _value = it.getValue();
      _builder_1.append(_value);
      _builder_1.append("\");");
      return _builder_1.toString();
    };
    String _join = IterableExtensions.join(IterableExtensions.<Map.Entry<String, String>, String>map(aliases.entrySet(), _function), "\n");
    _builder.append(_join, "\t");
    _builder.newLineIfNotEmpty();
    _builder.append("}}");
    String text = _builder.toString();
    return text;
  }
  
  public void recursAliasMap(final LScalarType type, final DatamartAttribute attribute, final Map<String, String> map) {
    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.recursAliasMap(attr.getType(), attribute, map);
        } else {
          map.put(attr.getName(), this._iQualifiedNameProvider.getFullyQualifiedName(attr).toString());
        }
      }
    } else {
      String _aliasedAttributeName = DatamartAttributeUtil.getAliasedAttributeName(attribute);
      String _string = this._iQualifiedNameProvider.getFullyQualifiedName(attribute.getAttributeRef().getEntity()).toString();
      String _plus = (_string + ".");
      String _name = attribute.getAttributeRef().getName();
      String _plus_1 = (_plus + _name);
      map.put(_aliasedAttributeName, _plus_1);
    }
  }
  
  /**
   * <p>recursively create an alias map for entities.</p>
   */
  public void createAliasMap(final DatamartEntity entity, final Map<String, String> map) {
    ArrayList<DatamartAttribute> entityAttributes = this.entityAttributes(entity);
    for (final DatamartAttribute attribute : entityAttributes) {
      {
        LScalarType _type = attribute.getAttributeRef().getType();
        LScalarType type = ((LScalarType) _type);
        this.recursAliasMap(type, attribute, map);
      }
    }
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      this.createAliasMap(navigation.getDatamartEntity(), map);
    }
  }
  
  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());
    EList<CubeDimensionUsage> _dimensionUsages = datamartCube.getCubeRef().getCubeTypeEntity().getDimensionUsages();
    for (final CubeDimensionUsage dimensionUsage : _dimensionUsages) {
      EList<CubeHierarchy> _hierarchies = dimensionUsage.getSourceValue().getHierarchies();
      for (final CubeHierarchy hierarchy : _hierarchies) {
        entities.add(hierarchy.getCubeDimEntity().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());
    }
  }
}
