From 73c7593618621daf449de198844bbd60b264c34a Mon Sep 17 00:00:00 2001 From: Kieran van Gaalen <kieran.van.gaalen@casema.nl> Date: Thu, 4 Nov 2021 12:48:05 +0100 Subject: [PATCH] Query chaining done --- aql/convertQuery.go | 54 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/aql/convertQuery.go b/aql/convertQuery.go index b69e45a..53f9285 100644 --- a/aql/convertQuery.go +++ b/aql/convertQuery.go @@ -59,10 +59,11 @@ createQuery generates a query based on the json file provided Return: *string, a string containing the corresponding AQL query and an error */ func createQuery(JSONQuery *entity.IncomingQueryJSON) *string { - query := "LET result = {\"vertices\":[],\"edges\":[]}\n" + query := "" for list := range listoflists { for index := range listoflists[list] { element := listoflists[list][index] + fmt.Println(element.typename) switch element.typename { case "entity": entity := JSONQuery.Entities[element.pointer] @@ -79,13 +80,26 @@ func createQuery(JSONQuery *entity.IncomingQueryJSON) *string { } } } + unusedRelations := findUnusedRelations(JSONQuery) + if len(unusedRelations) >= 0 { + query += "LET nodes = first(RETURN UNION_DISTINCT(" + for i := range unusedRelations { + query += "flatten(" + unusedRelations[i] + "[**].vertices)," + } + query += "[],[]))\n" + query += "LET edges = first(RETURN UNION_DISTINCT(" + for i := range unusedRelations { + query += "flatten(" + unusedRelations[i] + "[**].edges)," + } + query += "[],[]))\nRETURN {\"vertices\":nodes, \"edges\":edges }" + } return &query } func entityToQuery(element entity.QueryEntityStruct, JSONQuery *entity.IncomingQueryJSON) string { thisname := fmt.Sprintf("e%v", element.ID) ret := createLetFor(thisname, element.Name) - ret += "\tRETURN x\n)" + ret += "\tRETURN x\n)\n" return ret } @@ -114,10 +128,10 @@ func relationToQuery(element entity.QueryRelationStruct, JSONQuery *entity.Incom ret += fmt.Sprintf("\tFOR z in %v%v\n", typeToPrefix(element.ToType), element.ToID) } ret += "\tFILTER x._from == y._id AND x._to == z._id\n" - ret += "\tLET nodes = APPEND(result.vertices, [y, z])\n" + ret += "\tLET nodes = APPEND([], [y, z])\n" ret += "\tRETURN DISTINCT {\n" ret += "\t\"edges\": x,\n" - ret += "\t\"vertices\": nodes\n\t}\n)" + ret += "\t\"vertices\": nodes\n\t}\n)\n" return ret } @@ -131,7 +145,7 @@ func filterToQuery(element entity.QueryFilterStruct, JSONQuery *entity.IncomingQ 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) - ret += "\tRETURN x\n)" + ret += "\tRETURN x\n)\n" return ret } @@ -196,14 +210,14 @@ func getTupleVar(element entity.QueryGroupByStruct, JSONQuery *entity.IncomingQu result := "" 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", element.RelationID), "_id", "r._to", element.ByAttribute) - result += createSubVariable("variable_2", "variable_3", fmt.Sprintf("%v%v", typeToPrefix(element.GroupType), element.GroupID), "_id", "r._to", element.GroupAttribute) + 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 += "\tRETURN {\n\t\t\"variable_0\": variable_1, \n\t\t\"variable_1\": variable_3\n\t}\n)\n" return result } func createSubVariable(variableName string, variableName2 string, forName string, filter1 string, filter2 string, returnValue string) string { - result := "\tLET " + variableName + " = (\n\tFOR y IN " + forName + "\n" + result := "\tLET " + variableName + " = (\n\t\tFOR y IN " + forName + "\n" return result + "\t\tFILTER y." + filter1 + " == " + filter2 + "\n\t\tRETURN y." + returnValue + "\n\t) " + "\n\tLET " + variableName2 + " = " + variableName + "[0] \n" } @@ -220,18 +234,36 @@ func createGroupBy(element entity.QueryGroupByStruct, JSONQuery *entity.Incoming } } if final { - result += fmt.Sprintf("\tRETURN {\n\tname: c,\n\t%v: variable_0\n\t}\n)", element.GroupAttribute) + result += fmt.Sprintf("\tRETURN {\n\tname: c,\n\t%v: variable_0\n\t}\n)\n", element.GroupAttribute) } else { - result += "\tRETURN c\n)" + result += "\tRETURN c\n)\n" } return result } func createCollect(element entity.QueryGroupByStruct) string { - return "\tCOLLECT c = x.variable_0 INTO groups = x.variable_1\n\t\t" + + return "\tCOLLECT c = x.variable_0 INTO groups = x.variable_1\n\t" + "LET variable_0 = " + element.AppliedModifier + "(groups) \n" } func createFilter(filter entity.QueryFilterStruct) string { return "\tFILTER variable_0 " + wordsToLogicalSign(filter.MatchType) + " " + filter.Value + " \n" } + +func findUnusedRelations(JSONQuery *entity.IncomingQueryJSON) []string { + var unused []string + for i := range JSONQuery.Relations { + relationUnused := true + relation := JSONQuery.Relations[i] + for j := range JSONQuery.GroupBys { + groupBy := JSONQuery.GroupBys[j] + if groupBy.RelationID == relation.ID { + relationUnused = false + } + } + if relationUnused { + unused = append(unused, fmt.Sprintf("r%v", relation.ID)) + } + } + return unused +} -- GitLab