package entity

// IncomingQueryJSON describes the query coming into the service in JSON format
type IncomingQueryJSON struct {
	DatabaseName string
	Return       QueryReturnStruct
	Entities     []QueryEntityStruct
	Relations    []QueryRelationStruct
	Functions    []QueryFunctionStruct
	// 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
	//Modifiers []int
}

// QueryEntityStruct encapsulates a single entity with its corresponding constraints
type QueryEntityStruct struct {
	Type        string
	Constraints []QueryConstraintStruct
}

// QueryRelationStruct encapsulates a single relation with its corresponding constraints
type QueryRelationStruct struct {
	Type        string
	EntityFrom  int
	EntityTo    int
	Depth       QuerySearchDepthStruct
	Constraints []QueryConstraintStruct
}

type QueryFunctionStruct struct {
	Type            string
	TypeID          int
	GroupType       string
	GroupID         int
	GroupAttribute  string
	ByType          string
	ByID            int
	ByAttribute     string
	AppliedModifier string
	Constraints     []QueryConstraintStruct
}

// 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
type QueryConstraintStruct struct {
	Attribute       string
	Value           string
	DataType        string
	MatchType       string
	FunctionPointer int
}