/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . room . parser Ċ Ċ import Ġandroidx . room . verifier . QueryResult Info Ċ Ċ sealed Ġclass ĠSection Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġtext : ĠString ĊĊĠĠĠ Ġdata Ġclass ĠText ( val Ġcontent : ĠString ) Ġ: ĠSection () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠNew line Ġ: ĠSection () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"\ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBind Var ( val Ġsymbol : ĠString ) Ġ: ĠSection () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġsymbol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠProjection Ġ: ĠSection () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġobject ĠAll Ġ: ĠProjection () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"*" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠTable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Alias : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠProjection () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠTable ( val Ġname : ĠString , Ġval Ġalias : ĠString ) Ċ Ċ data Ġclass ĠPosition ( val Ġline : ĠInt , Ġval Ġchar In Line : ĠInt ) Ġ: ĠComparable < Position > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠPosition ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( line Ġ== Ġother . line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar In Line Ġ- Ġother . char In Line ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ- Ġother . line ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠSection Info ( ĊĠĠĠ Ġval Ġstart : ĠPosition , ĊĠĠĠ Ġval Ġend : ĠPosition , ĊĠĠĠ Ġval Ġsection : ĠSection Ċ ) Ċ Ċ data Ġclass ĠParsed Query ( ĊĠĠĠ Ġval Ġoriginal : ĠString , ĊĠĠĠ Ġval Ġtype : ĠQuery Type , ĊĠĠĠ Ġval Ġinputs : ĠList < Section Info >, ĊĠĠĠ Ġval Ġprojection s : ĠList < Section Info >, ĊĠĠĠ Ġval Ġexplicit Columns : ĠList < String >, ĊĠĠĠ Ġ// Ġpairs Ġof Ġtable Ġname Ġand Ġalias , ĊĠĠĠ Ġval Ġtables : ĠSet < Table >, ĊĠĠĠ Ġval Ġsyntax Errors : ĠList < String >, ĊĠĠĠ Ġval Ġruntime Query Placeholder : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠSTART S _ WITH _ NUMBER Ġ= Ġ"^ \\ ?[ 0 - 9 ] ". to Regex () ĊĠĠĠĠĠĠĠ Ġval ĠMIS SING Ġ= ĠParsed Query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Ġ= Ġ" missing Ġquery ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠQuery Type . UNKNOWN , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection s Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplicit Columns Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables Ġ= Ġempty Set (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Errors Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime Query Placeholder Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOptional Ġdata Ġthat Ġmight Ġbe Ġassigned Ġwhen Ġthe Ġquery Ġis Ġparsed Ġinside Ġan Ġannotation Ġprocessor . ĊĠĠĠĠ Ġ* ĠUser Ġmay Ġturn Ġthis Ġoff Ġor Ġit Ġmight Ġbe Ġdisabled Ġfor Ġany Ġreason Ġso Ġgenerated Ġcode Ġshould ĊĠĠĠĠ Ġ* Ġalways Ġhandle Ġnot Ġhaving Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġresult Info : ĠQuery Result Info ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRew rit ten Ġwhen Ġthe Ġquery Ġis Ġinterpreted Ġand Ġre written Ġby ĠQuery Interpreter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġinterpreted Ġ= Ġoriginal ĊĊĠĠĠ Ġval Ġsections Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspecial Sections : ĠList < Section Info > Ġ= Ġ( inputs Ġ+ Ġprojection s ). sorted By Ġ{ Ġit . start Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġoriginal . lines () ĊĠĠĠĠĠĠĠ Ġval Ġsections Ġ= Ġarray ListOf < Section >() ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġchar In Line Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlines [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmultiple Line Section Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Sections ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . start . line Ġ== Ġindex Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( start , Ġend , Ġsection ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char In Line Ġ< Ġstart . char In Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections . add ( Section . Text ( line . substring ( char In Line , Ġstart . char In Line ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections . add ( section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar In Line Ġ= Ġend . char In Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġend . line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġend . line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultiple Line Section Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! multiple Line Section ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char In Line Ġ< Ġline . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections . add ( Section . Text ( line . substring ( char In Line ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ+ Ġ 1 Ġ< Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections . add ( Section . New line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar In Line Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsections ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbind Sections Ġby Ġlazy Ġ{ Ġsections . filter Is Instance < Section . Bind Var >() Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun named Variable Errors (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanonymous Bind Error Ġ= Ġif Ġ( inputs . any Ġ{ Ġit . section . text Ġ== Ġ" ?" Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf ( Parser Errors . AN ONY MO US _ BIND _ ARGUMENT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < String >() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġanonymous Bind Error Ġ+ Ġinputs . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . section . text . matches ( START S _ WITH _ NUMBER ) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParser Errors . cannot Use Variable Indices ( it . section . text , Ġit . start . char In Line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunknown Query Type Errors (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Query Type . SUPPORTED . contains ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Parser Errors . invalid Query Type ( type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġerrors Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( syntax Errors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthere Ġis Ġa Ġsyntax Ġerror , Ġdon 't Ġreport Ġothers Ġsince Ġthey Ġmight Ġbe Ġmis leading . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Errors ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun named Variable Errors () Ġ+ Ġunknown Query Type Errors () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ