package Ġde . et ern al w ings . v ima . query Ċ Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . and Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . map Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . optional Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . or Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . separated Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . skip Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . unary Minus Ċ import Ġcom . github . h 0 tk 3 y . better Parse . combin ators . use Ċ import Ġcom . github . h 0 tk 3 y . better Parse . grammar . Grammar Ċ import Ġcom . github . h 0 tk 3 y . better Parse . grammar . parser Ċ import Ġcom . github . h 0 tk 3 y . better Parse . lexer . literal Token Ċ import Ġcom . github . h 0 tk 3 y . better Parse . lexer . regex Token Ċ import Ġcom . github . h 0 tk 3 y . better Parse . parser . Parser Ċ Ċ object ĠQuery Parser Ġ: ĠGram mar < Full Query >() Ġ{ ĊĊĠĠĠ Ġprivate Ġfun ĠString . un quote (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . startsWith ("\" ") Ġ&& Ġthis . endsWith ("\ "" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . substring ( 1 , Ġthis . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBase Ġtokens ĊĠĠĠ Ġval Ġplus Ġby Ġregex Token ("\\ +") ĊĠĠĠ Ġval Ġminus Ġby Ġliteral Token ("- ") ĊĠĠĠ Ġval Ġcolon Ġby Ġliteral Token (": ") ĊĠĠĠ Ġval Ġsmaller Ġby Ġliteral Token ("< ") ĊĠĠĠ Ġval Ġlarger Ġby Ġliteral Token ("> ") ĊĠĠĠ Ġval Ġequals Ġby Ġliteral Token (" =") ĊĠĠĠ Ġval Ġlike Ġby Ġliteral Token (" ~ ") ĊĠĠĠ Ġval ĠAND Ġby Ġregex Token (" AND | and ") ĊĠĠĠ Ġval ĠOR Ġby Ġregex Token (" OR | or ") ĊĠĠĠ Ġval Ġopen Brace Ġby Ġregex Token ("\\ (" ) ĊĠĠĠ Ġval Ġclose Brace Ġby Ġregex Token ("\\ )") ĊĠĠĠ Ġval Ġword Ġby Ġregex Token ("\\ w +") ĊĠĠĠ Ġval Ġws Ġby Ġregex Token ("\\ s +") ĊĠĠĠ Ġval Ġquote String Ġby Ġregex Token ("\" [^ \"] * \" ") ĊĊĠĠĠ Ġval Ġvalue Ġby Ġ( quote String . map Ġ{ Ġit . text . un quote () Ġ} Ġor Ġword . map Ġ{ Ġit . text Ġ}) ĊĊĠĠĠ Ġval Ġboolean Ġby Ġplus . map Ġ{ ĠBoolean Op ( true ) Ġ} Ġor Ġminus . map Ġ{ ĠBoolean Op ( false ) Ġ} ĊĠĠĠ Ġval Ġcomparator Ġby Ġ(( smaller . map Ġ{ ĠComparator . SMALL ER Ġ} Ġor Ġlarger . map Ġ{ ĠComparator . GRE ATER Ġ}) Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptional ( equals )). map Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . t 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . t 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComparator . SMALL ER Ġ-> ĠComparator . SMALL ER _ OR _ EQUAL S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComparator . GRE ATER Ġ-> ĠComparator . GRE ATER _ OR _ EQUAL S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . t 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġproperty Ġby Ġ( value Ġand Ġskip ( colon ) Ġand Ġvalue ). map Ġ{ ĠProperty Query ( it . t 1 , Ġit . t 2 ) Ġ} ĊĠĠĠ Ġval Ġlike Property Ġby Ġ( value Ġand Ġskip ( like ) Ġand Ġvalue ). map Ġ{ ĠProperty Query ( it . t 1 , Ġit . t 2 , Ġtrue ) Ġ} ĊĠĠĠ Ġval Ġcomparison Ġby Ġ( value Ġand Ġcomparator Ġand Ġvalue ). map Ġ{ ĠComparison Query ( it . t 1 , Ġit . t 2 , Ġit . t 3 ) Ġ} ĊĠĠĠ Ġval Ġtext Ġby Ġvalue . map Ġ{ ĠText Query ( it ) Ġ} ĊĊĠĠĠ Ġval Ġterm : ĠParser < Query Part > Ġby Ġ( optional ( boolean ) Ġand Ġ( property Ġor Ġlike Property Ġor Ġcomparison Ġor Ġtext )). map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbool Op Ġ= Ġit . t 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( bool Op Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean Query ( it . t 2 , Ġbool Op . value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . t 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġor Expr : ĠParser < Query Part > Ġby Ġ( parser (:: and Expr ) Ġand Ġ- ws Ġand ĠOR Ġand Ġ- ws Ġand Ġparser (:: or Expr )) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( first , Ġ_, Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġis ĠUnion Query Ġ-> ĠUnion Query ( first . parts Ġ+ Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġis ĠUnion Query Ġ-> ĠUnion Query ( second . parts Ġ+ Ġfirst ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnion Query ( listOf ( first , Ġsecond )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġor Ġparser (:: and Expr ) ĊĊĠĠĠ Ġval Ġand Expr : ĠParser < Query Part > Ġby Ġ( parser (:: expr ) Ġand Ġ- ws Ġand ĠAND Ġand Ġ- ws Ġand Ġparser (:: and Expr )) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( first , Ġ_, Ġsecond ) Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġis ĠIntersection Query Ġ-> ĠIntersection Query ( first . parts Ġ+ Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġis ĠIntersection Query Ġ-> ĠIntersection Query ( second . parts Ġ+ Ġfirst ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠIntersection Query ( listOf ( first , Ġsecond )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġor Ġparser (:: expr ) ĊĊĠĠĠ Ġval Ġexpr : ĠParser < Query Part > Ġby Ġ( skip ( open Brace ) Ġand Ġseparated ( or Expr , Ġws ) Ġand Ġskip ( close Brace )). map Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . terms . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . terms . first () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnion Query ( it . terms ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġor Ġterm ĊĊĠĠĠ Ġval Ġquery Ġby Ġseparated ( or Expr , Ġws ). use Ġ{ ĊĠĠĠĠĠĠĠ Ġreduce Ġ{ Ġa , Ġ_, Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġis ĠIntersection Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection Query ( a . parts Ġ+ Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntersection Query ( listOf ( a , Ġb )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġroot Parser : ĠParser < Full Query > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġquery . map Ġ{ ĠFull Query ( it ) Ġ} Ċ Ċ } ĊĊ