package Ġcom . health met rix . lab res . persistence Ċ Ċ import Ġcom . amazonaws . services . dynamodb v 2 . data modeling . D ynamoDB Mapper Ċ import Ġcom . amazonaws . services . dynamodb v 2 . data modeling . D ynamoDB Scan Expression Ċ import Ġcom . amazonaws . services . dynamodb v 2 . model . AttributeValue Ċ import Ġcom . amazonaws . services . dynamodb v 2 . model . Comparison Operator Ċ import Ġcom . amazonaws . services . dynamodb v 2 . model . Condition Ċ import Ġcom . health met rix . lab res . logger Ċ import Ġcom . health met rix . lab res . order . Order Number Ċ import Ġcom . health met rix . lab res . order . Sample Ċ import Ġcom . health met rix . lab res . order . Status Ċ import Ġnet . logstash . log back . argument . Structured Arguments Ċ import Ġorg . social signin . spring . data . dynamodb . repository . Enable Scan Ċ import Ġorg . springframework . context . annotation . Profile Ċ import Ġorg . springframework . data . repository . Crud Repository Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . time . Instant Ċ import Ġjava . util . UUID Ċ Ċ @ Enable Scan Ċ @ Profile (" d ynamo ") Ċ internal Ġinterface ĠRaw Order Information Repository Ġ: ĠCr ud Repository < Raw Order Information , ĠUUID > Ġ{ ĊĠĠĠ Ġfun ĠfindBy Issuer Id And Order Number ( issuer Id : ĠString , ĠorderNumber : ĠString ): ĠList < Raw Order Information > Ċ } Ċ Ċ @ Component Ċ @ Profile (" d ynamo ") Ċ class ĠD ynamo Order Information Repository Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRaw Order Information Repository , ĊĠĠĠ Ġprivate Ġval Ġd ynamo Mapper : ĠD ynamoDB Mapper Ċ ) Ġ: ĠOrder Information Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġfind ById ( id : ĠUUID ): ĠOrder Information ? Ġ= Ġrepository ĊĠĠĠĠĠĠĠ Ġ. findById ( id ) ĊĠĠĠĠĠĠĠ Ġ. orElse ( null ) ĊĠĠĠĠĠĠĠ Ġ? . cook () ĊĊĠĠĠ Ġoverride Ġfun ĠfindBy Order Number ( order Number : ĠOrder Number ): ĠList < Order Information > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository . findBy Issuer Id And Order Number ( order Number . issuer Id , ĠorderNumber . number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( Raw Order Information :: cook ) ĊĊĠĠĠ Ġoverride Ġfun ĠfindBy Order Number And Sample ( order Number : ĠOrder Number , Ġsample : ĠSample ): ĠList < Order Information > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Orders Ġ= ĠfindBy Order Number ( order Number ). filter Ġ{ Ġit . sample Ġ== Ġsample Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( existing Orders . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Conflict Ġin Ġfinding Ġorder Ġwith ĠorderNumber Ġ${ order Number . number }, Ġissuer Id Ġ${ order Number . issuer Id } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" and Ġsample Ġtype Ġ$ sample : ĠMore Ġthan Ġone Ġresult Ġfound ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct ured Arguments . kv (" order Number ", ĠorderNumber . number ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct ured Arguments . kv (" issuer Id ", ĠorderNumber . issuer Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct ured Arguments . kv (" sample ", Ġsample ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexisting Orders ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġmake Ġit Ġreturn Ġnullable ĊĠĠĠ Ġoverride Ġfun Ġsave ( order Information : ĠOrder Information ) Ġ= ĊĠĠĠĠĠĠĠ Ġrepository . save ( order Information . raw ()). cook () !! ĊĊĠĠĠ Ġoverride Ġfun Ġmigrate ( migration : Ġ( Raw Order Information ) Ġ-> ĠRaw Order Information ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Rows Ġ= Ġrepository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( migration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( repository :: save ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. count () ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Database Ġmigration : Ġ$ numberOf Rows Ġrows Ġmigrated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscan For Test Site And Event ( ĊĠĠĠĠĠĠĠ Ġtest Site Ids : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġevent : ĠString , ĊĠĠĠĠĠĠĠ Ġreported After : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġsampled After : ĠLong ?, ĊĠĠĠĠĠĠĠ Ġexclusive Start Key : ĠString ?, ĊĠĠĠĠĠĠĠ ĠpageSize : ĠInt ? ĊĠĠĠ Ġ): ĠScan Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" status " Ġto ĠCondition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comparison Operator ( Comparison Operator . EQ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with AttributeValue List ( AttributeValue (). with S ( Status . NEGATIVE . toString ())), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" test Site Id " Ġto ĠCondition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comparison Operator ( Comparison Operator . IN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with AttributeValue List ( test Site Ids . map Ġ{ ĠAttribute Value (). with S ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sampled After Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter [" sampled At "] Ġ= ĠCondition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comparison Operator ( Comparison Operator . GT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with AttributeValue List ( AttributeValue (). with N ( sampled After . toString ())) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reported After Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠD ynamoDB Ġcan Ġhandle Ġcomparisons Ġof Ġdate times Ġas ĠISO Ġstrings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= ĠInstant . of Epoch Milli ( reported After ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter [" reported At "] Ġ= ĠCondition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Comparison Operator ( Comparison Operator . GT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with AttributeValue List ( AttributeValue (). with S ( date String )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġscan ( emptyList (), Ġevent , Ġfilter , ĠpageSize , Ġexclusive Start Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan ( ĊĠĠĠĠĠĠĠ Ġcurrent Results : ĠList < Order Information >, ĊĠĠĠĠĠĠĠ Ġevent : ĠString , ĊĠĠĠĠĠĠĠ Ġfilter : ĠMap < String , ĠCondition >, ĊĠĠĠĠĠĠĠ ĠpageSize : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġexclusive Start Key : ĠString ? ĊĠĠĠ Ġ): ĠScan Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠD ynamoDB Scan Expression (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Scan Filter ( filter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exclusive Start Key Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Exclusive Start Key ( map Of (" id " Ġto ĠAttribute Value (). with S ( exclusive Start Key ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġd ynamo Mapper . scan Page ( Raw Order Information :: class . java , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġcurrent Results Ġ+ Ġresponse . results ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( Raw Order Information :: cook ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthough Ġthe ĠAWS Ġdocumentation Ġshows Ġexamples Ġof Ġfiltering Ġnested ĠJSON Ġin Ġscans Ġand Ġqueries , ĠI Ġcould Ġneither Ġget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġworking Ġin Ġthe ĠSDK , Ġnor Ġin Ġthe ĠCLI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . metadata ?. get (" event ") ?. as Text () Ġ== Ġevent Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Evalu ated Key Ġ= Ġresponse . last Evalu ated Key ?. get (" id ") ?. s ĊĊĠĠĠĠĠĠĠ Ġif Ġ( should Not Fetch More Results ( last Evalu ated Key , ĠpageSize , Ġresults ) Ġ&& Ġresults Fit In One Page ( pageSize , Ġresults )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScan Result ( results , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( too Many Results For Page ( pageSize , Ġresults )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠpageSize Ġcan 't Ġbe Ġnull Ġdue Ġto Ġcondition Ġin Ġtoo Many Results For Page , Ġbut Ġapparently Ġthe Ġcompiler Ġdoesn 't Ġknow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturned Results Ġ= Ġresults . sub List ( 0 , ĠpageSize !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScan Result ( returned Results , Ġreturned Results . last (). id . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġhappens Ġif Ġmore Ġthan Ġ 1 MB Ġdata Ġin Ġd ynamoDB Ġhas Ġto Ġbe Ġscanned ĊĠĠĠĠĠĠĠ Ġreturn Ġscan ( results , Ġevent , Ġfilter , ĠpageSize , Ġlast Evalu ated Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Not Fetch More Results ( last Evalu ated Key : ĠString ?, ĠpageSize : ĠInt ?, Ġresults : ĠList < Order Information >) Ġ= ĊĠĠĠĠĠĠĠ Ġall Results Have Been F etched ( last Evalu ated Key ) Ġ|| Ġpage Is Full ( pageSize , Ġresults ) ĊĊĠĠĠ Ġprivate Ġfun Ġall Results Have Been F etched ( last Evalu ated Key : ĠString ?) Ġ= Ġlast Evalu ated Key Ġ== Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġpage Is Full ( pageSize : ĠInt ?, Ġresults : ĠList < Order Information >) Ġ= ĊĠĠĠĠĠĠĠ ĠpageSize Ġ!= Ġnull Ġ&& ĠpageSize Ġ== Ġresults . size ĊĊĠĠĠ Ġprivate Ġfun Ġresults Fit In One Page ( pageSize : ĠInt ?, Ġresults : ĠList < Order Information >) Ġ= ĊĠĠĠĠĠĠĠ ĠpageSize Ġ== Ġnull Ġ|| Ġresults . size Ġ<= ĠpageSize ĊĊĠĠĠ Ġprivate Ġfun Ġtoo Many Results For Page ( pageSize : ĠInt ?, Ġresults : ĠList < Order Information >) Ġ= ĊĠĠĠĠĠĠĠ ĠpageSize Ġ!= Ġnull Ġ&& Ġresults . size Ġ> ĠpageSize Ċ } Ċ