/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠSIP 3 . IO , ĠCorp . Ċ Ġ* Ċ Ġ* Ġ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 Ġio . sip 3 . twig . ce . service Ċ Ċ import Ġcom . mongodb . client . model . Filters .* Ċ import Ġio . sip 3 . commons . domain . Attribute Ċ import Ġio . sip 3 . twig . ce . domain . Search Request Ċ import Ġio . sip 3 . twig . ce . domain . Search Response Ċ import Ġio . sip 3 . twig . ce . mongo . Mongo Client Ċ import Ġio . sip 3 . twig . ce . service . attribute . Attribute Service Ċ import Ġorg . bson . conversions . B son Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġjavax . validation . ValidationException Ċ Ċ abstract Ġclass ĠSearch Service Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġattribute Service : ĠAttribute Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġmongo Client : ĠMongo Client ĊĊĠĠĠ Ġabstract Ġfun Ġsearch ( request : ĠSearch Request ): ĠIterator < Search Response > ĊĊĠĠĠ Ġfun Ġfilter ( expression : ĠString , Ġtransform : Ġ(( String ) Ġ-> ĠString )? Ġ= Ġnull ): ĠB son Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . contains (" ! =") Ġ-> Ġfilter ( expression , Ġ"! =") Ġ{ Ġfield , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġne ( transform ?. invoke ( field ) Ġ?: Ġfield , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . contains ("> ") Ġ-> Ġfilter ( expression , Ġ"> ") Ġ{ Ġfield , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgt ( transform ?. invoke ( field ) Ġ?: Ġfield , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . contains ("< ") Ġ-> Ġfilter ( expression , Ġ"< ") Ġ{ Ġfield , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlt ( transform ?. invoke ( field ) Ġ?: Ġfield , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . contains (" = ~ ") Ġ-> Ġfilter ( expression , Ġ"= ~ ") Ġ{ Ġfield , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregex ( transform ?. invoke ( field ) Ġ?: Ġfield , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception (" Attribute Ġdoesn 't Ġsupport Ġregex Ġquery : Ġ$ expression ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . contains (" =") Ġ-> Ġfilter ( expression , Ġ"=" ) Ġ{ Ġfield , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( transform ?. invoke ( field ) Ġ?: Ġfield , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception (" Couldn 't Ġparse Ġthe Ġexpression : Ġ$ expression ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter ( expression : ĠString , Ġdelimiter : ĠString , Ġmapping : Ġ( String , ĠAny ) Ġ-> ĠB son ): ĠB son Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattribute Ġ= Ġexpression . substring Before ( delimiter ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġattribute . substring After (".") ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġattribute Service . list () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . name Ġ== Ġattribute Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type ĊĊĠĠĠĠĠĠĠ Ġval Ġraw Value Ġ= Ġexpression . substring After ( delimiter ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute . TYPE _ STRING Ġ-> Ġraw Value ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute . TYPE _ NUMBER Ġ-> Ġraw Value . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute . TYPE _ BOOLEAN Ġ-> Ġraw Value . to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValidation Exception (" Unknown Ġattribute : Ġ$ expression ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAttribute Service . VIRTUAL _ ATTRIBUTES [ attribute ]?. attributes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġmapping . invoke ( it . substring After (". "), Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġor ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġmapping . invoke ( field , Ġvalue ) ĊĠĠĠ Ġ} Ċ } Ċ