package Ġcom . github . sa ip ras ad kr ish nam ur thy . object finder Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . google code . cq engine . Concurrent Indexed Collection Ċ import Ġcom . google code . cq engine . attribute . Simple Nullable Attribute Ċ import Ġcom . google code . cq engine . query . option . Query Options Ċ import Ġcom . google code . cq engine . query . parser . common . Invalid Query Exception Ċ import Ġcom . google code . cq engine . query . parser . cq n . CQ N Parser Ċ import Ġcom . google code . cq engine . query . parser . sql . SQL Parser Ċ Ċ /** Ċ Ġ* Ġ< b > Object ĠFin der ĠBy ĠPredicate .</ b > Ċ Ġ* ĠFinds Ġthe Ġobjects Ġby Ġmeans Ġof Ġa Ġsimple Ġquery ĠDSL Ġthat Ġrepresents Ġa Ġpredicate . Ċ Ġ* Ċ Ġ* ĠFor Ġexample Ġconsider Ġthe Ġfollowing Ġsample : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠ Ġ[ Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Kotlin ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" Spark Java " Ċ Ġ* ĠĠĠĠĠ Ġ}, Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Java ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" SpringBoot " Ċ Ġ* ĠĠĠĠĠ Ġ}, Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Scala ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" Play " Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ] Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* ĠThe Ġfollowing Ġpredicates Ġare Ġvalid : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġname Ġ= Ġ' S ai ' Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ< b > If Ġyou Ġuse Ġ' AND ' Ġ' OR ' Ġyou Ġmust Ġuse Ġpar ant heses </ b > Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġ( name Ġ= Ġ' S ai ' ĠAND Ġlanguage =' Kotlin ') Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ< b > Nested Ġconditions </ b > Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġ( name Ġ= Ġ' S ai ' ĠAND Ġ( language =' Kotlin ' ĠOR Ġlanguage =' Java ') ĠAND Ġframework =' SpringBoot ') Ċ Ġ* Ġ</ pre > Ċ Ċ < br /> Ċ Ġ* Ġ< b > Object ĠFin der ĠBy ĠC QN .</ b > Ċ Ġ* Ġ< p > CQ N Ġis Ġa Ġcanonical Ġquery Ġin Ġprefix Ġnotation Ġwhich Ġcan Ġbe Ġeasy Ġto Ġconstruct Ġprogram atically Ġ( for Ġex : Ġusing Ġa Ġquery Ġbuilder ).</ p > Ċ Ġ* ĠFor Ġexample Ġconsider Ġthe Ġfollowing Ġsample : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠ Ġ[ Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Kotlin ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" Spark Java " Ċ Ġ* ĠĠĠĠĠ Ġ}, Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Java ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" SpringBoot " Ċ Ġ* ĠĠĠĠĠ Ġ}, Ċ Ġ* ĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" S ai ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" language ": Ġ" Scala ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" framework ": Ġ" Play " Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ] Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* ĠThe Ġfollowing Ġpredicates Ġare Ġvalid : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġequal (" name "," S ai ") Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġand ( equal (" name "," S ai "), Ġequal (" framework "," SpringBoot ")) Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠĠ Ġand ( equal (" name "," S ai "), Ġor ( equal (" language "," Java "), equal (" language "," Kotlin ")), Ġequal (" framework "," SpringBoot ")) Ċ Ġ* Ġ</ pre > Ċ Ġ* Ċ Ġ* Ġ@ author ĠS ai . Ċ Ġ*/ Ċ class ĠObject Finder Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġmatching Ġobjects Ġby Ġpredicate Ġquery . ĊĠĠĠĠ Ġ* Ġ@ param Ġobjects Ġinput Ġobjects . ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġquery Ġpredicate ĠDSL . ĊĠĠĠĠ Ġ* Ġ@ return Ġobjects Ġmatching Ġthe Ġpredicate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > ĠfindBy Predicate Query ( objects : ĠList < T >, Ġquery : ĠString ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( coll , Ġmap Back To Objects , Ġattributes ) Ġ= Ġtriple ( objects ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSQL Parser . for Po jo With Attributes ( Map :: class . java , Ġattributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġparser . retrieve ( coll , Ġ" SELECT Ġ* ĠFROM Ġdocs ĠWHERE Ġ$ query ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠresultSet . map Ġ{ Ġmap Back To Objects [ it ] !! Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( iq e : ĠInvalid Query Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iq e . cause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Query ( iq e . cause ?. message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Query ( iq e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġmatching Ġobjects Ġby ĠC QN Ġquery . ĊĠĠĠĠ Ġ* ĠA Ġfew Ġexamples : ĊĠĠĠĠ Ġ* Ġ< pre > ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġand ( equal (" name "," S ai "), Ġequal (" framework "," SpringBoot ")) ĊĠĠĠĠ Ġ* Ġ</ pre > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< pre > ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġand ( equal (" name "," S ai "), Ġor ( equal (" language "," Java "), equal (" language "," Kotlin ")), Ġequal (" framework "," SpringBoot ")) ĊĠĠĠĠ Ġ* Ġ</ pre > ĊĠĠĠĠ Ġ* Ġ@ param Ġobjects Ġinput Ġobjects . ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġquery Ġpredicate ĠDSL . ĊĠĠĠĠ Ġ* Ġ@ return Ġobjects Ġmatching Ġthe Ġpredicate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > ĠfindBy CQ N Query ( objects : ĠList < T >, Ġquery : ĠString ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( coll , Ġmap Back To Objects , Ġattributes ) Ġ= Ġtriple ( objects ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠC QN Parser . for Po jo With Attributes ( Map :: class . java , Ġattributes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultSet Ġ= Ġparser . retrieve ( coll , Ġquery ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠresultSet . map Ġ{ Ġmap Back To Objects [ it ] !! Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( iq e : ĠInvalid Query Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iq e . cause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Query ( iq e . cause ?. message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad Query ( iq e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġtriple ( objects : ĠList < T >): ĠTrip le < Concurrent Indexed Collection < Map < *, Ġ* >>, ĠMutable Map < Map < *, Ġ* >, ĠT >, ĠMutable Map < String , ĠSimple Nullable Attribute < Map < *, Ġ* >, Ġ* >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠobjectMapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠ Ġval Ġcoll Ġ= ĠConcurrent Indexed Collection < Map < *, Ġ* >>() ĊĠĠĠĠĠĠĠ Ġval Ġmap Back To Objects Ġ= Ġmutable Map Of < Map < *, Ġ* >, ĠT >() ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġmutable Map Of < String , ĠSimple Nullable Attribute < Map < *, Ġ* >, Ġ* >>() ĊĠĠĠĠĠĠĠ Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject As Map Ġ= ĠobjectMapper . convert Value ( it , ĠMap :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject As Map . entries . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġentry . key . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġwhen Ġ( entry . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber Ġ-> ĠPair ( key , Ġadd Numeric Index ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( key , Ġadd String Index ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes . plus Assign ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Back To Objects [ object As Map ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll . add ( object As Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( coll , Ġmap Back To Objects , Ġattributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd String Index ( attribute : ĠString ) Ġ= Ġobject Ġ: ĠSimple Nullable Attribute < Map < *, Ġ* >, ĠString >( attribute ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( o : ĠMap < *, Ġ*> ?, Ġp 1 : ĠQuery Options ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġo ?. get ( attribute ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Numeric Index ( attribute : ĠString ) Ġ= Ġobject Ġ: ĠSimple Nullable Attribute < Map < *, Ġ* >, ĠDouble >( attribute ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( o : ĠMap < *, Ġ*> ?, Ġp 1 : ĠQuery Options ?): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġo ?. get ( attribute ). toString (). toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }