-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathformat1.go
111 lines (92 loc) · 2.62 KB
/
format1.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
/*
Implementation of QueryParserI interface
*/
import (
"encoding/json"
"net/http"
"regexp"
"strings"
log "github.com/Sirupsen/logrus"
)
// Format1 satisfies the QueryParserI interface for format1
// from the sg-query spec
type Format1 struct{}
var format1QueryRegexp = regexp.MustCompile(`^([\w]+)\((.*)\)`)
// CanParseString returns a boolean indicating whether or not the method can parse the supplied string. It is not a guarantee that parsing will be successful.
func (f *Format1) CanParseString(queryStr string) bool {
// gotta start with and/or
if !strings.HasPrefix(queryStr, "AND") &&
!strings.HasPrefix(queryStr, "and") &&
!strings.HasPrefix(queryStr, "OR") &&
!strings.HasPrefix(queryStr, "or") {
return false
}
matches := format1QueryRegexp.FindStringSubmatch(queryStr)
if matches != nil {
if len(matches) != 3 {
return false
}
if strings.HasPrefix(matches[2], "[[") || strings.HasPrefix(matches[2], "[") {
return true
}
}
return false
}
// ParseString parses the supplied string and returns readFilters and an error
func (f *Format1) ParseString(queryStr string) (readFilters, error) {
query := newReadFilters()
if !strings.HasPrefix(queryStr, "AND") &&
!strings.HasPrefix(queryStr, "and") &&
!strings.HasPrefix(queryStr, "OR") &&
!strings.HasPrefix(queryStr, "or") {
return query, queryParseError{
StatusCode: http.StatusBadRequest,
Message: "Invalid query format",
}
}
matches := queryRegexp.FindStringSubmatch(queryStr)
if matches != nil {
if len(matches) != 3 {
return query, queryParseError{
StatusCode: http.StatusBadRequest,
Message: "Invalid query format",
}
}
var filtersStr string
if strings.HasPrefix(matches[2], "[[") {
filtersStr = matches[2]
} else if strings.HasPrefix(matches[2], "[") {
filtersStr = "[" + matches[2] + "]"
} else {
return query, queryParseError{
StatusCode: http.StatusBadRequest,
Message: "Invalid query filter format",
}
}
var filters []interface{}
err := json.Unmarshal([]byte(filtersStr), &filters)
if err != nil {
return query, queryParseError{
StatusCode: http.StatusBadRequest,
Message: err.Error(),
}
}
queryData := map[string]interface{}{
"logical_operator": matches[1],
"conditions": filters,
}
err = mapToReadFilters(queryData, &query)
return query, err
}
return query, queryParseError{
StatusCode: http.StatusBadRequest,
Message: "Invalid query format",
}
}
// Register the format with the manager
func init() {
manager := GetQPManager()
log.Info("manager fetched", manager)
manager.AddParser("format1", &Format1{})
}