/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . core . entity Ċ Ċ import Ġar cs . core . common . Id Ċ import Ġar cs . core . common . Refer enc able Ċ import Ġar cs . core . data . Capability . T tl Ċ import Ġar cs . core . data . FieldType Ċ import Ġar cs . core . data . Primitive Type Ċ import Ġar cs . core . data . Raw Entity Ċ import Ġar cs . core . data . Raw Entity . Companion . NO _ REFERENCE _ ID Ċ import Ġar cs . core . data . Raw Entity . Companion . UN INITIAL IZED _ TIMESTAMP Ċ import Ġar cs . core . data . Schema Ċ import Ġar cs . core . data . Schema Hash Ċ import Ġar cs . core . data . Schema Registry Ċ import Ġar cs . core . data . util . Refer enc able List Ċ import Ġar cs . core . data . util . Refer enc able Primitive Ċ import Ġar cs . core . data . util . to Refer enc able Ċ import Ġar cs . core . storage . Reference Ġas ĠStorage Reference Ċ import Ġar cs . core . util . Arc s Instant Ċ import Ġar cs . core . util . BigInt Ċ import Ġar cs . core . util . Time Ċ import Ġkotlin . reflect . K Property Ċ Ċ open Ġclass ĠEntity Base ( ĊĠĠĠ Ġprivate Ġval Ġentity ClassName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġschema : ĠSchema , ĊĠĠĠ Ġentity Id : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġcreation Timestamp : ĠLong Ġ= ĠUN INITIAL IZED _ TIMESTAMP , ĊĠĠĠ Ġexpiration Timestamp : ĠLong Ġ= ĠUN INITIAL IZED _ TIMESTAMP , ĊĠĠĠ Ġprivate Ġval Ġis Inline Entity : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠEntity Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOnly Ġthis Ġclass Ġshould Ġbe Ġable Ġto Ġchange Ġthese Ġfields Ġ( in Ġthe Ġ[ deserialize ] Ġand ĊĠĠĠĠ Ġ* Ġ[ ensure Entity Fields ] Ġmethods ). ĠBut Ġwe Ġkeep Ġthem Ġvisible Ġso Ġthat Ġit 's Ġpossible Ġto Ġconstruct ĊĠĠĠĠ Ġ* Ġmut ated Ġcopies Ġof Ġthe Ġsame Ġentity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfinal Ġoverride Ġvar Ġentity Id : ĠString ? Ġ= Ġentity Id ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġfinal Ġoverride Ġvar Ġcreation Timestamp : ĠLong Ġ= Ġcreation Timestamp ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġfinal Ġoverride Ġvar Ġexpiration Timestamp : ĠLong Ġ= Ġexpiration Timestamp ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġsing letons : ĠMutable Map < String , ĠAny ?> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġcollections : ĠMutable Map < String , ĠSet < Any >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ// ĠInitialize Ġall Ġfields . ĠAfter Ġthis Ġpoint , Ġif Ġa Ġkey Ġis Ġnot Ġpresent Ġin Ġsing letons / collections , ĊĠĠĠ Ġ// Ġit Ġwill Ġnot Ġbe Ġconsidered Ġa Ġvalid Ġfield Ġfor Ġthe Ġentity . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġconvenience Ġfor Ġexposing Ġsingleton Ġentity Ġfields Ġconvenient ly Ġin Ġsubclasses Ġof ĊĠĠĠĠ Ġ* Ġ[ Entity Base ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġwill Ġdelegate Ġthe Ġgetter / setter Ġof Ġthe Ġproperty Ġto Ġthe Ġ` get Singleton Value ` Ġand ĊĠĠĠĠ Ġ* Ġ` set Singleton Value ` Ġmethods . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* ĠĠ Ġvar Ġmy Property : ĠString Ġby ĠSingleton Property () ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprotected Ġinner Ġclass ĠSingleton Property < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Singleton Value ( property . name ) Ġas ĠT ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Singleton Value ( property . name , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġconvenience Ġfor Ġexposing Ġcollection Ġentity Ġfields Ġconvenient ly Ġin Ġsubclasses Ġof ĊĠĠĠĠ Ġ* Ġ[ Entity Base ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġwill Ġdelegate Ġthe Ġgetter / setter Ġof Ġthe Ġproperty Ġto Ġthe Ġ` get Collection Value ` Ġand ĊĠĠĠĠ Ġ* Ġ` set Collection Value ` Ġmethods . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* ĠĠ Ġvar Ġmy Property : ĠSet < String > Ġby ĠCollection Property () ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprotected Ġinner Ġclass ĠCollection Property < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Collection Value ( property . name ) Ġas ĠSet < T > ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠSet < T >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Collection Value ( property . name , Ġvalue Ġas ĠSet < Any >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġsingleton Ġfield . Ġ*/ ĊĠĠĠ Ġfun Ġget Singleton Value ( field : ĠString ): ĠAny ? Ġ= Ġif Ġ( field Ġin Ġsing letons ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsing letons [ field ] ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid FieldName Exception ( entity ClassName , Ġfield , Ġis Collection Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġcollection Ġfield . Ġ*/ ĊĠĠĠ Ġfun Ġget Collection Value ( field : ĠString ): ĠSet < Any > Ġ= Ġcollections . getOrElse ( field ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid FieldName Exception ( entity ClassName , Ġfield , Ġis Collection Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSets Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġsingleton Ġfield . Ġ*/ ĊĠĠĠ Ġfun Ġset Singleton Value ( field : ĠString , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= Ġget Singleton Type ( field ) ĊĠĠĠĠĠĠĠ Ġcheck Type ( field , Ġvalue , Ġexpected Type ) ĊĠĠĠĠĠĠĠ Ġsing letons [ field ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSets Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġcollection Ġfield . Ġ*/ ĊĠĠĠ Ġfun Ġset Collection Value ( field : ĠString , Ġvalues : ĠSet < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= Ġget Collection Type ( field ) ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġcheck Type ( field , Ġit , Ġexpected Type ) Ġ} ĊĠĠĠĠĠĠĠ Ġcollections [ field ] Ġ= Ġvalues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ FieldType ] Ġfor Ġthe Ġgiven Ġsingleton Ġfield . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid FieldName Exception Ġif Ġthe Ġfield Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Singleton Type ( field : ĠString ): ĠFieldType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Singleton Type OrNull ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid FieldName Exception ( entity ClassName , Ġfield , Ġis Collection Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġ[ FieldType ] Ġfor Ġthe Ġgiven Ġsingleton Ġfield , Ġor Ġnull Ġif Ġit Ġdoes Ġnot Ġexist . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Singleton Type OrNull ( field : ĠString ) Ġ= Ġschema . fields . sing letons [ field ] ĊĊĠĠĠ Ġ/** ĠReturns Ġtrue Ġif Ġthe Ġsingleton Ġhas Ġthe ĠField . Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġhas Singleton Field ( field : ĠString ) Ġ= Ġget Singleton Type OrNull ( field ) Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ FieldType ] Ġfor Ġthe Ġgiven Ġcollection Ġfield . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠInvalid FieldName Exception Ġif Ġthe Ġfield Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Collection Type ( field : ĠString ): ĠFieldType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Collection Type OrNull ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid FieldName Exception ( entity ClassName , Ġfield , Ġis Collection Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġ[ FieldType ] Ġfor Ġthe Ġgiven Ġcollection Ġfield , Ġor Ġnull Ġif Ġit Ġdoes Ġnot Ġexist . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Collection Type OrNull ( field : ĠString ) Ġ= Ġschema . fields . collections [ field ] ĊĊĠĠĠ Ġ/** ĠReturns Ġtrue Ġif Ġthe Ġcollection Ġhas Ġthe ĠField . Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġhas Collection Field ( field : ĠString ) Ġ= Ġget Collection Type OrNull ( field ) Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĠChecks Ġthat Ġthe Ġgiven Ġvalue Ġis Ġof Ġthe Ġexpected Ġtype . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Type ( field : ĠString , Ġvalue : ĠAny ?, Ġtype : ĠFieldType , Ġcontext : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNull Ġvalues Ġalways Ġpass . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFieldType . Primitive Ġ-> Ġwhen Ġ( type . primitive Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Boolean Ġ-> Ġrequire ( value Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠBoolean Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Number Ġ-> Ġrequire ( value Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠDouble Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Text Ġ-> Ġrequire ( value Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠString Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Byte Ġ-> Ġrequire ( value Ġis ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠByte Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Short Ġ-> Ġrequire ( value Ġis ĠShort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠShort Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Int Ġ-> Ġrequire ( value Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠInt Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Long Ġ-> Ġrequire ( value Ġis ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠLong Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Instant Ġ-> Ġrequire ( value Ġis ĠArc s Instant ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠInstant Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Char Ġ-> Ġrequire ( value Ġis ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠChar Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Float Ġ-> Ġrequire ( value Ġis ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠFloat Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . Double Ġ-> Ġrequire ( value Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠDouble Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrimitive Type . BigInt Ġ-> Ġrequire ( value Ġis ĠBigInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠBigInt Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFieldType . Entity Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġis ĠReference <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠReference Ġfor Ġ$ context $ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type . is Hard Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . set Hard Reference () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value . schema Hash Ġ== Ġtype . schema Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠReference Ġtype Ġto Ġhave Ġschema Ġhash Ġ${ type . schema Hash } Ġbut Ġhad Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema Ġhash Ġ${ value . schema Hash } ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFieldType . Tuple Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( b / 1 5 6 0 0 3 6 1 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError ("[ FieldType . Tuple ] s Ġare Ġnot Ġsupported .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFieldType . ListOf Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġlist Ġfor Ġ$ entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . forEach Ġ{ Ġcheck Type ( field , Ġit , Ġtype . primitive Type , Ġ" member Ġof Ġ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFieldType . Inline Entity Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value Ġis ĠEntity Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠEntity Base Ġfor Ġ$ context # entity ClassName .$ field , Ġbut Ġreceived Ġ$ value ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value . schema . hash Ġ== Ġtype . schema Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠEntity Base Ġtype Ġto Ġhave Ġschema Ġhash Ġ${ type . schema Hash } Ġbut Ġhad Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema Ġhash Ġ${ value . schema . hash } ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCombin es Ġall Ġsingleton / collection Ġfield Ġdata Ġinto Ġa Ġsingle Ġmap . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġall Fields (): ĠMap < String , ĠAny ?> Ġ= Ġmutable Map Of < String , ĠAny ?> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput All ( sing letons ) ĊĠĠĠĠĠĠĠ Ġput All ( collections ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġschema . fields . sing letons . keys . forEach Ġ{ Ġsing letons [ it ] Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġschema . fields . collections . keys . forEach Ġ{ Ġcollections [ it ] Ġ= Ġempty Set () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize ( store Schema : ĠSchema ?): ĠRaw Entity Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserialization Fields Ġ= Ġstore Schema ?. fields Ġ?: Ġschema . fields ĊĠĠĠĠĠĠĠ Ġval Ġserialization Ġ= ĠRaw Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġentity Id Ġ?: ĠNO _ REFERENCE _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsing letons Ġ= Ġserialization Fields . sing letons . keys . intersect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema . fields . sing letons . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġto Ġget Singleton Value ( field )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Refer enc able ( it , Ġget Singleton Type ( field )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollections Ġ= Ġserialization Fields . collections . keys . intersect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschema . fields . collections . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġget Collection Type ( field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġto Ġget Collection Value ( field ). map Ġ{ Ġto Refer enc able ( it , Ġtype ) Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Timestamp Ġ= Ġcreation Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Timestamp Ġ= Ġexpiration Timestamp ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠInline Ġentities Ġshould Ġhave Ġvalue Ġequality , Ġbut Ġwe Ġuse Ġthe Ġid Ġto Ġdetermine ĊĠĠĠĠĠĠĠĠ Ġ* Ġequality Ġwhen Ġadding Ġentities Ġto ĠCR DT Ġcollections / sing letons . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Inline Entity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġserialization . copy ( id Ġ= Ġserialization . hashCode (). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġserialization ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPop ulates Ġthe Ġentity Ġfrom Ġthe Ġgiven Ġ[ Raw Entity ] Ġserialization . ĠMust Ġonly Ġbe Ġcalled Ġon Ġa ĊĠĠĠĠ Ġ* Ġfresh , Ġempty Ġinstance . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSupports Ġtype Ġs licing : Ġfields Ġthat Ġare Ġnot Ġpresent Ġin Ġthe Ġ[ Schema ] Ġfor Ġthis Ġ[ Entity ] Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġsilently Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnested Entity Specs Ġmapping Ġfrom Ġ[ Schema Hash ] Ġto Ġ[ Entity Spec ], Ġused Ġwhen Ġdere fer encing ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ[ Reference ] Ġfields Ġinside Ġthe Ġentity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdeserialize ( ĊĠĠĠĠĠĠĠ Ġraw Entity : ĠRaw Entity , ĊĠĠĠĠĠĠĠ Ġnested Entity Specs : ĠMap < Schema Hash , ĠEntity Spec < out ĠEntity >> Ġ= Ġmap Of () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity Id Ġ= Ġif Ġ( raw Entity . id Ġ== ĠNO _ REFERENCE _ ID Ġ|| Ġis Inline Entity ) Ġnull Ġelse Ġraw Entity . id ĊĠĠĠĠĠĠĠ Ġraw Entity . sing letons . forEach Ġ{ Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Singleton Type OrNull ( field )?. let Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Singleton Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġfrom Refer enc able ( it , Ġtype , Ġnested Entity Specs ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġraw Entity . collections . forEach Ġ{ Ġ( field , Ġvalues ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Collection Type OrNull ( field )?. let Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Collection Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . map Ġ{ Ġfrom Refer enc able ( it , Ġtype , Ġnested Entity Specs ) Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcreation Timestamp Ġ= Ġraw Entity . creation Timestamp ĊĠĠĠĠĠĠĠ Ġexpiration Timestamp Ġ= Ġraw Entity . expiration Timestamp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġensure Entity Fields ( ĊĠĠĠĠĠĠĠ Ġid Generator : ĠId . Generator , ĊĠĠĠĠĠĠĠ Ġhandle Name : ĠString , ĊĠĠĠĠĠĠĠ Ġtime : ĠTime , ĊĠĠĠĠĠĠĠ Ġttl : ĠT tl ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( entityId Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id Ġ= Ġid Generator . new Child Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġshould Ġwe Ġallow Ġthis Ġto Ġbe Ġpl um bed Ġthrough ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Generator . new Arc Id (" dummy - arc "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġtime . currentTimeMillis ĊĠĠĠĠĠĠĠ Ġif Ġ( creation Timestamp Ġ== ĠUN INITIAL IZED _ TIMESTAMP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Timestamp Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ttl Ġ!= ĠT tl . Infinite ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Timestamp Ġ= Ġttl . calculate Expiration ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( creation Timestamp Ġ<= Ġnow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġset Ġa Ġfuture Ġcreation Timestamp =$ creation Timestamp ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠEntity Base ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( entity ClassName Ġ!= Ġother . entity ClassName ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( schema Ġ!= Ġother . schema ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( entityId Ġ!= Ġother . entityId ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( sing letons Ġ!= Ġother . sing letons ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( collections Ġ!= Ġother . collections ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( creation Timestamp Ġ!= Ġother . creation Timestamp ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( expiration Timestamp Ġ!= Ġother . expiration Timestamp ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġentity ClassName . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġschema . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġentity Id . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġsing letons . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcollections . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġall Fields (). entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (", Ġ") Ġ{ Ġ( field , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ field Ġ= Ġ$ value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ entity ClassName ($ fields )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠEntity Base Spec ( ĊĠĠĠ Ġoverride Ġval ĠS CHE MA : ĠSchema Ċ ) Ġ: ĠEntity Spec < Entity Base > Ġ{ ĊĠĠĠ Ġinit Ġ{ ĠSchema Registry . register ( SCHEMA ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( data : ĠRaw Entity ): ĠEntity Base Ġ= ĊĠĠĠĠĠĠĠ ĠEntity Base (" Entity Base ", ĠS CHE MA ). apply Ġ{ Ġdeserialize ( data ) Ġ} Ċ } Ċ Ċ class ĠInvalid FieldName Exception ( ĊĠĠĠ Ġentity ClassName : ĠString , ĊĠĠĠ Ġfield : ĠString , ĊĠĠĠ Ġis Collection : ĠBoolean Ċ ) Ġ: ĠIllegalArgumentException ( ĊĠĠĠ Ġ"$ entity ClassName Ġdoes Ġnot Ġhave Ġa Ġ${ if Ġ( is Collection ) Ġ" collection " Ġelse Ġ" singleton "} Ġfield Ġ" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" called Ġ\"$ field \" ." Ċ ) Ċ Ċ private Ġfun Ġto Refer enc able ( value : ĠAny , Ġtype : ĠFieldType ): ĠRefer enc able Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠ Ġis ĠFieldType . Primitive Ġ-> Ġwhen Ġ( type . primitive Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Boolean Ġ-> Ġ( value Ġas ĠBoolean ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Number Ġ-> Ġ( value Ġas ĠDouble ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Text Ġ-> Ġ( value Ġas ĠString ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Byte Ġ-> Ġ( value Ġas ĠByte ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Short Ġ-> Ġ( value Ġas ĠShort ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Int Ġ-> Ġ( value Ġas ĠInt ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Long Ġ-> Ġ( value Ġas ĠLong ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Instant Ġ-> Ġ( value Ġas ĠArc s Instant ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Char Ġ-> Ġ( value Ġas ĠChar ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Float Ġ-> Ġ( value Ġas ĠFloat ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . Double Ġ-> Ġ( value Ġas ĠDouble ). to Refer enc able () ĊĠĠĠĠĠĠĠ ĠPrimitive Type . BigInt Ġ-> Ġ( value Ġas ĠBigInt ). to Refer enc able () ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠFieldType . Entity Ref Ġ-> Ġ( value Ġas ĠReference < *> ). to Refer enc able () ĊĠĠĠ Ġ// ĠTODO ( b / 1 5 5 0 2 5 2 5 5 ) ĊĠĠĠ Ġis ĠFieldType . Tuple Ġ-> ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError ("[ FieldType . Tuple ] s Ġcannot Ġbe Ġconverted Ġto Ġreferences .") ĊĠĠĠ Ġis ĠFieldType . ListOf Ġ-> ĊĠĠĠĠĠĠĠ Ġ( value Ġas ĠList < *> ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Refer enc able ( it !! , Ġtype . primitive Type ) ĊĠĠĠĠĠĠĠ Ġ}. to Refer enc able ( type ) ĊĠĠĠ Ġis ĠFieldType . Inline Entity Ġ-> Ġ( value Ġas ĠEntity Base ). serialize () Ċ } Ċ Ċ private Ġfun Ġfrom Refer enc able ( ĊĠĠĠ Ġrefer enc able : ĠRefer enc able , ĊĠĠĠ Ġtype : ĠFieldType , ĊĠĠĠ Ġnested Entity Specs : ĠMap < Schema Hash , ĠEntity Spec < out ĠEntity >> Ċ ): ĠAny Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠFieldType . Primitive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( refer enc able Ġis ĠRefer enc able Primitive <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠRefer enc able Primitive Ġbut Ġwas Ġ$ refer enc able ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( refer enc able . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Refer enc able Primitive Ġencoded Ġan Ġunexpected Ġnull Ġvalue ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFieldType . Entity Ref Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( refer enc able Ġis ĠStorage Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠReference Ġbut Ġwas Ġ$ refer enc able ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Spec Ġ= Ġrequire NotNull ( nested Entity Specs [ type . schema Hash ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġschema Ġwith Ġhash Ġ${ type . schema Hash } ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReference ( entity Spec , Ġrefer enc able ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ( b / 1 5 5 0 2 5 2 5 5 ) ĊĠĠĠĠĠĠĠ Ġis ĠFieldType . Tuple Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" References Ġcannot Ġbe Ġconverted Ġ[ FieldType . Tuple ] s .") ĊĠĠĠĠĠĠĠ Ġis ĠFieldType . ListOf Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( refer enc able Ġis ĠRefer enc able List <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠRefer enc able List Ġbut Ġwas Ġ$ refer enc able ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( refer enc able . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Refer enc able List Ġencoded Ġan Ġunexpected Ġnull Ġvalue ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefer enc able . value . map Ġ{ Ġfrom Refer enc able ( it , Ġtype . primitive Type , Ġnested Entity Specs ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠFieldType . Inline Entity Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( refer enc able Ġis ĠRaw Entity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected ĠRaw Entity Ġbut Ġwas Ġ$ refer enc able ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Spec Ġ= Ġrequire NotNull ( nested Entity Specs [ type . schema Hash ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġschema Ġwith Ġhash Ġ${ type . schema Hash } ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Spec . deserialize ( refer enc able ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ