mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-09-12 21:58:58 -04:00
both engines now agree on names, titles, tags, paths, types, sizes, dates, hidden flags, facet values and wildcards. quotes only delimit phrases and the equals operator matches the whole field value, following the kql spec. the index name carries a generation so a changed mapping starts on a fresh index, MIGRATION.md says how to fill it.
260 lines
5.2 KiB
Plaintext
260 lines
5.2 KiB
Plaintext
{
|
|
package kql
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// ast
|
|
////////////////////////////////////////////////////////
|
|
|
|
AST <-
|
|
n:Nodes {
|
|
return buildAST(n, c.text, c.pos)
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// nodes
|
|
////////////////////////////////////////////////////////
|
|
|
|
Nodes <-
|
|
(_ Node)+
|
|
|
|
Node <-
|
|
GroupNode /
|
|
PropertyRestrictionNodes /
|
|
OperatorBooleanNodes /
|
|
FreeTextKeywordNodes
|
|
|
|
////////////////////////////////////////////////////////
|
|
// nesting
|
|
////////////////////////////////////////////////////////
|
|
|
|
GroupNode <-
|
|
k:Key? (OperatorColonNode / OperatorEqualNode)? "(" v:Nodes ")" {
|
|
return buildGroupNode(k, v, c.text, c.pos)
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// property restrictions
|
|
////////////////////////////////////////////////////////
|
|
|
|
PropertyRestrictionNodes <-
|
|
YesNoPropertyRestrictionNode /
|
|
DateTimeRestrictionNode /
|
|
NumberRestrictionNode /
|
|
TextPropertyRestrictionNode
|
|
|
|
YesNoPropertyRestrictionNode <-
|
|
k:Key (OperatorColonNode / OperatorEqualNode) v:("true" / "false"){
|
|
return buildBooleanNode(k, v, c.text, c.pos)
|
|
}
|
|
|
|
DateTimeRestrictionNode <-
|
|
k:Key o:(
|
|
OperatorGreaterOrEqualNode /
|
|
OperatorLessOrEqualNode /
|
|
OperatorGreaterNode /
|
|
OperatorLessNode /
|
|
OperatorEqualNode /
|
|
OperatorColonNode
|
|
) '"'? v:(
|
|
DateTime /
|
|
FullDate /
|
|
FullTime
|
|
) '"'? {
|
|
return buildDateTimeNode(k, o, v, c.text, c.pos)
|
|
} /
|
|
k:Key (
|
|
OperatorEqualNode /
|
|
OperatorColonNode
|
|
) '"'? v:NaturalLanguageDateTime '"'? {
|
|
return buildNaturalLanguageDateTimeNodes(k, v, c.text, c.pos)
|
|
}
|
|
|
|
NumberRestrictionNode <-
|
|
k:Key o:(
|
|
OperatorGreaterOrEqualNode /
|
|
OperatorLessOrEqualNode /
|
|
OperatorGreaterNode /
|
|
OperatorLessNode
|
|
) '"'? v:Number '"'? {
|
|
return buildNumberNode(k, o, v, c.text, c.pos)
|
|
}
|
|
|
|
TextPropertyRestrictionNode <-
|
|
k:Key OperatorEqualNode v:(String / [^ ()]+) {
|
|
return buildStringNode(k, v, true, c.text, c.pos)
|
|
} /
|
|
k:Key OperatorColonNode v:(String / [^ ()]+) {
|
|
return buildStringNode(k, v, false, c.text, c.pos)
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// free text-keywords
|
|
////////////////////////////////////////////////////////
|
|
|
|
FreeTextKeywordNodes <-
|
|
PhraseNode /
|
|
WordNode
|
|
|
|
PhraseNode <-
|
|
OperatorColonNode? _ v:String _ OperatorColonNode? {
|
|
return buildStringNode("", v, false, c.text, c.pos)
|
|
}
|
|
|
|
WordNode <-
|
|
OperatorColonNode? _ v:[^ :()]+ _ OperatorColonNode? {
|
|
return buildStringNode("", v, false, c.text, c.pos)
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// operators
|
|
////////////////////////////////////////////////////////
|
|
|
|
OperatorBooleanNodes <-
|
|
OperatorBooleanAndNode /
|
|
OperatorBooleanNotNode /
|
|
OperatorBooleanOrNode
|
|
|
|
OperatorBooleanAndNode <-
|
|
("AND" / "+") {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorBooleanNotNode <-
|
|
("NOT" / "-") {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorBooleanOrNode <-
|
|
("OR") {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorColonNode <-
|
|
":" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorEqualNode <-
|
|
"=" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorLessNode <-
|
|
"<" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorLessOrEqualNode <-
|
|
"<=" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorGreaterNode <-
|
|
">" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
OperatorGreaterOrEqualNode <-
|
|
">=" {
|
|
return buildOperatorNode(c.text, c.pos)
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////
|
|
// time
|
|
////////////////////////////////////////////////////////
|
|
|
|
TimeYear <-
|
|
Digit Digit Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
TimeMonth <-
|
|
Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
TimeDay <-
|
|
Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
TimeHour <-
|
|
Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
TimeMinute <-
|
|
Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
TimeSecond <-
|
|
Digit Digit {
|
|
return c.text, nil
|
|
}
|
|
|
|
FullDate <-
|
|
TimeYear "-" TimeMonth "-" TimeDay {
|
|
return c.text, nil
|
|
}
|
|
|
|
FullTime <-
|
|
TimeHour ":" TimeMinute ":" TimeSecond ("." Digit+)? ("Z" / ("+" / "-") TimeHour ":" TimeMinute) {
|
|
return c.text, nil
|
|
}
|
|
|
|
DateTime <-
|
|
FullDate "T" FullTime {
|
|
return c.text, nil
|
|
}
|
|
|
|
NaturalLanguageDateTime <-
|
|
"today" /
|
|
"yesterday" /
|
|
"this week" /
|
|
"last week" /
|
|
"last 7 days" /
|
|
"this month" /
|
|
"last month" /
|
|
"last 30 days" /
|
|
"this year" /
|
|
"last year" {
|
|
return c.text, nil
|
|
}
|
|
|
|
////////////////////////////////////////////////////////
|
|
// misc
|
|
////////////////////////////////////////////////////////
|
|
|
|
Char <-
|
|
[A-Za-z] {
|
|
return c.text, nil
|
|
}
|
|
|
|
Key <-
|
|
Char+ ("." Char+)* {
|
|
return c.text, nil
|
|
}
|
|
|
|
String <-
|
|
'"' v:[^"]* '"' {
|
|
return v, nil
|
|
}
|
|
|
|
Number <-
|
|
[0-9]+ ("." [0-9]+)? {
|
|
return string(c.text), nil
|
|
}
|
|
|
|
Digit <-
|
|
[0-9] {
|
|
return c.text, nil
|
|
}
|
|
|
|
_ <-
|
|
[ \t]* {
|
|
return nil, nil
|
|
}
|