Documentation
¶
Overview ¶
Package qfl exposes a parser for the QFL language and a filter data structure that stores the rules for a given data.
Index ¶
- type ComparasionType
- type Filter
- func (f *Filter) AddFloat(key string, values []float64, comparasion ComparasionType)
- func (f *Filter) AddInt(key string, values []int, comparasion ComparasionType)
- func (f *Filter) AddString(key string, values []string, comparasion ComparasionType)
- func (f *Filter) AddTime(key string, values []time.Time, comparasion ComparasionType)
- func (f *Filter) AddUint(key string, values []uint, comparasion ComparasionType)
- func (f *Filter) GetFloat(key string) []FilterRule[float64]
- func (f *Filter) GetInt(key string) []FilterRule[int]
- func (f *Filter) GetString(key string) []FilterRule[string]
- func (f *Filter) GetTime(key string) []FilterRule[time.Time]
- func (f *Filter) GetUint(key string) []FilterRule[uint]
- type FilterRule
- type Parser
- func (p *Parser) AddFloat(key string)
- func (p *Parser) AddInt(key string)
- func (p *Parser) AddString(key string)
- func (p *Parser) AddTime(key string)
- func (p *Parser) AddUint(key string)
- func (p Parser) Parse(kv map[string]string) (*Filter, error)
- func (p Parser) ParseURL(u *url.URL) (*Filter, error)
- type Primitive
- type SQLBuilder
- type SQLPlaceholderFormat
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ComparasionType ¶
type ComparasionType uint8
ComparasionType indicates the comparasion it should make for the values.
const ( ComparasionInvalid ComparasionType = iota ComparasionEquals ComparasionLessThan ComparasionMoreThan ComparasionLessOrEqual ComparasionMoreOrEqual ComparasionLike )
func (ComparasionType) String ¶
func (c ComparasionType) String() string
type Filter ¶
type Filter struct {
// contains filtered or unexported fields
}
Filter is a specialized data structure that stores rules for a given key. It only supports some primitive data types. All get and set functions should be the exactly same except for the type it's manipulating, this is on purporse to ensure type safety.
Example ¶
package main
import (
"fmt"
"github.com/robertoesteves13/qfl"
)
func main() {
f := qfl.Filter{}
// Set rules inside filter
f.AddInt("age", []int{22}, qfl.ComparasionMoreThan)
f.AddString("name", []string{"John"}, qfl.ComparasionLike)
// Get filter rules
age := f.GetInt("age")
name := f.GetString("name")
fmt.Printf("age %s %d\n", age[0].Comparasion, age[0].Values[0])
fmt.Printf("name %s %s\n", name[0].Comparasion, name[0].Values[0])
}
Output: age MoreThan 22 name Like John
func (*Filter) AddFloat ¶
func (f *Filter) AddFloat(key string, values []float64, comparasion ComparasionType)
func (*Filter) AddInt ¶
func (f *Filter) AddInt(key string, values []int, comparasion ComparasionType)
func (*Filter) AddString ¶
func (f *Filter) AddString(key string, values []string, comparasion ComparasionType)
func (*Filter) AddTime ¶
func (f *Filter) AddTime(key string, values []time.Time, comparasion ComparasionType)
type FilterRule ¶
type FilterRule[T Primitive] struct { Comparasion ComparasionType Values []T }
FilterRule represents Note that `ComparasionEquals` is the only one that can have more than one value.
type Parser ¶
type Parser struct {
TimeFormat string // defaults to RCF3339 if empty
// contains filtered or unexported fields
}
Parser parses the QFL language for the keys you specify
Example ¶
package main
import (
"fmt"
"time"
"github.com/robertoesteves13/qfl"
)
func main() {
data := map[string]string{
"income": "1234.56",
"role": "eq!Programmer,Tester",
"age": "gt!20|lt!60",
"employedSince": "2023-05-02T09:34:01Z",
}
parser := qfl.Parser{}
parser.AddFloat("income")
parser.AddString("role")
parser.AddInt("age")
parser.AddTime("employedSince")
filter, err := parser.Parse(data)
if err != nil {
// do error handling
}
age := filter.GetInt("age")
income := filter.GetFloat("income")
employedSince := filter.GetTime("employedSince")
role := filter.GetString("role")
fmt.Printf("age %v %d %v %d\n", age[0].Comparasion, age[0].Values[0], age[1].Comparasion, age[1].Values[0])
fmt.Printf("income %s %.2f\n", income[0].Comparasion, income[0].Values[0])
fmt.Printf("employedSince %s %s\n", employedSince[0].Comparasion, employedSince[0].Values[0].Format(time.RFC3339))
fmt.Printf("role %s %s %s\n", role[0].Comparasion, role[0].Values[0], role[0].Values[1])
}
Output: age MoreThan 20 LessThan 60 income Equals 1234.56 employedSince Equals 2023-05-02T09:34:01Z role Equals Programmer Tester
type SQLBuilder ¶ added in v1.1.0
type SQLBuilder struct {
Filter Filter
Keys map[string]string
PlaceholderFormat SQLPlaceholderFormat
}
SQLBuilder is a generic WHERE-condition builder capable to convert filter rules automatically
Example ¶
package main
import (
"fmt"
"github.com/robertoesteves13/qfl"
)
func main() {
filter := qfl.Filter{}
filter.AddString("name", []string{"Roberto"}, qfl.ComparasionLike)
filter.AddUint("age", []uint{23}, qfl.ComparasionMoreThan)
filter.AddUint("salary", []uint{3000}, qfl.ComparasionLessOrEqual)
filter.AddString("role", []string{"Programmer", "Developer"}, qfl.ComparasionEquals)
builder := qfl.SQLBuilder{
Filter: filter,
Keys: map[string]string{
"name": "name",
"age": "age",
"salary": "salary",
"role": "role",
},
PlaceholderFormat: qfl.SQLPlaceholderDollarSign,
}
sql, params, err := builder.Build()
if err != nil {
// Treat error...
}
fmt.Println(sql)
fmt.Println(params)
}
Output: WHERE name LIKE $1 AND age > $2 AND salary <= $3 AND role IN ($4,$5) [Roberto% 23 3000 Programmer Developer]
type SQLPlaceholderFormat ¶ added in v1.1.0
type SQLPlaceholderFormat uint8
const ( SQLPlaceholderQuestionMark SQLPlaceholderFormat = 0 SQLPlaceholderDollarSign SQLPlaceholderFormat = 1 )
