/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġapp . cash . temp est 2 . internal Ċ Ċ import Ġapp . cash . temp est . internal . Codec Ċ import Ġapp . cash . temp est . internal . Getter Method Handler Ċ import Ġapp . cash . temp est . internal . ItemType Ċ import Ġapp . cash . temp est . internal . KeyType Ċ import Ġapp . cash . temp est . internal . Method Handler Ċ import Ġapp . cash . temp est . internal . Proxy Factory Ċ import Ġapp . cash . temp est . internal . Raw ItemType Ċ import Ġapp . cash . temp est . internal . Schema Ċ import Ġapp . cash . temp est . internal . declared Members Ċ import Ġapp . cash . temp est 2 . Async Inline View Ċ import Ġapp . cash . temp est 2 . Async Logical Db Ċ import Ġapp . cash . temp est 2 . Async Logical Table Ċ import Ġapp . cash . temp est 2 . Async Queryable Ċ import Ġapp . cash . temp est 2 . Async Sc ann able Ċ import Ġapp . cash . temp est 2 . Async Secondary Index Ċ import Ġapp . cash . temp est 2 . Async View Ċ import Ġsoftware . amazon . aw ssdk . en hanced . dynamodb . D ynamo Db Async Table Ċ import Ġsoftware . amazon . aw ssdk . en hanced . dynamodb . D ynamo Db Enhanced Async Client Ċ import Ġsoftware . amazon . aw ssdk . en hanced . dynamodb . Table Schema Ċ import Ġjava . lang . reflect . Method Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ internal Ġclass ĠAsync Logical Db Factory ( ĊĠ Ġprivate Ġval Ġd ynamo Db Enhanced Client : ĠD ynamo Db Enhanced Async Client Ċ ) Ġ: ĠAsync Logical Table . Factory Ġ{ ĊĠ Ġprivate Ġval Ġschema Ġ= ĠSchema . create ( ĊĠĠĠ ĠV 2 String AttributeValue , ĊĠĠĠ ĠV 2 Map AttributeValue . Factory , ĊĠĠĠ ĠV 2 For Index Annotation , ĊĠĠĠ ĠV 2 Attribute Annotation , ĊĠĠĠ ĠV 2 Raw ItemType Factory () ĊĠ Ġ) ĊĊĠ Ġfun Ġ< DB Ġ: ĠAsync Logical Db > Ġlogical Db ( db Type : ĠK Class < DB >): ĠDB Ġ{ ĊĠĠĠ Ġval Ġlogical Db Ġ= ĠD ynamo Db Logical Db ( ĊĠĠĠĠĠ ĠD ynamo Db Logical Db . Mapped Table Resource Factory . simple ( d ynamo Db Enhanced Client :: table ), ĊĠĠĠĠĠ Ġschema , ĊĠĠĠ Ġ). async ( d ynamo Db Enhanced Client , Ġthis ) ĊĠĠĠ Ġval Ġmethod Handlers Ġ= Ġmutable Map Of < Method , ĠMethod Handler >() ĊĠĠĠ Ġfor Ġ( member Ġin Ġdb Type . declared Members ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! member . returnType . jvm Er asure . is Subclass Of ( Async Logical Table :: class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġtable Type Ġ= Ġmember . returnType . jvm Er asure Ġas ĠK Class < Async Logical Table < Any >> ĊĠĠĠĠĠ Ġval ĠtableName Ġ= Ġget TableName ( member , Ġdb Type ) ĊĠĠĠĠĠ Ġval Ġtable Ġ= Ġlogical Table ( tableName , Ġtable Type ) ĊĠĠĠĠĠ Ġmethod Handlers [ member . java Method ] Ġ= ĠGetter Method Handler ( table ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠProxy Factory . create ( db Type , Ġmethod Handlers . toMap (), Ġlogical Db ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< T Ġ: ĠAsync Logical Table < RI >, ĠR I Ġ: ĠAny > Ġlogical Table ( tableName : ĠString , Ġtable Type : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠ Ġval Ġraw ItemType Ġ= Ġschema . add Raw Item ( tableName , Ġtable Type . raw ItemType ) ĊĠĠĠ Ġval Ġtable Schema Ġ= ĠTable Schema Factory . create < Any >( raw ItemType . type . java ) ĊĠĠĠ Ġval Ġd ynamo Db Table Ġ= Ġd ynamo Db Enhanced Client . table ( raw ItemType . tableName , Ġtable Schema ) ĊĠĠĠ Ġval Ġlogical Table Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĊĠĠĠĠĠĠĠ ĠAsync Logical Table < RI >, ĊĠĠĠĠĠĠĠ ĠAsync View < RI , ĠR I > Ġby ĠD ynamo Db View ( ĊĠĠĠĠĠĠĠĠĠ Ġraw ItemType . codec Ġas ĠCodec < RI , ĠAny >, ĊĠĠĠĠĠĠĠĠĠ Ġraw ItemType . codec Ġas ĠCodec < RI , ĠAny >, ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠ Ġ). async ( d ynamo Db Table ), ĊĠĠĠĠĠĠĠ ĠAsync Inline View . Factory Ġby ĠInline View Factory ( raw ItemType , Ġtable Schema , Ġd ynamo Db Table ), ĊĠĠĠĠĠĠĠ ĠAsync Secondary Index . Factory Ġby ĠSecondary Index Factory ( raw ItemType , Ġtable Schema , Ġd ynamo Db Table ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcodec ( type : ĠK Class < T >): Ġapp . cash . temp est 2 . Codec < T , ĠR I > Ġ= ĠCodec Adapter ( schema . codec ( type )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmethod Handlers Ġ= Ġmutable Map Of < Method , ĠMethod Handler >() ĊĠĠĠ Ġfor Ġ( member Ġin Ġtable Type . declared Members ) Ġ{ ĊĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġwhen Ġ( member . returnType . jvm Er asure ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAsync Inline View :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Ġ= Ġmember . returnType . arguments [ 0 ]. type ?. jvm Er asure !! ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Type Ġ= Ġmember . returnType . arguments [ 1 ]. type ?. jvm Er asure !! ĊĠĠĠĠĠĠĠĠĠ Ġlogical Table . inline View ( key Type , Ġitem Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠAsync Secondary Index :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġkey Type Ġ= Ġmember . returnType . arguments [ 0 ]. type ?. jvm Er asure !! ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Type Ġ= Ġmember . returnType . arguments [ 1 ]. type ?. jvm Er asure !! ĊĠĠĠĠĠĠĠĠĠ Ġlogical Table . secondary Index ( key Type , Ġitem Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmethod Handlers [ member . java Method ] Ġ= ĠGetter Method Handler ( component ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠProxy Factory . create ( table Type , Ġmethod Handlers . toMap (), Ġlogical Table ) ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠInline View Factory ( ĊĠĠĠ Ġprivate Ġval Ġraw ItemType : ĠRaw ItemType , ĊĠĠĠ Ġprivate Ġval Ġtable Schema : ĠTable Schema < Any >, ĊĠĠĠ Ġprivate Ġval Ġd ynamo Db Table : ĠD ynamo Db Async Table < Any >, ĊĠ Ġ) Ġ: ĠAsync Inline View . Factory Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< K Ġ: ĠAny , ĠI Ġ: ĠAny > Ġinline View ( ĊĠĠĠĠĠ Ġkey Type : ĠK Class < K >, ĊĠĠĠĠĠ Ġitem Type : ĠK Class < I > ĊĠĠĠ Ġ): ĠAsync Inline View < K , ĠI > Ġ{ ĊĠĠĠĠĠ Ġval Ġitem Ġ= Ġschema . addItem ( item Type , Ġraw ItemType . type ) ĊĠĠĠĠĠ Ġval Ġkey Ġ= Ġschema . add Key ( key Type , Ġitem Type ) ĊĠĠĠĠĠ Ġreturn Ġobject Ġ: ĊĠĠĠĠĠĠĠ ĠAsync Inline View < K , ĠI >, ĊĠĠĠĠĠĠĠ ĠAsync View < K , ĠI > Ġby ĠD ynamo Db View ( ĊĠĠĠĠĠĠĠĠĠ Ġkey . codec Ġas ĠCodec < K , ĠAny >, ĊĠĠĠĠĠĠĠĠĠ Ġitem . codec Ġas ĠCodec < I , ĠAny >, ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠ Ġ). async ( d ynamo Db Table ), ĊĠĠĠĠĠĠĠ ĠAsync Queryable < K , ĠI > Ġby Ġquery able ( ĊĠĠĠĠĠĠĠĠĠ Ġraw ItemType , ĊĠĠĠĠĠĠĠĠĠ Ġitem , ĊĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠĠĠ Ġd ynamo Db Table , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠAsync Sc ann able < K , ĠI > Ġby Ġsc ann able ( ĊĠĠĠĠĠĠĠĠĠ Ġitem , ĊĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠĠĠ Ġd ynamo Db Table , ĊĠĠĠĠĠĠĠ Ġ) Ġ{} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠSecondary Index Factory ( ĊĠĠĠ Ġprivate Ġval Ġraw ItemType : ĠRaw ItemType , ĊĠĠĠ Ġprivate Ġval Ġtable Schema : ĠTable Schema < Any >, ĊĠĠĠ Ġprivate Ġval Ġd ynamo Db Table : ĠD ynamo Db Async Table < Any >, ĊĠ Ġ) Ġ: ĠAsync Secondary Index . Factory Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< K Ġ: ĠAny , ĠI Ġ: ĠAny > Ġsecondary Index ( ĊĠĠĠĠĠ Ġkey Type : ĠK Class < K >, ĊĠĠĠĠĠ Ġitem Type : ĠK Class < I > ĊĠĠĠ Ġ): ĠAsync Secondary Index < K , ĠI > Ġ{ ĊĠĠĠĠĠ Ġval Ġitem Ġ= Ġschema . addItem ( item Type , Ġraw ItemType . type ) ĊĠĠĠĠĠ Ġval Ġkey Ġ= Ġschema . add Key ( key Type , Ġitem Type ) ĊĠĠĠĠĠ Ġreturn Ġobject Ġ: ĊĠĠĠĠĠĠĠ ĠAsync Secondary Index < K , ĠI >, ĊĠĠĠĠĠĠĠ ĠAsync Queryable < K , ĠI > Ġby Ġquery able ( ĊĠĠĠĠĠĠĠĠĠ Ġraw ItemType , ĊĠĠĠĠĠĠĠĠĠ Ġitem , ĊĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠĠĠ Ġd ynamo Db Table , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠAsync Sc ann able < K , ĠI > Ġby Ġsc ann able ( ĊĠĠĠĠĠĠĠĠĠ Ġitem , ĊĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠ Ġtable Schema , ĊĠĠĠĠĠĠĠĠĠ Ġd ynamo Db Table , ĊĠĠĠĠĠĠĠ Ġ) Ġ{} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< K Ġ: ĠAny , ĠI Ġ: ĠAny > Ġquery able ( ĊĠĠĠ Ġraw ItemType : ĠRaw ItemType , ĊĠĠĠ Ġitem Type : ĠItem Type , ĊĠĠĠ Ġkey Type : ĠKey Type , ĊĠĠĠ Ġtable Schema : ĠTable Schema < Any >, ĊĠĠĠ Ġd ynamo Db Table : ĠD ynamo Db Async Table < Any >, ĊĠ Ġ): ĠAsync Queryable < K , ĠI > Ġ{ ĊĠĠĠ Ġif Ġ( key Type . range KeyName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠUnsupported Async Queryable ( raw ItemType . type ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠD ynamo Db Queryable ( ĊĠĠĠĠĠ Ġkey Type . secondary Index Name , ĊĠĠĠĠĠ Ġitem Type . attribute Names , ĊĠĠĠĠĠ Ġkey Type . codec Ġas ĠCodec < K , ĠAny >, ĊĠĠĠĠĠ Ġitem Type . codec Ġas ĠCodec < I , ĠAny >, ĊĠĠĠĠĠ Ġtable Schema , ĊĠĠĠ Ġ). async ( d ynamo Db Table ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< K Ġ: ĠAny , ĠI Ġ: ĠAny > Ġsc ann able ( ĊĠĠĠ Ġitem Type : ĠItem Type , ĊĠĠĠ Ġkey Type : ĠKey Type , ĊĠĠĠ Ġtable Schema : ĠTable Schema < Any >, ĊĠĠĠ Ġd ynamo Db Table : ĠD ynamo Db Async Table < Any >, ĊĠ Ġ): ĠAsync Sc ann able < K , ĠI > Ġ{ ĊĠĠĠ Ġreturn ĠD ynamo Db Sc ann able ( ĊĠĠĠĠĠ Ġkey Type . secondary Index Name , ĊĠĠĠĠĠ Ġitem Type . attribute Names , ĊĠĠĠĠĠ Ġkey Type . codec Ġas ĠCodec < K , ĠAny >, ĊĠĠĠĠĠ Ġitem Type . codec Ġas ĠCodec < I , ĠAny >, ĊĠĠĠĠĠ Ġtable Schema , ĊĠĠĠ Ġ). async ( d ynamo Db Table ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġ< T Ġ: ĠAsync Logical Table < RI >, ĠR I Ġ: ĠAny > ĠK Class < T >. raw ItemType : ĠK Class < RI > ĊĠĠĠ Ġget () Ġ= Ġsup ert ypes [ 0 ]. arguments [ 0 ]. type ?. jvm Er asure !! Ġas ĠK Class < RI > Ċ } Ċ