mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-08 11:57:51 +00:00
I tested this manually with BloomRPC and curl, but need to write real tests. Also need to get floats for decimal fields coming out of QueryPQL.
83 lines
3.9 KiB
Text
83 lines
3.9 KiB
Text
package pql
|
|
|
|
type PQL Peg {
|
|
Query
|
|
}
|
|
|
|
|
|
Calls <- sp (Call sp)* !.
|
|
Call <- 'Set' {p.startCall("Set")} open col comma args (comma timestamp)? close {p.endCall()}
|
|
/ 'SetRowAttrs' {p.startCall("SetRowAttrs")} open posfield comma row 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()}
|
|
/ 'ClearRow' {p.startCall("ClearRow")} open arg close {p.endCall()}
|
|
/ 'Store' {p.startCall("Store")} open Call comma arg close {p.endCall()}
|
|
/ 'TopN' {p.startCall("TopN")} open posfield (comma allargs)? close {p.endCall()}
|
|
/ 'Rows' {p.startCall("Rows")} open posfield (comma allargs)? close {p.endCall()}
|
|
/ 'Range' {p.startCall("Range")} open field sp '=' sp value comma 'from='? {p.addField("from")} timestampfmt {p.addVal(buffer[begin:end])} comma 'to='? sp {p.addField("to")} timestampfmt {p.addVal(buffer[begin:end])} close {p.endCall()}
|
|
/ < IDENT > { p.startCall(buffer[begin:end] ) } open allargs comma? close { p.endCall() }
|
|
allargs <- Call (comma Call)* (comma args)? / args / sp
|
|
args <- arg (comma args)? sp
|
|
arg <- ( field sp '=' sp value
|
|
/ field sp COND sp value
|
|
/ conditional
|
|
)
|
|
COND <- ( '><' { p.addBTWN() }
|
|
/ '<=' { p.addLTE() }
|
|
/ '>=' { p.addGTE() }
|
|
/ '==' { p.addEQ() }
|
|
/ '!=' { p.addNEQ() }
|
|
/ '<' { p.addLT() }
|
|
/ '>' { p.addGT() }
|
|
)
|
|
|
|
conditional <- {p.startConditional()} condint condLT condfield condLT condint {p.endConditional()}
|
|
condint <- <'-'? [1-9] [0-9]* / '0'> sp {p.condAdd(buffer[begin:end])}
|
|
condLT <- <('<=' / '<')> sp {p.condAdd(buffer[begin:end])}
|
|
condfield <- <fieldExpr> sp {p.condAdd(buffer[begin:end])}
|
|
|
|
value <- ( item
|
|
/ lbrack { p.startList() } list rbrack { p.endList() }
|
|
)
|
|
list <- item (comma list)?
|
|
item <- ( 'null' &(comma / sp close) { p.addVal(nil) }
|
|
/ 'true' &(comma / sp close) { p.addVal(true) }
|
|
/ 'false' &(comma / sp close) { p.addVal(false) }
|
|
/ timestampfmt { p.addVal(buffer[begin:end]) }
|
|
/ < '-'? [0-9]+ ('.'[0-9]*)? > { p.addNumVal(buffer[begin:end]) }
|
|
/ < '-'? '.'[0-9]+ > { p.addNumVal(buffer[begin:end]) }
|
|
/ < IDENT > { p.startCall(buffer[begin:end]) } open allargs comma? close { p.addVal(p.endCall()) }
|
|
/ < ([[A-Z]] / [0-9] / '-' / '_' / ':')+ > { p.addVal(buffer[begin:end]) }
|
|
/ < '"' doublequotedstring '"' > { s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) }
|
|
/ '\'' < singlequotedstring > '\'' { p.addVal(buffer[begin:end]) }
|
|
)
|
|
|
|
doublequotedstring <- ( '\\"' / '\\\\' / [^"] )*
|
|
singlequotedstring <- ( '\\\'' / '\\\\' / [^'] )*
|
|
|
|
fieldExpr <- ( [[A-Z]] / '_' ) ( [[A-Z]] / [0-9] / '_' / '-' )*
|
|
field <- <fieldExpr / reserved> { p.addField(buffer[begin:end]) }
|
|
reserved <- ('_row' / '_col' / '_start' / '_end' / '_timestamp' / '_field')
|
|
posfield <- <fieldExpr> { p.addPosStr("_field", buffer[begin:end]) }
|
|
uint <- [1-9] [0-9]* / '0'
|
|
col <- ( <uint> {p.addPosNum("_col", buffer[begin:end])}
|
|
/ '\'' <singlequotedstring> '\'' {p.addPosStr("_col", buffer[begin:end])}
|
|
/ '"' <doublequotedstring> '"' {p.addPosStr("_col", buffer[begin:end])}
|
|
)
|
|
row <- ( <uint> {p.addPosNum("_row", buffer[begin:end])}
|
|
/ '\'' <singlequotedstring> '\'' {p.addPosStr("_row", buffer[begin:end])}
|
|
/ '"' <doublequotedstring> '"' {p.addPosStr("_row", buffer[begin:end])}
|
|
)
|
|
|
|
open <- '(' sp
|
|
close <- ')' sp
|
|
sp <- ( ' ' / '\t' / '\n' )*
|
|
comma <- sp ',' sp
|
|
lbrack <- '[' sp
|
|
rbrack <- sp ']' sp
|
|
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]
|
|
timestampfmt <- '"' <timestampbasicfmt> '"' / '\'' <timestampbasicfmt> '\'' / <timestampbasicfmt>
|
|
timestamp <- <timestampfmt> {p.addPosStr("_timestamp", buffer[begin:end])}
|