From 874431058d888e0f716182a911def5082597d7ab Mon Sep 17 00:00:00 2001 From: Andrew Feldman Date: Sun, 29 Mar 2020 13:44:45 -0700 Subject: [PATCH 1/5] MigrationGuide: version comparison table --- migration-guide.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 migration-guide.md diff --git a/migration-guide.md b/migration-guide.md new file mode 100644 index 0000000..bedec85 --- /dev/null +++ b/migration-guide.md @@ -0,0 +1,28 @@ +# Migration guide + +The purpose of this guide is to help easily upgrade to Azure Cosmos DB Java SDK 4.0 for Core (SQL) API ("Java SDK 4.0" from here on out.) The audience for this guide is current users of + +* "Legacy" Sync Java SDK 2.x.x +* Async Java SDK 2.x.x +* Java SDK 3.x.x + +## Background + +| Java SDK | Release Date | Bundled APIs | Maven Jar | API Reference | Release Notes | +|-------------------------|--------------|--------------|-----------------------------------------|-----------------------------------------------------------|------------------------------------------------------------------------------------------| +| Async 2.x.x | June 2018 | Async | com.microsoft.azure::azure-cosmosdb | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-async-java) | +| "Legacy" Sync 2.x.x | Sept 2018 | Sync | com.microsoft.azure::azure-documentdb | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java) | +| 3.x.x | July 2019 | Async/Sync | com.microsoft.azure::azure-cosmos | [API](https://azure.github.io/azure-cosmosdb-java/3.0.0/) | - | +| 4.0 | April 2020 | Async/Sync | com.azure::azure-cosmos | - | - | + +## Breaking API changes + +## Code snippet comparisons + +### Naming conventions + +### Create database + +### Create container + +### \ No newline at end of file From 6506ae29766b42cfa736f9ada88c5498e3eb0c67 Mon Sep 17 00:00:00 2001 From: Andrew Feldman Date: Sun, 29 Mar 2020 14:54:04 -0700 Subject: [PATCH 2/5] State of migration guide --- media/java_sdk_naming_conventions.JPG | Bin 0 -> 105587 bytes migration-guide.md | 52 ++++++++++++++++++++------ 2 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 media/java_sdk_naming_conventions.JPG diff --git a/media/java_sdk_naming_conventions.JPG b/media/java_sdk_naming_conventions.JPG new file mode 100644 index 0000000000000000000000000000000000000000..62618cf74d0026cf68db7548208fffe92ee04889 GIT binary patch literal 105587 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 PyVfOZBwdvFbL_tXtBIRo literal 0 HcmV?d00001 diff --git a/migration-guide.md b/migration-guide.md index bedec85..81cab25 100644 --- a/migration-guide.md +++ b/migration-guide.md @@ -8,21 +8,51 @@ The purpose of this guide is to help easily upgrade to Azure Cosmos DB Java SDK ## Background -| Java SDK | Release Date | Bundled APIs | Maven Jar | API Reference | Release Notes | -|-------------------------|--------------|--------------|-----------------------------------------|-----------------------------------------------------------|------------------------------------------------------------------------------------------| -| Async 2.x.x | June 2018 | Async | com.microsoft.azure::azure-cosmosdb | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-async-java) | -| "Legacy" Sync 2.x.x | Sept 2018 | Sync | com.microsoft.azure::azure-documentdb | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java) | -| 3.x.x | July 2019 | Async/Sync | com.microsoft.azure::azure-cosmos | [API](https://azure.github.io/azure-cosmosdb-java/3.0.0/) | - | -| 4.0 | April 2020 | Async/Sync | com.azure::azure-cosmos | - | - | +| Java SDK | Release Date | Bundled APIs | Maven Jar | Java package name |API Reference | Release Notes | +|-------------------------|--------------|----------------------|-----------------------------------------|-------------------|-----------------------------------------------------------|------------------------------------------------------------------------------------------| +| Async 2.x.x | June 2018 | Async(RxJava) | com.microsoft.azure::azure-cosmosdb | | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-async-java) | +| "Legacy" Sync 2.x.x | Sept 2018 | Sync | com.microsoft.azure::azure-documentdb | | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java) | +| 3.x.x | July 2019 | Async(Reactor)/Sync | com.microsoft.azure::azure-cosmos | | [API](https://azure.github.io/azure-cosmosdb-java/3.0.0/) | - | +| 4.0 | April 2020 | Async(Reactor)/Sync | com.azure::azure-cosmos | | - | - | + +## Important implementation changes + +### RxJava replaced with reactor in Java SDK 3.x.x and 4.0 + +If you have been using a pre-3.x.x Java SDK, it is recommended to review our [Reactor pattern guide](reactor-pattern-guide.md) for an introduction to async programming and Reactor. + +Users of the Async Java SDK 2.x.x will want to review our [Reactor vs RxJava Guide]() for additional guidance on converting RxJava code to use Reactor. + +## Important API changes + +### Naming conventions + +![Java SDK naming conventions](media/java_sdk_naming_conventions.jpg) + +* Java SDK 3.x.x and 4.0 refer to clients, resources, etc. as ```Cosmos```*X*; for example ```CosmosClient```, ```CosmosDatabase```, ```CosmosContainer```..., whereas version 2.x.x Java SDKs did not have a uniform naming scheme. + +* Java SDK 3.x.x and 4.0 offer Sync and Async APIs. + * **Java SDK 4.0**: classes belong to the Sync API unless the name has ```Async``` after ```Cosmos```. + * **Java SDK 3.x.x**: classes belong to the Async API unless the name has ```Sync``` after Cosmos. + * **Async Java SDK 2.x.x**: similar class names to **Sync Java SDK 2.x.x** but the class name starts with ```Async```. + +### Representing items + +### Imports + +### Accessors + +### QueryMetrics -## Breaking API changes ## Code snippet comparisons -### Naming conventions +### Create resources + +### Item operations -### Create database +### Indexing -### Create container +### Stored procedures -### \ No newline at end of file +### Change Feed \ No newline at end of file From 9f1862eee03fd14403bebecf62c816ac76fd16f1 Mon Sep 17 00:00:00 2001 From: Andrew Feldman Date: Sun, 29 Mar 2020 23:36:01 -0700 Subject: [PATCH 3/5] State of migration guide --- migration-guide.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/migration-guide.md b/migration-guide.md index 81cab25..1d828a7 100644 --- a/migration-guide.md +++ b/migration-guide.md @@ -12,8 +12,8 @@ The purpose of this guide is to help easily upgrade to Azure Cosmos DB Java SDK |-------------------------|--------------|----------------------|-----------------------------------------|-------------------|-----------------------------------------------------------|------------------------------------------------------------------------------------------| | Async 2.x.x | June 2018 | Async(RxJava) | com.microsoft.azure::azure-cosmosdb | | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-async-java) | | "Legacy" Sync 2.x.x | Sept 2018 | Sync | com.microsoft.azure::azure-documentdb | | [API](https://azure.github.io/azure-cosmosdb-java/2.0.0/) | [Release Notes](https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java) | -| 3.x.x | July 2019 | Async(Reactor)/Sync | com.microsoft.azure::azure-cosmos | | [API](https://azure.github.io/azure-cosmosdb-java/3.0.0/) | - | -| 4.0 | April 2020 | Async(Reactor)/Sync | com.azure::azure-cosmos | | - | - | +| 3.x.x | July 2019 | Async(Reactor)/Sync | com.microsoft.azure::azure-cosmos | com.azure.data.cosmos | [API](https://azure.github.io/azure-cosmosdb-java/3.0.0/) | - | +| 4.0 | April 2020 | Async(Reactor)/Sync | com.azure::azure-cosmos | com.azure.cosmos | - | - | ## Important implementation changes @@ -36,10 +36,24 @@ Users of the Async Java SDK 2.x.x will want to review our [Reactor vs RxJava Gui * **Java SDK 3.x.x**: classes belong to the Async API unless the name has ```Sync``` after Cosmos. * **Async Java SDK 2.x.x**: similar class names to **Sync Java SDK 2.x.x** but the class name starts with ```Async```. -### Representing items +### Hierarchical API + +Java SDK 4.0 and Java SDK 3.x.x introduce a hierarchical API which organizes clients, databases and containers in a nested fashion, as shown in this Java SDK 4.0 code snippet: + +```java +CosmosContainer = client.getDatabase("MyDatabaseName").getContainer("MyContainerName"); +``` + +In version 2.x.x Java SDKs, all operations on resources and documents are performed through the client instance. + +### Representing documents + +In Java SDK 4.0, custom POJO's and ```JsonNodes``` are the two options for writing and reading documents from Azure Cosmos DB. ### Imports + + ### Accessors ### QueryMetrics From 286d4c52001b7cbfeff3ddb886f80a57dfe71344 Mon Sep 17 00:00:00 2001 From: Andrew Feldman Date: Mon, 30 Mar 2020 00:15:57 -0700 Subject: [PATCH 4/5] Java SDK 4.0 content for Migration Guide --- migration-guide.md | 297 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 295 insertions(+), 2 deletions(-) diff --git a/migration-guide.md b/migration-guide.md index 1d828a7..9a0cd6d 100644 --- a/migration-guide.md +++ b/migration-guide.md @@ -23,6 +23,10 @@ If you have been using a pre-3.x.x Java SDK, it is recommended to review our [Re Users of the Async Java SDK 2.x.x will want to review our [Reactor vs RxJava Guide]() for additional guidance on converting RxJava code to use Reactor. +### Java SDK 4.0 implements **Direct Mode** in Async and Sync APIs + +If you are user of the "Legacy" Sync Java SDK 2.x.x note that a **Direct** **ConnectionMode** based on TCP is implemented in Java SDK 4.0 for both the Async and Sync APIs. + ## Important API changes ### Naming conventions @@ -52,21 +56,310 @@ In Java SDK 4.0, custom POJO's and ```JsonNodes``` are the two options for writi ### Imports +* Java SDK 4.0 packages begin with ```com.azure.cosmos``` +* Java SDK 3.x.x packages begin with ```com.azure.data.cosmos``` ### Accessors -### QueryMetrics +Java SDK 4.0 exposes ```get``` and ```set``` methods for accessing instance members. +* Example: a ```CosmosContainer``` instance has ```container.getId()``` and ```container.setId()``` methods. +This is different from Java SDK 3.x.x which exposes a fluent interface. +* Example: a ```CosmosSyncContainer``` instance has ```container.id()``` which is overloaded to get or set ```id```. ## Code snippet comparisons ### Create resources +**Java SDK 4.0 Async API:** + +```java +ConnectionPolicy defaultPolicy = ConnectionPolicy.getDefaultPolicy(); +// Setting the preferred location to Cosmos DB Account region +// West US is just an example. User should set preferred location to the Cosmos DB region closest to the application +defaultPolicy.setPreferredLocations(Lists.newArrayList("Your Account Location")); +// Use Direct Mode for best performance +defaultPolicy.setConnectionMode(ConnectionMode.DIRECT); + +// Create Async client. +// Building an async client is still a sync operation. +client = new CosmosClientBuilder() + .setEndpoint("your.hostname") + .setKey("yourmasterkey") + .setConnectionPolicy(ConnectionPolicy.getDefaultPolicy()) + .setConsistencyLevel(ConsistencyLevel.EVENTUAL) + .buildAsyncClient(); + +// Describe the logic of database and container creation using Reactor... +Mono databaseContainerIfNotExist = + // Create database with specified name + client.createDatabaseIfNotExists("YourDatabaseName") + .flatMap(databaseResponse -> { + database = databaseResponse.getDatabase(); + // Container properties - name and partition key + CosmosContainerProperties containerProperties = + new CosmosContainerProperties("YourContainerName", "/id"); + // Create container with specified properties & provisioned throughput + return database.createContainerIfNotExists(containerProperties, 400); +}).flatMap(containerResponse -> { + container = containerResponse.getContainer(); + return Mono.empty(); +}).subscribe(); +``` + +**Java SDK 3.x.x Async API:** + +```java + +``` + ### Item operations +**Java SDK 4.0 Async API:** + +```java +// Container is created. Generate many docs to insert. +int number_of_docs = 50000; +ArrayList docs = generateManyDocs(number_of_docs); + +// Insert many docs into container... +Flux.fromIterable(docs).flatMap(doc -> container.createItem(doc)) + // ^Publisher: upon subscription, createItem inserts a doc & + // publishes request response to the next operation... + .flatMap(itemResponse -> { + // ...Streaming operation: count each doc... + number_docs_inserted.getAndIncrement(); + return Mono.empty(); +}).subscribe(); // ...Subscribing or blocking triggers stream execution. +``` + +**Java SDK 3.x.x Async API:** + +```java + +``` + ### Indexing +**Java SDK 4.0 Async API:** + +```java +CosmosContainerProperties containerProperties = new CosmosContainerProperties(containerName, "/lastName"); + +// Custom indexing policy +IndexingPolicy indexingPolicy = new IndexingPolicy(); +indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT); + +// Included paths +List includedPaths = new ArrayList<>(); +IncludedPath includedPath = new IncludedPath(); +includedPath.setPath("/*"); +includedPaths.add(includedPath); +indexingPolicy.setIncludedPaths(includedPaths); + +// Excluded paths +List excludedPaths = new ArrayList<>(); +ExcludedPath excludedPath = new ExcludedPath(); +excludedPath.setPath("/name/*"); +excludedPaths.add(excludedPath); +indexingPolicy.setExcludedPaths(excludedPaths); + +containerProperties.setIndexingPolicy(indexingPolicy); + +CosmosAsyncContainer containerIfNotExists = database.createContainerIfNotExists(containerProperties, 400) + .block() + .getContainer(); +``` + +**Java SDK 3.x.x Async API:** + +```java + +``` + ### Stored procedures -### Change Feed \ No newline at end of file +**Java SDK 4.0 Async API:** + +```java +logger.info("Creating stored procedure...\n"); + +sprocId = "createMyDocument"; +String sprocBody = "function createMyDocument() {\n" + + "var documentToCreate = {\"id\":\"test_doc\"}\n" + + "var context = getContext();\n" + + "var collection = context.getCollection();\n" + + "var accepted = collection.createDocument(collection.getSelfLink(), documentToCreate,\n" + + " function (err, documentCreated) {\n" + + "if (err) throw new Error('Error' + err.message);\n" + + "context.getResponse().setBody(documentCreated.id)\n" + + "});\n" + + "if (!accepted) return;\n" + + "}"; +CosmosStoredProcedureProperties storedProcedureDef = new CosmosStoredProcedureProperties(sprocId, sprocBody); +container.getScripts() + .createStoredProcedure(storedProcedureDef, + new CosmosStoredProcedureRequestOptions()).block(); + +// ... + +logger.info(String.format("Executing stored procedure %s...\n\n", sprocId)); + +CosmosStoredProcedureRequestOptions options = new CosmosStoredProcedureRequestOptions(); +options.setPartitionKey(new PartitionKey("test_doc")); + +container.getScripts() + .getStoredProcedure(sprocId) + .execute(null, options) + .flatMap(executeResponse -> { + logger.info(String.format("Stored procedure %s returned %s (HTTP %d), at cost %.3f RU.\n", + sprocId, + executeResponse.getResponseAsString(), + executeResponse.getStatusCode(), + executeResponse.getRequestCharge())); + return Mono.empty(); + }).block(); +``` + +**Java SDK 3.x.x Async API:** + +```java + +``` + +### Change Feed + +**Java SDK 4.0 Async API:** + +```java +ChangeFeedProcessor.changeFeedProcessorBuilder() + .setHostName(hostName) + .setFeedContainer(feedContainer) + .setLeaseContainer(leaseContainer) + .setHandleChanges((List docs) -> { + logger.info("--->setHandleChanges() START"); + + for (JsonNode document : docs) { + try { + //Change Feed hands the document to you in the form of a JsonNode + //As a developer you have two options for handling the JsonNode document provided to you by Change Feed + //One option is to operate on the document in the form of a JsonNode, as shown below. This is great + //especially if you do not have a single uniform data model for all documents. + logger.info("---->DOCUMENT RECEIVED: " + OBJECT_MAPPER.writerWithDefaultPrettyPrinter() + .writeValueAsString(document)); + + //You can also transform the JsonNode to a POJO having the same structure as the JsonNode, + //as shown below. Then you can operate on the POJO. + CustomPOJO pojo_doc = OBJECT_MAPPER.treeToValue(document, CustomPOJO.class); + logger.info("----=>id: " + pojo_doc.getId()); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + logger.info("--->handleChanges() END"); + + }) + .build(); +``` + +**Java SDK 3.x.x Async API:** + +```java + +``` + +### Container TTL + +**Java SDK 4.0 Async API:** + +```java +CosmosAsyncContainer container; + +// Create a new container with TTL enabled with default expiration value +CosmosContainerProperties containerProperties = new CosmosContainerProperties("myContainer", "/myPartitionKey"); +containerProperties.setDefaultTimeToLiveInSeconds(90 * 60 * 60 * 24); +container = database.createContainerIfNotExists(containerProperties, 400).block().getContainer(); +``` + +**Java SDK 3.x.x Async API:** + +```java +CosmosContainer container; + +// Create a new container with TTL enabled with default expiration value +CosmosContainerProperties containerProperties = new CosmosContainerProperties("myContainer", "/myPartitionKey"); +containerProperties.defaultTimeToLive(90 * 60 * 60 * 24); +container = database.createContainerIfNotExists(containerProperties, 400).block().container(); +``` + +### Document TTL + +**Java SDK 4.0 Async API:** + +```java +// Include a property that serializes to "ttl" in JSON +public class SalesOrder +{ + private String id; + private String customerId; + private Integer ttl; + + public SalesOrder(String id, String customerId, Integer ttl) { + this.id = id; + this.customerId = customerId; + this.ttl = ttl; + } + + public String getId() {return this.id;} + public void setId(String new_id) {this.id = new_id;} + public String getCustomerId() {return this.customerId;} + public void setCustomerId(String new_cid) {this.customerId = new_cid;} + public Integer getTtl() {return this.ttl;} + public void setTtl(Integer new_ttl) {this.ttl = new_ttl;} + + //... +} + +// Set the value to the expiration in seconds +SalesOrder salesOrder = new SalesOrder( + "SO05", + "CO18009186470", + 60 * 60 * 24 * 30 // Expire sales orders in 30 days +); +``` + +**Java SDK 3.x.x Async API:** + +```java +// Include a property that serializes to "ttl" in JSON +public class SalesOrder +{ + private String id; + private String customerId; + private Integer ttl; + + public SalesOrder(String id, String customerId, Integer ttl) { + this.id = id; + this.customerId = customerId; + this.ttl = ttl; + } + + public String id() {return this.id;} + public void id(String new_id) {this.id = new_id;} + public String customerId() {return this.customerId;} + public void customerId(String new_cid) {this.customerId = new_cid;} + public Integer ttl() {return this.ttl;} + public void ttl(Integer new_ttl) {this.ttl = new_ttl;} + + //... +} + +// Set the value to the expiration in seconds +SalesOrder salesOrder = new SalesOrder( + "SO05", + "CO18009186470", + 60 * 60 * 24 * 30 // Expire sales orders in 30 days +); +``` From 721a31424e783d0dc628748be90a235802279153 Mon Sep 17 00:00:00 2001 From: Andrew Feldman Date: Mon, 30 Mar 2020 00:58:07 -0700 Subject: [PATCH 5/5] Migration guide ready for merge to master --- migration-guide.md | 240 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 188 insertions(+), 52 deletions(-) diff --git a/migration-guide.md b/migration-guide.md index 9a0cd6d..44899f0 100644 --- a/migration-guide.md +++ b/migration-guide.md @@ -54,11 +54,24 @@ In version 2.x.x Java SDKs, all operations on resources and documents are perfor In Java SDK 4.0, custom POJO's and ```JsonNodes``` are the two options for writing and reading documents from Azure Cosmos DB. +In Java SDK 3.x.x ```CosmosItemProperties``` was exposed by the public API and served as a document representation. This class is no longer exposed in Java SDK 4.0. + ### Imports * Java SDK 4.0 packages begin with ```com.azure.cosmos``` - -* Java SDK 3.x.x packages begin with ```com.azure.data.cosmos``` + * Java SDK 3.x.x packages begin with ```com.azure.data.cosmos``` + +* Java SDK 4.0 places a number of classes in a nested package, ```com.azure.cosmos.models```. This includes + * ```CosmosContainerResponse``` + * ```CosmosDatabaseResponse``` + * ```CosmosItemResponse``` + * And Async API analogs of all of the above... + * ```CosmosContainerProperties``` + * ```FeedOptions``` + * ```PartitionKey``` + * ```IndexingPolicy``` + * ```IndexingMode``` + * ...etc. ### Accessors @@ -77,7 +90,6 @@ This is different from Java SDK 3.x.x which exposes a fluent interface. ```java ConnectionPolicy defaultPolicy = ConnectionPolicy.getDefaultPolicy(); // Setting the preferred location to Cosmos DB Account region -// West US is just an example. User should set preferred location to the Cosmos DB region closest to the application defaultPolicy.setPreferredLocations(Lists.newArrayList("Your Account Location")); // Use Direct Mode for best performance defaultPolicy.setConnectionMode(ConnectionMode.DIRECT); @@ -91,27 +103,51 @@ client = new CosmosClientBuilder() .setConsistencyLevel(ConsistencyLevel.EVENTUAL) .buildAsyncClient(); -// Describe the logic of database and container creation using Reactor... -Mono databaseContainerIfNotExist = - // Create database with specified name - client.createDatabaseIfNotExists("YourDatabaseName") - .flatMap(databaseResponse -> { - database = databaseResponse.getDatabase(); - // Container properties - name and partition key - CosmosContainerProperties containerProperties = - new CosmosContainerProperties("YourContainerName", "/id"); - // Create container with specified properties & provisioned throughput - return database.createContainerIfNotExists(containerProperties, 400); -}).flatMap(containerResponse -> { - container = containerResponse.getContainer(); - return Mono.empty(); + +// Create database with specified name +client.createDatabaseIfNotExists("YourDatabaseName") + .flatMap(databaseResponse -> { + database = databaseResponse.getDatabase(); + // Container properties - name and partition key + CosmosContainerProperties containerProperties = + new CosmosContainerProperties("YourContainerName", "/id"); + // Create container with specified properties & provisioned throughput + return database.createContainerIfNotExists(containerProperties, 400); + }).flatMap(containerResponse -> { + container = containerResponse.getContainer(); + return Mono.empty(); }).subscribe(); ``` **Java SDK 3.x.x Async API:** ```java +ConnectionPolicy defaultPolicy = ConnectionPolicy.defaultPolicy(); +// Setting the preferred location to Cosmos DB Account region +defaultPolicy.preferredLocations(Lists.newArrayList("Your Account Location")); +// Create async client +// +client = new CosmosClientBuilder() + .endpoint("your.hostname") + .key("yourmasterkey") + .connectionPolicy(defaultPolicy) + .consistencyLevel(ConsistencyLevel.EVENTUAL) + .build(); + +// Create database with specified name +client.createDatabaseIfNotExists("YourDatabaseName") + .flatMap(databaseResponse -> { + database = databaseResponse.database(); + // Container properties - name and partition key + CosmosContainerProperties containerProperties = + new CosmosContainerProperties("YourContainerName", "/id"); + // Create container with specified properties & provisioned throughput + return database.createContainerIfNotExists(containerProperties, 400); + }).flatMap(containerResponse -> { + container = containerResponse.container(); + return Mono.empty(); +}).subscribe(); ``` ### Item operations @@ -124,21 +160,25 @@ int number_of_docs = 50000; ArrayList docs = generateManyDocs(number_of_docs); // Insert many docs into container... -Flux.fromIterable(docs).flatMap(doc -> container.createItem(doc)) - // ^Publisher: upon subscription, createItem inserts a doc & - // publishes request response to the next operation... - .flatMap(itemResponse -> { - // ...Streaming operation: count each doc... - number_docs_inserted.getAndIncrement(); - return Mono.empty(); -}).subscribe(); // ...Subscribing or blocking triggers stream execution. +Flux.fromIterable(docs) + .flatMap(doc -> container.createItem(doc)) + .subscribe(); // ...Subscribing triggers stream execution. ``` **Java SDK 3.x.x Async API:** ```java +// Container is created. Generate many docs to insert. +int number_of_docs = 50000; +ArrayList docs = generateManyDocs(number_of_docs); +// Insert many docs into container... +Flux.fromIterable(docs) + .flatMap(doc -> container.createItem(doc)) + .subscribe(); // ...Subscribing triggers stream execution. ``` +(the same) + ### Indexing @@ -175,7 +215,31 @@ CosmosAsyncContainer containerIfNotExists = database.createContainerIfNotExists( **Java SDK 3.x.x Async API:** ```java +CosmosContainerProperties containerProperties = new CosmosContainerProperties(containerName, "/lastName"); + +// Custom indexing policy +IndexingPolicy indexingPolicy = new IndexingPolicy(); +indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT); //To turn indexing off set IndexingMode.NONE +// Included paths +List includedPaths = new ArrayList<>(); +IncludedPath includedPath = new IncludedPath(); +includedPath.path("/*"); +includedPaths.add(includedPath); +indexingPolicy.setIncludedPaths(includedPaths); + +// Excluded paths +List excludedPaths = new ArrayList<>(); +ExcludedPath excludedPath = new ExcludedPath(); +excludedPath.path("/name/*"); +excludedPaths.add(excludedPath); +indexingPolicy.excludedPaths(excludedPaths); + +containerProperties.indexingPolicy(indexingPolicy); + +CosmosContainer containerIfNotExists = database.createContainerIfNotExists(containerProperties, 400) + .block() + .container(); ``` ### Stored procedures @@ -225,7 +289,43 @@ container.getScripts() **Java SDK 3.x.x Async API:** ```java +logger.info("Creating stored procedure...\n"); + +sprocId = "createMyDocument"; +String sprocBody = "function createMyDocument() {\n" + + "var documentToCreate = {\"id\":\"test_doc\"}\n" + + "var context = getContext();\n" + + "var collection = context.getCollection();\n" + + "var accepted = collection.createDocument(collection.getSelfLink(), documentToCreate,\n" + + " function (err, documentCreated) {\n" + + "if (err) throw new Error('Error' + err.message);\n" + + "context.getResponse().setBody(documentCreated.id)\n" + + "});\n" + + "if (!accepted) return;\n" + + "}"; +CosmosStoredProcedureProperties storedProcedureDef = new CosmosStoredProcedureProperties(sprocId, sprocBody); +container.getScripts() + .createStoredProcedure(storedProcedureDef, + new CosmosStoredProcedureRequestOptions()).block(); + +// ... +logger.info(String.format("Executing stored procedure %s...\n\n", sprocId)); + +CosmosStoredProcedureRequestOptions options = new CosmosStoredProcedureRequestOptions(); +options.partitionKey(new PartitionKey("test_doc")); + +container.getScripts() + .getStoredProcedure(sprocId) + .execute(null, options) + .flatMap(executeResponse -> { + logger.info(String.format("Stored procedure %s returned %s (HTTP %d), at cost %.3f RU.\n", + sprocId, + executeResponse.responseAsString(), + executeResponse.statusCode(), + executeResponse.requestCharge())); + return Mono.empty(); + }).block(); ``` ### Change Feed @@ -233,28 +333,64 @@ container.getScripts() **Java SDK 4.0 Async API:** ```java -ChangeFeedProcessor.changeFeedProcessorBuilder() - .setHostName(hostName) - .setFeedContainer(feedContainer) - .setLeaseContainer(leaseContainer) - .setHandleChanges((List docs) -> { +ChangeFeedProcessor changeFeedProcessorInstance = + ChangeFeedProcessor.changeFeedProcessorBuilder() + .setHostName(hostName) + .setFeedContainer(feedContainer) + .setLeaseContainer(leaseContainer) + .setHandleChanges((List docs) -> { + logger.info("--->setHandleChanges() START"); + + for (JsonNode document : docs) { + try { + //Change Feed hands the document to you in the form of a JsonNode + //As a developer you have two options for handling the JsonNode document provided to you by Change Feed + //One option is to operate on the document in the form of a JsonNode, as shown below. This is great + //especially if you do not have a single uniform data model for all documents. + logger.info("---->DOCUMENT RECEIVED: " + OBJECT_MAPPER.writerWithDefaultPrettyPrinter() + .writeValueAsString(document)); + + //You can also transform the JsonNode to a POJO having the same structure as the JsonNode, + //as shown below. Then you can operate on the POJO. + CustomPOJO pojo_doc = OBJECT_MAPPER.treeToValue(document, CustomPOJO.class); + logger.info("----=>id: " + pojo_doc.getId()); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + logger.info("--->handleChanges() END"); + + }) + .build(); + +// ... + + changeFeedProcessorInstance.start() + .subscribeOn(Schedulers.elastic()) + .subscribe(); +``` + +**Java SDK 3.x.x Async API:** + +```java +ChangeFeedProcessor changeFeedProcessorInstance = + ChangeFeedProcessor.Builder() + .hostName(hostName) + .feedContainer(feedContainer) + .leaseContainer(leaseContainer) + .handleChanges((List docs) -> { logger.info("--->setHandleChanges() START"); - for (JsonNode document : docs) { + for (CosmosItemProperties document : docs) { try { - //Change Feed hands the document to you in the form of a JsonNode - //As a developer you have two options for handling the JsonNode document provided to you by Change Feed - //One option is to operate on the document in the form of a JsonNode, as shown below. This is great - //especially if you do not have a single uniform data model for all documents. - logger.info("---->DOCUMENT RECEIVED: " + OBJECT_MAPPER.writerWithDefaultPrettyPrinter() - .writeValueAsString(document)); - - //You can also transform the JsonNode to a POJO having the same structure as the JsonNode, - //as shown below. Then you can operate on the POJO. - CustomPOJO pojo_doc = OBJECT_MAPPER.treeToValue(document, CustomPOJO.class); - logger.info("----=>id: " + pojo_doc.getId()); - - } catch (JsonProcessingException e) { + + // You are given the document as a CosmosItemProperties instance which you may + // cast to the desired type. + CustomPOJO pojo_doc = document.getObject(CustomPOJO.class); + logger.info("----=>id: " + pojo_doc.id()); + + } catch (Exception e) { e.printStackTrace(); } } @@ -262,12 +398,12 @@ ChangeFeedProcessor.changeFeedProcessorBuilder() }) .build(); -``` -**Java SDK 3.x.x Async API:** - -```java +// ... + changeFeedProcessorInstance.start() + .subscribeOn(Schedulers.elastic()) + .subscribe(); ``` ### Container TTL @@ -347,11 +483,11 @@ public class SalesOrder } public String id() {return this.id;} - public void id(String new_id) {this.id = new_id;} - public String customerId() {return this.customerId;} - public void customerId(String new_cid) {this.customerId = new_cid;} + public SalesOrder id(String new_id) {this.id = new_id; return this;} + public String customerId() {return this.customerId; return this;} + public SalesOrder customerId(String new_cid) {this.customerId = new_cid;} public Integer ttl() {return this.ttl;} - public void ttl(Integer new_ttl) {this.ttl = new_ttl;} + public SalesOrder ttl(Integer new_ttl) {this.ttl = new_ttl; return this;} //... }