/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠCo up ang ĠLtd . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . springframework . data . re query . kotlin . repository . query Ċ Ċ import Ġio . re query . query . Field Expression Ċ import Ġio . re query . query . Logical Condition Ċ import Ġio . re query . query . Named Expression Ċ import Ġio . re query . query . element . Query Element Ċ import Ġio . re query . query . function . Count Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . springframework . data . domain . Sort Ċ import Ġorg . springframework . data . repository . query . Returned Type Ċ import Ġorg . springframework . data . repository . query . parser . Abstract Query Creator Ċ import Ġorg . springframework . data . repository . query . parser . Part Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . AFTER Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . BEFORE Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . B ETWEEN Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . CONTAIN ING Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . ENDING _ WITH Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . FALSE Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . GRE ATER _ THAN Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . GRE ATER _ THAN _ EQUAL Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . IN Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . IS _ EMPTY Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . IS _ NOT _ EMPTY Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . IS _ NOT _ NULL Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . IS _ NULL Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . LESS _ THAN Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . LESS _ THAN _ EQUAL Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . LIKE Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . NEG ATING _ SIMPLE _ PROPERTY Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . NOT _ CONTAIN ING Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . NOT _ IN Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . NOT _ LIKE Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . SIMPLE _ PROPERTY Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . START ING _ WITH Ċ import Ġorg . springframework . data . repository . query . parser . Part . Type . TRUE Ċ import Ġorg . springframework . data . repository . query . parser . Part Tree Ċ import Ġorg . springframework . data . re query . kotlin . NotSupportedException Ċ import Ġorg . springframework . data . re query . kotlin . apply Sort Ċ import Ġorg . springframework . data . re query . kotlin . core . Re query Operations Ċ import Ġorg . springframework . data . re query . kotlin . unwrap Ċ import Ġorg . springframework . data . re query . query . Expressions Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠQuery Ġcreator Ġto Ġcreate Ġa Ġ[ Query Element ] Ġfrom Ġa Ġ[ Part Tree ]. Ċ Ġ* Ċ Ġ* Ġ@ author Ġdeb op Ċ Ġ*/ Ċ open Ġclass ĠRe query Query Creator ( val Ġoperations : ĠRe query Operations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider : ĠParameter Metadata Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturned Type : ĠReturned Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree : ĠPart Tree ) ĊĠĠĠ Ġ: ĠAbstract Query Creator < Query Element < out ĠAny >, ĠLogical Condition < out ĠAny , Ġ* >>( tree ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġcontext Ġ= Ġoperations . mapping Context ĊĠĠĠ Ġprotected Ġval Ġdomain Class : ĠClass < out ĠAny > ĊĠĠĠ Ġprotected Ġval Ġdomain ClassName : ĠString ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Create ĠRe query Query Creator Ġprovider =$ provider , Ġreturned Type =$ returned Type , Ġdomain Class =${ returned Type . domain Type } Ġtree =$ tree " Ġ} ĊĊĠĠĠĠĠĠĠ Ġdomain Class Ġ= Ġreturned Type . domain Type ĊĠĠĠĠĠĠĠ Ġdomain ClassName Ġ= Ġdomain Class . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Le aking This ") ĊĠĠĠ Ġprivate Ġval Ġroot : ĠQuery Element < out ĠAny > Ġ= Ġcreate Query Element ( returned Type ) ĊĊĠĠĠ Ġval Ġparameter Expressions : ĠList < Parameter Metadata < out ĠAny >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprovider . get Expressions () ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Query Element ( type : ĠReturned Type ): ĠQuery Element < out ĠAny > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtype To Read Ġ= Ġtype . type To Read ĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Create ĠQuery Element Ġinstance . Ġreturned Type =$ type , Ġtype To Read =$ type To Read " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree . is Count Projection Ġ-> Ġoperations . select ( Count . count ( type . domain Type )). unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree . is Exists Projection Ġ-> Ġoperations . select ( type . domain Type . kotlin ). unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree . is Delete Ġ-> Ġoperations . delete ( type . domain Type . kotlin ). unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġoperations . select ( type . domain Type . kotlin ). unwrap () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoverride Ġfun Ġcreate ( part : ĠPart , Ġiterator : ĠMutable Iterator < Any >): ĠLogical Condition < out ĠAny , Ġ*> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Build Ġnew Ġcondition Ġ..." Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Where Condition ( part ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġand ( part : ĠPart , Ġbase : ĠLogical Condition < out ĠAny , Ġ* >, Ġiterator : ĠMutable Iterator < Any >): ĠLogical Condition < out ĠAny , Ġ*> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" add ĠAND Ġoperator " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġbuild Where Condition ( part ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbase . and ( condition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġor ( base : ĠLogical Condition < out ĠAny , Ġ* >, Ġcriteria : ĠLogical Condition < out ĠAny , Ġ* >): ĠLogical Condition < out ĠAny , Ġ*> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" add ĠOR Ġoperator " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbase . or ( criteria ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete ( criteria : ĠLogical Condition < out ĠAny , Ġ*> ?, Ġsort : ĠSort ): ĠQuery Element < out ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcomplete ( criteria , Ġsort , Ġroot ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcomplete ( criteria : ĠLogical Condition < out ĠAny , Ġ*> ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsort : ĠSort , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase : ĠQuery Element < out ĠAny >): ĠQuery Element < out ĠAny > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Complete Ġbuild Ġquery Ġ..." Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠreturnType . needs Custom Construction () ĠìĿ Ħ ĠìĿ´ìļ© íķ´ìĦľ ĠCustom ĠType ĠìĹĲ ĠëĮĢíķľ ĠìŀĳìĹħ ìĿĦ ĠìĪĺ íĸī íķł ĠìĪĺ ĠìŀĪëĭ¤ . ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġif ( criteria Ġ!= Ġnull ) Ġbase . where ( criteria ). unwrap () Ġelse Ġbase ĊĊĠĠĠĠĠĠĠ Ġreturn Ġquery . apply Sort ( domain Class , Ġsort ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Where Condition ( part : ĠPart ): ĠLogical Condition < out ĠAny , Ġ*> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠQuery Element Builder ( part ). build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠQuery Element Builder ( val Ġpart : ĠPart ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠLogical Condition < out ĠAny , Ġ*> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġpart . property ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġpart . type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpr : ĠNamed Expression < Any > Ġ= ĠNamed Expression . of ( property . segment , Ġproperty . type Ġas ĠClass < Any >) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Build ĠLogical Ġcondition Ġ... Ġproperty =$ property , Ġtype =$ type , Ġexpr =$ expr " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBETWEEN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . between ( provider . next ( part , ĠComparable :: class . java ). value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . next ( part , ĠComparable :: class . java ). value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAFTER , ĠG RE ATER _ THAN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . greater Than ( provider . next ( part , ĠComparable :: class . java ). value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG RE ATER _ THAN _ EQUAL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . greater Than OrEqual ( provider . next ( part , ĠComparable :: class . java ). value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBE FORE , ĠL ESS _ THAN Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . less Than ( provider . next ( part , ĠComparable :: class . java ). value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ESS _ THAN _ EQUAL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . less Than OrEqual ( provider . next ( part , ĠComparable :: class . java ). value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIS _ NULL Ġ-> Ġexpr . isNull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIS _ NOT _ NULL Ġ-> Ġexpr . notNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT _ IN , ĠIN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġprovider . next ( part , ĠCollection :: class . java ). value ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" IN , ĠNOT ĠIN Ġvalues Ġtype =${ values ?. java Class ?. simple Name }, Ġvalues =${ values }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIterable < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġiterable . Ġvalues =${ values . toList () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values . toList () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠKotlin ĠPrimitive ĠArray ĠìĿ¸ ì§Ģ Ġëĭ¤ Ġì¶Ķê°Ģ íķ´ ì£¼ ìĸ´ ìķ¼ Ġíķ©ëĭĪëĭ¤ . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShort Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChar Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" value Ġis Ġarray . Ġvalues =${ values }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) ĠExpress ions .` in `( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠExpress ions . not In ( expr , Ġvalues . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Ġ== ĠIN ) Ġexpr .` in `( values ) Ġelse Ġexpr . not In ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġerror (" Not Ġprovided Ġin Ġcolumns ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTART ING _ WITH Ġ-> Ġexpr . like ( provider . next ( part , ĠString :: class . java ). value . toString () Ġ+ Ġ"% ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEND ING _ WITH Ġ-> Ġexpr . like ("% " Ġ+ Ġprovider . next ( part , ĠString :: class . java ). value . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCON TAIN ING Ġ-> Ġexpr . like ("% " Ġ+ Ġprovider . next ( part , ĠString :: class . java ). value . toString () Ġ+ Ġ"% ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT _ CONTAIN ING Ġ-> Ġexpr . not Like ("% " Ġ+ Ġprovider . next ( part , ĠString :: class . java ). value . toString () Ġ+ Ġ"% ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIKE , ĠNOT _ LIKE Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġprovider . next ( part , ĠString :: class . java ). value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( should IgnoreCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue . toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! value . startsWith ("% ") Ġ&& Ġ! value . endsWith ("% ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ"% $ value %" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLIKE Ġ-> Ġexpr . upper If IgnoreCase (). like ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr . upper If IgnoreCase (). not Like ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTRUE Ġ-> Ġexpr . eq ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFALSE Ġ-> Ġexpr . eq ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS IMP LE _ PROPERTY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsimple Expr Ġ= Ġprovider . next < Any >( part ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Expr . isNull Parameter Ġ-> Ġexpr . isNull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif ( should IgnoreCase ()) Ġsimple Expr . value !!. toUpperCase () Ġelse Ġsimple Expr . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . upper If IgnoreCase (). equal ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNE G ATING _ SIMPLE _ PROPERTY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsimple Expr Ġ= Ġprovider . next < Any >( part ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif ( should IgnoreCase ()) Ġsimple Expr . value !!. toUpperCase () Ġelse Ġsimple Expr . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . upper If IgnoreCase (). not Equal ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIS _ EMPTY , ĠIS _ NOT _ EMPTY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Supported Exception (" Not Ġsupported Ġkeyword Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Supported Exception (" Not Ġsupported Ġkeyword Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< T > ĠField Expression < T >. upper If IgnoreCase (): ĠField Expression < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen ( part . should IgnoreCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPart . IgnoreCase Type . ALWAYS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( this . can U pp ser Case ()) Ġ{ Ġ" Unable Ġto Ġignore Ġcase Ġof Ġ${ class Type . name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . function (" Upper ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPart . IgnoreCase Type . WHEN _ PO SS IBLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . can U pp ser Case ()) Ġthis . function (" Upper ") Ġelse Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPart . IgnoreCase Type . NE VER Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠField Expression <* >. can U pp ser Case (): ĠBoolean Ġ= Ġthis . class Type Ġ== ĠString :: class . java ĊĊĠĠĠĠĠĠĠ Ġfun Ġshould IgnoreCase (): ĠBoolean Ġ= Ġpart . should IgnoreCase () Ġ!= ĠPart . IgnoreCase Type . NE VER ĊĊĠĠĠĠĠĠĠ Ġfun ĠAny . toUpperCase (): ĠString Ġ= Ġthis . toString (). toUpperCase ( Locale . getDefault ()) ĊĊĠĠĠ Ġ} Ċ }