/
fn.go
89 lines (74 loc) · 1.73 KB
/
fn.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
package qcode
import (
"fmt"
"strings"
)
func (co *Compiler) isFunction(sel *Select, fname string) (Function, bool, error) {
var cn string
var agg bool
var err error
fn := Function{FieldName: fname}
switch {
case fname == "search_rank":
fn.Name = "search_rank"
if _, ok := sel.ArgMap["search"]; !ok {
return fn, false, fmt.Errorf("no search defined: %s", fname)
}
case strings.HasPrefix(fname, "search_headline_"):
fn.Name = "search_headline"
cn = fname[16:]
if _, ok := sel.ArgMap["search"]; !ok {
return fn, false, fmt.Errorf("no search defined: %s", fname)
}
case fname == "__typename":
sel.Typename = true
fn.skip = true
case strings.HasSuffix(fname, "_cursor"):
fn.skip = true
default:
n := co.funcPrefixLen(fname)
if n != 0 {
cn = fname[n:]
fn.Name = fname[:(n - 1)]
agg = true
}
}
if cn != "" {
fn.Col, err = sel.Ti.GetColumn(cn)
}
return fn, agg, err
}
func (co *Compiler) funcPrefixLen(col string) int {
switch {
case strings.HasPrefix(col, "avg_"):
return 4
case strings.HasPrefix(col, "count_"):
return 6
case strings.HasPrefix(col, "max_"):
return 4
case strings.HasPrefix(col, "min_"):
return 4
case strings.HasPrefix(col, "sum_"):
return 4
case strings.HasPrefix(col, "stddev_"):
return 7
case strings.HasPrefix(col, "stddev_pop_"):
return 11
case strings.HasPrefix(col, "stddev_samp_"):
return 12
case strings.HasPrefix(col, "variance_"):
return 9
case strings.HasPrefix(col, "var_pop_"):
return 8
case strings.HasPrefix(col, "var_samp_"):
return 9
}
fnLen := len(col)
for k := range co.s.GetFunctions() {
kLen := len(k)
if kLen < fnLen && k[0] == col[0] && strings.HasPrefix(col, k) && col[kLen] == '_' {
return kLen + 1
}
}
return 0
}