repogen/internal/spec/models.go

129 lines
3.6 KiB
Go
Raw Normal View History

package spec
2021-01-19 12:26:26 +00:00
import (
"strings"
"github.com/sunboyy/repogen/internal/code"
)
// QueryMode one or many
type QueryMode string
// query mode constants
const (
QueryModeOne QueryMode = "ONE"
QueryModeMany QueryMode = "MANY"
)
// MethodSpec is a method specification inside repository specification
type MethodSpec struct {
Name string
Params []code.Param
Returns []code.Type
Operation Operation
}
// Operation is an interface for any kind of operation
type Operation interface {
}
// FindOperation is a method specification for find operations
type FindOperation struct {
Mode QueryMode
Query QuerySpec
}
2021-01-26 13:23:52 +00:00
// DeleteOperation is a method specification for delete operations
type DeleteOperation struct {
Mode QueryMode
Query QuerySpec
}
2021-01-19 12:26:26 +00:00
// QuerySpec is a set of conditions of querying the database
type QuerySpec struct {
2021-01-19 12:35:54 +00:00
Operator Operator
2021-01-19 12:26:26 +00:00
Predicates []Predicate
}
// NumberOfArguments returns number of arguments required to perform the query
func (q QuerySpec) NumberOfArguments() int {
var totalArgs int
for _, predicate := range q.Predicates {
totalArgs += predicate.Comparator.NumberOfArguments()
}
return totalArgs
2021-01-19 12:26:26 +00:00
}
2021-01-19 12:35:54 +00:00
// Operator is a boolean operator for merging conditions
2021-01-19 12:26:26 +00:00
type Operator string
2021-01-19 12:35:54 +00:00
// boolean operator types
2021-01-19 12:26:26 +00:00
const (
2021-01-19 12:35:54 +00:00
OperatorAnd Operator = "AND"
OperatorOr Operator = "OR"
)
// Comparator is a comparison operator of the condition to query the data
type Comparator string
// comparator types
const (
ComparatorNot Comparator = "NOT"
ComparatorEqual Comparator = "EQUAL"
ComparatorLessThan Comparator = "LESS_THAN"
ComparatorLessThanEqual Comparator = "LESS_THAN_EQUAL"
ComparatorGreaterThan Comparator = "GREATER_THAN"
ComparatorGreaterThanEqual Comparator = "GREATER_THAN_EQUAL"
ComparatorBetween Comparator = "BETWEEN"
2021-01-22 02:56:30 +00:00
ComparatorIn Comparator = "IN"
2021-01-19 12:26:26 +00:00
)
2021-01-22 02:56:30 +00:00
// ArgumentTypeFromFieldType returns a type of required argument from the given struct field type
func (c Comparator) ArgumentTypeFromFieldType(t code.Type) code.Type {
if c == ComparatorIn {
return code.ArrayType{ContainedType: t}
}
return t
}
// NumberOfArguments returns the number of arguments required to perform the comparison
func (c Comparator) NumberOfArguments() int {
if c == ComparatorBetween {
return 2
}
return 1
}
2021-01-19 12:26:26 +00:00
// Predicate is a criteria for querying a field
type Predicate struct {
2021-01-19 12:35:54 +00:00
Field string
Comparator Comparator
2021-01-19 12:26:26 +00:00
}
type predicateToken []string
func (t predicateToken) ToPredicate() Predicate {
if len(t) > 1 && t[len(t)-1] == "Not" {
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t[:len(t)-1], ""), Comparator: ComparatorNot}
2021-01-19 12:26:26 +00:00
}
if len(t) > 2 && t[len(t)-2] == "Less" && t[len(t)-1] == "Than" {
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t[:len(t)-2], ""), Comparator: ComparatorLessThan}
2021-01-19 12:26:26 +00:00
}
if len(t) > 3 && t[len(t)-3] == "Less" && t[len(t)-2] == "Than" && t[len(t)-1] == "Equal" {
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t[:len(t)-3], ""), Comparator: ComparatorLessThanEqual}
2021-01-19 12:26:26 +00:00
}
if len(t) > 2 && t[len(t)-2] == "Greater" && t[len(t)-1] == "Than" {
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t[:len(t)-2], ""), Comparator: ComparatorGreaterThan}
2021-01-19 12:26:26 +00:00
}
if len(t) > 3 && t[len(t)-3] == "Greater" && t[len(t)-2] == "Than" && t[len(t)-1] == "Equal" {
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t[:len(t)-3], ""), Comparator: ComparatorGreaterThanEqual}
2021-01-19 12:26:26 +00:00
}
2021-01-22 02:56:30 +00:00
if len(t) > 1 && t[len(t)-1] == "In" {
return Predicate{Field: strings.Join(t[:len(t)-1], ""), Comparator: ComparatorIn}
}
if len(t) > 1 && t[len(t)-1] == "Between" {
return Predicate{Field: strings.Join(t[:len(t)-1], ""), Comparator: ComparatorBetween}
}
2021-01-19 12:35:54 +00:00
return Predicate{Field: strings.Join(t, ""), Comparator: ComparatorEqual}
}