package entity

// IncomingQueryJSON describes the query coming into the service in JSON format
type IncomingQueryJSON struct {
	DatabaseName string
	Return       QueryReturnStruct
	Entities     []QueryEntityStruct
	Relations    []QueryRelationStruct
	GroupBys     []QueryGroupByStruct
	Filters      []QueryFilterStruct
	// Limit is for limiting the amount of paths AQL will return in a relation let statement
	Limit     int
	Modifiers []QueryModifierStruct
}

// QueryReturnStruct holds the indices of the entities and relations that need to be returned
type QueryReturnStruct struct {
	Entities  []int
	Relations []int
	GroupBys  []int
	//Modifiers []int
}

// QueryEntityStruct encapsulates a single entity with its corresponding constraints
type QueryEntityStruct struct {
	ID   int
	Name string
}

// QueryRelationStruct encapsulates a single relation with its corresponding constraints
type QueryRelationStruct struct {
	ID       int
	Name     string
	FromType string
	FromID   int
	ToType   string
	ToID     int
	Depth    QuerySearchDepthStruct
}

type QueryGroupByStruct struct {
	ID              int
	GroupType       string
	GroupID         int
	GroupAttribute  string
	ByType          string
	ByID            int
	ByAttribute     string
	AppliedModifier string
	RelationID      int
}

type QueryFilterStruct struct {
	ID           int
	FilteredType string
	FilteredID   int
	Attribute    string
	DataType     string
	MatchType    string
	Value        string
	InType       string
	InID         int
}

// QueryModifierStruct encapsulates a single modifier with its corresponding constraints
type QueryModifierStruct struct {
	Type           string // SUM COUNT AVG
	SelectedType   string // node relation
	SelectedTypeID int    // ID of the enitity or relation
	AttributeIndex int    // = -1 if its the node or relation, = > -1 if an attribute is selected
}

// QuerySearchDepthStruct holds the range of traversals for the relation
type QuerySearchDepthStruct struct {
	Min int
	Max int
}

// QueryConstraintStruct holds the information of the constraint
// Constraint datatypes
// 	string     MatchTypes: exact/contains/startswith/endswith
// 	int   MatchTypes: GT/LT/EQ/
// 	bool     MatchTypes: EQ/NEQ