/*
This program has been developed by students from the bachelor Computer Science at Utrecht University within the Software Project course.
© Copyright Utrecht University (Department of Information and Computing Sciences)
*/

package entityv2

/*
IncomingQueryJSON describes the query coming into the service in JSON format
*/
type IncomingQueryJSON struct {
	DatabaseName    string                    `json:"databaseName"`
	Limit           int                       `json:"limit"`
	Return          []string                  `json:"return"`
	Query           []QueryStruct             `json:"query"`
	Logic           interface{}               `json:"logic"`
	// Entities        []QueryEntityStruct   `json:"entities"`
	// Relations       []QueryRelationStruct `json:"relations"`
	// GroupBys        []QueryGroupByStruct  `json:"groupBys"`
	// MachineLearning []QueryMLStruct       `json:"machineLearning"`
	// Modifiers []QueryModifierStruct
	// Prefix    string
}

type QueryStruct struct {
	ID        string     `json:"id"`
	Node      NodeStruct `json:"node"`
}

type NodeStruct struct {
	Label      string             `json:"label"`
	ID         string             `json:"id"`
	// Logic      []LogicStruct      `json:"logic"`
	Filter     []FilterStruct     `json:"filter"`
	Relation   RelationStruct     `json:"relation"`
	SubQuery   *QueryStruct	      `json:"subquery"`
	Export     []ExportNodeStruct `json:"export"`

}


type ExportNodeStruct struct {
	ID           string  `json:"id"`
	Attribute    string  `json:"attribute"`
}


type FilterStruct struct {
	Attribute    string  `json:"attribute"`
	Operation    string  `json:"operation"`
	Value        string  `json:"value"`
}

type RelationStruct struct {
	Label      string                  `json:"label"`
	ID         string                  `json:"id"`
	Depth      QuerySearchDepthStruct  `json:"depth"`
	Direction  string                  `json:"direction"`
	Node       *NodeStruct             `json:"node"`
}

/*
QuerySearchDepthStruct holds the range of traversals for the relation
*/
type QuerySearchDepthStruct struct {
	Min int `json:"min"`
	Max int `json:"max"`
}

// 
// Logic Structs!
//

type LogicStruct struct {
	Attribute    string  `json:"attribute"`
	Operation    string  `json:"operation"`
	ID           string  `json:"id"`
}