Skip to content
Snippets Groups Projects
Commit 73c75936 authored by Kieran van Gaalen's avatar Kieran van Gaalen
Browse files

Query chaining done

parent bee9d9aa
No related branches found
No related tags found
1 merge request!1Big merge
......@@ -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
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment