Skip to content
Snippets Groups Projects
Commit 2423acdb authored by Jonge,J. de (Joes)'s avatar Jonge,J. de (Joes)
Browse files

Merge branch '676-Query-Nesting-Development' of...

Merge branch '676-Query-Nesting-Development' of https://git.science.uu.nl/GravenvanPolaris/query-conversion into 676-Query-Nesting-Development
parents a282041e cfe2f0ce
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