diff --git a/pql/ast.go b/pql/ast.go index 898f22836..0bcc582d4 100644 --- a/pql/ast.go +++ b/pql/ast.go @@ -213,7 +213,7 @@ func (q *Query) WriteCallN() int { var n int for _, call := range q.Calls { switch call.Name { - case "SetBit", "ClearBit", "SetRowAttrs", "SetColumnAttrs": + case "Set", "Clear", "SetRowAttrs", "SetColumnAttrs": n++ } } @@ -253,6 +253,18 @@ type Call struct { Children []*Call } +// FieldArg determines which key-value pair contains the field and rowID, +// in the case of arguments like Set(colID, field=rowID). +// Returns the field as a string if present, or an error if not. +func (c *Call) FieldArg() (string, error) { + for arg := range c.Args { + if !strings.HasPrefix(arg, "_") { + return arg, nil + } + } + return "", fmt.Errorf("No field argument specified") +} + // UintArg is for reading the value at key from call.Args as a uint64. If the // key is not in Call.Args, the value of the returned bool will be false, and // the error will be nil. The value is assumed to be a uint64 or an int64 and diff --git a/pql/pql.peg b/pql/pql.peg index a094aa663..ca5ece479 100644 --- a/pql/pql.peg +++ b/pql/pql.peg @@ -6,10 +6,10 @@ type PQL Peg { Calls <- whitesp (Call whitesp)* !. -Call <- 'Set' {p.startCall("Set")} open uintcol comma args (comma timestamp)? close {p.endCall()} +Call <- 'Set' {p.startCall("Set")} open col comma args (comma timestamp)? close {p.endCall()} / 'SetRowAttrs' {p.startCall("SetRowAttrs")} open posfield comma uintrow comma args close {p.endCall()} - / 'SetColumnAttrs' {p.startCall("SetColumnAttrs")} open posfield comma uintcol comma args close {p.endCall()} - / 'Clear' {p.startCall("Clear")} open uintcol comma args close {p.endCall()} + / 'SetColumnAttrs' {p.startCall("SetColumnAttrs")} open col comma args close {p.endCall()} + / 'Clear' {p.startCall("Clear")} open col comma args close {p.endCall()} / 'TopN' {p.startCall("TopN")} open posfield (comma allargs)? close {p.endCall()} / 'Range' {p.startCall("Range")} open (timerange / conditional / arg) close {p.endCall()} / < IDENT > { p.startCall(buffer[begin:end] ) } open allargs comma? close { p.endCall() } @@ -51,11 +51,14 @@ doublequotedstring <- ( [^"\\\n] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* singlequotedstring <- ( [^'\\\n] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* fieldExpr <- [[A-Z]] ( [[A-Z]] / [0-9] / '_' )* -field <- { p.addField(buffer[begin:end]) } +field <- { p.addField(buffer[begin:end]) } +reserved <- ('_row' / '_col' / '_start' / '_end' / '_timestamp' / '_field') posfield <- { p.addPosStr("_field", buffer[begin:end]) } uint <- [1-9] [0-9]* / '0' uintrow <- {p.addPosNum("_row", buffer[begin:end])} -uintcol <- {p.addPosNum("_col", buffer[begin:end])} +col <- ( {p.addPosNum("_col", buffer[begin:end])} + / '"' '"' {p.addPosStr("_col", buffer[begin:end])} + ) open <- '(' sp close <- ')' sp @@ -64,7 +67,7 @@ comma <- sp ',' whitesp lbrack <- '[' sp rbrack <- sp ']' sp whitesp <- ( ' ' / '\t' / '\n' )* -IDENT <- !('Set(' / 'SetRowAttrs(' / 'SetColumnAttrs(' / 'Clear(' / 'TopN(' / 'Range(') [[A-Z]] ([[A-Z]] / [0-9])* +IDENT <- [[A-Z]] ([[A-Z]] / [0-9])* timestampbasicfmt <- [0-9][0-9][0-9][0-9]'-'[01][0-9]'-'[0-3][0-9]'T'[0-9][0-9]':'[0-9][0-9] diff --git a/pql/pql.peg.go b/pql/pql.peg.go index f62f21552..c0915e921 100644 --- a/pql/pql.peg.go +++ b/pql/pql.peg.go @@ -34,10 +34,11 @@ const ( rulesinglequotedstring rulefieldExpr rulefield + rulereserved ruleposfield ruleuint ruleuintrow - ruleuintcol + rulecol ruleopen ruleclose rulesp @@ -93,6 +94,7 @@ const ( ruleAction40 ruleAction41 ruleAction42 + ruleAction43 ) var rul3s = [...]string{ @@ -115,10 +117,11 @@ var rul3s = [...]string{ "singlequotedstring", "fieldExpr", "field", + "reserved", "posfield", "uint", "uintrow", - "uintcol", + "col", "open", "close", "sp", @@ -174,6 +177,7 @@ var rul3s = [...]string{ "Action40", "Action41", "Action42", + "Action43", } type token32 struct { @@ -290,7 +294,7 @@ type PQL struct { Buffer string buffer []rune - rules [78]func() bool + rules [80]func() bool parse func(rule ...int) error reset func() Pretty bool @@ -467,6 +471,8 @@ func (p *PQL) Execute() { case ruleAction41: p.addPosNum("_col", buffer[begin:end]) case ruleAction42: + p.addPosStr("_col", buffer[begin:end]) + case ruleAction43: p.addPosStr("_timestamp", buffer[begin:end]) } @@ -579,7 +585,7 @@ func (p *PQL) Init() { position, tokenIndex = position0, tokenIndex0 return false }, - /* 1 Call <- <(('S' 'e' 't' Action0 open uintcol comma args (comma timestamp)? close Action1) / ('S' 'e' 't' 'R' 'o' 'w' 'A' 't' 't' 'r' 's' Action2 open posfield comma uintrow comma args close Action3) / ('S' 'e' 't' 'C' 'o' 'l' 'u' 'm' 'n' 'A' 't' 't' 'r' 's' Action4 open posfield comma uintcol comma args close Action5) / ('C' 'l' 'e' 'a' 'r' Action6 open uintcol comma args close Action7) / ('T' 'o' 'p' 'N' Action8 open posfield (comma allargs)? close Action9) / ('R' 'a' 'n' 'g' 'e' Action10 open (timerange / conditional / arg) close Action11) / ( Action12 open allargs comma? close Action13))> */ + /* 1 Call <- <(('S' 'e' 't' Action0 open col comma args (comma timestamp)? close Action1) / ('S' 'e' 't' 'R' 'o' 'w' 'A' 't' 't' 'r' 's' Action2 open posfield comma uintrow comma args close Action3) / ('S' 'e' 't' 'C' 'o' 'l' 'u' 'm' 'n' 'A' 't' 't' 'r' 's' Action4 open col comma args close Action5) / ('C' 'l' 'e' 'a' 'r' Action6 open col comma args close Action7) / ('T' 'o' 'p' 'N' Action8 open posfield (comma allargs)? close Action9) / ('R' 'a' 'n' 'g' 'e' Action10 open (timerange / conditional / arg) close Action11) / ( Action12 open allargs comma? close Action13))> */ func() bool { position5, tokenIndex5 := position, tokenIndex { @@ -604,7 +610,7 @@ func (p *PQL) Init() { if !_rules[ruleopen]() { goto l8 } - if !_rules[ruleuintcol]() { + if !_rules[rulecol]() { goto l8 } if !_rules[rulecomma]() { @@ -628,7 +634,7 @@ func (p *PQL) Init() { add(rulePegText, position13) } { - add(ruleAction42, position) + add(ruleAction43, position) } add(ruletimestamp, position12) } @@ -793,13 +799,7 @@ func (p *PQL) Init() { if !_rules[ruleopen]() { goto l22 } - if !_rules[ruleposfield]() { - goto l22 - } - if !_rules[rulecomma]() { - goto l22 - } - if !_rules[ruleuintcol]() { + if !_rules[rulecol]() { goto l22 } if !_rules[rulecomma]() { @@ -843,7 +843,7 @@ func (p *PQL) Init() { if !_rules[ruleopen]() { goto l25 } - if !_rules[ruleuintcol]() { + if !_rules[rulecol]() { goto l25 } if !_rules[rulecomma]() { @@ -1047,264 +1047,47 @@ func (p *PQL) Init() { position51 := position { position52, tokenIndex52 := position, tokenIndex - { - position53, tokenIndex53 := position, tokenIndex - if buffer[position] != rune('S') { - goto l54 - } - position++ - if buffer[position] != rune('e') { - goto l54 - } - position++ - if buffer[position] != rune('t') { - goto l54 - } - position++ - if buffer[position] != rune('(') { - goto l54 - } - position++ - goto l53 - l54: - position, tokenIndex = position53, tokenIndex53 - if buffer[position] != rune('S') { - goto l55 - } - position++ - if buffer[position] != rune('e') { - goto l55 - } - position++ - if buffer[position] != rune('t') { - goto l55 - } - position++ - if buffer[position] != rune('R') { - goto l55 - } - position++ - if buffer[position] != rune('o') { - goto l55 - } - position++ - if buffer[position] != rune('w') { - goto l55 - } - position++ - if buffer[position] != rune('A') { - goto l55 - } - position++ - if buffer[position] != rune('t') { - goto l55 - } - position++ - if buffer[position] != rune('t') { - goto l55 - } - position++ - if buffer[position] != rune('r') { - goto l55 - } - position++ - if buffer[position] != rune('s') { - goto l55 - } - position++ - if buffer[position] != rune('(') { - goto l55 - } - position++ - goto l53 - l55: - position, tokenIndex = position53, tokenIndex53 - if buffer[position] != rune('S') { - goto l56 - } - position++ - if buffer[position] != rune('e') { - goto l56 - } - position++ - if buffer[position] != rune('t') { - goto l56 - } - position++ - if buffer[position] != rune('C') { - goto l56 - } - position++ - if buffer[position] != rune('o') { - goto l56 - } - position++ - if buffer[position] != rune('l') { - goto l56 - } - position++ - if buffer[position] != rune('u') { - goto l56 - } - position++ - if buffer[position] != rune('m') { - goto l56 - } - position++ - if buffer[position] != rune('n') { - goto l56 - } - position++ - if buffer[position] != rune('A') { - goto l56 - } - position++ - if buffer[position] != rune('t') { - goto l56 - } - position++ - if buffer[position] != rune('t') { - goto l56 - } - position++ - if buffer[position] != rune('r') { - goto l56 - } - position++ - if buffer[position] != rune('s') { - goto l56 - } - position++ - if buffer[position] != rune('(') { - goto l56 - } - position++ - goto l53 - l56: - position, tokenIndex = position53, tokenIndex53 - if buffer[position] != rune('C') { - goto l57 - } - position++ - if buffer[position] != rune('l') { - goto l57 - } - position++ - if buffer[position] != rune('e') { - goto l57 - } - position++ - if buffer[position] != rune('a') { - goto l57 - } - position++ - if buffer[position] != rune('r') { - goto l57 - } - position++ - if buffer[position] != rune('(') { - goto l57 - } - position++ - goto l53 - l57: - position, tokenIndex = position53, tokenIndex53 - if buffer[position] != rune('T') { - goto l58 - } - position++ - if buffer[position] != rune('o') { - goto l58 - } - position++ - if buffer[position] != rune('p') { - goto l58 - } - position++ - if buffer[position] != rune('N') { - goto l58 - } - position++ - if buffer[position] != rune('(') { - goto l58 - } - position++ - goto l53 - l58: - position, tokenIndex = position53, tokenIndex53 - if buffer[position] != rune('R') { - goto l52 - } - position++ - if buffer[position] != rune('a') { - goto l52 - } - position++ - if buffer[position] != rune('n') { - goto l52 - } - position++ - if buffer[position] != rune('g') { - goto l52 - } - position++ - if buffer[position] != rune('e') { - goto l52 - } - position++ - if buffer[position] != rune('(') { - goto l52 - } - position++ - } - l53: - goto l5 - l52: - position, tokenIndex = position52, tokenIndex52 - } - { - position59, tokenIndex59 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l60 + goto l53 } position++ - goto l59 - l60: - position, tokenIndex = position59, tokenIndex59 + goto l52 + l53: + position, tokenIndex = position52, tokenIndex52 if c := buffer[position]; c < rune('A') || c > rune('Z') { goto l5 } position++ } - l59: - l61: + l52: + l54: { - position62, tokenIndex62 := position, tokenIndex + position55, tokenIndex55 := position, tokenIndex { - position63, tokenIndex63 := position, tokenIndex + position56, tokenIndex56 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l64 + goto l57 } position++ - goto l63 - l64: - position, tokenIndex = position63, tokenIndex63 + goto l56 + l57: + position, tokenIndex = position56, tokenIndex56 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l65 + goto l58 } position++ - goto l63 - l65: - position, tokenIndex = position63, tokenIndex63 + goto l56 + l58: + position, tokenIndex = position56, tokenIndex56 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l62 + goto l55 } position++ } - l63: - goto l61 - l62: - position, tokenIndex = position62, tokenIndex62 + l56: + goto l54 + l55: + position, tokenIndex = position55, tokenIndex55 } add(ruleIDENT, position51) } @@ -1320,15 +1103,15 @@ func (p *PQL) Init() { goto l5 } { - position67, tokenIndex67 := position, tokenIndex + position60, tokenIndex60 := position, tokenIndex if !_rules[rulecomma]() { - goto l67 + goto l60 } - goto l68 - l67: - position, tokenIndex = position67, tokenIndex67 + goto l61 + l60: + position, tokenIndex = position60, tokenIndex60 } - l68: + l61: if !_rules[ruleclose]() { goto l5 } @@ -1346,232 +1129,232 @@ func (p *PQL) Init() { }, /* 2 allargs <- <((Call (comma Call)* (comma args)?) / args / sp)> */ func() bool { - position70, tokenIndex70 := position, tokenIndex + position63, tokenIndex63 := position, tokenIndex { - position71 := position + position64 := position { - position72, tokenIndex72 := position, tokenIndex + position65, tokenIndex65 := position, tokenIndex if !_rules[ruleCall]() { - goto l73 + goto l66 } - l74: + l67: { - position75, tokenIndex75 := position, tokenIndex + position68, tokenIndex68 := position, tokenIndex if !_rules[rulecomma]() { - goto l75 + goto l68 } if !_rules[ruleCall]() { - goto l75 + goto l68 } - goto l74 - l75: - position, tokenIndex = position75, tokenIndex75 + goto l67 + l68: + position, tokenIndex = position68, tokenIndex68 } { - position76, tokenIndex76 := position, tokenIndex + position69, tokenIndex69 := position, tokenIndex if !_rules[rulecomma]() { - goto l76 + goto l69 } if !_rules[ruleargs]() { - goto l76 + goto l69 } - goto l77 - l76: - position, tokenIndex = position76, tokenIndex76 - } - l77: - goto l72 - l73: - position, tokenIndex = position72, tokenIndex72 - if !_rules[ruleargs]() { - goto l78 - } - goto l72 - l78: - position, tokenIndex = position72, tokenIndex72 - if !_rules[rulesp]() { goto l70 + l69: + position, tokenIndex = position69, tokenIndex69 + } + l70: + goto l65 + l66: + position, tokenIndex = position65, tokenIndex65 + if !_rules[ruleargs]() { + goto l71 + } + goto l65 + l71: + position, tokenIndex = position65, tokenIndex65 + if !_rules[rulesp]() { + goto l63 } } - l72: - add(ruleallargs, position71) + l65: + add(ruleallargs, position64) } return true - l70: - position, tokenIndex = position70, tokenIndex70 + l63: + position, tokenIndex = position63, tokenIndex63 return false }, /* 3 args <- <(arg (comma args)? sp)> */ func() bool { - position79, tokenIndex79 := position, tokenIndex + position72, tokenIndex72 := position, tokenIndex { - position80 := position + position73 := position if !_rules[rulearg]() { - goto l79 + goto l72 } { - position81, tokenIndex81 := position, tokenIndex + position74, tokenIndex74 := position, tokenIndex if !_rules[rulecomma]() { - goto l81 + goto l74 } if !_rules[ruleargs]() { - goto l81 + goto l74 } - goto l82 - l81: - position, tokenIndex = position81, tokenIndex81 + goto l75 + l74: + position, tokenIndex = position74, tokenIndex74 } - l82: + l75: if !_rules[rulesp]() { - goto l79 + goto l72 } - add(ruleargs, position80) + add(ruleargs, position73) } return true - l79: - position, tokenIndex = position79, tokenIndex79 + l72: + position, tokenIndex = position72, tokenIndex72 return false }, /* 4 arg <- <((field sp '=' sp value) / (field sp COND sp value))> */ func() bool { - position83, tokenIndex83 := position, tokenIndex + position76, tokenIndex76 := position, tokenIndex { - position84 := position + position77 := position { - position85, tokenIndex85 := position, tokenIndex + position78, tokenIndex78 := position, tokenIndex if !_rules[rulefield]() { - goto l86 + goto l79 } if !_rules[rulesp]() { - goto l86 + goto l79 } if buffer[position] != rune('=') { - goto l86 + goto l79 } position++ if !_rules[rulesp]() { - goto l86 + goto l79 } if !_rules[rulevalue]() { - goto l86 + goto l79 } - goto l85 - l86: - position, tokenIndex = position85, tokenIndex85 + goto l78 + l79: + position, tokenIndex = position78, tokenIndex78 if !_rules[rulefield]() { - goto l83 + goto l76 } if !_rules[rulesp]() { - goto l83 + goto l76 } { - position87 := position + position80 := position { - position88, tokenIndex88 := position, tokenIndex + position81, tokenIndex81 := position, tokenIndex if buffer[position] != rune('>') { - goto l89 + goto l82 } position++ if buffer[position] != rune('<') { - goto l89 + goto l82 } position++ { add(ruleAction14, position) } - goto l88 - l89: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l82: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('<') { - goto l91 + goto l84 } position++ if buffer[position] != rune('=') { - goto l91 + goto l84 } position++ { add(ruleAction15, position) } - goto l88 - l91: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l84: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('>') { - goto l93 + goto l86 } position++ if buffer[position] != rune('=') { - goto l93 + goto l86 } position++ { add(ruleAction16, position) } - goto l88 - l93: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l86: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('=') { - goto l95 + goto l88 } position++ if buffer[position] != rune('=') { - goto l95 + goto l88 } position++ { add(ruleAction17, position) } - goto l88 - l95: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l88: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('!') { - goto l97 + goto l90 } position++ if buffer[position] != rune('=') { - goto l97 + goto l90 } position++ { add(ruleAction18, position) } - goto l88 - l97: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l90: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('<') { - goto l99 + goto l92 } position++ { add(ruleAction19, position) } - goto l88 - l99: - position, tokenIndex = position88, tokenIndex88 + goto l81 + l92: + position, tokenIndex = position81, tokenIndex81 if buffer[position] != rune('>') { - goto l83 + goto l76 } position++ { add(ruleAction20, position) } } - l88: - add(ruleCOND, position87) + l81: + add(ruleCOND, position80) } if !_rules[rulesp]() { - goto l83 + goto l76 } if !_rules[rulevalue]() { - goto l83 + goto l76 } } - l85: - add(rulearg, position84) + l78: + add(rulearg, position77) } return true - l83: - position, tokenIndex = position83, tokenIndex83 + l76: + position, tokenIndex = position76, tokenIndex76 return false }, /* 5 COND <- <(('>' '<' Action14) / ('<' '=' Action15) / ('>' '=' Action16) / ('=' '=' Action17) / ('!' '=' Action18) / ('<' Action19) / ('>' Action20))> */ @@ -1580,102 +1363,102 @@ func (p *PQL) Init() { nil, /* 7 condint <- <(<(('-'? [1-9] [0-9]*) / '0')> sp Action23)> */ func() bool { - position104, tokenIndex104 := position, tokenIndex + position97, tokenIndex97 := position, tokenIndex { - position105 := position + position98 := position { - position106 := position + position99 := position { - position107, tokenIndex107 := position, tokenIndex + position100, tokenIndex100 := position, tokenIndex { - position109, tokenIndex109 := position, tokenIndex + position102, tokenIndex102 := position, tokenIndex if buffer[position] != rune('-') { - goto l109 + goto l102 } position++ - goto l110 - l109: - position, tokenIndex = position109, tokenIndex109 + goto l103 + l102: + position, tokenIndex = position102, tokenIndex102 } - l110: + l103: if c := buffer[position]; c < rune('1') || c > rune('9') { - goto l108 + goto l101 } position++ - l111: + l104: { - position112, tokenIndex112 := position, tokenIndex + position105, tokenIndex105 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l112 + goto l105 } position++ - goto l111 - l112: - position, tokenIndex = position112, tokenIndex112 - } - goto l107 - l108: - position, tokenIndex = position107, tokenIndex107 - if buffer[position] != rune('0') { goto l104 + l105: + position, tokenIndex = position105, tokenIndex105 + } + goto l100 + l101: + position, tokenIndex = position100, tokenIndex100 + if buffer[position] != rune('0') { + goto l97 } position++ } - l107: - add(rulePegText, position106) + l100: + add(rulePegText, position99) } if !_rules[rulesp]() { - goto l104 + goto l97 } { add(ruleAction23, position) } - add(rulecondint, position105) + add(rulecondint, position98) } return true - l104: - position, tokenIndex = position104, tokenIndex104 + l97: + position, tokenIndex = position97, tokenIndex97 return false }, /* 8 condLT <- <(<(('<' '=') / '<')> sp Action24)> */ func() bool { - position114, tokenIndex114 := position, tokenIndex + position107, tokenIndex107 := position, tokenIndex { - position115 := position + position108 := position { - position116 := position + position109 := position { - position117, tokenIndex117 := position, tokenIndex + position110, tokenIndex110 := position, tokenIndex if buffer[position] != rune('<') { - goto l118 + goto l111 } position++ if buffer[position] != rune('=') { - goto l118 + goto l111 } position++ - goto l117 - l118: - position, tokenIndex = position117, tokenIndex117 + goto l110 + l111: + position, tokenIndex = position110, tokenIndex110 if buffer[position] != rune('<') { - goto l114 + goto l107 } position++ } - l117: - add(rulePegText, position116) + l110: + add(rulePegText, position109) } if !_rules[rulesp]() { - goto l114 + goto l107 } { add(ruleAction24, position) } - add(rulecondLT, position115) + add(rulecondLT, position108) } return true - l114: - position, tokenIndex = position114, tokenIndex114 + l107: + position, tokenIndex = position107, tokenIndex107 return false }, /* 9 condfield <- <( sp Action25)> */ @@ -1684,1176 +1467,1376 @@ func (p *PQL) Init() { nil, /* 11 value <- <(item / (lbrack Action28 list rbrack Action29))> */ func() bool { - position122, tokenIndex122 := position, tokenIndex + position115, tokenIndex115 := position, tokenIndex { - position123 := position + position116 := position { - position124, tokenIndex124 := position, tokenIndex + position117, tokenIndex117 := position, tokenIndex if !_rules[ruleitem]() { - goto l125 + goto l118 } - goto l124 - l125: - position, tokenIndex = position124, tokenIndex124 + goto l117 + l118: + position, tokenIndex = position117, tokenIndex117 { - position126 := position + position119 := position if buffer[position] != rune('[') { - goto l122 + goto l115 } position++ if !_rules[rulesp]() { - goto l122 + goto l115 } - add(rulelbrack, position126) + add(rulelbrack, position119) } { add(ruleAction28, position) } if !_rules[rulelist]() { - goto l122 + goto l115 } { - position128 := position + position121 := position if !_rules[rulesp]() { - goto l122 + goto l115 } if buffer[position] != rune(']') { - goto l122 + goto l115 } position++ if !_rules[rulesp]() { - goto l122 + goto l115 } - add(rulerbrack, position128) + add(rulerbrack, position121) } { add(ruleAction29, position) } } - l124: - add(rulevalue, position123) + l117: + add(rulevalue, position116) } return true - l122: - position, tokenIndex = position122, tokenIndex122 + l115: + position, tokenIndex = position115, tokenIndex115 return false }, /* 12 list <- <(item (comma list)?)> */ func() bool { - position130, tokenIndex130 := position, tokenIndex + position123, tokenIndex123 := position, tokenIndex { - position131 := position + position124 := position if !_rules[ruleitem]() { - goto l130 + goto l123 } { - position132, tokenIndex132 := position, tokenIndex + position125, tokenIndex125 := position, tokenIndex if !_rules[rulecomma]() { - goto l132 + goto l125 } if !_rules[rulelist]() { - goto l132 + goto l125 } - goto l133 - l132: - position, tokenIndex = position132, tokenIndex132 + goto l126 + l125: + position, tokenIndex = position125, tokenIndex125 } - l133: - add(rulelist, position131) + l126: + add(rulelist, position124) } return true - l130: - position, tokenIndex = position130, tokenIndex130 + l123: + position, tokenIndex = position123, tokenIndex123 return false }, /* 13 item <- <(('n' 'u' 'l' 'l' &(comma / (sp close)) Action30) / ('t' 'r' 'u' 'e' &(comma / (sp close)) Action31) / ('f' 'a' 'l' 's' 'e' &(comma / (sp close)) Action32) / (<('-'? [0-9]+ ('.' [0-9]*)?)> Action33) / (<('-'? '.' [0-9]+)> Action34) / (<([a-z] / [A-Z] / [0-9] / '-' / '_' / ':')+> Action35) / ('"' '"' Action36) / ('\'' '\'' Action37))> */ func() bool { - position134, tokenIndex134 := position, tokenIndex + position127, tokenIndex127 := position, tokenIndex { - position135 := position + position128 := position { - position136, tokenIndex136 := position, tokenIndex + position129, tokenIndex129 := position, tokenIndex if buffer[position] != rune('n') { - goto l137 + goto l130 } position++ if buffer[position] != rune('u') { - goto l137 + goto l130 } position++ if buffer[position] != rune('l') { - goto l137 + goto l130 } position++ if buffer[position] != rune('l') { - goto l137 + goto l130 } position++ { - position138, tokenIndex138 := position, tokenIndex + position131, tokenIndex131 := position, tokenIndex { - position139, tokenIndex139 := position, tokenIndex + position132, tokenIndex132 := position, tokenIndex if !_rules[rulecomma]() { - goto l140 + goto l133 } - goto l139 - l140: - position, tokenIndex = position139, tokenIndex139 + goto l132 + l133: + position, tokenIndex = position132, tokenIndex132 if !_rules[rulesp]() { - goto l137 + goto l130 } if !_rules[ruleclose]() { - goto l137 + goto l130 } } - l139: - position, tokenIndex = position138, tokenIndex138 + l132: + position, tokenIndex = position131, tokenIndex131 } { add(ruleAction30, position) } - goto l136 - l137: - position, tokenIndex = position136, tokenIndex136 + goto l129 + l130: + position, tokenIndex = position129, tokenIndex129 if buffer[position] != rune('t') { - goto l142 + goto l135 } position++ if buffer[position] != rune('r') { - goto l142 + goto l135 } position++ if buffer[position] != rune('u') { - goto l142 + goto l135 } position++ if buffer[position] != rune('e') { - goto l142 + goto l135 } position++ { - position143, tokenIndex143 := position, tokenIndex + position136, tokenIndex136 := position, tokenIndex { - position144, tokenIndex144 := position, tokenIndex + position137, tokenIndex137 := position, tokenIndex if !_rules[rulecomma]() { - goto l145 + goto l138 } - goto l144 - l145: - position, tokenIndex = position144, tokenIndex144 + goto l137 + l138: + position, tokenIndex = position137, tokenIndex137 if !_rules[rulesp]() { - goto l142 + goto l135 } if !_rules[ruleclose]() { - goto l142 + goto l135 } } - l144: - position, tokenIndex = position143, tokenIndex143 + l137: + position, tokenIndex = position136, tokenIndex136 } { add(ruleAction31, position) } - goto l136 - l142: - position, tokenIndex = position136, tokenIndex136 + goto l129 + l135: + position, tokenIndex = position129, tokenIndex129 if buffer[position] != rune('f') { - goto l147 + goto l140 } position++ if buffer[position] != rune('a') { - goto l147 + goto l140 } position++ if buffer[position] != rune('l') { - goto l147 + goto l140 } position++ if buffer[position] != rune('s') { - goto l147 + goto l140 } position++ if buffer[position] != rune('e') { - goto l147 + goto l140 } position++ { - position148, tokenIndex148 := position, tokenIndex + position141, tokenIndex141 := position, tokenIndex { - position149, tokenIndex149 := position, tokenIndex + position142, tokenIndex142 := position, tokenIndex if !_rules[rulecomma]() { - goto l150 + goto l143 } - goto l149 - l150: - position, tokenIndex = position149, tokenIndex149 + goto l142 + l143: + position, tokenIndex = position142, tokenIndex142 if !_rules[rulesp]() { - goto l147 + goto l140 } if !_rules[ruleclose]() { - goto l147 + goto l140 } } - l149: - position, tokenIndex = position148, tokenIndex148 + l142: + position, tokenIndex = position141, tokenIndex141 } { add(ruleAction32, position) } - goto l136 - l147: - position, tokenIndex = position136, tokenIndex136 + goto l129 + l140: + position, tokenIndex = position129, tokenIndex129 { - position153 := position + position146 := position { - position154, tokenIndex154 := position, tokenIndex + position147, tokenIndex147 := position, tokenIndex if buffer[position] != rune('-') { - goto l154 + goto l147 } position++ - goto l155 - l154: - position, tokenIndex = position154, tokenIndex154 + goto l148 + l147: + position, tokenIndex = position147, tokenIndex147 } - l155: + l148: if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l152 + goto l145 } position++ - l156: + l149: { - position157, tokenIndex157 := position, tokenIndex + position150, tokenIndex150 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l157 + goto l150 } position++ - goto l156 - l157: - position, tokenIndex = position157, tokenIndex157 + goto l149 + l150: + position, tokenIndex = position150, tokenIndex150 } { - position158, tokenIndex158 := position, tokenIndex + position151, tokenIndex151 := position, tokenIndex if buffer[position] != rune('.') { + goto l151 + } + position++ + l153: + { + position154, tokenIndex154 := position, tokenIndex + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l154 + } + position++ + goto l153 + l154: + position, tokenIndex = position154, tokenIndex154 + } + goto l152 + l151: + position, tokenIndex = position151, tokenIndex151 + } + l152: + add(rulePegText, position146) + } + { + add(ruleAction33, position) + } + goto l129 + l145: + position, tokenIndex = position129, tokenIndex129 + { + position157 := position + { + position158, tokenIndex158 := position, tokenIndex + if buffer[position] != rune('-') { goto l158 } position++ - l160: - { - position161, tokenIndex161 := position, tokenIndex - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l161 - } - position++ - goto l160 - l161: - position, tokenIndex = position161, tokenIndex161 - } goto l159 l158: position, tokenIndex = position158, tokenIndex158 } l159: - add(rulePegText, position153) - } - { - add(ruleAction33, position) - } - goto l136 - l152: - position, tokenIndex = position136, tokenIndex136 - { - position164 := position - { - position165, tokenIndex165 := position, tokenIndex - if buffer[position] != rune('-') { - goto l165 - } - position++ - goto l166 - l165: - position, tokenIndex = position165, tokenIndex165 - } - l166: if buffer[position] != rune('.') { - goto l163 + goto l156 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l163 + goto l156 } position++ - l167: + l160: { - position168, tokenIndex168 := position, tokenIndex + position161, tokenIndex161 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l161 + } + position++ + goto l160 + l161: + position, tokenIndex = position161, tokenIndex161 + } + add(rulePegText, position157) + } + { + add(ruleAction34, position) + } + goto l129 + l156: + position, tokenIndex = position129, tokenIndex129 + { + position164 := position + { + position167, tokenIndex167 := position, tokenIndex + if c := buffer[position]; c < rune('a') || c > rune('z') { goto l168 } position++ goto l167 l168: - position, tokenIndex = position168, tokenIndex168 + position, tokenIndex = position167, tokenIndex167 + if c := buffer[position]; c < rune('A') || c > rune('Z') { + goto l169 + } + position++ + goto l167 + l169: + position, tokenIndex = position167, tokenIndex167 + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l170 + } + position++ + goto l167 + l170: + position, tokenIndex = position167, tokenIndex167 + if buffer[position] != rune('-') { + goto l171 + } + position++ + goto l167 + l171: + position, tokenIndex = position167, tokenIndex167 + if buffer[position] != rune('_') { + goto l172 + } + position++ + goto l167 + l172: + position, tokenIndex = position167, tokenIndex167 + if buffer[position] != rune(':') { + goto l163 + } + position++ + } + l167: + l165: + { + position166, tokenIndex166 := position, tokenIndex + { + position173, tokenIndex173 := position, tokenIndex + if c := buffer[position]; c < rune('a') || c > rune('z') { + goto l174 + } + position++ + goto l173 + l174: + position, tokenIndex = position173, tokenIndex173 + if c := buffer[position]; c < rune('A') || c > rune('Z') { + goto l175 + } + position++ + goto l173 + l175: + position, tokenIndex = position173, tokenIndex173 + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l176 + } + position++ + goto l173 + l176: + position, tokenIndex = position173, tokenIndex173 + if buffer[position] != rune('-') { + goto l177 + } + position++ + goto l173 + l177: + position, tokenIndex = position173, tokenIndex173 + if buffer[position] != rune('_') { + goto l178 + } + position++ + goto l173 + l178: + position, tokenIndex = position173, tokenIndex173 + if buffer[position] != rune(':') { + goto l166 + } + position++ + } + l173: + goto l165 + l166: + position, tokenIndex = position166, tokenIndex166 } add(rulePegText, position164) } - { - add(ruleAction34, position) - } - goto l136 - l163: - position, tokenIndex = position136, tokenIndex136 - { - position171 := position - { - position174, tokenIndex174 := position, tokenIndex - if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l175 - } - position++ - goto l174 - l175: - position, tokenIndex = position174, tokenIndex174 - if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l176 - } - position++ - goto l174 - l176: - position, tokenIndex = position174, tokenIndex174 - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l177 - } - position++ - goto l174 - l177: - position, tokenIndex = position174, tokenIndex174 - if buffer[position] != rune('-') { - goto l178 - } - position++ - goto l174 - l178: - position, tokenIndex = position174, tokenIndex174 - if buffer[position] != rune('_') { - goto l179 - } - position++ - goto l174 - l179: - position, tokenIndex = position174, tokenIndex174 - if buffer[position] != rune(':') { - goto l170 - } - position++ - } - l174: - l172: - { - position173, tokenIndex173 := position, tokenIndex - { - position180, tokenIndex180 := position, tokenIndex - if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l181 - } - position++ - goto l180 - l181: - position, tokenIndex = position180, tokenIndex180 - if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l182 - } - position++ - goto l180 - l182: - position, tokenIndex = position180, tokenIndex180 - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l183 - } - position++ - goto l180 - l183: - position, tokenIndex = position180, tokenIndex180 - if buffer[position] != rune('-') { - goto l184 - } - position++ - goto l180 - l184: - position, tokenIndex = position180, tokenIndex180 - if buffer[position] != rune('_') { - goto l185 - } - position++ - goto l180 - l185: - position, tokenIndex = position180, tokenIndex180 - if buffer[position] != rune(':') { - goto l173 - } - position++ - } - l180: - goto l172 - l173: - position, tokenIndex = position173, tokenIndex173 - } - add(rulePegText, position171) - } { add(ruleAction35, position) } - goto l136 - l170: - position, tokenIndex = position136, tokenIndex136 + goto l129 + l163: + position, tokenIndex = position129, tokenIndex129 if buffer[position] != rune('"') { - goto l187 + goto l180 } position++ { - position188 := position - { - position189 := position - l190: - { - position191, tokenIndex191 := position, tokenIndex - { - position192, tokenIndex192 := position, tokenIndex - { - position194, tokenIndex194 := position, tokenIndex - { - position195, tokenIndex195 := position, tokenIndex - if buffer[position] != rune('"') { - goto l196 - } - position++ - goto l195 - l196: - position, tokenIndex = position195, tokenIndex195 - if buffer[position] != rune('\\') { - goto l197 - } - position++ - goto l195 - l197: - position, tokenIndex = position195, tokenIndex195 - if buffer[position] != rune('\n') { - goto l194 - } - position++ - } - l195: - goto l193 - l194: - position, tokenIndex = position194, tokenIndex194 - } - if !matchDot() { - goto l193 - } - goto l192 - l193: - position, tokenIndex = position192, tokenIndex192 - if buffer[position] != rune('\\') { - goto l198 - } - position++ - if buffer[position] != rune('n') { - goto l198 - } - position++ - goto l192 - l198: - position, tokenIndex = position192, tokenIndex192 - if buffer[position] != rune('\\') { - goto l199 - } - position++ - if buffer[position] != rune('"') { - goto l199 - } - position++ - goto l192 - l199: - position, tokenIndex = position192, tokenIndex192 - if buffer[position] != rune('\\') { - goto l200 - } - position++ - if buffer[position] != rune('\'') { - goto l200 - } - position++ - goto l192 - l200: - position, tokenIndex = position192, tokenIndex192 - if buffer[position] != rune('\\') { - goto l191 - } - position++ - if buffer[position] != rune('\\') { - goto l191 - } - position++ - } - l192: - goto l190 - l191: - position, tokenIndex = position191, tokenIndex191 - } - add(ruledoublequotedstring, position189) + position181 := position + if !_rules[ruledoublequotedstring]() { + goto l180 } - add(rulePegText, position188) + add(rulePegText, position181) } if buffer[position] != rune('"') { - goto l187 + goto l180 } position++ { add(ruleAction36, position) } - goto l136 - l187: - position, tokenIndex = position136, tokenIndex136 + goto l129 + l180: + position, tokenIndex = position129, tokenIndex129 if buffer[position] != rune('\'') { - goto l134 + goto l127 } position++ { - position202 := position + position183 := position { - position203 := position - l204: + position184 := position + l185: { - position205, tokenIndex205 := position, tokenIndex + position186, tokenIndex186 := position, tokenIndex { - position206, tokenIndex206 := position, tokenIndex + position187, tokenIndex187 := position, tokenIndex { - position208, tokenIndex208 := position, tokenIndex + position189, tokenIndex189 := position, tokenIndex { - position209, tokenIndex209 := position, tokenIndex + position190, tokenIndex190 := position, tokenIndex if buffer[position] != rune('\'') { - goto l210 + goto l191 } position++ - goto l209 - l210: - position, tokenIndex = position209, tokenIndex209 + goto l190 + l191: + position, tokenIndex = position190, tokenIndex190 if buffer[position] != rune('\\') { - goto l211 + goto l192 } position++ - goto l209 - l211: - position, tokenIndex = position209, tokenIndex209 + goto l190 + l192: + position, tokenIndex = position190, tokenIndex190 if buffer[position] != rune('\n') { - goto l208 + goto l189 } position++ } - l209: - goto l207 - l208: - position, tokenIndex = position208, tokenIndex208 + l190: + goto l188 + l189: + position, tokenIndex = position189, tokenIndex189 } if !matchDot() { - goto l207 + goto l188 } - goto l206 - l207: - position, tokenIndex = position206, tokenIndex206 + goto l187 + l188: + position, tokenIndex = position187, tokenIndex187 if buffer[position] != rune('\\') { - goto l212 + goto l193 } position++ if buffer[position] != rune('n') { - goto l212 + goto l193 } position++ - goto l206 - l212: - position, tokenIndex = position206, tokenIndex206 + goto l187 + l193: + position, tokenIndex = position187, tokenIndex187 if buffer[position] != rune('\\') { - goto l213 + goto l194 } position++ if buffer[position] != rune('"') { - goto l213 + goto l194 } position++ - goto l206 - l213: - position, tokenIndex = position206, tokenIndex206 + goto l187 + l194: + position, tokenIndex = position187, tokenIndex187 if buffer[position] != rune('\\') { - goto l214 + goto l195 } position++ if buffer[position] != rune('\'') { - goto l214 + goto l195 } position++ - goto l206 - l214: - position, tokenIndex = position206, tokenIndex206 + goto l187 + l195: + position, tokenIndex = position187, tokenIndex187 if buffer[position] != rune('\\') { - goto l205 + goto l186 } position++ if buffer[position] != rune('\\') { - goto l205 + goto l186 } position++ } - l206: - goto l204 - l205: - position, tokenIndex = position205, tokenIndex205 + l187: + goto l185 + l186: + position, tokenIndex = position186, tokenIndex186 } - add(rulesinglequotedstring, position203) + add(rulesinglequotedstring, position184) } - add(rulePegText, position202) + add(rulePegText, position183) } if buffer[position] != rune('\'') { - goto l134 + goto l127 } position++ { add(ruleAction37, position) } } - l136: - add(ruleitem, position135) + l129: + add(ruleitem, position128) } return true - l134: - position, tokenIndex = position134, tokenIndex134 + l127: + position, tokenIndex = position127, tokenIndex127 return false }, /* 14 doublequotedstring <- <((!('"' / '\\' / '\n') .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ - nil, + func() bool { + { + position198 := position + l199: + { + position200, tokenIndex200 := position, tokenIndex + { + position201, tokenIndex201 := position, tokenIndex + { + position203, tokenIndex203 := position, tokenIndex + { + position204, tokenIndex204 := position, tokenIndex + if buffer[position] != rune('"') { + goto l205 + } + position++ + goto l204 + l205: + position, tokenIndex = position204, tokenIndex204 + if buffer[position] != rune('\\') { + goto l206 + } + position++ + goto l204 + l206: + position, tokenIndex = position204, tokenIndex204 + if buffer[position] != rune('\n') { + goto l203 + } + position++ + } + l204: + goto l202 + l203: + position, tokenIndex = position203, tokenIndex203 + } + if !matchDot() { + goto l202 + } + goto l201 + l202: + position, tokenIndex = position201, tokenIndex201 + if buffer[position] != rune('\\') { + goto l207 + } + position++ + if buffer[position] != rune('n') { + goto l207 + } + position++ + goto l201 + l207: + position, tokenIndex = position201, tokenIndex201 + if buffer[position] != rune('\\') { + goto l208 + } + position++ + if buffer[position] != rune('"') { + goto l208 + } + position++ + goto l201 + l208: + position, tokenIndex = position201, tokenIndex201 + if buffer[position] != rune('\\') { + goto l209 + } + position++ + if buffer[position] != rune('\'') { + goto l209 + } + position++ + goto l201 + l209: + position, tokenIndex = position201, tokenIndex201 + if buffer[position] != rune('\\') { + goto l200 + } + position++ + if buffer[position] != rune('\\') { + goto l200 + } + position++ + } + l201: + goto l199 + l200: + position, tokenIndex = position200, tokenIndex200 + } + add(ruledoublequotedstring, position198) + } + return true + }, /* 15 singlequotedstring <- <((!('\'' / '\\' / '\n') .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ nil, /* 16 fieldExpr <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / [0-9] / '_')*)> */ func() bool { - position218, tokenIndex218 := position, tokenIndex + position211, tokenIndex211 := position, tokenIndex { - position219 := position + position212 := position { - position220, tokenIndex220 := position, tokenIndex + position213, tokenIndex213 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l221 + goto l214 } position++ - goto l220 - l221: - position, tokenIndex = position220, tokenIndex220 + goto l213 + l214: + position, tokenIndex = position213, tokenIndex213 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l218 + goto l211 } position++ } - l220: - l222: + l213: + l215: { - position223, tokenIndex223 := position, tokenIndex + position216, tokenIndex216 := position, tokenIndex { - position224, tokenIndex224 := position, tokenIndex + position217, tokenIndex217 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l225 + goto l218 } position++ + goto l217 + l218: + position, tokenIndex = position217, tokenIndex217 + if c := buffer[position]; c < rune('A') || c > rune('Z') { + goto l219 + } + position++ + goto l217 + l219: + position, tokenIndex = position217, tokenIndex217 + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l220 + } + position++ + goto l217 + l220: + position, tokenIndex = position217, tokenIndex217 + if buffer[position] != rune('_') { + goto l216 + } + position++ + } + l217: + goto l215 + l216: + position, tokenIndex = position216, tokenIndex216 + } + add(rulefieldExpr, position212) + } + return true + l211: + position, tokenIndex = position211, tokenIndex211 + return false + }, + /* 17 field <- <(<(fieldExpr / reserved)> Action38)> */ + func() bool { + position221, tokenIndex221 := position, tokenIndex + { + position222 := position + { + position223 := position + { + position224, tokenIndex224 := position, tokenIndex + if !_rules[rulefieldExpr]() { + goto l225 + } goto l224 l225: position, tokenIndex = position224, tokenIndex224 - if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l226 + { + position226 := position + { + position227, tokenIndex227 := position, tokenIndex + if buffer[position] != rune('_') { + goto l228 + } + position++ + if buffer[position] != rune('r') { + goto l228 + } + position++ + if buffer[position] != rune('o') { + goto l228 + } + position++ + if buffer[position] != rune('w') { + goto l228 + } + position++ + goto l227 + l228: + position, tokenIndex = position227, tokenIndex227 + if buffer[position] != rune('_') { + goto l229 + } + position++ + if buffer[position] != rune('c') { + goto l229 + } + position++ + if buffer[position] != rune('o') { + goto l229 + } + position++ + if buffer[position] != rune('l') { + goto l229 + } + position++ + goto l227 + l229: + position, tokenIndex = position227, tokenIndex227 + if buffer[position] != rune('_') { + goto l230 + } + position++ + if buffer[position] != rune('s') { + goto l230 + } + position++ + if buffer[position] != rune('t') { + goto l230 + } + position++ + if buffer[position] != rune('a') { + goto l230 + } + position++ + if buffer[position] != rune('r') { + goto l230 + } + position++ + if buffer[position] != rune('t') { + goto l230 + } + position++ + goto l227 + l230: + position, tokenIndex = position227, tokenIndex227 + if buffer[position] != rune('_') { + goto l231 + } + position++ + if buffer[position] != rune('e') { + goto l231 + } + position++ + if buffer[position] != rune('n') { + goto l231 + } + position++ + if buffer[position] != rune('d') { + goto l231 + } + position++ + goto l227 + l231: + position, tokenIndex = position227, tokenIndex227 + if buffer[position] != rune('_') { + goto l232 + } + position++ + if buffer[position] != rune('t') { + goto l232 + } + position++ + if buffer[position] != rune('i') { + goto l232 + } + position++ + if buffer[position] != rune('m') { + goto l232 + } + position++ + if buffer[position] != rune('e') { + goto l232 + } + position++ + if buffer[position] != rune('s') { + goto l232 + } + position++ + if buffer[position] != rune('t') { + goto l232 + } + position++ + if buffer[position] != rune('a') { + goto l232 + } + position++ + if buffer[position] != rune('m') { + goto l232 + } + position++ + if buffer[position] != rune('p') { + goto l232 + } + position++ + goto l227 + l232: + position, tokenIndex = position227, tokenIndex227 + if buffer[position] != rune('_') { + goto l221 + } + position++ + if buffer[position] != rune('f') { + goto l221 + } + position++ + if buffer[position] != rune('i') { + goto l221 + } + position++ + if buffer[position] != rune('e') { + goto l221 + } + position++ + if buffer[position] != rune('l') { + goto l221 + } + position++ + if buffer[position] != rune('d') { + goto l221 + } + position++ + } + l227: + add(rulereserved, position226) } - position++ - goto l224 - l226: - position, tokenIndex = position224, tokenIndex224 - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l227 - } - position++ - goto l224 - l227: - position, tokenIndex = position224, tokenIndex224 - if buffer[position] != rune('_') { - goto l223 - } - position++ } l224: - goto l222 - l223: - position, tokenIndex = position223, tokenIndex223 - } - add(rulefieldExpr, position219) - } - return true - l218: - position, tokenIndex = position218, tokenIndex218 - return false - }, - /* 17 field <- <( Action38)> */ - func() bool { - position228, tokenIndex228 := position, tokenIndex - { - position229 := position - { - position230 := position - if !_rules[rulefieldExpr]() { - goto l228 - } - add(rulePegText, position230) + add(rulePegText, position223) } { add(ruleAction38, position) } - add(rulefield, position229) + add(rulefield, position222) } return true - l228: - position, tokenIndex = position228, tokenIndex228 + l221: + position, tokenIndex = position221, tokenIndex221 return false }, - /* 18 posfield <- <( Action39)> */ + /* 18 reserved <- <(('_' 'r' 'o' 'w') / ('_' 'c' 'o' 'l') / ('_' 's' 't' 'a' 'r' 't') / ('_' 'e' 'n' 'd') / ('_' 't' 'i' 'm' 'e' 's' 't' 'a' 'm' 'p') / ('_' 'f' 'i' 'e' 'l' 'd'))> */ + nil, + /* 19 posfield <- <( Action39)> */ func() bool { - position232, tokenIndex232 := position, tokenIndex + position235, tokenIndex235 := position, tokenIndex { - position233 := position + position236 := position { - position234 := position + position237 := position if !_rules[rulefieldExpr]() { - goto l232 + goto l235 } - add(rulePegText, position234) + add(rulePegText, position237) } { add(ruleAction39, position) } - add(ruleposfield, position233) + add(ruleposfield, position236) } return true - l232: - position, tokenIndex = position232, tokenIndex232 + l235: + position, tokenIndex = position235, tokenIndex235 return false }, - /* 19 uint <- <(([1-9] [0-9]*) / '0')> */ + /* 20 uint <- <(([1-9] [0-9]*) / '0')> */ func() bool { - position236, tokenIndex236 := position, tokenIndex + position239, tokenIndex239 := position, tokenIndex { - position237 := position + position240 := position { - position238, tokenIndex238 := position, tokenIndex + position241, tokenIndex241 := position, tokenIndex if c := buffer[position]; c < rune('1') || c > rune('9') { + goto l242 + } + position++ + l243: + { + position244, tokenIndex244 := position, tokenIndex + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l244 + } + position++ + goto l243 + l244: + position, tokenIndex = position244, tokenIndex244 + } + goto l241 + l242: + position, tokenIndex = position241, tokenIndex241 + if buffer[position] != rune('0') { goto l239 } position++ - l240: + } + l241: + add(ruleuint, position240) + } + return true + l239: + position, tokenIndex = position239, tokenIndex239 + return false + }, + /* 21 uintrow <- <( Action40)> */ + nil, + /* 22 col <- <(( Action41) / ('"' '"' Action42))> */ + func() bool { + position246, tokenIndex246 := position, tokenIndex + { + position247 := position + { + position248, tokenIndex248 := position, tokenIndex { - position241, tokenIndex241 := position, tokenIndex - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l241 + position250 := position + if !_rules[ruleuint]() { + goto l249 } - position++ - goto l240 - l241: - position, tokenIndex = position241, tokenIndex241 + add(rulePegText, position250) } - goto l238 - l239: - position, tokenIndex = position238, tokenIndex238 - if buffer[position] != rune('0') { - goto l236 + { + add(ruleAction41, position) + } + goto l248 + l249: + position, tokenIndex = position248, tokenIndex248 + if buffer[position] != rune('"') { + goto l246 } position++ - } - l238: - add(ruleuint, position237) - } - return true - l236: - position, tokenIndex = position236, tokenIndex236 - return false - }, - /* 20 uintrow <- <( Action40)> */ - nil, - /* 21 uintcol <- <( Action41)> */ - func() bool { - position243, tokenIndex243 := position, tokenIndex - { - position244 := position - { - position245 := position - if !_rules[ruleuint]() { - goto l243 - } - add(rulePegText, position245) - } - { - add(ruleAction41, position) - } - add(ruleuintcol, position244) - } - return true - l243: - position, tokenIndex = position243, tokenIndex243 - return false - }, - /* 22 open <- <('(' sp)> */ - func() bool { - position247, tokenIndex247 := position, tokenIndex - { - position248 := position - if buffer[position] != rune('(') { - goto l247 - } - position++ - if !_rules[rulesp]() { - goto l247 - } - add(ruleopen, position248) - } - return true - l247: - position, tokenIndex = position247, tokenIndex247 - return false - }, - /* 23 close <- <(')' sp)> */ - func() bool { - position249, tokenIndex249 := position, tokenIndex - { - position250 := position - if buffer[position] != rune(')') { - goto l249 - } - position++ - if !_rules[rulesp]() { - goto l249 - } - add(ruleclose, position250) - } - return true - l249: - position, tokenIndex = position249, tokenIndex249 - return false - }, - /* 24 sp <- <(' ' / '\t')*> */ - func() bool { - { - position252 := position - l253: - { - position254, tokenIndex254 := position, tokenIndex { - position255, tokenIndex255 := position, tokenIndex + position252 := position + if !_rules[ruledoublequotedstring]() { + goto l246 + } + add(rulePegText, position252) + } + if buffer[position] != rune('"') { + goto l246 + } + position++ + { + add(ruleAction42, position) + } + } + l248: + add(rulecol, position247) + } + return true + l246: + position, tokenIndex = position246, tokenIndex246 + return false + }, + /* 23 open <- <('(' sp)> */ + func() bool { + position254, tokenIndex254 := position, tokenIndex + { + position255 := position + if buffer[position] != rune('(') { + goto l254 + } + position++ + if !_rules[rulesp]() { + goto l254 + } + add(ruleopen, position255) + } + return true + l254: + position, tokenIndex = position254, tokenIndex254 + return false + }, + /* 24 close <- <(')' sp)> */ + func() bool { + position256, tokenIndex256 := position, tokenIndex + { + position257 := position + if buffer[position] != rune(')') { + goto l256 + } + position++ + if !_rules[rulesp]() { + goto l256 + } + add(ruleclose, position257) + } + return true + l256: + position, tokenIndex = position256, tokenIndex256 + return false + }, + /* 25 sp <- <(' ' / '\t')*> */ + func() bool { + { + position259 := position + l260: + { + position261, tokenIndex261 := position, tokenIndex + { + position262, tokenIndex262 := position, tokenIndex if buffer[position] != rune(' ') { - goto l256 + goto l263 } position++ - goto l255 - l256: - position, tokenIndex = position255, tokenIndex255 + goto l262 + l263: + position, tokenIndex = position262, tokenIndex262 if buffer[position] != rune('\t') { - goto l254 + goto l261 } position++ } - l255: - goto l253 - l254: - position, tokenIndex = position254, tokenIndex254 + l262: + goto l260 + l261: + position, tokenIndex = position261, tokenIndex261 } - add(rulesp, position252) + add(rulesp, position259) } return true }, - /* 25 comma <- <(sp ',' whitesp)> */ + /* 26 comma <- <(sp ',' whitesp)> */ func() bool { - position257, tokenIndex257 := position, tokenIndex + position264, tokenIndex264 := position, tokenIndex { - position258 := position + position265 := position if !_rules[rulesp]() { - goto l257 + goto l264 } if buffer[position] != rune(',') { - goto l257 + goto l264 } position++ if !_rules[rulewhitesp]() { - goto l257 + goto l264 } - add(rulecomma, position258) + add(rulecomma, position265) } return true - l257: - position, tokenIndex = position257, tokenIndex257 + l264: + position, tokenIndex = position264, tokenIndex264 return false }, - /* 26 lbrack <- <('[' sp)> */ + /* 27 lbrack <- <('[' sp)> */ nil, - /* 27 rbrack <- <(sp ']' sp)> */ + /* 28 rbrack <- <(sp ']' sp)> */ nil, - /* 28 whitesp <- <(' ' / '\t' / '\n')*> */ + /* 29 whitesp <- <(' ' / '\t' / '\n')*> */ func() bool { { - position262 := position - l263: + position269 := position + l270: { - position264, tokenIndex264 := position, tokenIndex + position271, tokenIndex271 := position, tokenIndex { - position265, tokenIndex265 := position, tokenIndex + position272, tokenIndex272 := position, tokenIndex if buffer[position] != rune(' ') { - goto l266 + goto l273 } position++ - goto l265 - l266: - position, tokenIndex = position265, tokenIndex265 + goto l272 + l273: + position, tokenIndex = position272, tokenIndex272 if buffer[position] != rune('\t') { - goto l267 + goto l274 } position++ - goto l265 - l267: - position, tokenIndex = position265, tokenIndex265 + goto l272 + l274: + position, tokenIndex = position272, tokenIndex272 if buffer[position] != rune('\n') { - goto l264 + goto l271 } position++ } - l265: - goto l263 - l264: - position, tokenIndex = position264, tokenIndex264 + l272: + goto l270 + l271: + position, tokenIndex = position271, tokenIndex271 } - add(rulewhitesp, position262) + add(rulewhitesp, position269) } return true }, - /* 29 IDENT <- <(!(('S' 'e' 't' '(') / ('S' 'e' 't' 'R' 'o' 'w' 'A' 't' 't' 'r' 's' '(') / ('S' 'e' 't' 'C' 'o' 'l' 'u' 'm' 'n' 'A' 't' 't' 'r' 's' '(') / ('C' 'l' 'e' 'a' 'r' '(') / ('T' 'o' 'p' 'N' '(') / ('R' 'a' 'n' 'g' 'e' '(')) ([a-z] / [A-Z]) ([a-z] / [A-Z] / [0-9])*)> */ + /* 30 IDENT <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / [0-9])*)> */ nil, - /* 30 timestampbasicfmt <- <([0-9] [0-9] [0-9] [0-9] '-' ('0' / '1') [0-9] '-' [0-3] [0-9] 'T' [0-9] [0-9] ':' [0-9] [0-9])> */ + /* 31 timestampbasicfmt <- <([0-9] [0-9] [0-9] [0-9] '-' ('0' / '1') [0-9] '-' [0-3] [0-9] 'T' [0-9] [0-9] ':' [0-9] [0-9])> */ func() bool { - position269, tokenIndex269 := position, tokenIndex + position276, tokenIndex276 := position, tokenIndex { - position270 := position + position277 := position if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if buffer[position] != rune('-') { - goto l269 + goto l276 } position++ { - position271, tokenIndex271 := position, tokenIndex + position278, tokenIndex278 := position, tokenIndex if buffer[position] != rune('0') { - goto l272 + goto l279 } position++ - goto l271 - l272: - position, tokenIndex = position271, tokenIndex271 + goto l278 + l279: + position, tokenIndex = position278, tokenIndex278 if buffer[position] != rune('1') { - goto l269 + goto l276 } position++ } - l271: + l278: if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if buffer[position] != rune('-') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('3') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if buffer[position] != rune('T') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if buffer[position] != rune(':') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l269 + goto l276 } position++ - add(ruletimestampbasicfmt, position270) + add(ruletimestampbasicfmt, position277) } return true - l269: - position, tokenIndex = position269, tokenIndex269 + l276: + position, tokenIndex = position276, tokenIndex276 return false }, - /* 31 timestampfmt <- <(('"' timestampbasicfmt '"') / ('\'' timestampbasicfmt '\'') / timestampbasicfmt)> */ + /* 32 timestampfmt <- <(('"' timestampbasicfmt '"') / ('\'' timestampbasicfmt '\'') / timestampbasicfmt)> */ func() bool { - position273, tokenIndex273 := position, tokenIndex + position280, tokenIndex280 := position, tokenIndex { - position274 := position + position281 := position { - position275, tokenIndex275 := position, tokenIndex + position282, tokenIndex282 := position, tokenIndex if buffer[position] != rune('"') { - goto l276 + goto l283 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l276 + goto l283 } if buffer[position] != rune('"') { - goto l276 + goto l283 } position++ - goto l275 - l276: - position, tokenIndex = position275, tokenIndex275 + goto l282 + l283: + position, tokenIndex = position282, tokenIndex282 if buffer[position] != rune('\'') { - goto l277 + goto l284 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l277 + goto l284 } if buffer[position] != rune('\'') { - goto l277 + goto l284 } position++ - goto l275 - l277: - position, tokenIndex = position275, tokenIndex275 + goto l282 + l284: + position, tokenIndex = position282, tokenIndex282 if !_rules[ruletimestampbasicfmt]() { - goto l273 + goto l280 } } - l275: - add(ruletimestampfmt, position274) + l282: + add(ruletimestampfmt, position281) } return true - l273: - position, tokenIndex = position273, tokenIndex273 + l280: + position, tokenIndex = position280, tokenIndex280 return false }, - /* 32 timestamp <- <( Action42)> */ + /* 33 timestamp <- <( Action43)> */ nil, - /* 34 Action0 <- <{p.startCall("Set")}> */ + /* 35 Action0 <- <{p.startCall("Set")}> */ nil, - /* 35 Action1 <- <{p.endCall()}> */ + /* 36 Action1 <- <{p.endCall()}> */ nil, - /* 36 Action2 <- <{p.startCall("SetRowAttrs")}> */ + /* 37 Action2 <- <{p.startCall("SetRowAttrs")}> */ nil, - /* 37 Action3 <- <{p.endCall()}> */ + /* 38 Action3 <- <{p.endCall()}> */ nil, - /* 38 Action4 <- <{p.startCall("SetColumnAttrs")}> */ + /* 39 Action4 <- <{p.startCall("SetColumnAttrs")}> */ nil, - /* 39 Action5 <- <{p.endCall()}> */ + /* 40 Action5 <- <{p.endCall()}> */ nil, - /* 40 Action6 <- <{p.startCall("Clear")}> */ + /* 41 Action6 <- <{p.startCall("Clear")}> */ nil, - /* 41 Action7 <- <{p.endCall()}> */ + /* 42 Action7 <- <{p.endCall()}> */ nil, - /* 42 Action8 <- <{p.startCall("TopN")}> */ + /* 43 Action8 <- <{p.startCall("TopN")}> */ nil, - /* 43 Action9 <- <{p.endCall()}> */ + /* 44 Action9 <- <{p.endCall()}> */ nil, - /* 44 Action10 <- <{p.startCall("Range")}> */ + /* 45 Action10 <- <{p.startCall("Range")}> */ nil, - /* 45 Action11 <- <{p.endCall()}> */ + /* 46 Action11 <- <{p.endCall()}> */ nil, nil, - /* 47 Action12 <- <{ p.startCall(buffer[begin:end] ) }> */ + /* 48 Action12 <- <{ p.startCall(buffer[begin:end] ) }> */ nil, - /* 48 Action13 <- <{ p.endCall() }> */ + /* 49 Action13 <- <{ p.endCall() }> */ nil, - /* 49 Action14 <- <{ p.addBTWN() }> */ + /* 50 Action14 <- <{ p.addBTWN() }> */ nil, - /* 50 Action15 <- <{ p.addLTE() }> */ + /* 51 Action15 <- <{ p.addLTE() }> */ nil, - /* 51 Action16 <- <{ p.addGTE() }> */ + /* 52 Action16 <- <{ p.addGTE() }> */ nil, - /* 52 Action17 <- <{ p.addEQ() }> */ + /* 53 Action17 <- <{ p.addEQ() }> */ nil, - /* 53 Action18 <- <{ p.addNEQ() }> */ + /* 54 Action18 <- <{ p.addNEQ() }> */ nil, - /* 54 Action19 <- <{ p.addLT() }> */ + /* 55 Action19 <- <{ p.addLT() }> */ nil, - /* 55 Action20 <- <{ p.addGT() }> */ + /* 56 Action20 <- <{ p.addGT() }> */ nil, - /* 56 Action21 <- <{p.startConditional()}> */ + /* 57 Action21 <- <{p.startConditional()}> */ nil, - /* 57 Action22 <- <{p.endConditional()}> */ + /* 58 Action22 <- <{p.endConditional()}> */ nil, - /* 58 Action23 <- <{p.condAdd(buffer[begin:end])}> */ + /* 59 Action23 <- <{p.condAdd(buffer[begin:end])}> */ nil, - /* 59 Action24 <- <{p.condAdd(buffer[begin:end])}> */ + /* 60 Action24 <- <{p.condAdd(buffer[begin:end])}> */ nil, - /* 60 Action25 <- <{p.condAdd(buffer[begin:end])}> */ + /* 61 Action25 <- <{p.condAdd(buffer[begin:end])}> */ nil, - /* 61 Action26 <- <{p.addPosStr("_start", buffer[begin:end])}> */ + /* 62 Action26 <- <{p.addPosStr("_start", buffer[begin:end])}> */ nil, - /* 62 Action27 <- <{p.addPosStr("_end", buffer[begin:end])}> */ + /* 63 Action27 <- <{p.addPosStr("_end", buffer[begin:end])}> */ nil, - /* 63 Action28 <- <{ p.startList() }> */ + /* 64 Action28 <- <{ p.startList() }> */ nil, - /* 64 Action29 <- <{ p.endList() }> */ + /* 65 Action29 <- <{ p.endList() }> */ nil, - /* 65 Action30 <- <{ p.addVal(nil) }> */ + /* 66 Action30 <- <{ p.addVal(nil) }> */ nil, - /* 66 Action31 <- <{ p.addVal(true) }> */ + /* 67 Action31 <- <{ p.addVal(true) }> */ nil, - /* 67 Action32 <- <{ p.addVal(false) }> */ + /* 68 Action32 <- <{ p.addVal(false) }> */ nil, - /* 68 Action33 <- <{ p.addNumVal(buffer[begin:end]) }> */ + /* 69 Action33 <- <{ p.addNumVal(buffer[begin:end]) }> */ nil, - /* 69 Action34 <- <{ p.addNumVal(buffer[begin:end]) }> */ + /* 70 Action34 <- <{ p.addNumVal(buffer[begin:end]) }> */ nil, - /* 70 Action35 <- <{ p.addVal(buffer[begin:end]) }> */ + /* 71 Action35 <- <{ p.addVal(buffer[begin:end]) }> */ nil, - /* 71 Action36 <- <{ p.addVal(buffer[begin:end]) }> */ + /* 72 Action36 <- <{ p.addVal(buffer[begin:end]) }> */ nil, - /* 72 Action37 <- <{ p.addVal(buffer[begin:end]) }> */ + /* 73 Action37 <- <{ p.addVal(buffer[begin:end]) }> */ nil, - /* 73 Action38 <- <{ p.addField(buffer[begin:end]) }> */ + /* 74 Action38 <- <{ p.addField(buffer[begin:end]) }> */ nil, - /* 74 Action39 <- <{ p.addPosStr("_field", buffer[begin:end]) }> */ + /* 75 Action39 <- <{ p.addPosStr("_field", buffer[begin:end]) }> */ nil, - /* 75 Action40 <- <{p.addPosNum("_row", buffer[begin:end])}> */ + /* 76 Action40 <- <{p.addPosNum("_row", buffer[begin:end])}> */ nil, - /* 76 Action41 <- <{p.addPosNum("_col", buffer[begin:end])}> */ + /* 77 Action41 <- <{p.addPosNum("_col", buffer[begin:end])}> */ nil, - /* 77 Action42 <- <{p.addPosStr("_timestamp", buffer[begin:end])}> */ + /* 78 Action42 <- <{p.addPosStr("_col", buffer[begin:end])}> */ + nil, + /* 79 Action43 <- <{p.addPosStr("_timestamp", buffer[begin:end])}> */ nil, } p.rules = _rules diff --git a/pql/pqlpeg_test.go b/pql/pqlpeg_test.go index 023bbc71c..1bedd797b 100644 --- a/pql/pqlpeg_test.go +++ b/pql/pqlpeg_test.go @@ -47,6 +47,13 @@ SetBit(Union(Zitmap(row==4), Intersect(Qitmap(blah>4), Ritmap(field="http://zoo9 } +func TestOldPQL(t *testing.T) { + _, err := ParseString(`SetBit(f=11, col=1)`) + if err != nil { + t.Fatalf("should have parsed: %v", err) + } +} + func TestPEGWorking(t *testing.T) { tests := []struct { name string @@ -59,7 +66,11 @@ func TestPEGWorking(t *testing.T) { ncalls: 0}, { name: "Set", - input: "Set(1, a=4)", + input: "Set(2, f=10)", + ncalls: 1}, + { + name: "SetTime", + input: "Set(2, f=1, 1999-12-31T00:00)", ncalls: 1}, { name: "DoubleSet", @@ -143,11 +154,11 @@ func TestPEGWorking(t *testing.T) { ncalls: 1}, { name: "SetColumnAttrs", - input: "SetColumnAttrs(blah, 9, a=47)", + input: "SetColumnAttrs(9, a=47)", ncalls: 1}, { name: "SetColumnAttrs2args", - input: "SetColumnAttrs(blah, 9, a=47, b=bval)", + input: "SetColumnAttrs(9, a=47, b=bval)", ncalls: 1}, { name: "Clear", @@ -233,12 +244,6 @@ func TestPEGErrors(t *testing.T) { name string input string }{ - { - name: "SetEmpty", - input: "Set()"}, - { - name: "SetNoCol", - input: "Set(a=4)"}, { name: "SetNoParens", input: "Set"}, @@ -248,24 +253,12 @@ func TestPEGErrors(t *testing.T) { { name: "SetTimestampNoArg", input: "Set(1, 2017-04-03T19:34)"}, - { - name: "SetRowAttrsNoField", - input: "SetRowAttrs(a=4)"}, - { - name: "SetColumnAttrsNoField", - input: "SetColumnAttrs(a=4)"}, - { - name: "ClearNoCol", - input: "Clear(a=4)"}, { name: "SetStartingComma", input: "Set(, 1, a=4)"}, { name: "StartinCommaArb", input: "Zeeb(, a=4)"}, - { - name: "TopN No Field", - input: "TopN(a=77)"}, { name: "SetRowAttrs0args", input: "SetRowAttrs(blah, 9)"}, @@ -320,13 +313,12 @@ func TestPQLDeepEquality(t *testing.T) { }}, { name: "SetColumnAttrs", - call: "SetColumnAttrs(myfield, 9, z=4)", + call: "SetColumnAttrs(9, z=4)", exp: &Call{ Name: "SetColumnAttrs", Args: map[string]interface{}{ - "z": int64(4), - "_field": "myfield", - "_col": int64(9), + "z": int64(4), + "_col": int64(9), }, }}, { @@ -472,6 +464,51 @@ func TestPQLDeepEquality(t *testing.T) { }, }, }}, + { + name: "Sum", + call: "Sum(field=f)", + exp: &Call{ + Name: "Sum", + Args: map[string]interface{}{ + "field": "f", + }, + }}, + { + name: "SumChild", + call: "Sum(Row(), field=f)", + exp: &Call{ + Name: "Sum", + Args: map[string]interface{}{ + "field": "f", + }, + Children: []*Call{ + {Name: "Row"}, + }, + }}, + { + name: "MinChild", + call: "Min(Row(), field=f)", + exp: &Call{ + Name: "Min", + Args: map[string]interface{}{ + "field": "f", + }, + Children: []*Call{ + {Name: "Row"}, + }, + }}, + { + name: "MaxChild", + call: "Max(Row(), field=f)", + exp: &Call{ + Name: "Max", + Args: map[string]interface{}{ + "field": "f", + }, + Children: []*Call{ + {Name: "Row"}, + }, + }}, } for i, test := range tests {