From b863e73401c587d91f3f0cf3aaccdf68c1e00437 Mon Sep 17 00:00:00 2001
From: Kieran van Gaalen <kieran.van.gaalen@casema.nl>
Date: Thu, 4 Nov 2021 14:57:09 +0100
Subject: [PATCH] Chaining and nesting done, some issues remain, these are
 documented in samenwerken met joris

---
 aql/convertQuery.go | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/aql/convertQuery.go b/aql/convertQuery.go
index 53f9285..5663215 100644
--- a/aql/convertQuery.go
+++ b/aql/convertQuery.go
@@ -71,7 +71,7 @@ func createQuery(JSONQuery *entity.IncomingQueryJSON) *string {
 			case "relation":
 				relation := JSONQuery.Relations[element.pointer]
 				query += relationToQuery(relation, JSONQuery)
-			case "function":
+			case "groupBy":
 				function := JSONQuery.GroupBys[element.pointer]
 				query += functionToQuery(function, JSONQuery, list == len(listoflists)-1)
 			case "filter":
@@ -112,7 +112,11 @@ func relationToQuery(element entity.QueryRelationStruct, JSONQuery *entity.Incom
 	if len(filters) > 0 {
 		for i := range filters {
 			filter := filters[i]
-			if filter.FromID == element.FromID {
+			fmt.Println(filter.FromID)
+			fmt.Println(element.FromID)
+			fmt.Println(filter.FromType)
+			fmt.Println(element.FromType)
+			if filter.FromType == element.FromType && filter.FromID == element.FromID {
 				ret += fmt.Sprintf("\tFOR y in f%v\n", filter.ID)
 				ydefined = true
 			} else {
@@ -137,14 +141,22 @@ func relationToQuery(element entity.QueryRelationStruct, JSONQuery *entity.Incom
 
 func functionToQuery(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQueryJSON, final bool) string {
 	ret := getTupleVar(element, JSONQuery)
-	ret += createGroupBy(element, JSONQuery, final)
+	if final {
+		ret += createFinalGroupBy(element, JSONQuery)
+	} else {
+		ret += createGroupBy(element, JSONQuery)
+	}
 	return ret
 }
 
 func filterToQuery(element entity.QueryFilterStruct, JSONQuery *entity.IncomingQueryJSON) string {
 	thisname := fmt.Sprintf("f%v", element.ID)
 	ret := createLetFor(thisname, fmt.Sprintf("%v%v", typeToPrefix(element.FromType), element.FromID))
-	ret += fmt.Sprintf("\tFILTER x.%v %v %v\n", element.Attribute, wordsToLogicalSign((element.MatchType)), element.Value)
+	if element.FromType == "groupBy" {
+		ret += fmt.Sprintf("\tFILTER x.modifier %v %v\n", wordsToLogicalSign((element.MatchType)), element.Value)
+	} else {
+		ret += fmt.Sprintf("\tFILTER x.%v %v %v\n", element.Attribute, wordsToLogicalSign((element.MatchType)), element.Value)
+	}
 	ret += "\tRETURN x\n)\n"
 	return ret
 }
@@ -211,7 +223,7 @@ func getTupleVar(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQu
 	thisname := fmt.Sprintf("gt%v", element.ID)
 	result += createLetFor(thisname, JSONQuery.Relations[element.RelationID].Name)
 	result += createSubVariable("variable_0", "variable_1", fmt.Sprintf("r%v[**].vertices[1]", element.RelationID), "_id", "x._to", "_id")
-	result += createSubVariable("variable_2", "variable_3", fmt.Sprintf("%v%v", typeToPrefix(element.GroupType), element.GroupID), "_id", "x._to", element.GroupAttribute)
+	result += createSubVariable("variable_2", "variable_3", fmt.Sprintf("%v%v", typeToPrefix(element.GroupType), element.GroupID), "_id", "x._from", element.GroupAttribute)
 	result += "\tRETURN {\n\t\t\"variable_0\": variable_1, \n\t\t\"variable_1\": variable_3\n\t}\n)\n"
 	return result
 }
@@ -222,22 +234,26 @@ func createSubVariable(variableName string, variableName2 string, forName string
 		"\n\tLET " + variableName2 + " = " + variableName + "[0] \n"
 }
 
-func createGroupBy(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQueryJSON, final bool) string {
+func createGroupBy(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQueryJSON) string {
 	thisname := fmt.Sprintf("g%v", element.ID)
 	tuplename := fmt.Sprintf("gt%v", element.ID)
 	result := createLetFor(thisname, tuplename)
 	result += createCollect(element)
+	result += "\tRETURN {\n\t_id: c,\n\t\"modifier\": variable_0\n\t}\n)\n"
+	return result
+}
+
+func createFinalGroupBy(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQueryJSON) string {
+	tuplename := fmt.Sprintf("gt%v", element.ID)
+	result := "FOR x IN " + tuplename + "\n"
+	result += createCollect(element)
 	filters := tryGetFilterFrom("groupBy", element.ID, JSONQuery)
 	if len(filters) > 0 {
 		for i := range filters {
 			result += createFilter(filters[i])
 		}
 	}
-	if final {
-		result += fmt.Sprintf("\tRETURN {\n\tname: c,\n\t%v: variable_0\n\t}\n)\n", element.GroupAttribute)
-	} else {
-		result += "\tRETURN c\n)\n"
-	}
+	result += fmt.Sprintf("\tRETURN {\n\tname: c,\n\t%v: variable_0\n\t}\n)\n", element.GroupAttribute)
 	return result
 }
 
-- 
GitLab