Query function
The Query function is depreciated. If you start with Sofawiki, use the Relation function.
The syntax of the query function looks like the SQL syntax, but it works on a more low level
- All queries are linearized to check only one fields condition
- The results of the queries are combined in a stack to create more complex queries
- The expressions use a stack with Reversed Polish Notation
- A line starting with # is a comment, and all text in this line is ignored
See also Sofawiki Database Primer and Differences between SQL and Sofawiki database
query = (selectstatement | filterstatement | importstatement | datastatement | wherestatement | groupstatement | orderstatement | limitstatement | UNION | exceptstatement | joinstatement | CROSS | COPY | POP | SWAP | projectstatement | ROTATE | renamestatement | formatstatement | numberformatstatement | calcstatement | templatestatement | outputstatement | stylestatement | # | FIELDS | VERBOSE)+
selectstatement = SELECT fieldlist (FROM (VIRTUAL)? name)? (wherestatement | IN valuelist)? (HINT string)?
fieldlist = field (, field)*
valuelist = string (:: string)*
optionlist = option (, value)*
option = parameter: value
name = string
filterstatement = FILTER hintedfieldlist
hintedfieldlist = field filterhint? (, field filterhint? )*
filterhint = "[a-z0-9_| ]+"|"*"
wherestatement = WHERE field (operator string | dollaroperator expression)
operator = (!)? (numericoperator | stringoperator | relaxedstringoperator | otheroperator)
numericoperator = (= | < | > | <= | >=)
stringoperator = (== | =* | *= | *=* | << | >> | >=)
relaxedstringoperator = { ~~ | !~ | ~* | *~ | *~* )
otheroperator = (* | 0 | r= )
dollaroperator = $operator
expression = (field | $field | number | quotedstring | + | - | * | / | . | :: | ABS | SIGN | COPY | POP | SWAP | SUBSTR | REPLACE | TRIM | FUNCTION-function )*
quotedstring = "(.)+(""(.)*)*"
importstatement = IMPORT (TAB | FIELDS) name
datastatement = DATA wikifields
wikifields = ([[field::string]])*
groupstatement = GROUP (fieldaggregation) (, fieldaggregation)* BY fieldlist
fieldaggregation = field (COUNT | SUM | MIN | MAX | AVG | CONCAT)?
orderstatement = ORDER fieldorder (, fieldorder)*
fieldorder = field (NUMERIC)? (DESC)?
limistatement = LIMIT number number
orstatement = UNION
exceptstatement = EXCEPT field
joinstatement = (JOIN | LEFTJOIN | OUTERJOIN) field
projectstatement = PROJECT fieldlist
renamestatement = RENAME (field | * | # ) string (, field string)*
formatstatement = FORMAT field string
numberformatstatement = NUMERFORMAT field (number)? (, field (number)? )*
calcstatement = CALC field expression
templatestatement = TEMPLATE field templatename
outputstatement = OUTPUT (HTML | HTMLPAGED number | LIST | LISTPAGED number | FIXED (fieldlist)? | FIELDS | TAB | TABHEADER | TEXT | TEXTSPACE | ROWTEMPLATE string) | CHART (BAR|LINE|PIE) (optionlist)?
stylestatement = STYLE string
Note on quantificators on this formal definition:
* zero or more
? zero or one
+ one or more