| /* |
| * |
| * 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.HashMap |
| import java.util.HashSet |
| import java.util.LinkedHashMap |
| import java.util.List |
| import java.util.Map |
| import java.util.Set |
| import java.util.stream.Collectors |
| import javax.inject.Inject |
| import mondrian.rolap.RolapConnection |
| 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.LScalarType |
| import org.eclipse.osbp.dsl.semantic.entity.LBean |
| 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.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.datamart.IDataMart.EType |
| 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.CubePackage |
| 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.DatamartAttribute |
| import org.eclipse.osbp.xtext.datamartdsl.DatamartAttributeBase |
| 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.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.DatamartEntity |
| import org.eclipse.osbp.xtext.datamartdsl.DatamartFunction |
| import org.eclipse.osbp.xtext.datamartdsl.DatamartFunctionIntParameter |
| 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.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.xtext.common.types.JvmAnnotationReference |
| import org.eclipse.xtext.common.types.JvmDeclaredType |
| import org.eclipse.xtext.common.types.JvmField |
| import org.eclipse.xtext.common.types.JvmGenericType |
| import org.eclipse.xtext.common.types.JvmOperation |
| 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.xbase.jvmmodel.AbstractModelInferrer |
| import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor |
| import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder |
| 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> |
| * This inferrer infers models of extension .datamart and generates code to be used by other dsl. It encapsulates difficult syntax construction |
| * and provides a reflective call interface as well as a data transfer object olap cellSet. |
| * There are two different approaches: the traditional SQL thru entities and their attributes and MDX thru cubes and their measures and stuff. |
| * For SQL the olap cellSet is emulated by appropriate classes and implements NOT ALL features of a MDX filled olap cellSet. |
| * </p> |
| * |
| * @author Joerg Riegel |
| */ |
| /** |
| * <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> |
| */ |
| class DatamartDSLJvmModelInferrer extends AbstractModelInferrer { |
| |
| /** |
| * convenience API to build and initialize JVM types and their members. |
| */ |
| @Inject extension JvmTypesBuilder |
| @Inject extension IQualifiedNameProvider |
| @Inject extension NamingExtensions |
| @Inject extension TypeReferences |
| @Inject extension AnnotationExtension |
| @Inject extension ModelExtensions |
| |
| @Inject |
| @Extension |
| private DataType dtType; |
| |
| var sqlAliasCounter = <String, Integer>newHashMap |
| var sqlFilterMap = <String, DatamartAttributeBase>newHashMap |
| var idMap = <String, LEntity>newHashMap |
| var datamartDtoMapper = null as String |
| var ignoreEntityGrouping = false |
| var sqlHasAggregate = false |
| var sqlHasOrder = false |
| var public static String pckgName = null |
| var String binderClassName = "" |
| var defaultColumnWeight = 500 |
| |
| def void generatePckgName(DatamartPackage pckg, IJvmDeclaredTypeAcceptor acceptor) { |
| pckgName = pckg.name |
| } |
| |
| /** |
| * <p>infer method dispatches the neccessary routines to build fields, setter, getter, constructors and methods of the generated code.</p> |
| * |
| */ |
| def dispatch void infer(DatamartPackage datamart, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) { |
| datamart.generatePckgName(acceptor) |
| |
| // the test main class |
| var cls = datamart.toClass(datamart.name.toString.concat("TestClass")) |
| cls.simpleName = cls.simpleName.toFirstUpper |
| acceptor.accept(cls, [ |
| annotations += _annotationTypesBuilder.annotationRef(SuppressWarnings, "serial") |
| packageName = datamart.fullyQualifiedName.toString |
| it.toTestCalls(datamart) |
| it.fileHeader = datamart.documentation |
| ]) |
| |
| // the service binder class |
| binderClassName = datamart.fullyQualifiedName.toString + "." + |
| datamart.fullyQualifiedName.lastSegment.toFirstUpper + "ServiceBinder" |
| cls = datamart.toClass(datamart.name.toString.concat("ServiceBinder")) |
| cls.simpleName = cls.simpleName.toFirstUpper |
| acceptor.accept(cls, [ |
| annotations += _annotationTypesBuilder.annotationRef(SuppressWarnings, "serial") |
| annotations += _annotationTypesBuilder.annotationRef(typeof(Component)) |
| |
| packageName = datamart.fullyQualifiedName.toString |
| it.fileHeader = datamart.documentation |
| it.toBinderFields(datamart) |
| it.toBinderOperations(datamart) |
| ]) |
| |
| for (definition : datamart.definitions) { |
| acceptor.accept(definition.toClass(definition.fullyQualifiedName + IDataMart.DATAMART_CLASS_POSTFIX), [ |
| annotations += _annotationTypesBuilder.annotationRef(SuppressWarnings, "serial") |
| packageName = datamart.fullyQualifiedName.toString |
| if (definition.source instanceof DatamartEntity) { |
| superTypes += _typeReferenceBuilder.typeRef(AEntityDatamart) |
| } |
| if (definition.source instanceof DatamartCube) { |
| superTypes += _typeReferenceBuilder.typeRef(ACubeDatamart) |
| } |
| if (definition.source instanceof DatamartTask) { |
| superTypes += _typeReferenceBuilder.typeRef(ATaskDatamart) |
| } |
| it.toFields(definition) |
| it.toGetterSetter(definition) |
| it.toOperations(definition, datamart) |
| ]) |
| } |
| } |
| |
| def toTestCalls(JvmGenericType type, DatamartPackage datamart) { |
| var JvmOperation operation |
| for (definition : datamart.definitions) { |
| operation = definition.toMethod("test".concat(definition.name), _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| annotations += _annotationTypesBuilder.annotationRef(Test) |
| body = [append('''«definition.getAllTestcalls»''')] |
| ]) |
| type.members += operation |
| } |
| } |
| |
| def getAllTestcalls(DatamartDefinition definition) { |
| var body = "" |
| body = ''' |
| «body» |
| «definition.name»Datamart «definition.name.toFirstLower»Datamart = new «definition.name»Datamart(); |
| «definition.name.toFirstLower»Datamart.setUser(new User("«IUserAccessService.ADMINISTRATOR»")); |
| «body»«definition.name.toFirstLower»Datamart.Test«definition.name»(); |
| ''' |
| return body |
| } |
| |
| def void toBinderFields(JvmDeclaredType type, DatamartPackage datamart) { |
| var JvmField field = null |
| // create logger |
| field = datamart.toField("log", _typeReferenceBuilder.typeRef(Logger)) [ |
| setInitializer([append('''org.slf4j.LoggerFactory.getLogger("servicebinder")''')]) |
| ] |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| // create persistence service field |
| field = datamart.toField("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService)) |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| field = datamart.toField("bpmEngine", _typeReferenceBuilder.typeRef(IBPMEngine)) |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| field = datamart.toField("userAccessService", _typeReferenceBuilder.typeRef(IUserAccessService)) |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| field = datamart.toField("dslMetadataService", _typeReferenceBuilder.typeRef(IDSLMetadataService)) |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| field = datamart.toField("taskClient", _typeReferenceBuilder.typeRef(IBPMTaskClient)) |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| } |
| |
| def void toBinderOperations(JvmDeclaredType type, DatamartPackage datamart) { |
| type.members += datamart.toMethod("getPersistenceService", _typeReferenceBuilder.typeRef(IPersistenceService), [ |
| visibility = JvmVisibility.PUBLIC |
| static = true |
| body = [ |
| append( |
| '''return persistenceService;''') |
| ] |
| ]) |
| type.members += datamart.toMethod("getBpmEngine", _typeReferenceBuilder.typeRef(IBPMEngine), [ |
| visibility = JvmVisibility.PUBLIC |
| static = true |
| body = [ |
| append( |
| '''return bpmEngine;''') |
| ] |
| ]) |
| type.members += datamart.toMethod("getUserAccessService", _typeReferenceBuilder.typeRef(IUserAccessService), [ |
| visibility = JvmVisibility.PUBLIC |
| static = true |
| body = [ |
| append( |
| '''return userAccessService;''') |
| ] |
| ]) |
| type.members += datamart.toMethod("getDSLMetadataService", _typeReferenceBuilder.typeRef(IDSLMetadataService), [ |
| visibility = JvmVisibility.PUBLIC |
| static = true |
| body = [ |
| append( |
| '''return dslMetadataService;''') |
| ] |
| ]) |
| type.members += datamart.toMethod("getTaskClient", _typeReferenceBuilder.typeRef(IBPMTaskClient), [ |
| visibility = JvmVisibility.PUBLIC |
| static = true |
| body = [ |
| append( |
| '''return taskClient;''') |
| ] |
| ]) |
| type.members += datamart.toMethod("bindPersistenceMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference)) |
| annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.MANDATORY) |
| annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.STATIC) |
| annotations += annotationRef |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».persistenceService = persistenceService; |
| log.debug("Datamart PersistenceService bound");''') |
| ] |
| ]) |
| // unbind persistence service |
| type.members += datamart.toMethod("unbindPersistenceMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("persistenceService", _typeReferenceBuilder.typeRef(IPersistenceService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».persistenceService = null; |
| log.debug("Datamart PersistenceService unbound");''') |
| ] |
| ]) |
| // bind bpm service |
| type.members += datamart.toMethod("bindBPMMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference)) |
| annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.OPTIONAL) |
| annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.DYNAMIC) |
| annotations += annotationRef |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("bpmEngine", _typeReferenceBuilder.typeRef(IBPMEngine)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».bpmEngine = bpmEngine; |
| log.debug("Datamart BPMEngine bound");''') |
| ] |
| ]) |
| // unbind bpm service |
| type.members += datamart.toMethod("unbindBPMMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("bpmEngine", _typeReferenceBuilder.typeRef(IBPMEngine)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».bpmEngine = null; |
| log.debug("Datamart BPMEngine unbound");''') |
| ] |
| ]) |
| // bind userAccessService |
| type.members += datamart.toMethod("bindUserAccessMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference)) |
| annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.MANDATORY) |
| annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.STATIC) |
| annotations += annotationRef |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("userAccessService", _typeReferenceBuilder.typeRef(IUserAccessService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».userAccessService = userAccessService; |
| log.debug("Datamart UserAccessService bound");''') |
| ] |
| ]) |
| // unbind userAccessService |
| type.members += datamart.toMethod("unbindUserAccessMethod", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("userAccessService", _typeReferenceBuilder.typeRef(IUserAccessService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».userAccessService = null; |
| log.debug("Datamart UserAccessService unbound");''') |
| ] |
| ]) |
| // bind dslMetadataService |
| type.members += datamart.toMethod("bindDSLMetadataService", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference)) |
| annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.MANDATORY) |
| annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.STATIC) |
| annotations += annotationRef |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("dslMetadataService", _typeReferenceBuilder.typeRef(IDSLMetadataService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».dslMetadataService = dslMetadataService; |
| log.debug("Datamart DSLMetadataService bound");''') |
| ] |
| ]) |
| // unbind dslMetadataService |
| type.members += datamart.toMethod("unbindDSLMetadataService", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("dslMetadataService", _typeReferenceBuilder.typeRef(IDSLMetadataService)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».dslMetadataService = null; |
| log.debug("Datamart DSLMetadataService unbound");''') |
| ] |
| ]) |
| // bind taskClient |
| type.members += datamart.toMethod("bindTaskClient", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| var annotationRef = _annotationTypesBuilder.annotationRef(typeof(Reference)) |
| annotationRef.addAnnAttr(datamart, "cardinality", ReferenceCardinality.OPTIONAL) |
| annotationRef.addAnnAttr(datamart, "policy", ReferencePolicy.DYNAMIC) |
| annotations += annotationRef |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("taskClient", _typeReferenceBuilder.typeRef(IBPMTaskClient)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».taskClient = taskClient; |
| log.debug("Datamart BPMTaskClient bound");''') |
| ] |
| ]) |
| // unbind taskClient |
| type.members += datamart.toMethod("unbindTaskClient", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| visibility = JvmVisibility.PUBLIC |
| synchronized = true |
| parameters += datamart.toParameter("taskClient", _typeReferenceBuilder.typeRef(IBPMTaskClient)) |
| body = [ |
| append( |
| ''' |
| «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».taskClient = null; |
| log.debug("Datamart BPMTaskClient unbound");''') |
| ] |
| ]) |
| } |
| |
| /** |
| * <p>build the class variables for each datamart definition.</p> |
| * |
| */ |
| def void toFields(JvmDeclaredType type, DatamartDefinition definition) { |
| val typesMap = <String, LAttribute>newHashMap |
| val entityMap = <String, LEntity>newHashMap |
| var JvmField field = null |
| // create logger |
| field = definition.toField("log", _typeReferenceBuilder.typeRef(Logger)) [ |
| setInitializer([append('''org.slf4j.LoggerFactory.getLogger("datamarts")''')]) |
| ] |
| field.static = true |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| field = definition.toField("user", _typeReferenceBuilder.typeRef(IUser)) |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| if (definition.source instanceof DatamartCube) { |
| field = definition.toField("statement", _typeReferenceBuilder.typeRef(String)) [ |
| setInitializer([append('''"«definition.createMDXStatement»"''')]) |
| ] |
| type.members += field |
| field = definition.toField("connection", _typeReferenceBuilder.typeRef(RolapConnection)) [ |
| setInitializer([append('''null''')]) |
| ] |
| type.members += field |
| field = definition.toField("datamartDtoMapper", _typeReferenceBuilder.typeRef(DatamartDtoMapper)) [ |
| setInitializer([append('''new DatamartDtoMapper()''')]) |
| ] |
| type.members += field |
| } |
| if (definition.source instanceof DatamartEntity) { |
| field = definition.toField("dateFilterAttributeProperties", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String)))) [ |
| setInitializer = [ |
| append('''new HashMap<String, Map<String, String>>()«(definition.source as DatamartEntity).createFilterAttributeProperties»''') |
| ] |
| ] |
| field.visibility = JvmVisibility::PRIVATE |
| type.members += field |
| |
| field = definition.toField("statement", |
| _typeReferenceBuilder.typeRef(String)) [ |
| setInitializer([ |
| append('''"«definition.createSQLStatements((definition.source as DatamartEntity), typesMap, entityMap)»"''') |
| ]) |
| ] |
| type.members += field |
| field = definition.toField("datamartDtoMapper", _typeReferenceBuilder.typeRef(DatamartDtoMapper)) [ |
| setInitializer([append('''«datamartDtoMapper»''')]) |
| ] |
| type.members += field |
| field = definition.toField("connection", _typeReferenceBuilder.typeRef(Connection)) [ |
| setInitializer([append('''null''')]) |
| ] |
| type.members += field |
| field = definition.toField("axisMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(Integer), |
| _typeReferenceBuilder.typeRef(ArrayList, _typeReferenceBuilder.typeRef(String)))) [ |
| setInitializer([append('''new HashMap<Integer,ArrayList<String>>() «definition.createAxisMap(entityMap)»''')]) |
| ] |
| type.members += field |
| field = definition.toField("aliasMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String))) [ |
| setInitializer([append('''new HashMap<String,String>() «definition.createAliasMap(entityMap)»''')]) |
| ] |
| type.members += field |
| } |
| |
| if (definition.source instanceof DatamartTask) { |
| field = definition.toField("axisMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(Integer), |
| _typeReferenceBuilder.typeRef(ArrayList, _typeReferenceBuilder.typeRef(String)))) [ |
| setInitializer([append('''new HashMap<Integer,ArrayList<String>>() «definition.createAxisMap(entityMap)»''')]) |
| ] |
| type.members += field |
| field = definition.toField("datamartDtoMapper", _typeReferenceBuilder.typeRef(DatamartDtoMapper)) [ |
| setInitializer([append('''new DatamartDtoMapper()''')]) |
| ] |
| type.members += field |
| } |
| // must be made after createSQLStatement |
| field = definition.toField("idMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(EType))) [ |
| setInitializer([append('''new HashMap<String,EType>() «definition.createIdMap»''')]) |
| ] |
| type.members += field |
| |
| field = definition.toField("primaryList", |
| _typeReferenceBuilder.typeRef(ArrayList, |
| getTypeForName(DatamartPrimary, definition, _typeReferenceBuilder.wildcard()))) [ |
| setInitializer([append('''new ArrayList<DatamartPrimary<?>>() «definition.createPrimaryList»''')]) |
| ] |
| type.members += field |
| |
| field = definition.toField("typesMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(EType))) [ |
| setInitializer([ |
| append('''new HashMap<String,EType>() «definition.createTypesMaps(typesMap)»''') |
| ]) |
| ] |
| type.members += field |
| |
| field = definition.toField("typesProp", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String))) [ |
| setInitializer([ |
| append('''new HashMap<String, String>() «definition.createTypesProps(typesMap)»''') |
| ]) |
| ] |
| type.members += field |
| |
| field = definition.toField("resultAttributes", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String)))[setInitializer([append('''new HashMap<String,String>()''')])] |
| type.members += field |
| } |
| |
| /** |
| * <p>build the getters and setters from class variables of datamart definition.</p> |
| * |
| */ |
| def void toGetterSetter(JvmDeclaredType type, DatamartDefinition definition) { |
| var JvmOperation operation = null |
| operation = definition.toGetter("idMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(EType))) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| operation = definition.toGetter("primaryList", |
| _typeReferenceBuilder.typeRef(List, |
| getTypeForName(DatamartPrimary, definition, _typeReferenceBuilder.wildcard()))) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| if (definition.source instanceof DatamartEntity || definition.source instanceof DatamartTask) { |
| operation = definition.toGetter("axisMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(Integer), |
| _typeReferenceBuilder.typeRef(ArrayList, _typeReferenceBuilder.typeRef(String)))) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| } |
| if (definition.source instanceof DatamartEntity) { |
| operation = definition.toGetter("aliasMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String))) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| } |
| operation = definition.toGetter("typesProp", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(String))) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| operation = definition.toGetter("user", _typeReferenceBuilder.typeRef(IUser)) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| operation = definition.toSetter("user", _typeReferenceBuilder.typeRef(IUser)) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| } |
| |
| /** |
| * <p>build the methods separately for cube, entity and task or SQL and MDX respective.</p> |
| * |
| */ |
| def void toOperations(JvmDeclaredType type, DatamartDefinition definition, DatamartPackage datamart) { |
| var JvmOperation operation |
| |
| operation = definition.toMethod("initializeFilterMap", |
| _typeReferenceBuilder.typeRef(ArrayList, _typeReferenceBuilder.typeRef(DatamartFilter))) [ |
| body = [ |
| append(''' |
| return new ArrayList<DatamartFilter>() «definition.createFilterMap»; |
| ''') |
| ] |
| ] |
| operation.visibility = JvmVisibility::PROTECTED |
| type.members += operation |
| |
| // Method getPrimaryFilterId |
| operation = definition.toMethod("getPrimaryFilterId", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append(''' |
| return "«definition.createPrimaryFilterId»"; |
| ''') |
| ] |
| ]) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| |
| operation = definition.toMethod("clearCache", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| annotations += _annotationTypesBuilder.annotationRef(Override) |
| body = [ |
| append(''' |
| «IF definition.source instanceof DatamartCube» |
| try { |
| «binderClassName».getPersistenceService().clearCubeCache(«binderClassName».getPersistenceService().getMondrianConnection(getPersistenceUnit(), "«((definition.source as DatamartCube).cubeRef.eContainer as CubePackage).fullyQualifiedName»"), "«(definition.source as DatamartCube).cubeRef.name»"); |
| } catch (SQLException e) { |
| log.error("{}", e); |
| }; |
| «ENDIF»''') |
| ] |
| ]) |
| type.members += operation |
| |
| operation = definition.toMethod("getResultAttribute", _typeReferenceBuilder.typeRef(String), [ |
| annotations += _annotationTypesBuilder.annotationRef(Override) |
| parameters += definition.toParameter("attributeName", _typeReferenceBuilder.typeRef(String)) |
| body = [ |
| append(''' |
| return resultAttributes.get(attributeName);''') |
| ] |
| ]) |
| type.members += operation |
| |
| operation = definition.toMethod("getTypesMap", |
| _typeReferenceBuilder.typeRef(Map, _typeReferenceBuilder.typeRef(String), |
| _typeReferenceBuilder.typeRef(EType)), [ |
| body = [ |
| append(''' |
| return typesMap; |
| ''') |
| ] |
| ]) |
| operation.visibility = JvmVisibility::PUBLIC |
| type.members += operation |
| |
| /* the task stuff */ |
| if (definition.source instanceof DatamartTask) { |
| // get persistence unit |
| type.members += definition.toMethod("getPersistenceUnit", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| return null; |
| ''' |
| ) |
| ] |
| ]) |
| // client connect method |
| type.members += definition.toMethod("connect", _typeReferenceBuilder.typeRef(Connection), [ |
| body = [ |
| append( |
| ''' |
| return null;''') |
| ] |
| ]) |
| |
| // disconnect method |
| type.members += definition.toMethod("disconnect", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| '''''') |
| ] |
| ]) |
| |
| // renderFilters method |
| operation = definition.toMethod("renderFilters", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| ''' |
| for (DatamartFilter filter : getFilters()) { |
| filter.clearData(); |
| if (filter.getName().equals("Groups")) { |
| for(String grp : «binderClassName».getBpmEngine().getGroups()) { |
| filter.addItem(grp, true); |
| } |
| } |
| if (filter.getName().equals("Users")) { |
| for(String usr : «binderClassName».getBpmEngine().getUsers()) { |
| filter.addItem(usr, true); |
| } |
| } |
| }''') |
| ] |
| ]) |
| type.members += operation |
| |
| // getResults method |
| type.members += definition.toMethod("getResults", _typeReferenceBuilder.typeRef(DerivedCellSet), [ |
| body = [ |
| append( |
| ''' |
| if(user != null) { |
| List<BPMTaskSummary> tasks = «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».getTaskClient().getUserTaskList(user, false); |
| if (tasks == null || tasks.size() == 0) { |
| tasks = «datamart.fullyQualifiedName.lastSegment.toFirstUpper+"ServiceBinder"».getTaskClient().getUserTaskList(user, true); |
| } |
| return (new DerivedCellSet(new SqlCellSet(tasks, getAxisMap()), null, |
| «binderClassName».getDSLMetadataService(), |
| user)); |
| } |
| return null; |
| ''') |
| ] |
| ]) |
| |
| // getResults by taskid method |
| type.members += definition.toMethod("getResultsByTaskId", _typeReferenceBuilder.typeRef(DerivedCellSet), [ |
| parameters += definition.toParameter("client", _typeReferenceBuilder.typeRef(IBPMTaskClient)) |
| parameters += definition.toParameter("taskId", _typeReferenceBuilder.typeRef(Long)) |
| body = [ |
| append( |
| ''' |
| List<BPMTaskSummary> myTasks = new ArrayList<>(); |
| myTasks.add(client.getUserTask(taskId, user)); |
| return (new DerivedCellSet(new SqlCellSet(myTasks, getAxisMap()), null, |
| «binderClassName».getDSLMetadataService(), user));''') |
| ] |
| ]) |
| |
| // test method |
| operation = definition.toMethod('''Test«definition.name»''', _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| renderFilters(); |
| org.junit.Assert.assertNotNull(getResults());''') |
| ] |
| ]) |
| operation.returnType = _typeReferenceBuilder.typeRef(Void::TYPE) |
| var JvmAnnotationReference annRef = _annotationTypesBuilder.annotationRef(Test) |
| operation.annotations.add(annRef) |
| type.members += operation |
| } |
| |
| /* the cube stuff */ |
| if (definition.source instanceof DatamartCube) { |
| if ((definition.source as DatamartCube).cubeRef.cubeTypeEntity !== null) { |
| val entity = (definition.source as DatamartCube).cubeRef.cubeTypeEntity.entityRef.entityValue |
| // get persistence unit |
| type.members += definition.toMethod("getPersistenceUnit", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| return "«(entity as LEntity).persistenceUnit»"; |
| ''' |
| ) |
| ] |
| ]) |
| // connect method |
| type.members += definition.toMethod("connect", _typeReferenceBuilder.typeRef(RolapConnection), [ |
| body = [ |
| append( |
| ''' |
| if (connection == null) { |
| try { |
| connection = «binderClassName».getPersistenceService().getMondrianConnection(getPersistenceUnit(), "«((definition.source as DatamartCube).cubeRef.eContainer as CubePackage).fullyQualifiedName»"); |
| «binderClassName».getPersistenceService().registerPersistenceUnit(getPersistenceUnit(), «(entity as LEntity).fullyQualifiedName».class); |
| } catch (SQLException e) { |
| log.error("{}", e); |
| return (connection); |
| } |
| } |
| return (connection);''') |
| ] |
| ]) |
| // disconnect method |
| type.members += definition.toMethod("disconnect", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| ''' |
| if (connection != null) { |
| connection.close(); |
| connection = null; |
| }''') |
| ] |
| ]) |
| |
| // renderFilters method |
| operation = definition.toMethod("renderFilters", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| ''' |
| connect(); |
| if (connection != null) { |
| for (DatamartFilter filter : getFilters()) { |
| filter.clearData(); |
| DerivedCellSet cellSet = new DerivedCellSet(«binderClassName».getPersistenceService().sendQuery(connection,getVendorSql(filter)), |
| «binderClassName».getDSLMetadataService(), |
| user); |
| List<DerivedAxis> axes = cellSet.getAxes(); |
| DerivedAxis columnsAxis = axes.get(Axis.COLUMNS.ordinal()); |
| for (DerivedPosition position : columnsAxis.getPositions()) { |
| DerivedMember measure = position.getMembers().get(0); |
| filter.addOlapItem(measure.getHierarchy().getName(), measure.getUniqueName()); |
| } |
| } |
| } |
| disconnect();''') |
| ] |
| ]) |
| type.members += operation |
| |
| // applyFilters method |
| operation = definition.toMethod("applyFilters", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| String filteredStatement = statement; |
| computeConditions(); |
| for (DatamartFilter filter : getFilters()) { |
| if(filter.getCondition() != null) { |
| filteredStatement = filteredStatement.replace(filter.getDecoratedName(), filter.getCondition().replace("'","")); |
| } |
| } |
| filteredStatement = filteredStatement.replace("<empty>,","").replace(",<empty>","").replace("<empty>",""); |
| log.debug("«definition.name»:"+filteredStatement); |
| return filteredStatement;''') |
| ] |
| ]) |
| type.members += operation |
| |
| // execute method |
| type.members += definition.toMethod("getResults", _typeReferenceBuilder.typeRef(DerivedCellSet), [ |
| parameters += definition.toParameter("operativeDtoClass", _typeReferenceBuilder.typeRef(Class)) |
| parameters += definition.toParameter("operativeDtos", |
| _typeReferenceBuilder.typeRef(List, _typeReferenceBuilder.typeRef(IDto))) |
| body = [ |
| append( |
| ''' |
| DerivedCellSet derivedCellSet = null; |
| connect(); |
| if (connection != null) { |
| derivedCellSet = new DerivedCellSet(«binderClassName».getPersistenceService().sendQuery(connection, applyFilters()), |
| «binderClassName».getDSLMetadataService(), |
| user); |
| } |
| disconnect(); |
| return derivedCellSet;''') |
| ] |
| ]) |
| |
| // test method |
| operation = definition.toMethod('''Test«definition.name»''', _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| renderFilters(); |
| org.junit.Assert.assertNotNull(getResults(null, null));''' |
| ) |
| ] |
| ]) |
| operation.returnType = _typeReferenceBuilder.typeRef(Void::TYPE) |
| var JvmAnnotationReference annRef = _annotationTypesBuilder.annotationRef(Test) |
| operation.annotations.add(annRef) |
| type.members += operation |
| } |
| } |
| |
| /* the entity stuff */ |
| if (definition.source instanceof DatamartEntity) { |
| // get persistence unit |
| type.members += definition.toMethod("getPersistenceUnit", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| return "«(definition.source as DatamartEntity)?.entityRef?.persistenceUnit»"; |
| ''' |
| ) |
| ] |
| ]) |
| // connect method |
| type.members += definition.toMethod("connect", _typeReferenceBuilder.typeRef(Connection), [ |
| body = [ |
| append( |
| ''' |
| if (connection == null) { |
| try { |
| connection = «binderClassName».getPersistenceService().getPersistenceUnitConnection(getPersistenceUnit()); |
| «binderClassName».getPersistenceService().registerPersistenceUnit(getPersistenceUnit(), «(definition.source as DatamartEntity)?.entityRef?.fullyQualifiedName».class); |
| } catch (SQLException e) { |
| log.error("{}", e); |
| return (connection); |
| } |
| } |
| return (connection);''' |
| ) |
| ] |
| ]) |
| |
| // disconnect method |
| type.members += definition.toMethod("disconnect", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| ''' |
| if (connection != null) { |
| try { |
| connection.close(); |
| connection = null; |
| } catch (SQLException e) { |
| log.error("{}", e); |
| } |
| }''' |
| ) |
| ] |
| ]) |
| // renderFilters method |
| type.members += definition.toMethod("insertCondition", _typeReferenceBuilder.typeRef(String), [ |
| parameters += definition.toParameter("filteredStatement", _typeReferenceBuilder.typeRef(String)) |
| parameters += definition.toParameter("condition", _typeReferenceBuilder.typeRef(String)) |
| body = [ |
| append( |
| ''' |
| int index = filteredStatement.indexOf("order by"); |
| if(index > -1) { |
| return filteredStatement.substring(0, index-1) + condition + filteredStatement.substring(index-1); |
| } else { |
| return filteredStatement + condition; |
| }''' |
| ) |
| ] |
| ]) |
| // renderFilters method |
| operation = definition.toMethod("renderFilters", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| body = [ |
| append( |
| ''' |
| connect(); |
| if (connection != null) { |
| for (DatamartFilter filter : getFilters()) { |
| if((DatamartFilter.FilterType.BY_ID != filter.getType()) && (DatamartFilter.FilterType.BETWEEN != filter.getType()) && (DatamartFilter.FilterType.BETWEEN_DATE != filter.getType())) { |
| ResultSet rs = null; |
| try { |
| rs = connection.createStatement().executeQuery(getVendorSql(filter)); |
| if (rs != null) { |
| while (rs.next()) { |
| int type = rs.getMetaData().getColumnType(1); |
| switch (type) { |
| case java.sql.Types.DATE: |
| Date date = rs.getDate(1); |
| if (date != null) { |
| if (user == null) { |
| filter.addItem(date.toString(), getVendorToDateSQLMethod()+"('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')", false); |
| } else { |
| filter.addItem(SimpleDateFormatter.getFormat("LONGDATE", user.getLocale()).format(date), getVendorToDateSQLMethod()+"('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')", false); |
| } |
| } |
| break; |
| case java.sql.Types.TIMESTAMP: |
| Timestamp timestamp = rs.getTimestamp(1); |
| if (timestamp != null) { |
| if (user == null) { |
| filter.addItem(timestamp.toString(), getVendorToTimestampSQLMethod()+"('"+timestamp.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')", false); |
| } else { |
| filter.addItem(SimpleDateFormatter.getFormat("LONGDATE", user.getLocale()).format(timestamp), getVendorToTimestampSQLMethod()+"('"+timestamp.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')", false); |
| } |
| } |
| break; |
| case java.sql.Types.DECIMAL: |
| BigDecimal bigDecimal = rs.getBigDecimal(1); |
| if (bigDecimal != null) { |
| filter.addItem(bigDecimal.toPlainString(), bigDecimal.toPlainString(), false); |
| } |
| break; |
| case java.sql.Types.NUMERIC: |
| case java.sql.Types.DOUBLE: |
| filter.addItem(Double.toString(rs.getDouble(1)), Double.toString(rs.getDouble(1)), false); |
| break; |
| case java.sql.Types.INTEGER: |
| case java.sql.Types.BIGINT: |
| filter.addItem(Integer.toString(rs.getInt(1)), Integer.toString(rs.getInt(1)), false); |
| break; |
| case java.sql.Types.FLOAT: |
| filter.addItem(Float.toString(rs.getFloat(1)), Float.toString(rs.getFloat(1)), false); |
| break; |
| case java.sql.Types.CHAR: |
| case java.sql.Types.NCHAR: |
| case java.sql.Types.NVARCHAR: |
| case java.sql.Types.VARCHAR: |
| case java.sql.Types.LONGVARCHAR: |
| filter.addItem(rs.getString(1), rs.getString(1), true); |
| break; |
| } |
| } |
| } |
| } catch (SQLException e) { |
| log.error("{}", e); |
| } finally { |
| try { |
| rs.close(); |
| } catch (java.sql.SQLException e) {} |
| } |
| } |
| } |
| } |
| disconnect();''' |
| ) |
| ] |
| ]) |
| type.members += operation |
| |
| // applyFilters method |
| operation = definition.toMethod("applyFilters", _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| String filteredStatement = statement; |
| computeConditions(); |
| for (DatamartFilter filter : getFilters()) { |
| if (DatamartFilter.FilterType.BY_ID == filter.getType()) { |
| if(filter.getCondition() != null) { |
| if (!filteredStatement.toLowerCase().contains(" where ")) { |
| if ((" "+filter.getCondition()).toLowerCase().contains("where ")) { |
| filteredStatement = insertCondition(filteredStatement, " "+filter.getCondition()); |
| } |
| else { |
| filteredStatement = insertCondition(filteredStatement, " where "+filter.getCondition()); |
| } |
| } |
| else { |
| if (filter.getCondition().trim().toLowerCase().startsWith("and ") || |
| filter.getCondition().trim().toLowerCase().startsWith("or ") ) { |
| filteredStatement = insertCondition(filteredStatement, filter.getCondition()); |
| } |
| else { |
| filteredStatement = insertCondition(filteredStatement, " and "+filter.getCondition()); |
| } |
| } |
| } |
| } |
| else { |
| filteredStatement = filteredStatement.replace(filter.getDecoratedName(), filter.getCondition()); |
| } |
| } |
| log.debug("«definition.name»:"+filteredStatement); |
| return filteredStatement;''') |
| ] |
| ]) |
| type.members += operation |
| |
| // execute method |
| type.members += definition.toMethod("getResults", _typeReferenceBuilder.typeRef(DerivedCellSet), [ |
| parameters += definition.toParameter("operativeDtoClass", _typeReferenceBuilder.typeRef(Class)) |
| parameters += definition.toParameter("operativeDtos", |
| _typeReferenceBuilder.typeRef(List, _typeReferenceBuilder.typeRef(IDto))) |
| body = [ |
| append( |
| ''' |
| ResultSet rs = null; |
| SqlCellSet cellSet = null; |
| java.sql.ResultSetMetaData metaData = null; |
| // --- if filler text is enabled --- |
| if (fFillerTextEnabled) { |
| // --- try to generate filler text --- |
| rs = generateFillerTextResultSet(); |
| } |
| // --- if no result set is generated by now --- |
| connect(); |
| if (rs == null) { |
| if (connection != null) { |
| String query = applyFilters(); |
| if (query.length()>0) { |
| try { |
| rs = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(query); |
| } catch (SQLException e) { |
| log.error("Query: "+query); |
| log.error("{}", e); |
| } |
| } |
| } |
| } |
| if (rs != null) { |
| try { |
| cellSet = new SqlCellSet(rs, getAxisMap(), getIdMap(), getAliasMap(), datamartDtoMapper, operativeDtoClass, operativeDtos, getPrimaryList(), «binderClassName».getUserAccessService()); |
| registerFirstLine(rs, user); |
| metaData = rs.getMetaData(); |
| rs.close(); |
| } |
| catch (java.sql.SQLException e) { |
| try { |
| log.error("Statement: "+rs.getStatement().toString()); |
| } catch (SQLException e1) {} |
| log.error("{}", e); |
| } |
| return (new DerivedCellSet(cellSet, |
| metaData, |
| «binderClassName».getDSLMetadataService(), user)); |
| } |
| disconnect(); |
| return null;''') |
| ] |
| ]) |
| // registerFirstLine method |
| type.members += definition.toMethod("registerFirstLine", _typeReferenceBuilder.typeRef(Void::TYPE), [ |
| parameters += definition.toParameter("rs", _typeReferenceBuilder.typeRef(ResultSet)) |
| parameters += definition.toParameter("user", _typeReferenceBuilder.typeRef(IUser)) |
| exceptions += _typeReferenceBuilder.typeRef(SQLException) |
| body = [ |
| append( |
| ''' |
| if (rs != null && rs.first()) { |
| for (int column = 1; column <= rs.getMetaData().getColumnCount(); column++) { |
| int type = rs.getMetaData().getColumnType(column); |
| switch (type) { |
| case java.sql.Types.DATE: |
| if(rs.getDate(column) != null) { |
| if (user == null) { |
| resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getDate(column).toString()); |
| } else { |
| resultAttributes.put(rs.getMetaData().getColumnName(column), |
| SimpleDateFormatter.getFormat("LONGDATE", user.getLocale()).format(rs.getDate(column))); |
| } |
| } |
| break; |
| case java.sql.Types.TIMESTAMP: |
| if(rs.getTimestamp(column) != null) { |
| if (user == null) { |
| resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getTimestamp(column).toString()); |
| } else { |
| resultAttributes.put(rs.getMetaData().getColumnName(column), SimpleDateFormatter |
| .getFormat("LONGDATE", user.getLocale()).format(rs.getTimestamp(column))); |
| } |
| } |
| break; |
| case java.sql.Types.DECIMAL: |
| if(rs.getBigDecimal(column) != null) { |
| resultAttributes.put(rs.getMetaData().getColumnName(column), |
| rs.getBigDecimal(column).toPlainString()); |
| } |
| break; |
| case java.sql.Types.NUMERIC: |
| case java.sql.Types.DOUBLE: |
| resultAttributes.put(rs.getMetaData().getColumnName(column), Double.toString(rs.getDouble(column))); |
| break; |
| case java.sql.Types.FLOAT: |
| resultAttributes.put(rs.getMetaData().getColumnName(column), Float.toString(rs.getFloat(column))); |
| break; |
| case java.sql.Types.CHAR: |
| case java.sql.Types.NCHAR: |
| case java.sql.Types.NVARCHAR: |
| case java.sql.Types.VARCHAR: |
| case java.sql.Types.LONGVARCHAR: |
| resultAttributes.put(rs.getMetaData().getColumnName(column), rs.getString(column)); |
| break; |
| } |
| } |
| } |
| ''' |
| ) |
| ] |
| ]) |
| |
| // test method |
| operation = definition.toMethod('''Test«definition.name»''', _typeReferenceBuilder.typeRef(String), [ |
| body = [ |
| append( |
| ''' |
| renderFilters(); |
| org.junit.Assert.assertNotNull(getResults(null, null));''') |
| ] |
| ]) |
| operation.returnType = _typeReferenceBuilder.typeRef(Void::TYPE) |
| var JvmAnnotationReference annRef = _annotationTypesBuilder.annotationRef(Test) |
| operation.annotations.add(annRef) |
| type.members += operation |
| } |
| } |
| |
| def String createFilterAttributeProperties(DatamartEntity entity) { |
| var text = "" |
| for (condition : entity.conditions) { |
| if (condition.condition !== null) { |
| if (condition.condition instanceof ConditionalExpression) { |
| var element = (condition.condition as ConditionalExpression).right |
| var leftConditionalExpr = (condition.condition as ConditionalExpression).left |
| if (leftConditionalExpr instanceof DatamartAttributeBase) { |
| var attribute = (condition.condition as ConditionalExpression).left as DatamartAttributeBase |
| if (element.ranged) { |
| if (attribute.attributeRef.datatype.isDate) { |
| if (attribute.attributeRef.properties !== null && |
| !attribute.attributeRef.properties.empty) { |
| text = ''' |
| {{ |
| put("«attribute.getAttributeName(entity)»", new HashMap<String, String>() {{''' |
| for (property : attribute.attributeRef.properties) { |
| text = ''' |
| «text» |
| put("«property.key»", "«property.value»");''' |
| } |
| text = ''' |
| «text» |
| }}); |
| }}''' |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| for (navigation : entity.navigations) { |
| if (navigation instanceof DatamartMember) { |
| text = ''' |
| «text» |
| «(navigation as DatamartMember).datamartEntity.createFilterAttributeProperties»''' |
| } |
| if (navigation instanceof DatamartOwner) { |
| text = ''' |
| «text» |
| «(navigation as DatamartOwner).datamartEntity.createFilterAttributeProperties»''' |
| } |
| } |
| return text |
| } |
| |
| /** |
| * <p>build the id map as lookup for primary key oriented applications.</p> |
| * |
| */ |
| def String createIdMap(DatamartDefinition definition) { |
| var listTxt = "" |
| for (idColumn : idMap.keySet) { |
| listTxt = ''' |
| «listTxt» |
| put("«idColumn»", EType.«dtType.getBasicType(idMap.get(idColumn).primaryKeyAttribute as LEntityAttribute)»);''' |
| } |
| listTxt = ''' |
| {{ |
| «listTxt» |
| }}''' |
| return listTxt |
| } |
| |
| def String createPrimaryList(DatamartDefinition definition) { |
| var listTxt = "" |
| for (idColumn : idMap.keySet) { |
| var typeName = "" |
| if (idMap.get(idColumn).idAttributeType instanceof LDataType) { |
| if ((idMap.get(idColumn).idAttributeType as LDataType).jvmTypeReference !== null) { |
| typeName = (idMap.get(idColumn).idAttributeType as LDataType).jvmTypeReference.type.simpleName |
| } else { |
| typeName = (idMap.get(idColumn).idAttributeType as LDataType).name |
| } |
| listTxt = ''' |
| «listTxt» |
| add(new DatamartPrimary<«typeName»>("«idColumn»", "«idMap.get(idColumn).primaryKeyAttribute.name»", "«idMap.get(idColumn).fullyQualifiedName»"));''' |
| } |
| } |
| listTxt = ''' |
| {{ |
| «listTxt» |
| }}''' |
| return listTxt |
| } |
| |
| def String addPrimaryFilters(DatamartDefinition definition) { |
| var listTxt = "" |
| for (idColumn : idMap.keySet) { |
| listTxt = ''' |
| «listTxt» |
| add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.BY_ID, "«idMap.get(idColumn).name».«idMap.get(idColumn).primaryKeyAttribute.name»",""));''' |
| } |
| return listTxt |
| } |
| |
| /** |
| * <p>build the types map as lookup for datatypes.</p> |
| * |
| */ |
| def String createTypesMaps( |
| DatamartDefinition definition, |
| HashMap<String, LAttribute> typesMap |
| ) { |
| |
| var listTxt = ''' |
| {{ |
| «definition.createTypesMap(typesMap)» |
| }}''' |
| return listTxt |
| } |
| |
| /** |
| * <p>build the types map as lookup for datatypes.</p> |
| * |
| */ |
| def String createTypesProps( |
| DatamartDefinition definition, |
| HashMap<String, LAttribute> typesMap |
| ) { |
| |
| var listTxt = "" |
| for (attribute : typesMap.keySet) { |
| if (!typesMap.get(attribute).properties.empty) { |
| var attributeName = attribute.split("\\.").get(1) |
| listTxt = ''' |
| «listTxt» |
| put("«attributeName»", "«typesMap.get(attribute).properties.get(0).value»");''' |
| } |
| } |
| listTxt = ''' |
| {{ |
| «listTxt» |
| }}''' |
| return listTxt |
| } |
| |
| /** |
| * <p>build the types map as lookup for datatypes according to authorization roles.</p> |
| * |
| */ |
| def String createTypesMap(DatamartDefinition definition, HashMap<String, LAttribute> typesMap) { |
| var listTxt = "" |
| for (attribute : typesMap.keySet) { |
| val type = dtType.getBasicType(typesMap.get(attribute)) |
| listTxt = ''' |
| «listTxt» |
| put("«attribute»", EType.«type.toString»);''' |
| } |
| return listTxt |
| } |
| |
| /** |
| * <p>build the axis map.</p> |
| * |
| */ |
| def String createAxisMap(DatamartDefinition definition, Map<String, LEntity> entityMap) { |
| var text = "" |
| var map = <Integer, Map<String, Integer>>newHashMap |
| if (definition.source !== null) { |
| if (definition.source instanceof DatamartEntity) { |
| (definition.source as DatamartEntity).createAxisMap(map) |
| } |
| if (definition.source instanceof DatamartTask) { |
| (definition.source as DatamartTask).createAxisMap(map) |
| } |
| } |
| for (axisNumber : map.keySet()) { |
| if (definition.source instanceof DatamartEntity && axisNumber == AxisEnum.COLUMNS_VALUE) { |
| if (!ignoreEntityGrouping) { |
| for (LEntity entityRef : entityMap.values) { |
| var idColumn = DatamartDefinitionUtil.getEntityIdAliasName(entityRef) |
| if (idColumn !== null) { |
| map.get(axisNumber).put(idColumn, 0) |
| } |
| } |
| } |
| } |
| // sort according weight reverse and format map |
| var listTxt = map.get(axisNumber).entrySet.stream.sorted(Map.Entry.comparingByValue.reversed).map [ |
| "add(\"" + it.key + "\");" |
| ].collect(Collectors.joining("\n", "{{\n", "\n}}")) |
| text = ''' |
| «text» |
| put(«axisNumber»,new ArrayList<String>() «listTxt»);''' |
| } |
| text = ''' |
| {{ |
| «text» |
| }}''' |
| return text |
| } |
| |
| /** |
| * <p>creates an axis map for tasks.</p> |
| * |
| */ |
| def void createAxisMap(DatamartTask task, Map<Integer, Map<String, Integer>> map) { |
| this.idMap.clear() |
| for (column : task.columns) { |
| var axisNumber = 0 |
| var name = column.columnRef.literal |
| var found = false |
| for (axNum : map.keySet()) { |
| if (axNum == axisNumber) { |
| map.get(axNum).put(name, defaultColumnWeight) |
| found = true |
| } |
| } |
| if (!found) { |
| var columns = <String, Integer>newHashMap |
| columns.put(name, defaultColumnWeight) |
| map.put(axisNumber, columns) |
| } |
| } |
| } |
| |
| def void recursAxisMap(LScalarType type, DatamartAttribute attribute, Map<Integer, Map<String, Integer>> map, |
| int axisNumber) { |
| if (type instanceof LBean) { |
| var bean = type as LBean |
| for (attr : bean.allAttributes) { |
| if (attr.type instanceof LBean) { |
| recursAxisMap(attr.type, attribute, map, axisNumber) |
| } else { |
| addAxisAttribute(attr.name, defaultColumnWeight, map, axisNumber) |
| } |
| } |
| } else { |
| var weight = defaultColumnWeight |
| if (attribute.hasColumnWeight) { |
| weight = attribute.columnWeight |
| } |
| addAxisAttribute(DatamartAttributeUtil.getAliasedAttributeName(attribute), weight, map, axisNumber) |
| } |
| } |
| |
| def addAxisAttribute(String name, Integer weight, Map<Integer, Map<String, Integer>> map, int axisNumber) { |
| var found = false |
| for (axNum : map.keySet()) { |
| if (axNum == axisNumber) { |
| map.get(axNum).put(name, weight) |
| found = true |
| } |
| } |
| if (!found) { |
| var columns = <String, Integer>newHashMap |
| columns.put(name, weight) |
| map.put(axisNumber, columns) |
| } |
| } |
| |
| /** |
| * <p>recursively create an axis map for entities.</p> |
| * |
| */ |
| def void createAxisMap(DatamartEntity entity, Map<Integer, Map<String, Integer>> map) { |
| var entityAttributes = entity.entityAttributes |
| for (attribute : entityAttributes) { |
| var axisNumber = -1 |
| if (attribute.axis.name.value == -1) { |
| axisNumber = 0 |
| } else { |
| axisNumber = attribute.axis.name.value |
| } |
| var type = attribute.attributeRef.type as LScalarType |
| recursAxisMap(type, attribute, map, axisNumber) |
| } |
| for (navigation : entity.navigations) { |
| navigation.datamartEntity.createAxisMap(map) |
| } |
| } |
| |
| /** |
| * <p>build the alias map.</p> |
| * |
| */ |
| def String createAliasMap(DatamartDefinition definition, Map<String, LEntity> entityMap) { |
| var aliases = <String, String>newHashMap |
| if (definition.source !== null && definition.source instanceof DatamartEntity) { |
| (definition.source as DatamartEntity).createAliasMap(aliases) |
| } |
| var text = ''' |
| {{ |
| «aliases.entrySet.map['''put("«it.key»","«it.value»");'''].join("\n")» |
| }}''' |
| return text |
| } |
| |
| def void recursAliasMap(LScalarType type, DatamartAttribute attribute, Map<String, String> map) { |
| if (type instanceof LBean) { |
| var bean = type as LBean |
| for (attr : bean.allAttributes) { |
| if (attr.type instanceof LBean) { |
| recursAliasMap(attr.type, attribute, map) |
| } else { |
| map.put(attr.name, attr.fullyQualifiedName.toString) |
| } |
| } |
| } else { |
| map.put(DatamartAttributeUtil.getAliasedAttributeName(attribute), attribute.attributeRef.entity.fullyQualifiedName.toString+"."+attribute.attributeRef.name) |
| } |
| } |
| |
| /** |
| * <p>recursively create an alias map for entities.</p> |
| * |
| */ |
| def void createAliasMap(DatamartEntity entity, Map<String, String> map) { |
| var entityAttributes = entity.entityAttributes |
| for (attribute : entityAttributes) { |
| var type = attribute.attributeRef.type as LScalarType |
| recursAliasMap(type, attribute, map) |
| } |
| for (navigation : entity.navigations) { |
| navigation.datamartEntity.createAliasMap(map) |
| } |
| } |
| |
| def getAttributeType(DatamartAttribute prop) { |
| return prop.attributeRef.type |
| } |
| |
| /** |
| * <p>build a map for the filters contained in a datamart depending on a cube.</p> |
| * |
| */ |
| def createFilterMap(DatamartDefinition definition) { |
| var text = "" |
| if (definition.source !== null) { |
| if (definition.source instanceof DatamartCube) { |
| var cube = (definition.source as DatamartCube) |
| for (axisslicer : cube.axisslicer) { |
| if (axisslicer instanceof DatamartCubeAxis && (axisslicer as DatamartCubeAxis).elements !== null) { |
| for (element : (axisslicer as DatamartCubeAxis).elements) { |
| if(element instanceof DatamartSetAggregation) { |
| var setAggregation = (element as DatamartSetAggregation) |
| if(setAggregation.set instanceof DatamartHierarchy) { |
| var hierarchy = setAggregation.set as DatamartHierarchy |
| text = text+hierarchy.createHierarchyFilter(definition) |
| } else if(setAggregation.left.set instanceof DatamartHierarchy) { |
| var hierarchy = setAggregation.left.set as DatamartHierarchy |
| text = text+hierarchy.createHierarchyFilter(definition) |
| } else if(setAggregation.set instanceof DatamartSetTuple) { |
| var hierarchy = (setAggregation.set as DatamartSetTuple).right |
| text = text+hierarchy.createHierarchyFilter(definition) |
| } |
| } else if (element instanceof DatamartHierarchy) { |
| var hierarchy = (element as DatamartHierarchy) |
| text = text+hierarchy.createHierarchyFilter(definition) |
| } |
| } |
| } |
| if (axisslicer instanceof DatamartSlicer && (axisslicer as DatamartSlicer).element !== null) { |
| var element = (axisslicer as DatamartSlicer).element |
| if (element instanceof DatamartHierarchy) { |
| var hierarchy = (element as DatamartHierarchy) |
| text = text+hierarchy.createHierarchyFilter(definition) |
| } |
| } |
| } |
| } |
| if (definition.source instanceof DatamartEntity) { |
| var entity = (definition.source as DatamartEntity) |
| text = entity.createFiltermapCondition(definition) |
| text = text + definition.addPrimaryFilters |
| } |
| if (definition.source instanceof DatamartTask) { |
| var task = (definition.source as DatamartTask) |
| text = text+task.createFiltermapCondition(definition) |
| } |
| if (text.length > 0) { |
| text = ''' |
| {{ |
| «text» |
| }}''' |
| } |
| } |
| return text |
| } |
| |
| def String createHierarchyFilter(DatamartHierarchy hierarchy, DatamartDefinition definition) { |
| var text = "" |
| var String ordering = null |
| if(hierarchy.hierarchyRef.eContainer instanceof CubeDimension) { |
| if((hierarchy.hierarchyRef.eContainer as CubeDimension).typeTime) { |
| ordering = "DESC" |
| } |
| } |
| if (hierarchy.filtered) { |
| text = ''' |
| «text» |
| add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.SINGLEHIERARCHY, "«hierarchy.getLevelName(true, false, false, true)»","«hierarchy.createMDXFilter(definition.source, ordering, false)»")); |
| ''' |
| } |
| if (hierarchy.selected) { |
| text = ''' |
| «text» |
| add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.MULTIPLEHIERARCHY, "«hierarchy.getLevelName(true, false, false, true)»","«hierarchy.createMDXFilter(definition.source, ordering, false)»")); |
| ''' |
| } |
| if (hierarchy.except) { |
| text = ''' |
| «text» |
| add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.EXCEPT, "«hierarchy.getDimensionName(true)+".["+hierarchy.exceptRef.name+"]"»","«hierarchy.createMDXFilter(definition.source, ordering, true)»")); |
| ''' |
| } |
| return text |
| } |
| |
| /** |
| * <p>build a map for the filters contained in a datamart depending on entity.</p> |
| * |
| */ |
| def createPrimaryFilterId(DatamartDefinition definition) { |
| var text = "" |
| if (definition.source !== null && definition.source instanceof DatamartEntity) { |
| var entity = (definition.source as DatamartEntity) |
| text = '''«entity.entityRef.name».«entity.entityRef.primaryKeyAttribute.name»''' |
| } |
| return text |
| } |
| |
| /** |
| * <p>build a map for the filters contained in a datamart depending on a task.</p> |
| * |
| */ |
| def String createFiltermapCondition(DatamartTask task, DatamartDefinition definition) { |
| var text = "" |
| for (condition : task.conditions) { |
| text = ''' |
| «text» |
| «condition.createSQLFilter(task, definition)»''' |
| } |
| return text |
| } |
| |
| /** |
| * <p>build the sql filter condition depending on an entity.</p> |
| * |
| */ |
| def createSQLFilter(DatamartCondition condition, DatamartTask task, DatamartDefinition definition) { |
| var text = "" |
| if (condition.condition !== null) { |
| if (condition.condition instanceof ConditionalExpression) { |
| var element = (condition.condition as ConditionalExpression).right |
| if ((condition.condition as ConditionalExpression).left instanceof DatamartTaskFilter) { |
| var taskFilter = (condition.condition as ConditionalExpression).left as DatamartTaskFilter |
| if (element.filtered || element.selected) { |
| var filter = '''«taskFilter.filterRef.literal»''' |
| text = ''' |
| «text» |
| add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, «IF element.filtered»DatamartFilter.FilterType.SINGLE«ELSEIF element.selected»DatamartFilter.FilterType.MULTIPLE«ENDIF», "«taskFilter.filterRef.literal»","«filter»"));''' |
| } |
| } |
| } |
| } |
| return text |
| } |
| |
| /** |
| * <p>build a map for the filters contained in a datamart depending on an entity.</p> |
| * |
| */ |
| def String createFiltermapCondition(DatamartEntity entity, DatamartDefinition definition) { |
| var text = "" |
| for (condition : entity.conditions) { |
| text = ''' |
| «text» |
| «condition.createSQLFilter(entity, definition)»''' |
| } |
| for (navigation : entity.navigations) { |
| if (navigation instanceof DatamartMember) { |
| text = ''' |
| «text» |
| «(navigation as DatamartMember).datamartEntity.createFiltermapCondition(definition)»''' |
| } |
| if (navigation instanceof DatamartOwner) { |
| text = ''' |
| «text» |
| «(navigation as DatamartOwner).datamartEntity.createFiltermapCondition(definition)»''' |
| } |
| } |
| return text |
| } |
| |
| /** |
| * <p>build the sql filter condition depending on an entity.</p> |
| * |
| */ |
| def createSQLFilter(DatamartCondition condition, DatamartEntity entity, DatamartDefinition definition) { |
| var text = "" |
| if (condition.condition !== null) { |
| if (condition.condition instanceof ConditionalExpression) { |
| var element = (condition.condition as ConditionalExpression).right |
| var leftCondExpr = (condition.condition as ConditionalExpression).left |
| if (leftCondExpr instanceof DatamartAttributeBase){ |
| var attribute = (condition.condition as ConditionalExpression).left as DatamartAttributeBase |
| var filter = element.createSQLFilter(entity, attribute) |
| if (element.filtered) { |
| text = '''«text»add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.SINGLE, "«attribute.getAttributeName(entity)»","«filter»"));''' |
| } |
| if (element.selected) { |
| text = '''«text»add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.MULTIPLE, "«attribute.getAttributeName(entity)»","«filter»"));''' |
| } |
| if (element.ranged) { |
| if (attribute.attributeRef.datatype.isDate) { |
| if (attribute.attributeRef.properties !== null) { |
| text = '''«text»add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN_DATE, dateFilterAttributeProperties.get("«attribute.getAttributeName(entity)»"), "«attribute.getAttributeName(entity)»",""));''' |
| } else { |
| text = '''«text»add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN_DATE, "«attribute.getAttributeName(entity)»",""));''' |
| } |
| } else { |
| text = '''«text»add(new DatamartFilter(«binderClassName».getDSLMetadataService(), user, DatamartFilter.FilterType.BETWEEN, "«attribute.getAttributeName(entity)»",""));''' |
| } |
| } |
| } |
| } |
| } |
| return text |
| } |
| |
| def createSQLFilter(Expression element, DatamartEntity entity, DatamartAttributeBase attribute) { |
| var tableName = entity.entityRef.toTableName |
| if (entity.hasSuperType) { |
| tableName = entity.entityRef.superType.toTableName |
| } |
| var type = attribute.attributeRef.type |
| var filter = "" |
| if (type instanceof LDataType) { |
| if (element.optional && !type.date) { |
| filter = '''select «IDataMart.SQLFILTERNOTHING» from «EnumDatabaseVendor.ONE_ROW_ONE_COLUMN_TABLE» union ''' |
| } |
| } |
| filter = '''«filter»select distinct «attribute.attributeRef.toColumnName» as \"«DatamartAttributeUtil.getAliasedAttributeName(attribute)»\" from «entity.entityRef.persistenceInfo.schemaName.provideSchemaName»«tableName» order by 1''' |
| return filter |
| } |
| |
| /** |
| * <p>build the mdx filter slice depending on a cube.</p> |
| * |
| */ |
| def createMDXFilter(DatamartHierarchy hierarchy, DatamartSource source, String ordering, boolean isExcept) { |
| var filter = "select {} on columns," |
| if (hierarchy.levelRef !== null && !isExcept) { |
| if(ordering !== null) { |
| filter = '''«filter»Order(«hierarchy.getLevelName(true, false, false, true)».members,[«hierarchy.hierarchyName»].CurrentMember.Properties(\"MEMBER_KEY\"),«ordering») on rows''' |
| } else { |
| filter = '''«filter»«hierarchy.getLevelName(true, false, false, true)».members on rows''' |
| } |
| } |
| if (hierarchy.exceptRef !== null && isExcept) { |
| if(ordering !== null) { |
| filter = '''«filter»Order(«hierarchy.getDimensionName(true)+".["+hierarchy.exceptRef.name+"]"».members,[«hierarchy.getExceptHierarchyName»].CurrentMember.Properties(\"MEMBER_KEY\"),«ordering») on rows''' |
| } else { |
| filter = '''«filter»«hierarchy.getDimensionName(true)+".["+hierarchy.exceptRef.name+"]"».members on rows''' |
| } |
| } |
| if (source instanceof DatamartCube) { |
| filter = '''«filter» from «(source as DatamartCube).cubeRef.name»''' |
| } |
| return filter |
| } |
| |
| /** |
| * <p>helper to get a level name.</p> |
| * |
| */ |
| def getFilterAlias(DatamartHierarchy level) { |
| var text = "" |
| if (level.levelRef !== null) { |
| text = '''«level.getDimensionName(false)»«level.levelRef.name.toFirstUpper»''' |
| } |
| return text |
| } |
| |
| /** |
| * <p>mdx syntax part for aggregations on sets.</p> |
| * |
| */ |
| def createSetAggregation(List<DatamartSetAggregation> usedSetAggregation, Boolean nonEmpty) { |
| var set = "" |
| var firstTuple = true |
| for (element : usedSetAggregation) { |
| if (firstTuple) { |
| firstTuple = false |
| } else { |
| set = '''«set»,''' |
| } |
| set = '''«set»«element.evaluateExpression(null)»''' |
| } |
| if (usedSetAggregation.size > 1) { |
| set = '''«IF nonEmpty»Non Empty«ENDIF»{«set»}''' |
| } else if (usedSetAggregation.size > 0) { |
| set = '''«IF nonEmpty»Non Empty «ENDIF»«set»''' |
| } |
| return set |
| } |
| |
| /** |
| * <p>mdx syntax part for hierarchies.</p> |
| * |
| */ |
| def createHierarchies(List<DatamartHierarchy> usedHierarchies, Boolean nonEmpty) { |
| var set = "" |
| var firstTuple = true |
| for (element : usedHierarchies) { |
| if (firstTuple) { |
| firstTuple = false |
| } else { |
| set = '''«set»,''' |
| } |
| set = '''«set»«element.getLevelName(true, true, true, false)»''' |
| } |
| if (usedHierarchies.size > 1) { |
| set = '''«IF nonEmpty»Non Empty«ENDIF»{«set»}''' |
| } else if (usedHierarchies.size > 0) { |
| set = '''«IF nonEmpty»Non Empty «ENDIF»«set»''' |
| } |
| return set |
| } |
| |
| /** |
| * <p>mdx syntax part for measures.</p> |
| * |
| */ |
| def createMeasures(List<DatamartMeasure> usedMeasures, List<DatamartDerivedMeasure> usedDerived, Boolean nonEmpty) { |
| var set = "" |
| var firstTuple = true |
| for (element : usedMeasures) { |
| if (firstTuple) { |
| firstTuple = false |
| } else { |
| set = '''«set»,''' |
| } |
| set = '''«set»«element.getMeasureName»''' |
| } |
| for (element : usedDerived) { |
| if (firstTuple) { |
| firstTuple = false |
| } else { |
| set = '''«set»,''' |
| } |
| set = '''«set»«element.getDerivedMeasureName»''' |
| } |
| if (usedMeasures.size + usedDerived.size > 1) { |
| set = '''«IF nonEmpty»Non Empty«ENDIF»{«set»}''' |
| } else if (usedMeasures.size + usedDerived.size > 0) { |
| set = '''«IF nonEmpty»Non Empty «ENDIF»«set»''' |
| } |
| return set |
| } |
| |
| /** |
| * <p>the main function to build a mdx statement.</p> |
| * |
| */ |
| def createMDXStatement(DatamartDefinition definition) { |
| this.sqlAliasCounter.clear() |
| this.sqlFilterMap.clear() |
| this.ignoreEntityGrouping = false |
| this.sqlHasAggregate = false |
| this.sqlHasOrder = false |
| this.idMap.clear() |
| var cube = (definition.source as DatamartCube) |
| var body = "" |
| var slice = "" |
| var derived = "" |
| var firstAxis = true |
| var firstSlice = true |
| var firstderived = true |
| for (axisslicer : cube.axisslicer) { |
| if (axisslicer instanceof DatamartCubeAxis) { |
| var crossJoinMeasure = false |
| var crossJoinHierarchy = false |
| var crossJoinSetAggregation = false |
| var axis = (axisslicer as DatamartCubeAxis) |
| if (firstAxis) { |
| firstAxis = false |
| } else { |
| body = '''«body»,''' |
| } |
| if (axis.elements !== null) { |
| var set = "" |
| val usedHierarchies = <DatamartHierarchy>newArrayList |
| val usedMeasures = <DatamartMeasure>newArrayList |
| val usedDerivedMeasure = <DatamartDerivedMeasure>newArrayList |
| val usedSetAggregation = <DatamartSetAggregation>newArrayList |
| for (element : axis.elements) { |
| if (element instanceof DatamartSetAggregation) { |
| |
| // if a set aggregation comes along, all is cross joined |
| if (usedMeasures.size > 0 || usedDerivedMeasure.size > 0) { |
| if (crossJoinMeasure) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createMeasures( |
| usedMeasures, usedDerivedMeasure, false)»''' |
| if (crossJoinMeasure) { |
| set = '''«set»)''' |
| } |
| usedMeasures.clear |
| usedDerivedMeasure.clear |
| crossJoinSetAggregation = true |
| } |
| if (usedHierarchies.size > 0) { |
| if (crossJoinHierarchy) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createHierarchies( |
| usedHierarchies, false)»''' |
| if (crossJoinHierarchy) { |
| set = '''«set»)''' |
| } |
| usedHierarchies.clear |
| crossJoinSetAggregation = true |
| } |
| var setAggregation = (element as DatamartSetAggregation) |
| usedSetAggregation.add(setAggregation) |
| } |
| if (element instanceof DatamartHierarchy) { |
| |
| // if hierarchy changes to measure, a crossjoin is generated |
| if (usedMeasures.size > 0 || usedDerivedMeasure.size > 0) { |
| if (crossJoinMeasure) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createMeasures( |
| usedMeasures, usedDerivedMeasure, false)»''' |
| if (crossJoinMeasure) { |
| set = '''«set»)''' |
| } |
| usedMeasures.clear |
| usedDerivedMeasure.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| if (crossJoinSetAggregation) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createSetAggregation( |
| usedSetAggregation, false)»''' |
| if (crossJoinSetAggregation) { |
| set = '''«set»)''' |
| } |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var hierarchyLevel = (element as DatamartHierarchy) |
| |
| // if hierarchies are mixed, a crossjoin is generated |
| var lastHierarchy = usedHierarchies.last |
| if (!crossJoinHierarchy && (lastHierarchy === null || |
| hierarchyLevel.getHierarchyName.equals(lastHierarchy.getHierarchyName))) { |
| usedHierarchies.add(hierarchyLevel) |
| } else { |
| if (crossJoinHierarchy) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createHierarchies( |
| usedHierarchies, false)»''' |
| if (crossJoinHierarchy) { |
| set = '''«set»)''' |
| } |
| usedHierarchies.clear |
| usedHierarchies.add(hierarchyLevel) |
| crossJoinHierarchy = true |
| } |
| } |
| if (element instanceof DatamartMeasure) { |
| |
| // if measure changes to hierarchy, a crossjoin is generated |
| if (usedHierarchies.size > 0) { |
| if (crossJoinMeasure) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createHierarchies( |
| usedHierarchies, false)»''' |
| if (crossJoinMeasure) { |
| set = '''«set»)''' |
| } |
| usedHierarchies.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| if (crossJoinSetAggregation) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createSetAggregation( |
| usedSetAggregation, false)»''' |
| if (crossJoinSetAggregation) { |
| set = '''«set»)''' |
| } |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var measure = (element as DatamartMeasure) |
| usedMeasures.add(measure) |
| } |
| if (element instanceof DatamartDerivedMeasure) { |
| |
| // if measure changes to hierarchy, a crossjoin is generated |
| if (usedHierarchies.size > 0) { |
| if (crossJoinMeasure) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createHierarchies( |
| usedHierarchies, false)»''' |
| if (crossJoinMeasure) { |
| set = '''«set»)''' |
| } |
| usedHierarchies.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| if (crossJoinSetAggregation) { |
| set = '''«set»,''' |
| } |
| set = '''«IF cube.nonEmpty»NonEmptyCrossjoin«ELSE»CrossJoin«ENDIF»(«set»«createSetAggregation( |
| usedSetAggregation, false)»''' |
| if (crossJoinSetAggregation) { |
| set = '''«set»)''' |
| } |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var measure = (element as DatamartDerivedMeasure) |
| usedDerivedMeasure.add(measure) |
| } |
| } |
| if (crossJoinMeasure || crossJoinHierarchy || crossJoinSetAggregation) { |
| set = '''«set»,''' |
| } |
| set = '''«set»«createHierarchies(usedHierarchies, |
| cube.nonEmpty && !(crossJoinMeasure || crossJoinHierarchy || crossJoinSetAggregation))»''' |
| usedHierarchies.clear |
| set = '''«set»«createMeasures(usedMeasures, usedDerivedMeasure, |
| cube.nonEmpty && !(crossJoinMeasure || crossJoinHierarchy || crossJoinSetAggregation))»''' |
| usedMeasures.clear |
| usedDerivedMeasure.clear |
| set = '''«set»«createSetAggregation(usedSetAggregation, |
| cube.nonEmpty && !(crossJoinMeasure || crossJoinHierarchy || crossJoinSetAggregation))»''' |
| usedMeasures.clear |
| if (crossJoinMeasure || crossJoinHierarchy || crossJoinSetAggregation) { |
| set = '''«set»)''' |
| } |
| body = '''«body»«set» on «axis.axis.name»''' |
| } |
| } |
| if (axisslicer instanceof DatamartSlicer) { |
| if (firstSlice) { |
| firstSlice = false |
| } else { |
| slice = '''«slice»,''' |
| } |
| var element = (axisslicer as DatamartSlicer).element |
| if (element instanceof DatamartHierarchy) { |
| var hierarchyLevel = (element as DatamartHierarchy) |
| slice = '''«slice»«hierarchyLevel.getLevelName(true, true, true, true)»''' |
| } |
| if (element instanceof DatamartMeasure) { |
| slice = '''«slice»«(element as DatamartMeasure).getMeasureName»''' |
| } |
| } |
| if (axisslicer instanceof DatamartDefineDerivedMeasure) { |
| if (firstderived) { |
| firstderived = false |
| } |
| var derivedMeasure = (axisslicer as DatamartDefineDerivedMeasure) |
| derived = '''«derived» member [Measures].[«derivedMeasure.name»] as «derivedMeasure.buildDerivedFormula»''' |
| } |
| } |
| if (!firstSlice) { |
| slice = ''' where («slice»)''' |
| } |
| if (!firstderived) { |
| derived = '''with«derived» ''' |
| } |
| |
| return '''«derived»select «body» from «cube.cubeRef.name»«slice»''' |
| } |
| |
| def isCrossJoined(DatamartDefinition definition) { |
| if (!(definition.source instanceof DatamartCube)) { |
| return false; |
| } |
| var cube = (definition.source as DatamartCube) |
| var firstAxis = true |
| for (axisslicer : cube.axisslicer) { |
| if (axisslicer instanceof DatamartCubeAxis) { |
| var crossJoinMeasure = false |
| var crossJoinHierarchy = false |
| var crossJoinSetAggregation = false |
| var axis = (axisslicer as DatamartCubeAxis) |
| if (firstAxis) { |
| firstAxis = false |
| } |
| if (axis.elements !== null) { |
| val usedHierarchies = <DatamartHierarchy>newArrayList |
| val usedMeasures = <DatamartMeasure>newArrayList |
| val usedDerivedMeasure = <DatamartDerivedMeasure>newArrayList |
| val usedSetAggregation = <DatamartSetAggregation>newArrayList |
| for (element : axis.elements) { |
| if (element instanceof DatamartSetAggregation) { |
| // if a set aggregation comes along, all is cross joined |
| if (usedMeasures.size > 0 || usedDerivedMeasure.size > 0) { |
| usedMeasures.clear |
| usedDerivedMeasure.clear |
| crossJoinSetAggregation = true |
| } |
| if (usedHierarchies.size > 0) { |
| usedHierarchies.clear |
| crossJoinSetAggregation = true |
| } |
| var setAggregation = (element as DatamartSetAggregation) |
| usedSetAggregation.add(setAggregation) |
| } |
| if (element instanceof DatamartHierarchy) { |
| // if hierarchy changes to measure, a crossjoin is generated |
| if (usedMeasures.size > 0 || usedDerivedMeasure.size > 0) { |
| usedMeasures.clear |
| usedDerivedMeasure.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var hierarchyLevel = (element as DatamartHierarchy) |
| |
| // if hierarchies are mixed, a crossjoin is generated |
| var lastHierarchy = usedHierarchies.last |
| if (!crossJoinHierarchy && (lastHierarchy === null || |
| hierarchyLevel.getHierarchyName.equals(lastHierarchy.getHierarchyName))) { |
| usedHierarchies.add(hierarchyLevel) |
| } else { |
| usedHierarchies.clear |
| usedHierarchies.add(hierarchyLevel) |
| crossJoinHierarchy = true |
| } |
| } |
| if (element instanceof DatamartMeasure) { |
| // if measure changes to hierarchy, a crossjoin is generated |
| if (usedHierarchies.size > 0) { |
| usedHierarchies.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var measure = (element as DatamartMeasure) |
| usedMeasures.add(measure) |
| } |
| if (element instanceof DatamartDerivedMeasure) { |
| // if measure changes to hierarchy, a crossjoin is generated |
| if (usedHierarchies.size > 0) { |
| usedHierarchies.clear |
| crossJoinMeasure = true |
| } |
| if (usedSetAggregation.size > 0) { |
| usedSetAggregation.clear |
| crossJoinSetAggregation = true |
| } |
| var measure = (element as DatamartDerivedMeasure) |
| usedDerivedMeasure.add(measure) |
| } |
| } |
| 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> |
| * |
| */ |
| def String getHierarchyName(DatamartHierarchy hierarchy) { |
| if (hierarchy.hierarchyRef.name === null) { |
| return (hierarchy.hierarchyRef.eContainer as CubeDimension).name |
| } else { |
| hierarchy.hierarchyRef.name |
| } |
| } |
| |
| /** |
| * <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> |
| * |
| */ |
| def String getExceptHierarchyName(DatamartHierarchy hierarchy) { |
| if (hierarchy.exceptRef.name === null) { |
| return (hierarchy.exceptRef.eContainer as CubeDimension).name |
| } else { |
| hierarchy.exceptRef.name |
| } |
| } |
| |
| /** |
| * <p>mdx syntax part for derived measure expressions.</p> |
| * |
| */ |
| def buildDerivedFormula(DatamartDefineDerivedMeasure derivedMeasure) { |
| var formula = "" |
| for (element : derivedMeasure.derivedElement) { |
| formula = '''«formula»«element.evaluateExpression(null)»''' |
| } |
| 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> |
| * |
| */ |
| // due to a possible bug in xtext 2.4.2 we must supply the extra entity as the model will find a wrong one from the attribute |
| def String evaluateExpression(Expression element, DatamartEntity entity) { |
| var evaluation = "" |
| if (element.value !== null) { |
| evaluation = element.value |
| } |
| if (element.numberValue !== null) { |
| evaluation = element.numberValue |
| } |
| if (element.stringValue !== null) { |
| evaluation = "'".concat(element.stringValue).concat("'") |
| } |
| if (element.filtered || element.selected || element.ranged) { |
| evaluation = '''«DatamartFilter.decorate(((element.eContainer() as ConditionalExpression).left as DatamartAttributeBase).getAttributeName(entity))»''' |
| } |
| if (element.unreferenced) { |
| var leftConditionExpression = (element.eContainer() as ConditionalExpression).left |
| var LEntityFeature entityF = null |
| if (leftConditionExpression instanceof DatamartReferenceBase){ |
| entityF = ((element.eContainer() as ConditionalExpression).left as DatamartReferenceBase).referenceRef |
| } else if (leftConditionExpression instanceof DatamartAttributeBase){ |
| entityF = ((element.eContainer() as ConditionalExpression).left as DatamartAttributeBase).attributeRef |
| } |
| if (entityF !== null) { |
| evaluation = '''«entityF.entity.name».«entityF.toColumnName» is null''' |
| } |
| |
| } |
| if (element.function !== null) { |
| if (element.function instanceof DatamartFunction) { |
| evaluation = '''«evaluation»«element.hierarchy.getLevelName(true, true, true, false)».«(element.function as DatamartFunction). |
| function.name()»''' |
| } |
| if (element.function instanceof DatamartParameterFunction) { |
| evaluation = '''«evaluation»«element.hierarchy.getLevelName(true, true, true, false)».«(element.function as DatamartParameterFunction). |
| function.name()»(«(element.function as DatamartParameterFunction).parameter.value»)''' |
| } |
| } |
| |
| // derived functionless hierarchized measure |
| if (element.hierarchy !== null && element.function === null) { |
| evaluation = '''«evaluation»«element.hierarchy.getLevelName(true, true, true, false)»''' |
| } |
| if (element instanceof DatamartSetTuple) { |
| if ((element as DatamartSetTuple).left.setFunction !== null) { |
| if ((element as DatamartSetTuple).left.setFunction instanceof DatamartSetFunction) { |
| evaluation = '''«evaluation»«((element as DatamartSetTuple).left.setFunction as DatamartSetFunction). |
| setFunction.name()»(«(element as DatamartSetTuple).right.getLevelName(true, true, true, false)»)''' |
| } |
| if ((element as DatamartSetTuple).left.setFunction instanceof DatamartSetParameterFunction) { |
| evaluation = '''«evaluation»«((element as DatamartSetTuple).left.setFunction as DatamartSetParameterFunction). |
| setFunction.name()»(«(element as DatamartSetTuple).right.getLevelName(true, true, true, false)»,«(((element as DatamartSetTuple). |
| left.setFunction as DatamartSetParameterFunction).parameter as DatamartFunctionIntParameter). |
| value»)''' |
| } |
| } |
| } |
| if (element instanceof DatamartMeasure) { |
| evaluation = '''«(element as DatamartMeasure).getMeasureName»''' |
| } |
| if (element instanceof DatamartDerivedMeasure) { |
| evaluation = '''«(element as DatamartDerivedMeasure).getDerivedMeasureName»''' |
| } |
| if (element instanceof DatamartHierarchy) { |
| evaluation = '''«(element as DatamartHierarchy).getLevelName(true, true, true, false)»''' |
| } |
| if (element instanceof DatamartAttributeBase) { |
| evaluation = '''«(element as DatamartAttributeBase).getAttributeName(entity)»''' |
| } |
| if (element instanceof Multiplication) { |
| evaluation = '''«(element as Multiplication).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation»*''' |
| evaluation = '''«evaluation»«(element as Multiplication).right.evaluateExpression(entity)»''' |
| } |
| if (element instanceof Division) { |
| evaluation = '''«(element as Division).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation»/''' |
| evaluation = '''«evaluation»«(element as Division).right.evaluateExpression(entity)»''' |
| } |
| if (element instanceof Addition) { |
| evaluation = '''(«(element as Addition).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation»+''' |
| evaluation = '''«evaluation»«(element as Addition).right.evaluateExpression(entity)»)''' |
| } |
| if (element instanceof Subtraction) { |
| evaluation = '''(«(element as Subtraction).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation»-''' |
| evaluation = '''«evaluation»«(element as Subtraction).right.evaluateExpression(entity)»)''' |
| } |
| if (element instanceof Conjunction) { |
| evaluation = '''«(element as Conjunction).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation» and ''' |
| evaluation = '''«evaluation»«(element as Conjunction).right.evaluateExpression(entity)»''' |
| } |
| if (element instanceof Disjunction) { |
| evaluation = '''(«(element as Disjunction).left.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation» or ''' |
| evaluation = '''«evaluation»«(element as Disjunction).right.evaluateExpression(entity)»)''' |
| } |
| if (element instanceof ConditionalExpression) { |
| evaluation = '''«(element as ConditionalExpression).left.evaluateExpression(entity)»''' |
| var optionalAllowed = true |
| if ((element as ConditionalExpression).left instanceof DatamartAttributeBase) { |
| var type = ((element as ConditionalExpression).left as DatamartAttributeBase).attributeRef.type |
| // we cannot allow optional with date as we cannot mix * with date types |
| if (type instanceof LDataType) { |
| optionalAllowed = !type.date |
| } |
| } |
| |
| if ((element as ConditionalExpression).right.selected) { |
| evaluation = '''«evaluation» in ''' |
| evaluation = '''«evaluation»(«(element as ConditionalExpression).right.evaluateExpression(entity)»)''' |
| } else if ((element as ConditionalExpression).right.ranged) { |
| evaluation = '''«(element as ConditionalExpression).right.evaluateExpression(entity)»''' |
| } else if ((element as ConditionalExpression).right.unreferenced) { |
| evaluation = '''«(element as ConditionalExpression).right.evaluateExpression(entity)»''' |
| } else { |
| evaluation = '''«evaluation» «(element as ConditionalExpression).operator.literal» ''' |
| evaluation = '''«evaluation»«(element as ConditionalExpression).right.evaluateExpression(entity)»''' |
| } |
| if ((element as ConditionalExpression).right.optional && optionalAllowed) { |
| evaluation = '''(«(element as ConditionalExpression).right.evaluateExpression(entity)»=«IDataMart.SQLFILTERNOTHING» or «evaluation»)''' |
| } |
| } |
| if (element instanceof DatamartMemberTuple) { |
| evaluation = '''(«(element as DatamartMemberTuple).right.evaluateExpression(entity)»''' |
| evaluation = '''«evaluation»,''' |
| evaluation = '''«evaluation»«(element as DatamartMemberTuple).left.evaluateExpression(entity)»)''' |
| } |
| if (element instanceof DatamartAggregation) { |
| if ((element as DatamartAggregation).left.aggregation !== null) { |
| if ((element as DatamartAggregation).left.aggregation instanceof DatamartAggregationFunction) { |
| evaluation = '''«((element as DatamartAggregation).left.aggregation as DatamartAggregationFunction). |
| aggregation.name()»(''' |
| if ((element as DatamartAggregation).left.set instanceof DatamartHierarchy) { |
| evaluation = '''«evaluation»«((element as DatamartAggregation).left.set as DatamartHierarchy). |
| getLevelName(true, true, true, false)»''' |
| } |
| if ((element as DatamartAggregation).left.set instanceof DatamartSetTuple) { |
| evaluation = '''«evaluation»«((element as DatamartAggregation).left.set as DatamartSetTuple). |
| evaluateExpression(entity)»''' |
| } |
| } |
| } |
| evaluation = '''«evaluation»,''' |
| evaluation = '''«evaluation»«(element as DatamartAggregation).right.evaluateExpression(entity)»)''' |
| } |
| if (element instanceof DatamartSetAggregation) { |
| if ((element as DatamartSetAggregation).left.aggregation !== null) { |
| if ((element as DatamartSetAggregation).left.aggregation instanceof DatamartSetAggregationFunction) { |
| evaluation = '''«((element as DatamartSetAggregation).left.aggregation as DatamartSetAggregationFunction). |
| aggregation.name()»(''' |
| if ((element as DatamartSetAggregation).left.set instanceof DatamartHierarchy) { |
| evaluation = '''«evaluation»«((element as DatamartSetAggregation).left.set as DatamartHierarchy). |
| getLevelName(true, true, true, false)»''' |
| } |
| if ((element as DatamartSetAggregation).left.set instanceof DatamartSetTuple) { |
| evaluation = '''«evaluation»«((element as DatamartSetAggregation).left.set as DatamartSetTuple). |
| evaluateExpression(entity)»''' |
| } |
| } |
| } |
| evaluation = '''«evaluation»,«(((element as DatamartSetAggregation).left.aggregation as DatamartSetAggregationFunction). |
| parameter as DatamartFunctionIntParameter).value»,''' |
| evaluation = '''«evaluation»«(element as DatamartSetAggregation).right.evaluateExpression(entity)»)''' |
| } |
| return evaluation |
| } |
| |
| /** |
| * <p>mdx syntax part for attribute names, full qualified and aliased> |
| * |
| */ |
| def getAttributeName(DatamartAttributeBase attribute, DatamartEntity entity) { |
| if (entity !== null) { |
| return '''«entity.entityAlias».«attribute.attributeRef.toColumnName»''' |
| } else { |
| return '''«(attribute.attributeRef.eContainer as LEntity).name».«attribute.attributeRef.toColumnName»''' |
| } |
| } |
| |
| /** |
| * <p>mdx syntax part for measure names.</p> |
| * |
| */ |
| def getMeasureName(DatamartMeasure measure) { |
| return '''[Measures].[«measure.measureRef.name»]''' |
| } |
| |
| /** |
| * <p>mdx syntax part for derived measure names.</p> |
| * |
| */ |
| def getDerivedMeasureName(DatamartDerivedMeasure measure) { |
| return '''[Measures].[«measure.derivedRef.name»]''' |
| } |
| |
| /** |
| * <p>mdx syntax part for dimension names.</p> |
| * |
| */ |
| def getDimensionName(DatamartHierarchy hierarchy, Boolean withBrackets) { |
| var dim = "" |
| if (hierarchy.hierarchyRef.eContainer !== null) { |
| if (hierarchy.hierarchyRef.name === null) { |
| dim = '''«IF withBrackets»[«ENDIF»«(hierarchy.hierarchyRef.eContainer as CubeDimension).name»«IF withBrackets»]«ENDIF»''' |
| } else { |
| dim = '''«IF withBrackets»[«ENDIF»«hierarchy.hierarchyRef.name»«IF withBrackets»]«ENDIF»''' |
| } |
| } |
| return dim |
| } |
| |
| /** |
| * <p>mdx syntax part for level names.</p> |
| * |
| */ |
| def getLevelName(DatamartHierarchy hierarchy, Boolean withBrackets, Boolean withFiltermask, Boolean withFunctions, |
| Boolean isFilter) { |
| var text = '''«hierarchy.getDimensionName(withBrackets)»''' |
| if (hierarchy.levelRef !== null) { |
| text = '''«text».''' |
| if (hierarchy.filtered && withFiltermask) { |
| text = '''«DatamartFilter.FILTER_PLACEHOLDER»«text»''' |
| } |
| if (hierarchy.selected && withFiltermask) { |
| text = '''«DatamartFilter.FILTER_PLACEHOLDER»«text»''' |
| } |
| if (withBrackets) { |
| text = '''«text»[''' |
| } |
| text = '''«text»«hierarchy.levelRef.name»''' |
| if (withBrackets) { |
| text = '''«text»]''' |
| } |
| if (hierarchy.filtered && withFiltermask) { |
| text = '''«text»«DatamartFilter.FILTER_PLACEHOLDER»''' |
| } |
| if (hierarchy.selected && withFiltermask) { |
| text = '''«text»«DatamartFilter.FILTER_PLACEHOLDER»''' |
| } |
| if (hierarchy.filtered || hierarchy.selected) { |
| if (hierarchy.all && withFunctions) { |
| text = '''«text».Children''' |
| } |
| } else if (withFunctions) { |
| text = '''«text».Members''' |
| } |
| } |
| if (hierarchy.levelRef === null /* && hierarchy.exceptRef === null && withFunctions*/ ) { |
| if (hierarchy.hierarchyRef.eContainer !== null && |
| !(hierarchy.hierarchyRef.eContainer as CubeDimension).typeTime) { |
| if (hierarchy.all) { |
| if(hierarchy.except && !isFilter) { |
| text = '''«text».Children''' |
| } else { |
| text = '''«text».Members''' |
| } |
| } else if (hierarchy.allMember && hierarchy.hierarchyRef.allMemberName) { |
| text = '''«text».[«hierarchy.hierarchyRef.allMemberNameValue.replaceAll("\"","")»]''' |
| } else if (hierarchy.allLevels) { |
| text = '''«text».AllMembers''' |
| } else if (hierarchy.defaultMember && hierarchy.hierarchyRef.defaultMember) { |
| text = '''«text».Defaultmember''' |
| } else { |
| if (hierarchy.hierarchyRef.defaultMember) { |
| text = '''«text».Defaultmember''' |
| } else { |
| text = '''«text».Members''' |
| } |
| } |
| } |
| } |
| if (hierarchy.except && !isFilter) { |
| text = '''Except(«text»,{«DatamartFilter.FILTER_PLACEHOLDER»«hierarchy.getDimensionName(true)».«IF withBrackets»[«ENDIF»«hierarchy.exceptRef.name»«IF withBrackets»]«ENDIF»«DatamartFilter.FILTER_PLACEHOLDER»})''' |
| } |
| if (hierarchy.ordered) { |
| if (hierarchy.orderRef instanceof DatamartMeasure) { |
| text = '''Order(«text»,«(hierarchy.orderRef as DatamartMeasure).getMeasureName»,«IF hierarchy. |
| descending»Desc«ELSE»Asc«ENDIF»)''' |
| } else { |
| text = '''Order(«text»,«(hierarchy.orderRef as DatamartDerivedMeasure).getDerivedMeasureName»,«IF hierarchy. |
| descending»Desc«ELSE»Asc«ENDIF»)''' |
| } |
| } |
| return '''«text»''' |
| } |
| |
| /** |
| * <p>helper for entity names.</p> |
| * |
| */ |
| def getEntityAlias(DatamartEntity entity) { |
| return getEntityAlias(entity.entityRef) |
| } |
| |
| /** |
| * <p>helper for entity names including aliases when used in recursive join relations.</p> |
| * |
| */ |
| def String getEntityAlias(LEntity entityRef) { |
| var name = "" |
| if (entityRef.hasSuperType) { |
| name = entityRef.superType.getName() |
| } else { |
| name = entityRef.getName() |
| } |
| var alias = name |
| if (sqlAliasCounter.containsKey(name)) { |
| var newId = sqlAliasCounter.get(name) |
| alias = '''«alias»«IF newId > 0»«newId»«ENDIF»''' |
| } |
| return alias |
| } |
| |
| /** |
| * <p>helper for entity names including aliases when used in recursive join relations.</p> |
| * |
| */ |
| def entityAlias2(DatamartEntity entity) { |
| return entity.entityRef.entityAlias2 |
| } |
| |
| def entityAlias2(LEntity entityRef) { |
| var name = "" |
| if (entityRef.hasSuperType) { |
| name = entityRef.superType.getName() |
| } else { |
| name = entityRef.getName() |
| } |
| var alias = name |
| if (sqlAliasCounter.containsKey(name)) { |
| var newId = sqlAliasCounter.get(name) |
| sqlAliasCounter.put(name, newId + 1) |
| alias = '''«alias»«newId + 1»''' |
| } else { |
| sqlAliasCounter.put(name, 0) |
| } |
| return alias |
| } |
| |
| /** |
| * <p>main method to build sql statements bases on entities and roles.</p> |
| * |
| */ |
| def createSQLStatements(DatamartDefinition definition, DatamartEntity entity, |
| Map<String, LAttribute> typesMap, Map<String, LEntity> entityMap) { |
| return definition.createSQLStatement(typesMap, entityMap) |
| } |
| |
| /** |
| * <p>main method to build sql statements bases on entities and a role.</p> |
| * |
| */ |
| def createSQLStatement(DatamartDefinition definition, Map<String, LAttribute> typesMap, Map<String, LEntity> entityMap) { |
| this.sqlAliasCounter.clear() |
| this.sqlFilterMap.clear() |
| this.sqlHasAggregate = false |
| this.sqlHasOrder = false |
| var groupingList = <String>newArrayList |
| this.idMap.clear() |
| this.ignoreEntityGrouping = false |
| var attributes = <String, Pair<String, Integer>>newHashMap |
| var conditions = <String>newArrayList |
| var orderings = <String, Integer>newLinkedHashMap |
| var entity = (definition.source as DatamartEntity) |
| var used = entity.createEntity(null, null, entityMap, attributes, conditions, orderings, typesMap, groupingList) |
| var select = attributes.createSelect(definition, entityMap) |
| var condition = conditions.createCondition |
| var ordering = orderings.createOrdering |
| var grouping = groupingList.createGrouping |
| if (select.empty) { |
| return "" |
| } |
| return '''select «select» from «used»«IF conditions.size > 0» where «condition»«ENDIF»«IF this. |
| sqlHasAggregate» group by «grouping»«ENDIF»«IF this.sqlHasOrder» order by «ordering»«ENDIF»''' |
| } |
| |
| /** |
| * <p>sql syntax part for group by.</p> |
| * |
| */ |
| def createGrouping(List<String> grouping) { |
| var groupingString = "" |
| for (String groupBy : grouping) { |
| groupingString = '''«IF !groupingString.empty»«groupingString»,«ENDIF»«groupBy»''' |
| } |
| return groupingString |
| } |
| |
| /** |
| * <p>sql syntax part for where.</p> |
| * |
| */ |
| def createCondition(ArrayList<String> conditions) { |
| var conditionString = "" |
| for (String condition : conditions) { |
| conditionString = '''«IF !conditionString.empty»«conditionString» and «ENDIF»(«condition»)''' |
| } |
| return conditionString |
| } |
| |
| /** |
| * <p>sql syntax part for order.</p> |
| * |
| */ |
| def createOrdering(Map<String, Integer> orderings) { |
| sqlHasOrder = orderings.size > 0 |
| return orderings.entrySet.stream.sorted(Map.Entry.comparingByValue.reversed).map[it.key].collect( |
| Collectors.joining(",")) |
| } |
| |
| /** |
| * <p>sql syntax part for select.</p> |
| * |
| */ |
| def createSelect(Map<String, Pair<String, Integer>> attributes, DatamartDefinition definition, Map<String, LEntity> entityMap) { |
| var selectString = "" |
| if (definition.source instanceof DatamartEntity){ |
| if (!(definition.source as DatamartEntity).suppressAttributes){ |
| selectString = attributes.entrySet.sortWith[e1, e2|return (e2.value.value - e1.value.value)].map [ |
| it.key + " as \\\"" + it.value.key + "\\\"" |
| ].join(",") |
| selectString = '''«selectString»''' |
| } |
| } |
| datamartDtoMapper = "new DatamartDtoMapper()" |
| if (definition !== null) { |
| if (!ignoreEntityGrouping) { |
| for (LEntity entityRef : entityMap.values) { |
| var entityName = "" |
| if (entityRef.hasSuperType) { |
| entityName = entityRef.superType.getName() |
| } else { |
| entityName = entityRef.getName() |
| } |
| var dtoFqn = EntityUtils.getDtoFQNForLEntity(entityRef) |
| var idColumn = DatamartDefinitionUtil.getEntityIdAliasName(entityRef) |
| if (entityRef.primaryKeyAttribute !== null) { |
| selectString = '''«selectString»«IF !selectString.empty»,«ENDIF»«entityName».«entityRef.primaryKeyAttribute.name» as \"«idColumn»\"''' |
| if (entityRef.hasSuperType) { |
| idMap.put(idColumn, entityRef.superType) |
| } else { |
| idMap.put(idColumn, entityRef) |
| } |
| datamartDtoMapper = ''' |
| «datamartDtoMapper» |
| .add("«dtoFqn»", "«entityRef.primaryKeyAttribute.name»", EType.«dtType.getBasicType(idMap.get(idColumn).primaryKeyAttribute)», "«idColumn»")''' |
| } |
| } |
| } |
| } |
| return selectString |
| } |
| |
| def hasSuperType(DatamartEntity entity) { |
| return entity.entityRef.hasSuperType |
| } |
| |
| def hasSuperType(LEntity entityRef) { |
| return entityRef.superType !== null && !entityRef.superType.mappedSuperclass && |
| !entityRef.superType.equals(entityRef) |
| } |
| |
| /** |
| * <p>recursive entity relation builder.</p> |
| * |
| */ |
| def String createEntity(DatamartEntity entity, DatamartEntity parent, DatamartNavigation parentNavigation, Map<String, LEntity> entityMap, |
| Map<String, Pair<String, Integer>> attributes, List<String> conditions, |
| LinkedHashMap<String, Integer> orderings, Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var body = "" |
| var tableName = entity.entityRef.toTableName |
| if (entity.hasSuperType) { |
| conditions.add('''«entity.entityAlias».disc='«entity.entityRef.toTableName»' ''') |
| tableName = entity.entityRef.superType.toTableName |
| } |
| body = '''«body»«entity.entityRef.persistenceInfo.schemaName.provideSchemaName»«tableName» «entity.entityAlias2»''' |
| if (parent !== null && parentNavigation !== null) { |
| body = ''' left join «body»«entity.createJoin(parent, parentNavigation)»''' |
| } |
| if (entity.hasSuperType) { |
| body = '''«body» left join «entity.createSupertypeJoin»''' |
| } |
| for (DatamartNavigation navigation : entity.navigations) { |
| if (navigation instanceof DatamartMember) { |
| body = '''«body»«(navigation as DatamartMember).datamartEntity.createEntity(entity, navigation, entityMap, |
| attributes, conditions, orderings, typesMap, groupingList)»''' |
| } |
| if (navigation instanceof DatamartOwner) { |
| body = '''«body»«(navigation as DatamartOwner).datamartEntity.createEntity(entity, navigation, entityMap, |
| attributes, conditions, orderings, typesMap, groupingList)»''' |
| } |
| } |
| // Required for the creation of the sql statement with at least the id attribute. |
| entityMap.put(entity.entityAlias, entity.entityRef) |
| // ----------------------------------------------------------------------------- |
| if (entity.attributes.empty && !entity.suppressAttributes) { |
| for (attr : entity.entityRef.allAttributes) { |
| if (!attr.id && !attr.uuid && !attr.version && !attr.transient) { |
| var datamartAttr = DatamartDSLFactory.eINSTANCE.createDatamartAttribute |
| datamartAttr.attributeRef = attr |
| entity.recurAttribute(datamartAttr, false, "", defaultColumnWeight, attributes, typesMap, groupingList) |
| } |
| } |
| } else { |
| for (DatamartAttribute attribute : entity.attributes) { |
| var columnWeight = defaultColumnWeight |
| if (attribute.hasColumnWeight) { |
| columnWeight = attribute.columnWeight |
| } |
| entity.recurAttribute(attribute, attribute.aggregated, attribute.aggregate.getName(), columnWeight, |
| attributes, typesMap, groupingList) |
| } |
| } |
| for (DatamartCondition condition : entity.conditions) { |
| conditions.add(condition.condition.evaluateExpression(entity)) |
| } |
| for (DatamartOrder order : entity.ordering) { |
| var Integer columnWeight |
| if (order.hasColumnWeight) { |
| columnWeight = order.columnWeight |
| } else { |
| columnWeight = defaultColumnWeight |
| } |
| orderings.put(entity.entityAlias + "." + order.orderBy.toColumnName + " " + order.orderHow.getName(), |
| columnWeight) |
| } |
| return body |
| } |
| |
| def void recurAttribute(DatamartEntity entity, DatamartAttribute datamartAttr, boolean aggregated, |
| String aggregateName, Integer columnWeight, Map<String, Pair<String, Integer>> attributes, |
| Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var attr = datamartAttr.attributeRef |
| var LScalarType type = attr.type |
| if (type instanceof LBean) { |
| var bean = type as LBean |
| for (battr : bean.allAttributes) { |
| if (battr.type instanceof LBean) { |
| entity.recurAttribute(battr, aggregated, aggregateName, columnWeight, attributes, |
| typesMap, groupingList) |
| } else { |
| entity.addAttribute(battr, aggregated, aggregateName, columnWeight, attributes, |
| typesMap, groupingList) |
| } |
| } |
| } else { |
| entity.addAttribute(datamartAttr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList) |
| } |
| } |
| |
| private def void recurAttribute(DatamartEntity entity, LAttribute attr, boolean aggregated, |
| String aggregateName, Integer columnWeight, Map<String, Pair<String, Integer>> attributes, |
| Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var LScalarType type = attr.type |
| if (type instanceof LBean) { |
| var bean = type as LBean |
| for (battr : bean.allAttributes) { |
| if (battr.type instanceof LBean) { |
| entity.recurAttribute(battr, aggregated, aggregateName, columnWeight, attributes, |
| typesMap, groupingList) |
| } else { |
| entity.addAttribute(battr, aggregated, aggregateName, columnWeight, attributes, |
| typesMap, groupingList) |
| } |
| } |
| } else { |
| entity.addAttribute(attr, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList) |
| } |
| } |
| |
| def aliasedColumnName(LEntity entityRef, LAttribute attr) { |
| var name = "" |
| if (entityRef.hasSuperType) { |
| if (entityRef.superType.allAttributes.contains(attr)) { |
| name = entityRef.superType.getName() |
| } else { |
| name = entityRef.getName() |
| } |
| } else { |
| name = entityRef.getName() |
| } |
| var alias = name |
| if (sqlAliasCounter.containsKey(name)) { |
| var newId = sqlAliasCounter.get(name) |
| alias = '''«alias»«IF newId > 0»«newId»«ENDIF»''' |
| } |
| return alias + "." + attr.toColumnName |
| } |
| |
| def void addAttribute(DatamartEntity datamartEntity, DatamartAttribute datamartAttr, boolean aggregated, |
| String aggregateName, Integer columnWeight, Map<String, Pair<String, Integer>> attributes, |
| Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var attr = datamartAttr.attributeRef |
| datamartEntity.addAttribute(attr, DatamartAttributeUtil.getAliasedAttributeName(datamartAttr), aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList) |
| } |
| |
| def void addAttribute(DatamartEntity datamartEntity, LAttribute attr, boolean aggregated, |
| String aggregateName, Integer columnWeight, Map<String, Pair<String, Integer>> attributes, |
| Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var attributeName = '''«attr?.name?.replace("^", "")»''' |
| datamartEntity.addAttribute(attr, attributeName, aggregated, aggregateName, columnWeight, attributes, typesMap, groupingList) |
| } |
| |
| private def void addAttribute(DatamartEntity datamartEntity, LAttribute attr, String attributeName, boolean aggregated, |
| String aggregateName, Integer columnWeight, Map<String, Pair<String, Integer>> attributes, |
| Map<String, LAttribute> typesMap, List<String> groupingList) { |
| var entity = datamartEntity.entityRef |
| var key = entity.aliasedColumnName(attr) |
| var attrName = "" |
| var typesAttr = "" |
| if (entity.hasSuperType) { |
| if (entity.superType.allAttributes.contains(attr)) { |
| attrName = entity.superType.name + "." + attributeName |
| typesAttr = entity.superType.name + "." + attributeName |
| } else { |
| attrName = entity.name + "." + attributeName |
| typesAttr = entity.name + "." + attributeName |
| } |
| } else { |
| attrName = entity.name + "." + attributeName |
| typesAttr = entity.name + "." + attributeName |
| } |
| typesMap.put(typesAttr, attr); |
| if (aggregated) { |
| key = '''«aggregateName»(«key»)''' |
| this.sqlHasAggregate = true; |
| attributes.put(key.toString, |
| new Pair(attributeName, columnWeight)) |
| this.ignoreEntityGrouping = true |
| } else { |
| groupingList.add(key.toString) |
| attributes.put(key.toString, |
| new Pair(attributeName, columnWeight)) |
| } |
| } |
| |
| def getProvideSchemaName( |
| String schemaName) '''«IF schemaName !== null && schemaName.length > 0»«schemaName».«ENDIF»''' |
| |
| /** |
| * <p>sql syntax part for joined relations.</p> |
| * |
| */ |
| def createJoin(DatamartEntity entity, DatamartEntity parent, DatamartNavigation navigation) { |
| var join = "" |
| var joinRef = navigation.joinRef |
| if (joinRef instanceof DatamartReference) { |
| var name = joinRef.ref.toColumnName |
| if (navigation instanceof DatamartMember) { |
| // determination of the right column name of the foreign key id required for the join |
| // using the name of the reference instead of the name joinref and checking the names |
| // of the navigation ref with the ref opposite. |
| var refs = navigation.datamartEntity.entityRef.allReferences |
| for (ref : refs) { |
| if (ref.type !== null && ref.type.equals(parent.entityRef) && (ref.opposite.name.equals(joinRef.ref.name))) { |
| name = ref.toColumnName |
| } |
| } |
| join = '''«entity.getEntityAlias».«name»=«parent.getEntityAlias».«parent.entityRef.idAttributeName»''' |
| } else if (navigation instanceof DatamartOwner) { |
| join = '''«entity.getEntityAlias».«entity.entityRef.idAttributeName»=«parent.getEntityAlias».«name»''' |
| } |
| join = ''' on(«join»)''' |
| } |
| } |
| |
| def createSupertypeJoin(DatamartEntity entity) { |
| var subTypeAlias = entity.entityRef.name |
| if (sqlAliasCounter.containsKey(entity.entityRef.name)) { |
| var newId = sqlAliasCounter.get(entity.entityRef.name) |
| subTypeAlias = '''«subTypeAlias»«IF newId > 0»«newId»«ENDIF»''' |
| } |
| var join = '''«subTypeAlias».«entity.entityRef.idAttributeName»=«entity.entityRef.superType.getEntityAlias».«entity.entityRef.superType.idAttributeName»''' |
| join = '''«entity.entityRef.persistenceInfo.schemaName.provideSchemaName»«entity.entityRef.toTableName» «subTypeAlias» on(«join»)''' |
| } |
| |
| /** |
| * get a set of entities used by the datamart |
| */ |
| def Set<LEntity> findAllEntities(DatamartDefinition datamart) { |
| var entities = new HashSet<LEntity>() |
| switch (datamart.source) { |
| DatamartEntity: findAllEntites(datamart.source as DatamartEntity, entities) |
| DatamartCube: findAllEntites(datamart.source as DatamartCube, entities) |
| } |
| return entities |
| } |
| |
| /** |
| * add all entities used by the datamart entity into the given set of entities |
| */ |
| def void findAllEntites(DatamartEntity datamartEntity, Set<LEntity> entities) { |
| entities.add(datamartEntity.entityRef) |
| for (navigation : datamartEntity.navigations) { |
| findAllEntites(navigation.datamartEntity, entities) |
| } |
| } |
| |
| /** |
| * add all entities used by the datamart cube into the given set of entities |
| */ |
| def void findAllEntites(DatamartCube datamartCube, Set<LEntity> entities) { |
| entities.add(datamartCube.cubeRef.cubeTypeEntity.entityRef.entityValue) |
| for (dimensionUsage : datamartCube.cubeRef.cubeTypeEntity.dimensionUsages) { |
| for (hierarchy : dimensionUsage.sourceValue.hierarchies) { |
| entities.add(hierarchy.cubeDimEntity.entityRef.entityValue) |
| } |
| } |
| } |
| |
| def List<DatamartAttribute> allEntityAttributes(DatamartDefinition datamart) { |
| var attributes = <DatamartAttribute>newArrayList |
| if (datamart.source instanceof DatamartEntity) { |
| attributes = allEntityAttributes(datamart.source as DatamartEntity, "") |
| } |
| return attributes |
| } |
| |
| /** |
| * add all entities used by the datamart entity into the given set of entities |
| */ |
| def ArrayList<DatamartAttribute> allEntityAttributes(DatamartEntity datamartEntity, String refPrefix) { |
| var entityAttributes = datamartEntity.entityAttributes |
| for (navigation : datamartEntity.navigations) { |
| allEntityAttributes(navigation.datamartEntity, navigation.joinRef.ref.name) |
| } |
| var primary = datamartEntity.entityRef.primaryKeyAttribute |
| var attribute = DatamartDSLFactory.eINSTANCE.createDatamartAttribute |
| attribute.attributeRef = primary |
| attribute.aliased = true |
| attribute.aliasName = '''«refPrefix»«IF primary!==null»«IF refPrefix.empty»«primary.name.toFirstLower»«ELSE»«primary.name.toFirstUpper»«ENDIF»«ENDIF»''' |
| entityAttributes.add(attribute); |
| entityAttributes |
| } |
| |
| private def entityAttributes(DatamartEntity entity) { |
| var entityAttributes = newArrayList |
| for (attribute : entity.attributes) { |
| entityAttributes.add(attribute) |
| } |
| if (entityAttributes.empty && !entity.suppressAttributes) { |
| for (attr : entity.entityRef.allAttributes) { |
| if (!attr.id && !attr.uuid && !attr.version && !attr.transient) { |
| entityAttributes.add(attr.createDatamartAttribute) |
| } |
| } |
| } |
| entityAttributes |
| } |
| |
| private def createDatamartAttribute(LEntityAttribute attr){ |
| var datamartAttr = DatamartDSLFactory.eINSTANCE.createDatamartAttribute |
| datamartAttr.attributeRef = attr |
| var datamartAxis = DatamartDSLFactory.eINSTANCE.createDatamartAxis |
| datamartAxis.name = AxisEnum.COLUMNS |
| datamartAttr.axis = datamartAxis |
| datamartAttr |
| } |
| } |