enhancement: Keyword Query Language (KQL) search syntax support (#7043)

* feat(search): introduce search query package

With the increasing complexity of how we organize our resources, the search must also be able to find them using entity properties.

The query package provides the necessary functionality to do this.

This makes it possible to search for resources via KQL, the microsoft spec is largely covered and can be used for this.

In the current state, the legacy query language is still used, in a future update this will be deprecated and KQL will become the standard
This commit is contained in:
Florian Schade
2023-08-28 16:41:36 +02:00
committed by GitHub
parent aef4fc7b2f
commit ed0dbce978
40 changed files with 5409 additions and 57 deletions
@@ -0,0 +1,108 @@
{
package kql
}
////////////////////////////////////////////////////////
// ast
////////////////////////////////////////////////////////
AST <-
_ nodes:Nodes _ {
return buildAST(nodes, c.text, c.pos)
}
Nodes <-
n:(
_
(
GroupNode /
PropertyRestrictionNodes /
BooleanOperatorNode /
FreeTextKeywordNodes
)
_
)+ {
return buildNodes(n)
}
////////////////////////////////////////////////////////
// nesting
////////////////////////////////////////////////////////
GroupNode <-
k:(Char+)? (ColonOperator / EqualOperator)? "(" v:Nodes ")" {
return buildGroupNode(k, v, c.text, c.pos)
}
////////////////////////////////////////////////////////
// property restrictions
////////////////////////////////////////////////////////
PropertyRestrictionNodes <-
YesNoPropertyRestrictionNode /
TextPropertyRestrictionNode
YesNoPropertyRestrictionNode <-
k:Char+ (ColonOperator / EqualOperator) v:("true" / "false"){
return buildBooleanNode(k, v, c.text, c.pos)
}
TextPropertyRestrictionNode <-
k:Char+ (ColonOperator / EqualOperator) v:(String / [^ ()]+){
return buildStringNode(k, v, c.text, c.pos)
}
////////////////////////////////////////////////////////
// free text-keywords
////////////////////////////////////////////////////////
FreeTextKeywordNodes <-
PhraseNode /
WordNode
PhraseNode <-
ColonOperator? _ v:String _ ColonOperator? {
return buildStringNode("", v, c.text, c.pos)
}
WordNode <-
ColonOperator? _ v:[^ :()]+ _ ColonOperator? {
return buildStringNode("", v, c.text, c.pos)
}
////////////////////////////////////////////////////////
// operators
////////////////////////////////////////////////////////
BooleanOperatorNode <-
("AND" / "OR" / "NOT") {
return buildOperatorNode(c.text, c.pos)
}
ColonOperator <-
":" {
return c.text, nil
}
EqualOperator <-
"=" {
return c.text, nil
}
////////////////////////////////////////////////////////
// misc
////////////////////////////////////////////////////////
Char <-
[A-Za-z] {
return c.text, nil
}
String <-
'"' v:[^"]* '"' {
return v, nil
}
_ <-
[ \t]*