package Ġedu . by u . u api . compiler . collections Ċ Ċ import Ġcom . squareup . jav ap o et .* Ċ import Ġedu . by u . u api . compiler . Names Ċ import Ġedu . by u . u api . compiler . parameter ize Ċ import Ġjava . util .* Ċ import Ġjavax . lang . model . element . Modifier Ċ Ċ internal Ġclass ĠGenerated Params Provider ( val Ġmodel : ĠParams Model ) Ġ{ ĊĊĊĠĠĠ Ġfun Ġgenerate (): ĠJava File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Type Ġ= ĠClass Name . get ( model . packageName , Ġmodel . name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Spec Ġ= ĠType Spec . class Builder ( model . name Ġ+ Ġ"\ $ List Param Reader ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( Names . collection Params Provider . parameter ize ( params Type )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsearching Ġ= Ġmodel . search ing ?. generate ()?. also Ġ{ Ġit . add Static Bits ( type Spec ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiltering Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsorting Ġ= Ġmodel . sorting ?. generate Sorting ()?. also Ġ{ Ġit . add Static Bits ( type Spec ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdictionary Ġ= ĠParameter Spec . builder ( Names . type Dictionary , Ġ" dictionary ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Names . non Null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġget Meta Ġ= ĠMethod Spec . method Builder (" get Meta ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Names . override ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Names . non Null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Names . collection Params Meta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter ( dictionary ) ĊĊĠĠĠĠĠĠĠ Ġget Meta . add Statement ( assign OrNull ( Names . search Params Meta , Ġ" search ing ", Ġsearching ?. meta Field )) ĊĠĠĠĠĠĠĠ Ġget Meta . add Statement ( assign OrNull ( Names . filter Params Meta , Ġ" filtering ", Ġfiltering )) ĊĠĠĠĠĠĠĠ Ġget Meta . add Statement ( assign OrNull ( Names . sort Params Meta , Ġ" sorting ", Ġsorting ?. meta Field )) ĊĊĠĠĠĠĠĠĠ Ġget Meta . add Statement (" return Ġnew Ġ\$ T ( search ing , Ġfiltering , Ġsorting )", ĠNames . collection Params Meta ) ĊĊĠĠĠĠĠĠĠ Ġtype Spec . add Method ( get Meta . build ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJava File . builder ( model . packageName , Ġtype Spec . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip Java Lang Imports ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSort ing Model . generate Sorting (): ĠSort ing Elements Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Fields List Ġ= Ġthis . fields . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= ĠField Spec . builder ( Names . string , Ġ" SORT _ PARAMS _\ $ ${ it . name }\ $", ĠModifier . PRIVATE , ĠModifier . STATIC , ĠModifier . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. initializer ("\ $ S ", Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġto Ġfield !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġname Fields Map Ġ= Ġname Fields List . toMap () ĊĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string List , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" SORT _ PARAMS _ FIELDS ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE ĊĠĠĠĠĠĠĠ Ġ). initializer ( name List ( name Fields List . map Ġ{ Ġit . second Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġdefaults Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string List , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" SORT _ PARAMS _ DEFAULT _ FIELDS ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE ĊĠĠĠĠĠĠĠ Ġ). initializer ( name List ( this . defaults . map Ġ{ Ġname Fields Map . getValue ( it ) Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta Field Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . sort Params Meta , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" SORT _ PARAMS _ META ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE ĊĠĠĠĠĠĠĠ Ġ). initializer (" new Ġ\$ T (\ $ N , Ġ\$ N )", ĠNames . sort Params Meta , Ġall , Ġdefaults ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSort ing Elements ( name Fields Map , Ġall , Ġdefaults , Ġmeta Field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSearch ing Model . generate (): ĠSearch ing Elements Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearching Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġval Ġfield Names Ġ= Ġmutable ListOf < Field Spec >() ĊĠĠĠĠĠĠĠ Ġval Ġname Fields Ġ= Ġsorted Map Of < String , ĠField Spec >() ĊĠĠĠĠĠĠĠ Ġval Ġfield Lists Ġ= Ġsorted Map Of < String , ĠField Spec >() ĊĠĠĠĠĠĠĠ Ġval Ġstatic Block Ġ= ĠCode Block . builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta Field Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNames . search Params Meta , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" SEARCH _ PARAMS _ META ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL ĊĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠĠĠĠĠ Ġstatic Block . add Statement (" final Ġ\$ 1 T Ġsearch _ build Ġ= Ġnew Ġ\$ 1 T ()", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . linked HashMap . parameter ize ( Names . string , ĠNames . string Set ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsearching . contexts . forEach Ġ{ Ġcontext , Ġfields Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġfields . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SEARCH _ PARAMS _\ $$ context \ $_ \ $$ it \ $", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). initializer ("\ $ S ", Ġit ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Name Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SEARCH _ PARAMS _\ $$ context \ $", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). initializer ("\ $ S ", Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield List Ġ= ĠField Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string Set , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SEARCH _ PARAMS _\ $$ context \ $_ FIELDS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . STATIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). initializer ( name Set ( names . values )). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Names . addAll ( names . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Fields [ context ] Ġ= Ġcontext Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Lists [ context ] Ġ= Ġfield List ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Block . add Statement (" search _ build . put (\ $ N , Ġ\$ N )", Ġcontext Name , Ġfield List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstatic Block . add Statement ("\ $ N Ġ= Ġ\$ T . unmodifiable Map ( search _ build )", Ġmeta Field , ĠNames . util _ collections ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSearch ing Elements ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Names , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Fields , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Lists , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Block . build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠSearch ing Elements ( ĊĠĠĠĠĠĠĠ Ġval ĠfieldName Fields : ĠList < Field Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġcontext Name Fields : ĠSorted Map < String , ĠField Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġcontext Field Lists : ĠSorted Map < String , ĠField Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġmeta Field : ĠField Spec , ĊĠĠĠĠĠĠĠ Ġval Ġstatic Block : ĠCode Block ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Static Bits ( type Spec : ĠType Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Fields ( fieldName Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Fields ( context Name Fields . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Fields ( context Field Lists . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addField ( meta Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Static Block ( static Block ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠSort ing Elements ( ĊĠĠĠĠĠĠĠ Ġval Ġname Fields : ĠMap < String , ĠField Spec >, ĊĠĠĠĠĠĠĠ Ġval Ġall Sort Fields : ĠField Spec , ĊĠĠĠĠĠĠĠ Ġval Ġdefault Sort Fields : ĠField Spec , ĊĠĠĠĠĠĠĠ Ġval Ġmeta Field : ĠField Spec ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Static Bits ( type Spec : ĠType Spec . Builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . add Fields ( name Fields . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addField ( all Sort Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addField ( default Sort Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Spec . addField ( meta Field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġname List ( name Fields : ĠCollection < Field Spec >): ĠCode Block Ġ{ ĊĠĠĠ Ġif Ġ( name Fields . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . emptyList ()", ĠNames . util _ collections ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( name Fields . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . singletonList (\ $ N )", ĠNames . util _ collections , Ġname Fields . first ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġformat Ġ= Ġname Fields . join ToString (", Ġ") Ġ{ Ġ"\ $ N " Ġ} ĊĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . unmodifiable List (\ $ T . asList ($ format )) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . util _ collections , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . util _ arrays , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* name Fields . to Typed Array () ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġname Set ( name Fields : ĠCollection < Field Spec >): ĠCode Block Ġ{ ĊĠĠĠ Ġif Ġ( name Fields . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . empty Set ()", ĠNames . util _ collections ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( name Fields . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . singleton (\ $ N )", ĠNames . util _ collections , Ġname Fields . first ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġformat Ġ= Ġname Fields . join ToString (", Ġ") Ġ{ Ġ"\ $ N " Ġ} ĊĠĠĠ Ġreturn ĠCode Block . of ("\ $ T . unmodifiable Set ( new Ġ\$ T (\ $ T . asList ($ format ))) ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . util _ collections , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . string HashSet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNames . util _ arrays , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* name Fields . to Typed Array () ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġassign OrNull ( ĊĠĠĠ Ġtype : ĠType Name , ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġfield Spec : ĠField Spec ? Ċ ): ĠCode Block Ġ= ĊĠĠĠ Ġif Ġ( field Spec Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCode Block . of (" final Ġ\$ T Ġ$ name Ġ= Ġnull ", Ġtype ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠCode Block . of (" final Ġ\$ T Ġ$ name Ġ= Ġ\$ N ", Ġtype , Ġfield Spec ) ĊĠĠĠ Ġ} ĊĊ