From 1b01f9a9f1bf5946ec336fe96588d68040ada5cd Mon Sep 17 00:00:00 2001
From: Simon Eismann <eismannsimon@googlemail.com>
Date: Wed, 7 Sep 2016 01:18:13 +0200
Subject: [PATCH] added defaults to ListMetricsQuery

---
 .../engine/interpreter/DefaultProvider.java   | 39 ++++++++++---------
 .../ModelStructureQueryInterpreter.java       |  7 +++-
 .../PerformanceMetricsQueryInterpreter.java   |  2 +-
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/DefaultProvider.java b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/DefaultProvider.java
index 5371e7a4..dc440462 100644
--- a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/DefaultProvider.java
+++ b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/DefaultProvider.java
@@ -1,7 +1,5 @@
 package tools.descartes.dql.core.engine.interpreter;
 
-import org.eclipse.emf.ecore.util.EcoreUtil;
-
 import tools.descartes.dql.core.engine.query.QueryExecutionEngine;
 import tools.descartes.dql.core.engine.query.QueryExecutionEngineImpl;
 import tools.descartes.dql.lang.descartesQL.DescartesQL;
@@ -19,13 +17,23 @@ import tools.descartes.dql.models.mapping.mapping.EntityMapping;
 
 public class DefaultProvider {
 
-	private SelectQuery query;
 	private DescartesQLFactory dqlFactory = DescartesQLFactory.eINSTANCE;
 	private EntityMapping statTypes;
 	private EntityMapping entityTypes;
-
-	public DefaultProvider(SelectQuery query) {
-		this.query = query;
+	private UsingClause usingClause;
+	private ForClause forClause;
+
+	/*
+	 * Since SelectQuery and ListQuery don't have a common ancestor, we need to
+	 * use a little workaround
+	 */
+	public DefaultProvider(SelectQuery selectQuery, ListQuery listQuery) {
+		if (selectQuery != null) {
+			this.usingClause = selectQuery.getUsingClause();
+			this.forClause = selectQuery.getForClause();
+		} else {
+			this.usingClause = listQuery.getUsingClause();
+		}
 	}
 
 	public String getDefaultStatType(String entityRef, String metricRef2) {
@@ -42,17 +50,15 @@ public class DefaultProvider {
 
 	private EntityMapping getEntityTypes() {
 		if (entityTypes == null)
-			initializeEntityTypes(query);
+			initializeEntityTypes();
 		return entityTypes;
 	}
 
-	private void initializeEntityTypes(SelectQuery selectQuery) {
-		UsingClause uc = EcoreUtil.copy(selectQuery.getUsingClause());
-
+	private void initializeEntityTypes() {
 		DescartesQL entityQuery = dqlFactory.createDescartesQL();
 		ListQuery listQuery = dqlFactory.createListQuery();
 		entityQuery.setQuery(listQuery);
-		listQuery.setUsingClause(uc);
+		listQuery.setUsingClause(usingClause);
 		ListEntitiesQuery listMetricsQuery = dqlFactory.createListEntitiesQuery();
 		listQuery.setQueryType(listMetricsQuery);
 		listMetricsQuery.setMode("LIST ENTITIES");
@@ -63,22 +69,19 @@ public class DefaultProvider {
 
 	private EntityMapping getStatTypes() {
 		if (statTypes == null)
-			initializeStatTypes(query);
+			initializeStatTypes();
 		return statTypes;
 	}
 
-	private void initializeStatTypes(SelectQuery selectQuery) {
-		UsingClause uc = EcoreUtil.copy(selectQuery.getUsingClause());
-		ForClause fc = selectQuery.getForClause();
-
+	private void initializeStatTypes() {
 		DescartesQL metricsQuery = dqlFactory.createDescartesQL();
 		ListQuery listQuery = dqlFactory.createListQuery();
 		metricsQuery.setQuery(listQuery);
-		listQuery.setUsingClause(uc);
+		listQuery.setUsingClause(usingClause);
 		ListMetricsQuery listMetricsQuery = dqlFactory.createListMetricsQuery();
 		listQuery.setQueryType(listMetricsQuery);
 		listMetricsQuery.setMode("LIST METRICS");
-		listMetricsQuery.setEntityReferenceClause(fc.getEntityReferenceClause());
+		listMetricsQuery.setEntityReferenceClause(forClause.getEntityReferenceClause());
 
 		QueryExecutionEngine qee = new QueryExecutionEngineImpl();
 		this.statTypes = qee.execute(metricsQuery).get(0);
diff --git a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/ModelStructureQueryInterpreter.java b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/ModelStructureQueryInterpreter.java
index 23a81dfc..17854024 100644
--- a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/ModelStructureQueryInterpreter.java
+++ b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/ModelStructureQueryInterpreter.java
@@ -147,6 +147,7 @@ public class ModelStructureQueryInterpreter
 	private boolean interpretListMetricsQuery(final ListQuery query) {
 		// TODO: Implement
 		// FilterClause filterClause = ((ListQuery) query).getFilterClause();
+		DefaultProvider defaultProvider = new DefaultProvider(null, query);
 		final ListQuery listQuery = query;
 		final ListMetricsQuery listMetricsQuery = (ListMetricsQuery) query.getQueryType();
 
@@ -173,9 +174,11 @@ public class ModelStructureQueryInterpreter
 		final EList<EntityReference> refClause = entityReferenceClause.getEntityReferences();
 		for (final EntityReference ref : refClause) {
 			Entity entity = domainFactory.createEntity();
-			entity.setEntityType(ref.getType());
+			if (ref.getType() != null)
+				entity.setEntityType(ref.getType());
+			else
+				entity.setEntityType(defaultProvider.lookUpEntityType(ref));
 			entity.setIdentifier(ref.getIdentifier());
-
 			if (ref.getAlias() != null) {
 				entity.setAlias(ref.getAlias().getAlias());
 			}
diff --git a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/PerformanceMetricsQueryInterpreter.java b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/PerformanceMetricsQueryInterpreter.java
index c7039d34..db9a413b 100644
--- a/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/PerformanceMetricsQueryInterpreter.java
+++ b/core/tools.descartes.dql.core.engine/src/tools/descartes/dql/core/engine/interpreter/PerformanceMetricsQueryInterpreter.java
@@ -106,7 +106,7 @@ public class PerformanceMetricsQueryInterpreter extends
 
 		if (getQuery() instanceof SelectQuery) {
 			selectQuery = (SelectQuery) getQuery();
-			this.defaultProvider = new DefaultProvider(selectQuery);
+			this.defaultProvider = new DefaultProvider(selectQuery, null);
 			final UsingClause usingClause = selectQuery.getUsingClause();
 			final ModelReferenceClause modelReference = usingClause.getModelReference();
 			final ModelFamily family = modelReference.getFamily();
-- 
GitLab