/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Query Element Extensions ") Ċ Ċ package Ġorg . springframework . data . re query . kotlin Ċ Ċ import Ġio . re query . query . Condition Ċ 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 . Ordering Expression Ċ import Ġio . re query . query . Result Ċ import Ġio . re query . query . Return Ċ import Ġio . re query . query . Scalar Ċ import Ġio . re query . query . element . Logical Operator Ċ import Ġio . re query . query . element . Query Element Ċ import Ġio . re query . query . element . Query Wrapper Ċ import Ġio . re query . query . element . Where Condition Element Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . springframework . data . domain . Page able Ċ import Ġorg . springframework . data . domain . Sort Ċ import Ġkotlin . reflect . K Class Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ /** Ċ Ġ* ĠSpring ĠFramework ìĿĺ Ġ[ Sort . Direction ] ìĹĲ ĠëĶ° ë¥¸ Ġ[ Ordering Expression ] ìĿĦ ĠìĥĿìĦ± íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdirection Ġìłķ ëł ¬ Ġë°© íĸ¥ ìĿĦ ĠëĤĺ íĥĢ ë ĥ ħ ëĭĪëĭ¤ . Ġ( Spring Ġframework ìĿĺ Ġ[ Sort . Direction ] Ġenum Ġê°Ĵ Ċ Ġ*/ Ċ fun ĠField Expression < out ĠAny >. getOrder Expression ( direction : ĠSort . Direction ): ĠOrdering Expression < out ĠAny > Ġ= ĊĠĠĠ Ġif ( direction . is Ascending ) Ġthis . asc () Ġelse Ġdesc () Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠEntity ìĹĲ ĠìłĢìŀ¥ íķľ ĠìĿ´ë¦Ħ ìĿĺ Ġ[ Named Expression ] ìĿĦ ĠìĥĿìĦ± íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param ĠV Ġtype Ġof Ġfield Ċ Ġ* Ġ@ param Ġname Ġname Ġof Ġfield Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠV Ġ: ĠAny > Ġnamed Expression Of ( name : ĠString ): ĠNamed Expression < V > Ġ= ĊĠĠĠ ĠNamed Expression . of ( name , ĠV :: class . java ) Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠEntity ìĹĲ ĠìłĢìŀ¥ íķľ ĠìĿ´ë¦Ħ ìĿĺ Ġ[ Named Expression ] ìĿĦ ĠìĥĿìĦ± íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġname Ġname Ġof Ġfield Ċ Ġ* Ġ@ param Ġtype Ġfield Ġtype Ċ Ġ*/ Ċ fun Ġ< V Ġ: ĠAny > Ġnamed Expression Of ( name : ĠString , Ġtype : ĠClass < V >): ĠNamed Expression < V > Ġ= ĊĠĠĠ ĠNamed Expression . of ( name , Ġtype ) Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. unwrap (): ĠQuery Element < T > Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis Ġis ĠQuery Wrapper < *> Ġ-> Ġthis . unwrap Query () ĊĠĠĠ Ġelse Ġ-> Ġthis Ċ } Ġas ĠQuery Element < T > Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. unwrap Any (): ĠQuery Element < out ĠAny > Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis Ġis ĠQuery Wrapper < *> Ġ-> Ġthis . unwrap Query () ĊĠĠĠ Ġelse Ġ-> Ġthis Ċ } Ġas ĠQuery Element < out ĠAny > Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠDomain Ġclass Ġë ¥ ¼ Ġì¡° íļĮ íķĺëĬĶ Ġ[ Query Element ] ìĹĲ ĠP aging ĠìĿ Ħ ĠìĦ¤ìłķ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdomain K lass Ġkotlin Ġtype Ġof Ġdomain Ġclass Ċ Ġ* Ġ@ param Ġpage able Ġ[ Page able ] Ġinstance Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. apply Page able ( domain K lass : ĠK Class < out ĠAny >, Ġpage able : ĠPage able Ġ= ĠPage able . un page d ()): ĠQuery Element < T > Ġ{ ĊĠĠĠ Ġreturn Ġapply Page able ( domain K lass . java , Ġpage able ) Ċ } Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠDomain ĠEntity ë¥¼ Ġì¡° íļĮ íķĺëĬĶ Ġ[ Query Element ] ìĹĲ ĠP aging ìĿĦ ĠìĦ¤ìłķ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdomain Class Ġdomain Ġclass Ċ Ġ* Ġ@ param Ġpage able Ġ[ Page able ] Ġinstance Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. apply Page able ( domain Class : ĠClass < out ĠAny >, Ġpage able : ĠPage able Ġ= ĠPage able . un page d ()): ĠQuery Element < T > Ġ{ ĊĊĠĠĠ Ġlog . trace Ġ{ Ġ" Apply Ġpaging Ġ.. Ġdomain Class =${ domain Class . simple Name }, Ġpage able =$ page able " Ġ} ĊĊĠĠĠ Ġvar Ġquery Ġ= Ġthis . unwrap () ĊĊĠĠĠ Ġif ( page able . is Un page d ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( page able . sort . is Sorted ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Ġ= Ġquery . apply Sort ( domain Class , Ġpage able . sort ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( page able . pageSize Ġ> Ġ 0 Ġ&& Ġquery . limit Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Ġ= Ġquery . limit ( page able . pageSize ). unwrap () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( page able . offset Ġ> Ġ 0 Ġ&& Ġquery . offset Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Ġ= Ġquery . offset ( page able . offset . toInt ()). unwrap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġquery Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. apply Sort ( domain K lass : ĠK Class < out ĠAny >, Ġsort : ĠSort Ġ= ĠSort . un sorted ()): ĠQuery Element < T > Ġ{ ĊĠĠĠ Ġreturn Ġif ( sort . is Sorted ) Ġapply Sort ( domain K lass . java , Ġsort ) Ġelse Ġthis . unwrap () Ċ } Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠDomain ĠEntity ë¥¼ Ġì¡° íļĮ íķĺëĬĶ Ġ[ Query Element ] ìĹĲ Ġìłķ ëł ¬ ( Sort ) ë¥¼ ĠìĦ¤ìłķ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdomain Class Ġdomain Ġclass Ċ Ġ* Ġ@ param Ġsort Ġ[ Sort ] Ġinstance Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. apply Sort ( domain Class : ĠClass < out ĠAny >, Ġsort : ĠSort Ġ= ĠSort . un sorted ()): ĠQuery Element < T > Ġ{ ĊĊĠĠĠ Ġlog . trace Ġ{ Ġ" Apply Ġsort , Ġdomain Class =${ domain Class . simple Name }, Ġsort =$ sort " Ġ} ĊĊĠĠĠ Ġvar Ġquery Ġ= Ġthis . unwrap () ĊĊĠĠĠ Ġif ( sort . is Un sorted ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsort . forEach Ġ{ Ġorder Ġ-> ĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġorder . property ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġorder . direction ĊĊĠĠĠĠĠĠĠ Ġ// ĠìĿ´ë¯¸ ĠìŀĪ ìĿĦ ĠìĪĺ ĠìŀĪëĭ¤ ĊĠĠĠĠĠĠĠ Ġval Ġorder Expr Ġ= Ġquery . orderBy Expressions ?. find Ġ{ Ġit . name Ġ== ĠpropertyName Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( order Expr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Class . get Expression ( propertyName )?. let Ġ{ Ġexpr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ= Ġquery . orderBy ( expr . getOrder Expression ( direction )). unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġquery Ċ } Ċ Ċ /** Ċ Ġ* ĠRe query Ġì§ Ī ìĿĺ ìĹĲ Ġì¡° ê± ´ Ġëĵ¤ ìĿĦ ĠìĦ¤ìłķ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ġ@ param ĠT Ċ Ġ* Ġ@ param Ġcondition Elements Ġì§ Ī ìĿĺ Ġì¡° ê± ´ ëĵ¤ Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠReturn < T >. apply Where Conditions ( condition Elements : ĠSet < Where Condition Element < out ĠAny >> ): ĠQuery Element < T > Ġ{ ĊĊĠĠĠ Ġval Ġquery Ġ= Ġthis . unwrap () ĊĊĠĠĠ Ġif ( condition Elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery ĊĠĠĠ Ġ} ĊĠĠĠ Ġif ( condition Elements . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġquery . where ( condition Elements . first (). condition ). unwrap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġwhere Element Ġ= Ġquery . where ( condition Elements . first (). condition ) ĊĊĠĠĠ Ġcondition Elements ĊĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcondition Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġcondition Element . condition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= Ġcondition Element . operator ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Apply Ġwhere Ġcondition =$ condition , Ġoperator =$ operator " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( operator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Element Ġ= Ġwhen ( operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . AND Ġ-> Ġwhere Element . and ( condition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . OR Ġ-> Ġwhere Element . or ( condition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . NOT Ġ-> Ġwhere Element . and ( condition ). not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġwhere Element . unwrap () Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Return ] ĠìĿ¸ ìĬ¤ íĦ´ ìĬ¤ ìĿĺ Ġê²°ê³¼ ë¥¼ Ġë°Ľ ìķĦ Ġ[ Result ] ĠìĿ¸ ìĬ¤ íĦ´ ìĬ¤ ë¡ľ Ġë³Ģ íĻĺ íķ©ëĭĪëĭ¤ . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠReturn < out ĠAny >. getAs Result (): ĠResult < out ĠAny > Ġ= Ġthis . get () Ġas ĠResult < out ĠAny > Ċ Ċ /** Ċ Ġ* Ġ[ Return ] ĠìĿ¸ ìĬ¤ íĦ´ ìĬ¤ ë¡ľ ë¶Ģ íĦ° Ġê²°ê³¼ ë¥¼ Ġdomain Ġentity ĠìĪĺ íĺķ ìĿĺ Ġ[ Result ] Ġë¡ľ Ġë³Ģ íĻĺ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ġ@ param ĠE Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< E Ġ: ĠAny > ĠReturn < out ĠAny >. getAs Result Entity (): ĠResult < E > Ġ= Ġthis . get () Ġas ĠResult < E > ĊĊ Ċ /** Ċ Ġ* Ġ[ Return ] ĠìĿ¸ ìĬ¤ íĦ´ ìĬ¤ ë¡ľ ë¶Ģ íĦ° Ġê²°ê³¼ ë¥¼ Ġ[ Scalar < Int >] ë¡ľ Ġë³Ģ íĻĺ íķľëĭ¤ Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠReturn < out ĠAny >. getAs Scalar Int (): ĠScalar < Int > Ġ= Ġthis . get () Ġas ĠScalar < Int > Ċ Ċ /** Ċ Ġ* Ġ[ Return ] ĠìĿ¸ ìĬ¤ íĦ´ ìĬ¤ ë¡ľ ë¶Ģ íĦ° Ġê²°ê³¼ ë¥¼ Ġ[ Scalar < ã ħ £ ã ħ Ĳ ã ħ ľ ã ħ İ >] ë¡ľ Ġë³Ģ íĻĺ íķľëĭ¤ Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠReturn < out ĠAny >. getAs Scalar Long (): ĠScalar < Long > Ġ= Ġthis . get () Ġas ĠScalar < Long > Ċ Ċ fun ĠClass < out ĠAny >. get Ordering Expressions ( sort : ĠSort ): ĠArray < Ordering Expression < out ĠAny >> Ġ{ ĊĊĠĠĠ Ġif ( sort . is Un sorted ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsort ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġorder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġorder . property ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . get Expression ( propertyName )?. let Ġ{ Ġexpr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( order . direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort . Direction . ASC Ġ-> Ġexpr . asc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr . desc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Typed Array () Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< E Ġ: ĠAny > ĠIterable < Condition < E , Ġ* >> . fold Conditions (): ĠLogical Condition < E , Ġ* >? Ġ{ ĊĊĠĠĠ Ġvar Ġresult : ĠLogical Condition < E , Ġ* >? Ġ= Ġnull ĊĊĠĠĠ Ġthis . forEach Ġ{ Ġcond Ġ-> ĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Fold Ġconditions . Ġcond =$ cond " Ġ} ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġwhen ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġcond Ġas ? ĠLogical Condition < E , Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult !!. and ( cond ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠLogical Condition < E , Ġ*> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< E Ġ: ĠAny > ĠIterable < Condition < E , Ġ* >> . fold Conditions ( operator : ĠLogical Operator ): ĠLogical Condition < E , Ġ* >? Ġ{ ĊĊĠĠĠ Ġvar Ġresult : ĠLogical Condition < E , Ġ* >? Ġ= Ġnull ĊĊĠĠĠ Ġthis . forEach Ġ{ Ġcond Ġ-> ĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Fold Ġconditions . Ġcond =${ cond . left Operand }, Ġ${ cond . operator }, Ġ${ cond . right Operand }" Ġ} ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġwhen ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġcond Ġas ? ĠLogical Condition < E , Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen ( operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . AND Ġ-> Ġresult !!. and ( cond ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . OR Ġ-> Ġresult !!. or ( cond ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogical Operator . NOT Ġ-> Ġresult !!. and ( cond ). not () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠLogical Condition < E , Ġ*> ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } ĊĊĊ