package Ġio . github . th under z 9 9 . cosmos Ċ Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . convert Value Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġcom . microsoft . azure . document db .* Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . json . JSONObject Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ val Ġmapper Ġ= ĠObjectMapper (). configure ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES , Ġfalse ). register Kotlin Module () Ċ Ċ /** Ċ Ġ* Ġclass Ġthat Ġrepresent Ġa Ġcos mos Ġaccount Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* Ġval Ġaccount Ġ= ĠCosmos (" Account Endpoint = https :// xxx . documents . azure . com : 4 4 3 /; Account Key = xxx == ; ") Ċ Ġ* Ġval Ġdb Ġ= Ġaccount . get Database (" Database 1 ") Ċ Ġ* Ċ Ġ* Ġ// Then Ġuse Ġdb Ġto Ġdo ĠCRUD Ġ/ Ġquery Ċ Ġ* Ġdb . upsert (" Users ", Ġuser ) Ċ Ġ* Ċ Ġ*/ Ċ class ĠCosmos ( private Ġval Ġconnection String : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclient : ĠDocument Client ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( connectionString . contains ("/ ; ")) Ġ{ Ġ" Make Ġsure Ġconnection String Ġis Ġin Ġvalid Ġformat : Ġ$ connectionString " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( connectionString . contains (" https :// ")) Ġ{ Ġ" Make Ġsure Ġconnection String Ġis Ġin Ġvalid Ġformat : Ġ$ connectionString " Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġ( endpoint , Ġkey ) Ġ= Ġconnection String . split ("; ") ĊĊĠĠĠĠĠĠĠ Ġendpoint Ġ= Ġendpoint . remove Prefix (" Account Endpoint =") ĊĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey . remove Prefix (" Account Key =") ĊĊĠĠĠĠĠĠĠ Ġcheck ( endpoint . isNotBlank ()) Ġ{ Ġ" endpoint Ġmust Ġbe Ġnon - empty " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( key . isNotBlank ()) Ġ{ Ġ" key Ġmust Ġbe Ġnon - empty " Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" endpoint : Ġ$ endpoint " Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" key : Ġ${ key . substring ( 0 , Ġ 3 )} ..." Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠDocument Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint , Ġkey , ĠConnection Policy . GetDefault (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCons istency Level . Session ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa ĠCosmos Database Ġobject Ġby Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Database ( database : ĠString ): ĠCosmos Database Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( database . isNotBlank ()) Ġ{ Ġ" database Ġmust Ġbe Ġnon - empty " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Database ( client , Ġdatabase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġthe Ġdb Ġand Ġcoll Ġif Ġnot Ġexist . ĠColl Ġcreation Ġwill Ġbe Ġskipped Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate If NotExist ( database : ĠString , Ġcollection : ĠString Ġ= Ġ"") : ĠCosmos Database Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( collection . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Database If NotExist ( client , Ġdatabase ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Collection If NotExist ( client , Ġdatabase , Ġcollection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Database ( client , Ġdatabase ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġclass Ġthat Ġrepresent Ġa Ġcos mos Ġdatabase Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* Ġval Ġcos mos Ġ= ĠCosmos (" Account Endpoint = https :// xxx . documents . azure . com : 4 4 3 /; Account Key = xxx == ; ") Ċ Ġ* Ġval Ġdb Ġ= Ġcos mos . get Database (" Database 1 ") Ċ Ġ* Ċ Ġ* Ġ// Then Ġuse Ġdb Ġto Ġdo ĠCRUD Ġ/ Ġquery Ċ Ġ* Ġdb . upsert (" Users ", Ġuser 1 ) Ċ Ġ* Ġuser 2 : ĠUser Ġ= Ġdb . read (" Users ", Ġ" id 0 0 1 "). toObject () Ċ Ġ* Ċ Ġ*/ Ċ class ĠCosmos Database ( private Ġval Ġclient : ĠDocument Client , Ġprivate Ġval Ġdatabase : ĠString ) Ġ{ ĊĊĠĠĠ Ġfun Ġcreate ( collection : ĠString , Ġdata : ĠAny , Ġpartition : ĠString Ġ= Ġcollection ): ĠCosmos Document Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġobject Map : ĠMutable Map < String , ĠAny > Ġ= Ġmapper . convert Value ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġpartition Ġinfo ĊĠĠĠĠĠĠĠ Ġobject Map [ getDefault Partition Key ()] Ġ= Ġpartition ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Link Ġ= Ġget Collection Link ( database , Ġcollection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġclient . create Document ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Link , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Options ( partition ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ). resource ĊĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" created ĠDocument : Ġ$ collection Link / docs /${ object Map [" id "] }, Ġpartition :$ partition " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Document ( resource . toObject ( JSONObject :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThrow Ġ 4 0 4 ĠNot ĠFound ĠException Ġif Ġobject Ġnot Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread ( collection : ĠString , Ġid : ĠString , Ġpartition : ĠString Ġ= Ġcollection ): ĠCosmos Document Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck ( id . isNotEmpty ()) Ġ{ Ġ" id Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Link Ġ= Ġget Document Link ( database , Ġcollection , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġclient . read Document ( document Link , Ġrequest Options ( partition )). resource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" read Document : Ġ$ document Link , Ġpartition :$ partition " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Document ( resource . toObject ( JSONObject :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġexisting Ġdata . Ġif Ġnot Ġexist , Ġthrow ĠNot ĠFound ĠException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( collection : ĠString , Ġid : ĠString , Ġdata : ĠAny , Ġpartition : ĠString Ġ= Ġcollection ): ĠCosmos Document Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck ( id . isNotEmpty ()) Ġ{ Ġ" id Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Link Ġ= Ġget Document Link ( database , Ġcollection , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġval Ġobject Map : ĠMutable Map < String , ĠAny > Ġ= Ġmapper . convert Value ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġpartition Ġinfo ĊĠĠĠĠĠĠĠ Ġobject Map [ getDefault Partition Key ()] Ġ= Ġpartition ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġclient . replace Document ( document Link , Ġobject Map , Ġrequest Options ( partition )). resource ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" updated ĠDocument : Ġ$ document Link , Ġpartition :$ partition " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Document ( resource . toObject ( JSONObject :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġupsert Ġdata Ġ( if Ġnot Ġexist , Ġcreate Ġthe Ġdata . Ġif Ġalready Ġexist , Ġupdate Ġthe Ġdata ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupsert ( collection : ĠString , Ġid : ĠString Ġ= Ġ"", Ġdata : ĠAny , Ġpartition : ĠString Ġ= Ġcollection ): ĠCosmos Document Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Link Ġ= Ġget Collection Link ( database , Ġcollection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġobject Map : ĠMutable Map < String , ĠAny > Ġ= Ġmapper . convert Value ( data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġpartition Ġinfo ĊĠĠĠĠĠĠĠ Ġobject Map [ getDefault Partition Key ()] Ġ= Ġpartition ĊĊĠĠĠĠĠĠĠ Ġif Ġ( id . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Map [" id "] Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck ( object Map [" id "]. toString (). isNotEmpty ()) Ġ{ Ġ" id Ġmust Ġbe Ġnon - empty " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= Ġclient . upsert Document ( collection Link , Ġobject Map , Ġrequest Options ( partition ), Ġtrue ). resource ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" upsert ed ĠDocument : Ġ$ collection Link / docs /$ id , Ġpartition :$ partition " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Document ( resource . toObject ( JSONObject :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġdocument . ĠDo Ġnothing Ġif Ġobject Ġnot Ġexist Ġ( Suppress ing Ġ 4 0 4 ĠNot ĠFound ĠException ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete ( coll : ĠString , Ġid : ĠString , Ġpartition : ĠString Ġ= Ġcoll ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck ( id . isNotEmpty ()) Ġ{ Ġ" id Ġmust Ġnot Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Collection ( coll ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Link Ġ= Ġget Document Link ( database , Ġcoll , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . delete Document ( document Link , Ġrequest Options ( partition )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" deleted ĠDocument : Ġ$ document Link , Ġpartition :$ partition " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( de : ĠDocument ClientException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Resource NotFoundException ( de )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġde ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" delete Ġis Ġskipped Ġdue Ġto Ġnot Ġfound . ĠDocument : Ġ$ document Link , Ġpartition :$ partition " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfind Ġitems Ġfrom Ġcollection ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsage : ĊĠĠĠĠ Ġ* Ġ< code > ĊĠĠĠĠ Ġ* Ġval Ġusers Ġ= Ġdb . find (" Data ", Ġfilter Ġ= Ġjson Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠ Ġ" name " Ġto Ġ" H anks " ĊĠĠĠĠ Ġ* Ġ}). toList < User >() ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ// Ġor ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġval Ġusers Ġ= Ġdb . find ( ĊĠĠĠĠ Ġ* ĠĠ Ġ" Data ", ĊĠĠĠĠ Ġ* ĠĠ Ġfilter Ġ= Ġjson Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ" fullName . last " Ġto Ġ" H anks " ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ" id " Ġto ĠlistOf (" id 0 0 1 ", Ġ" id 0 0 3 ", Ġ" id 0 0 5 ") ĊĠĠĠĠ Ġ* ĠĠ Ġ}, ĊĠĠĠĠ Ġ* ĠĠ Ġsort Ġ= Ġjson Ġ{ ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ"_ ts " Ġto Ġ" DESC " ĊĠĠĠĠ Ġ* ĠĠ Ġ}, ĊĠĠĠĠ Ġ* ĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠ Ġ* ĠĠ Ġlimit Ġ= Ġ 1 0 , ĊĠĠĠĠ Ġ* ĠĠ Ġpartition Ġ= Ġ" Users " ĊĠĠĠĠ Ġ* Ġ). toList < User >() ĊĠĠĠĠ Ġ* Ġ</ code > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind ( ĊĠĠĠĠĠĠĠ Ġcollection : ĠString , ĊĠĠĠĠĠĠĠ Ġfilter : ĠJSONObject Ġ= ĠJSONObject (), ĊĠĠĠĠĠĠĠ Ġsort : ĠJSONObject Ġ= ĠJSONObject (""" Ġ{" _ ts ": Ġ" DESC "} Ġ""" ), ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 0 0 , ĊĠĠĠĠĠĠĠ Ġpartition : ĠString Ġ= Ġcollection ĊĠĠĠ Ġ): ĠCosmos Document List Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Link Ġ= Ġget Collection Link ( database , Ġcollection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠFeed Options () ĊĠĠĠĠĠĠĠ Ġoptions . partition Key Ġ= ĠPartition Key ( partition ) ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Spec : ĠSql Query Spec Ġ= Ġbuild Query Spec ( filter , Ġsort , Ġoffset , Ġlimit ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocs Ġ= Ġclient . query Documents ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Link , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions ĊĠĠĠĠĠĠĠ Ġ). query Iterable . toList < Document >() ĊĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" find ĠDocument : Ġcollection : Ġ$ collection , Ġfilter : Ġ$ filter , Ġsort : Ġ$ sort , Ġoffset : Ġ$ offset , Ġlimit : Ġ$ limit , Ġ Ġpartition :$ partition " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Objs : ĠList < JSONObject > Ġ= Ġdocs . as Sequence (). map Ġ{ Ġit . toObject ( JSONObject :: class . java ) Ġ}. toList () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCosmos Document List ( json Objs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġreturn Ġcount Ġof Ġdocuments ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcount ( ĊĠĠĠĠĠĠĠ Ġcollection : ĠString , ĊĠĠĠĠĠĠĠ Ġfilter : ĠJSONObject Ġ= ĠJSONObject (), ĊĠĠĠĠĠĠĠ Ġpartition : ĠString Ġ= Ġcollection ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Collection ( collection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Link Ġ= Ġget Collection Link ( database , Ġcollection ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠFeed Options () ĊĠĠĠĠĠĠĠ Ġoptions . partition Key Ġ= ĠPartition Key ( partition ) ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Spec : ĠSql Query Spec Ġ= Ġbuild Query Spec ( filter , Ġcount Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocs Ġ= Ġclient . query Documents ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Link , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions ĊĠĠĠĠĠĠĠ Ġ). query Iterable . toList < Document >() ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdocs [ 0 ]. getInt ("$ 1 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġrequest Options ( partition : ĠString ): ĠRequest Options Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠRequest Options () ĊĠĠĠĠĠĠĠ Ġoptions . partition Key Ġ= ĠPartition Key ( partition ) ĊĠĠĠĠĠĠĠ Ġreturn Ġoptions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcheck Collection ( coll : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( coll . isNotBlank ()) Ġ{ Ġ" coll Ġmust Ġbe Ġnon - blank " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġthe Ġdb Ġand Ġcoll Ġif Ġnot Ġexist . ĠColl Ġcreation Ġwill Ġbe Ġskipped Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate If NotExist ( db : ĠString Ġ= Ġthis . database , Ġcoll : ĠString Ġ= Ġ"") : ĠCosmos Database Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( coll . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Database If NotExist ( client , Ġdb ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Collection If NotExist ( client , Ġdb , Ġcoll ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresent Ġa ĠCosmos DB Ġdocument . ĠHas Ġa ĠJSONObject Ġinside . Ċ Ġ* Ċ Ġ* ĠHaving Ġto Object Ġand ĠtoJson Ġutil Ġmethod Ġto Ġconvert Ġto ĠClass Ġor ĠString Ġconvenient ly . Ċ Ġ* Ċ Ġ*/ Ċ data Ġclass ĠCosmos Document ( val Ġjson Obj : ĠJSONObject ) Ġ{ ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġto Object (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . readValue ( json Obj . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . writeValue AsString ( json Obj ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Map (): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . readValue ( json Obj . toString ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresent Ġa Ġlist Ġof ĠCosmos DB Ġdocument . Ċ Ġ* Ċ Ġ* ĠHaving Ġto List Ġand ĠtoJson Ġutil Ġmethod Ġto Ġconvert Ġto ĠList < T > Ġor ĠString Ġconvenient ly . Ċ Ġ* Ċ Ġ*/ Ċ data Ġclass ĠCosmos Document List ( val Ġjson Objs : ĠList < JSONObject >) Ġ{ ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġto List (): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjson Objs . as Sequence (). map Ġ{ Ġmapper . readValue < T >( it . toString ()) Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . writeValue AsString ( json Objs ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġget Database Link ( db : ĠString ) Ġ= Ġ"/ dbs /% s ". format ( db ) Ċ Ċ internal Ġfun Ġget Collection Link ( db : ĠString , Ġcoll : ĠString ) Ġ= ĊĠĠĠ Ġ"/ dbs /% s / coll s /% s ". format ( db , Ġcoll ) Ċ Ċ internal Ġfun Ġget Document Link ( db : ĠString , Ġcoll : ĠString , Ġid : ĠString ) Ġ= ĊĠĠĠ Ġ"/ dbs /% s / coll s /% s / docs /% s ". format ( db , Ġcoll , Ġid ) Ċ Ċ internal Ġfun Ġis Resource NotFoundException ( e : ĠException ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( e Ġis ĠDocument ClientException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġe . statusCode Ġ== Ġ 4 0 4 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġe . message ?. contains (" Resource ĠNot ĠFound ") Ġ?: Ġfalse Ċ } Ċ Ċ /** Ċ Ġ* Ġ ĠA Ġhelper Ġfunction Ġto Ġgenerate Ġc . foo ĠIN Ġ(...) Ġquery Text Ċ Ġ* Ċ Ġ* Ġ ĠINPUT : Ġ" parentId ", Ġ"@ parentId ", Ġ[" id 0 0 1 ", Ġ" id 0 0 2 ", Ġ" id 0 0 5 "], Ġparams Ċ Ġ* Ġ ĠOUTPUT : Ġ"( Ġc . parentId ĠIN Ġ(@ parentId __ 0 , Ġ@ parentId __ 1 , Ġ@ parentId __ 2 ) Ġ) ", Ġ Ġand Ġadd Ġparams Value Ġinto Ġparams Ċ Ġ*/ Ċ internal Ġfun Ġbuild Array ( ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġparam Name : ĠString , ĊĠĠĠ Ġparam Value : ĠIterable < Indexed Value < Any ? >>, ĊĠĠĠ Ġparams : ĠSql Parameter Collection Ċ ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġparam Value . join ToString (", Ġ", Ġprefix Ġ= Ġ" Ġ( c .$ key ĠIN Ġ( ", Ġpostfix Ġ= Ġ")) ") Ġ{ Ġ( index , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġparam Name Idx Ġ= Ġ"${ param Name } __$ index " ĊĠĠĠĠĠĠĠ Ġparams . add ( Sql Parameter ( param Name Idx , Ġv )) ĊĠĠĠĠĠĠĠ Ġparam Name Idx ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġbuild Query Spec ( ĊĠĠĠ Ġfilter : ĠJSONObject Ġ= ĠJSONObject (), ĊĠĠĠ Ġsort : ĠJSONObject Ġ= ĠJSONObject (), ĊĠĠĠ Ġoffset : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġlimit : ĠInt Ġ= Ġ 1 0 0 , ĊĠĠĠ Ġcount : ĠBoolean Ġ= Ġfalse Ċ ): ĠSql Query Spec Ġ{ ĊĊĠĠĠ Ġvar Ġselect Ġ= Ġif Ġ( count ) Ġ" COUNT ( 1 )" Ġelse Ġ"*" ĊĠĠĠ Ġval Ġquery Text Ġ= ĠStringBuilder (" SELECT Ġ$ select ĠFROM Ġc ") ĊĠĠĠ Ġval Ġparams Ġ= ĠSql Parameter Collection () ĊĊĠĠĠ Ġ// Ġfilter ĊĠĠĠ Ġfilter . keys (). with Index (). forEach Ġ{ Ġ( index , Ġk ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Text . append (" ĠWHERE ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Text . append (" ĠAND ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠfullName . last Ġ-> Ġ@ fullName __ last ĊĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= Ġ"@ ${ k . replace (".", Ġ"__ ") }" ĊĠĠĠĠĠĠĠ Ġval Ġparam Value Ġ= Ġfilter [ k ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( param Value Ġis ĠCollection <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe . g Ġ( Ġc . parentId ĠIN Ġ(@ parentId __ 0 , Ġ@ parentId __ 1 , Ġ@ parentId __ 2 ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Text . append ( build Array ( k , Ġparam Name , Ġparam Value . with Index (), Ġparams )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( param Value Ġis ĠArray <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Text . append ( build Array ( k , Ġparam Name , Ġparam Value . with Index (), Ġparams )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġother Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Text . append (" Ġ( c .$ k Ġ= Ġ$ param Name )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add ( Sql Parameter ( param Name , Ġparam Value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsort ĊĠĠĠ Ġif Ġ(! sort . isEmpty Ġ&& Ġ! count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Text . append ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsort . keys (). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ",", Ġprefix Ġ= Ġ" ĠORDER ĠBY ", Ġpostfix Ġ= Ġ"") Ġ{ Ġk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsort Str Ġ= Ġsort [ k ]. toString (). toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( sort Str Ġ== Ġ" DESC " Ġ|| Ġsort Str Ġ== Ġ" ASC ") Ġ{ Ġ" Order Ġmust Ġbe ĠASC Ġor ĠDESC . Ġprovided : Ġ$ sort Str " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġc .$ k Ġ$ sort Str " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġoffset Ġand Ġlimit ĊĠĠĠ Ġif Ġ(! count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Text . append (" ĠOFFSET Ġ$ offset ĠLIMIT Ġ$ limit ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠSql Query Spec ( query Text . toString (), Ġparams ). also Ġ{ Ġlog . info Ġ{ Ġ" query Text :$ query Text " Ġ} Ġ} Ċ } Ċ Ċ internal Ġfun Ġcreate Database If NotExist ( client : ĠDocument Client , Ġdb : ĠString ): ĠDatabase Ġ{ ĊĊĠĠĠ Ġvar Ġdatabase Ġ= Ġread Database ( client , Ġdb ) ĊĠĠĠ Ġif Ġ( database Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Obj Ġ= ĠDatabase () ĊĠĠĠĠĠĠĠ Ġdb Obj . id Ġ= Ġdb ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠRequest Options () ĊĠĠĠĠĠĠĠ Ġoptions . offer Through put Ġ= Ġ 4 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . create Database ( db Obj , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" created Ġnos ql Ġdatabase : Ġ$ db " Ġ} ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= Ġresult . resource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcheck ( database Ġ!= Ġnull ) ĊĠĠĠ Ġreturn Ġdatabase Ċ } Ċ Ċ internal Ġfun Ġread Database ( client : ĠDocument Client , Ġdb : ĠString ): ĠDatabase ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( db . isNotBlank ()) Ġ{ Ġ" db Ġmust Ġbe Ġnon - empty " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . read Database ( get Database Link ( db ), Ġnull ) ĊĠĠĠĠĠĠĠ Ġres . resource ĊĠĠĠ Ġ} Ġcatch Ġ( de : ĠDocument ClientException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġnot Ġexist ĊĠĠĠĠĠĠĠ Ġif Ġ( is Resource NotFoundException ( de )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThrow Ġany Ġother ĠException ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġde ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġcreate Collection If NotExist ( client : ĠDocument Client , Ġdb : ĠString , Ġcoll : ĠString ): ĠDocument Collection Ġ{ ĊĊĠĠĠ Ġcreate Database If NotExist ( client , Ġdb ) ĊĊĠĠĠ Ġvar Ġcollection Ġ= Ġread Collection ( client , Ġdb , Ġcoll ) ĊĊĠĠĠ Ġif Ġ( collection Ġ== Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcollection Info Ġ= ĠDocument Collection () ĊĠĠĠĠĠĠĠ Ġcollection Info . id Ġ= Ġcoll ĊĊĠĠĠĠĠĠĠ Ġcollection Info . indexing Policy Ġ= ĠgetDefault Indexing Policy () ĊĠĠĠĠĠĠĠ Ġcollection Info . default TimeTo Live Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġpartition Key Def Ġ= ĠPartition Key Definition () ĊĠĠĠĠĠĠĠ Ġval Ġpaths : ĠList < String > Ġ= ĠlistOf ("/ ${ getDefault Partition Key () }") ĊĠĠĠĠĠĠĠ Ġpartition Key Def . paths Ġ= Ġpaths ĊĊĠĠĠĠĠĠĠ Ġcollection Info . partition Key Ġ= Ġpartition Key Def ĊĊĠĠĠĠĠĠĠ Ġcollection Ġ= Ġclient . create Collection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Database Link ( db ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ). resource ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Created Ġnos ql Ġcollection . Ġdb :$ db , Ġcoll : Ġ$ coll " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcheck ( collection Ġ!= Ġnull ) ĊĠĠĠ Ġreturn Ġcollection Ċ } Ċ Ċ internal Ġfun Ġread Collection ( client : ĠDocument Client , Ġdb : ĠString , Ġcoll : ĠString ): ĠDocument Collection ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Collection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Collection Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoll ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġres . resource ĊĠĠĠ Ġ} Ġcatch Ġ( de : ĠDocument ClientException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åŃĺåľ¨ ãģĹãģªãģĦ åł´åĲĪ ĊĠĠĠĠĠĠĠ Ġif Ġ( de . statusCode Ġ== Ġ 4 0 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥ ģ ãĤ§ ãĥĥãĤ¯ ãģ¯ å¤± æķ Ĺ ãģĹãģŁ åł´åĲĪãģ¯ Exception ãĤĴ æĬķ ãģ Ĵ ãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġde ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġreturn Ġthe Ġdefault Ġindexing Policy Ċ Ġ*/ Ċ internal Ġfun ĠgetDefault Indexing Policy (): ĠIndex ing Policy Ġ{ ĊĠĠĠ Ġval Ġrange Index Override Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf Null s < Index >( 3 ) ĊĠĠĠ Ġrange Index Override [ 0 ] Ġ= ĠIndex . Range ( DataType . Number , Ġ- 1 ) ĊĠĠĠ Ġrange Index Override [ 1 ] Ġ= ĠIndex . Range ( DataType . String , Ġ- 1 ) ĊĠĠĠ Ġrange Index Override [ 2 ] Ġ= ĠIndex . Spatial ( DataType . Point ) ĊĠĠĠ Ġval Ġindexing Policy Ġ= ĠIndex ing Policy ( range Index Override ) ĊĠĠĠ Ġindexing Policy . indexing Mode Ġ= ĠIndex ingMode . Cons istent ĊĠĠĠ Ġlog . info Ġ{ Ġ" set Ġindexing Ġpolicy Ġto Ġdefault :$ indexing Policy Ġ" Ġ} ĊĠĠĠ Ġreturn Ġindexing Policy Ċ } Ċ Ċ internal Ġfun ĠgetDefault Partition Key (): ĠString Ġ= Ġ"_ partition " Ċ