package Ġorg . pro meth ist . common . query Ċ Ċ import Ġcom . mongodb . client . model . Filters Ċ import Ġorg . bson . conversions . B son Ċ import Ġorg . lit ote . km ongo .* Ċ import Ġorg . lit ote . km ongo . id . ObjectId Generator Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjavax . ws . rs . Web ApplicationException Ċ import Ġjavax . ws . rs . core . Response Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . reflect . full . create Type Ċ import Ġkotlin . reflect . full . is Subtype Of Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ object ĠMongo Filters Factory Ġ{ ĊĠĠĠ Ġfun Ġcreate Filters ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Model : ĠK Class <* >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery : ĠQuery , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Property : ĠK Property < *> ? Ġ= Ġroot Model . member Properties . first OrNull Ġ{ Ġit . name Ġ== Ġ"_ id " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Seek : ĠBoolean Ġ= Ġtrue Ġ// todo Ġrefactor Ġto Ġhave Ġtwo Ġmethods Ġfor Ġfilters Ġand Ġseek Ġfilters ĊĠĠĠ Ġ): ĠMutable List < B son > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfilters Ġ= Ġmutable ListOf < B son >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . seek _ id Ġ!= Ġnull Ġ&& Ġinclude Seek ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . add ( seek Property !! Ġgt ĠObjectId Generator . create ( query . seek _ id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( filter Ġin Ġquery . filters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . add ( create Filter ( root Model , Ġfilter )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfilters ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Filter ( root Model : ĠK Class <* >, Ġfilter : ĠQuery . Filter ): ĠB son Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġresolve Type ( root Model , Ġfilter . path ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġif Ġ( filter . operator Ġ== ĠQuery . Operator .` in `) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . value . split ("," ). map Ġ{ Ġcreate Value ( type , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Value ( type , Ġfilter . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( filter . operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . eq Ġ-> ĠFilters . eq ( filter . path , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . gt Ġ-> ĠFilters . gt ( filter . path , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . gte Ġ-> ĠFilters . gte ( filter . path , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . lt Ġ-> ĠFilters . lt ( filter . path , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . lte Ġ-> ĠFilters . lte ( filter . path , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator .` in ` Ġ-> ĠFilters .` in `( filter . path , Ġvalue Ġas ĠList <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . like Ġ-> ĠFilters . regex ( filter . path , Ġ" .* ${ value } .* ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery . Operator . regex Ġ-> ĠFilters . regex ( filter . path , Ġvalue Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve Type ( root Model : ĠK Class <* >, Ġpath : ĠString ): ĠK Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġpath . split (". "). to Mutable List () ĊĠĠĠĠĠĠĠ Ġvar Ġmodel Ġ= Ġroot Model ĊĊĠĠĠĠĠĠĠ Ġvar Ġtype : ĠK Type ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġchunks . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproperty : ĠK Property < *> Ġ= Ġmodel . member Properties . first Ġ{ Ġit . name Ġ== Ġchunk Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġproperty . returnType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . is Subtype Of ( Iterable :: class . create Type ( listOf ( K Type Projection . STAR )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . arguments [ 0 ]. type !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . is Subtype Of ( Map :: class . create Type ( listOf ( K Type Projection ( K Variance . IN VARIANT , ĠString :: class . create Type ()), ĠK Type Projection . STAR )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . arguments [ 1 ]. type !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġtype . classifier Ġas ĠK Class < *> ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( chunks . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Pipeline ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel : ĠK Class <* >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery : ĠQuery , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Property : ĠK Property < *> ? Ġ= Ġmodel . member Properties . first OrNull Ġ{ Ġit . name Ġ== Ġ"_ id " Ġ} ĊĠĠĠ Ġ): ĠMutable List < B son > Ġ= Ġmutable ListOf < B son >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( match (* create Filters ( model , Ġquery ). to Typed Array ())) ĊĠĠĠĠĠĠĠ Ġadd ( sort ( orderBy ( seek Property Ġas ĠK Property < *> ))) ĊĠĠĠĠĠĠĠ Ġadd ( limit ( query . limit )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Value ( type : ĠK Type , Ġvalue : ĠString ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Subtype Of ( Id :: class . create Type ( listOf ( K Type Projection . STAR ), Ġtrue ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObjectId Generator . create ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . create Type () Ġ-> Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate :: class . create Type () Ġ-> Ġget Date FromString ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . create Type () Ġ-> Ġvalue . to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Date FromString ( date String : ĠString ): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdf Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ' T ' HH : mm : ss X ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdf . parse ( date String ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWeb ApplicationException (" Date Ġformat Ġshould Ġbe Ġy yyy - MM - dd ' T ' HH : mm : ss X ", ĠResponse . Status . BAD _ REQUEST ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ