blob: 60c7c6c451ac891b0904914c90d85e3b2b17180f [file] [log] [blame]
/**
*
* Copyright (c) 2011, 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*
*
* This copyright notice shows up in the generated Java code
*
*/
package org.eclipse.osbp.xtext.cubedsl.scoping
import org.eclipse.osbp.xtext.cubedsl.CubeAggregatorEnum
import org.eclipse.osbp.xtext.cubedsl.CubeDimension
import org.eclipse.osbp.xtext.cubedsl.CubeDimensionEntity
import org.eclipse.osbp.xtext.cubedsl.CubeDimensionEntityEntity
import org.eclipse.osbp.xtext.cubedsl.CubeDimensionUsage
import org.eclipse.osbp.xtext.cubedsl.CubeEntity
import org.eclipse.osbp.xtext.cubedsl.CubeHierarchy
import org.eclipse.osbp.xtext.cubedsl.CubeMeasure
import org.eclipse.osbp.xtext.cubedsl.CubePackage
import org.eclipse.osbp.xtext.cubedsl.CubeTypeEntity
import org.eclipse.osbp.xtext.cubedsl.CubeDSLPackage
import java.util.ArrayList
import java.util.Date
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.Scopes
import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider
import org.eclipse.osbp.dsl.semantic.entity.LEntity
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
import org.eclipse.osbp.dsl.semantic.common.types.LDataType
import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature
/**
* This class contains custom scoping description.
*
* see : http://www.eclipse.org/Xtext/documentation.html#scoping
* on how and when to use it
*
*/
//class CubeDSLScopeProvider extends AbstractDeclarativeScopeProvider {
class CubeDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider /*XbaseWithAnnotationsScopeProvider*/ {
@Override
override IScope getScope(EObject context, EReference reference) {
if (reference == CubeDSLPackage.Literals.CUBE_DIMENSION_ENTITY_ENTITY__OVER_VALUE) {
return getScope_CubeDimensionEntityEntityOverValue(context as CubeDimensionEntityEntity)
} else if (reference == CubeDSLPackage.Literals.CUBE_DIMENSION_USAGE__OVER_VALUE) {
return getScope_CubeDimensionUsage_OverValue(context as CubeDimensionUsage)
} else if (reference == CubeDSLPackage.Literals.CUBE_MEASURE__MEASURE_COL) {
return getScope_CubeMeasureCol(context as CubeMeasure)
} else if ((reference == CubeDSLPackage.Literals.CUBE_LEVEL__LEVEL_COL_VALUE) ||
(reference == CubeDSLPackage.Literals.CUBE_LEVEL_PROP__LEVEL_PROP_COL_VALUE)
) {
return getScope_CubeEntityColRef(context as EObject)
} else if (reference == CubeDSLPackage.Literals.CUBE_ENTITY__KEY_VALUE) {
return getScope_CubeEntity_KeyValue(context as CubeEntity)
} else if (reference == CubeDSLPackage.Literals.CUBE_DIMENSION_USAGE__SOURCE_VALUE) {
return getScope_CubeDimensionUsage_SourceValue(context as CubeDimensionUsage)
} else {
return super.getScope(context, reference)
}
}
def IScope getScope_CubeDimensionUsage_SourceValue(CubeDimensionUsage cubeDimUsage) {
var result = <EObject>newArrayList
var eObj = cubeDimUsage.eContainer
while (!(eObj instanceof CubePackage)) {
eObj = eObj.eContainer
}
var cubePackage = (eObj as CubePackage)
if (cubePackage != null) {
for (CubeDimension cubeDim : cubePackage.dimensions) {
if (cubeDim.name != null) {
result.add(cubeDim)
}
}
}
return Scopes.scopeFor(result)
}
def getScope_CubeDimensionUsage_OverValue(CubeDimensionUsage cubeDimUsage) {
var result = <EObject>newArrayList
var dimEntities = <String>newArrayList
var dimUsageSource = cubeDimUsage.getSourceValue
var LEntity cubeEnt = cubeDimUsage.getCubeEntity
if (dimUsageSource != null) {
for (CubeHierarchy cubeHierarchy : dimUsageSource.hierarchies){
dimEntities.add(cubeHierarchy.dimEntityName)
}
if (dimUsageSource.typeTime){
for (LEntityAttribute entityAttr : cubeEnt.allAttributes) {
if (entityAttr.date){
result.add(entityAttr)
}
}
}
}
if (cubeEnt != null){
// If the cube entity is as the used entity for the dimension
// only its attributes are used as foreign key
if (dimEntities.contains(cubeEnt.name)) {
for (LEntityAttribute entityAttr : cubeEnt.allAttributes) {
result.add(entityAttr)
}
} else {
for (LEntityReference entityRef : cubeEnt.allReferences) {
if (dimEntities.contains(entityRef.getTypeName)){
result.add(entityRef)
}
}
}
}
return Scopes.scopeFor(result)
}
def ArrayList<EObject> getRefResultList(LEntity cubeEnt, ArrayList<EObject> result){
for (LEntityReference entityRef : cubeEnt.allReferences) {
if (entityRef.name != null){
result.add(entityRef)
}
}
return result
}
def getCubeEntity(EObject childEObj){
var LEntity cubeEnt;
var eObj = childEObj.eContainer
while (!(eObj instanceof CubeTypeEntity)) {
if (eObj != null) {
eObj = eObj.eContainer
}
}
if (eObj != null) {
cubeEnt = (eObj as CubeTypeEntity).entityRef.entityValue
}
return cubeEnt
}
def getScope_CubeMeasureCol(CubeMeasure cubeMeasure) {
var result = <EObject>newArrayList
var LEntity cubeEnt = cubeMeasure.getCubeEntity
if (cubeEnt != null){
// if measure uses count aggregator only numeric entity attributes are provided
if (cubeMeasure.aggregator != null && (cubeMeasure.aggregator.equals(CubeAggregatorEnum.COUNT) || cubeMeasure.aggregator.equals(CubeAggregatorEnum.DSC))){
result = cubeEnt.getRefResultList(result)
} else {
for (LEntityAttribute entityAttr : cubeEnt.allAttributes) {
if (entityAttr.type != null && (entityAttr.type instanceof LDataType) && (entityAttr.type as LDataType).asPrimitive && !("String".equals((entityAttr.type as LDataType).name))){
result.add(entityAttr)
}
}
}
}
return Scopes.scopeFor(result)
}
def IScope getScope_CubeEntityColRef(EObject context) {
var result = <EObject>newArrayList
var eObj = context
while (!((eObj instanceof CubeDimensionEntity)||(eObj instanceof CubeDimensionEntityEntity)||(eObj instanceof CubeTypeEntity))) {
if (eObj != null) {
eObj = eObj.eContainer
}
}
if (eObj != null) {
var LEntity cubeEnt = null;
if (eObj instanceof CubeDimensionEntityEntity){
cubeEnt = (eObj as CubeDimensionEntityEntity).entityRef.entityValue
} else if (eObj instanceof CubeDimensionEntity){
cubeEnt = (eObj as CubeDimensionEntity).entityRef.entityValue
} else if (eObj instanceof CubeTypeEntity){
cubeEnt = (eObj as CubeTypeEntity).entityRef.entityValue
}
result = cubeEnt.getAttrResultList(result)
}
return Scopes.scopeFor(result)
}
def IScope getScope_CubeDimensionEntityEntityOverValue(CubeDimensionEntityEntity cubeDimEntityEntity) {
var result = <EObject>newArrayList
var eObj = cubeDimEntityEntity.eContainer
while (!(eObj instanceof CubeDimensionEntity)) {
if (eObj != null) {
eObj = eObj.eContainer
}
}
if (eObj != null) {
if (eObj instanceof CubeDimensionEntity){
result = cubeDimEntityEntity.getJoinableRefsResultList((eObj as CubeDimensionEntity), result)
}
}
return Scopes.scopeFor(result)
}
def IScope getScope_CubeEntity_KeyValue(CubeEntity entity) {
var result = <EObject>newArrayList
if (entity!=null){
result = entity.entityValue.getAttrResultList(result)
}
return Scopes.scopeFor(result)
}
def getJoinableRefsResultList(CubeDimensionEntityEntity cubeDimEntityEntity, CubeDimensionEntity entity, ArrayList<EObject> result) {
if (entity != null && entity.entityRef != null && entity.entityRef.entityValue != null && entity.entityRef.entityValue.name != null) {
var LEntity cubeEnt = entity.entityRef.entityValue
for (LEntityReference lEntRef : cubeEnt.allReferences){
if (cubeDimEntityEntity.entityRef!=null && cubeDimEntityEntity.entityRef.entityValue !=null && cubeDimEntityEntity.entityRef.entityValue.name !=null && cubeDimEntityEntity.entityRef.entityValue.name.equals(lEntRef.type.name)){
result.add(lEntRef)
}
}
}
return result;
}
def getAttrResultList(LEntity cubeEnt, ArrayList<EObject> result) {
if (cubeEnt != null) {
for (LEntityAttribute entityAttr : cubeEnt.allAttributes) {
if (entityAttr.name != null) {
result.add(entityAttr)
}
}
}
return result;
}
def getAllFeaturesResultList(LEntity cubeEnt, ArrayList<EObject> result) {
if (cubeEnt != null) {
for (LEntityFeature entityFeature : cubeEnt.allFeatures) {
if (entityFeature.name != null) {
result.add(entityFeature)
}
}
}
return result;
}
def getDimEntityName(CubeHierarchy cubeHierarchy){
if (cubeHierarchy!=null && cubeHierarchy.cubeDimEntity!=null && cubeHierarchy.cubeDimEntity.entityRef!=null && cubeHierarchy.cubeDimEntity.entityRef.entityValue!=null){
return cubeHierarchy.cubeDimEntity.entityRef.entityValue.name
}
}
def getTypeName(LEntityReference entityRef){
if (entityRef.type.name!=null && entityRef.type.name!=null){
return entityRef.type.name
}
}
def isDate(LEntityAttribute entityAttr){
var dateTypes = <Class>newArrayList
dateTypes.add(typeof(Date))
dateTypes.add(typeof(java.sql.Date))
var isDateBoolean = ( (entityAttr.type instanceof LDataType) &&
((entityAttr.type as LDataType).date ||
// (dateTypes.contains((entityAttr.type as LDataType).jvmTypeReference.type.simpleName))
dateTypes.containsInstanceOf((entityAttr.type as LDataType))
)
)
return isDateBoolean
}
def containsInstanceOf(ArrayList<Class> dateTypes, LDataType dataType) {
for (Class dateObj : dateTypes){
if (dateObj != null && dateObj.name.equals(dataType.jvmTypeReference.type.identifier)){
return true
}
}
return false;
}
}