From d66a2ba4fb820036f86fb8292bd49362ee349184 Mon Sep 17 00:00:00 2001 From: Ravi Tella Date: Mon, 13 Sep 2021 11:01:28 -0400 Subject: [PATCH 1/3] added a comment on query plan caching. --- sdk/cosmos/azure-spring-data-cosmos/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/cosmos/azure-spring-data-cosmos/README.md b/sdk/cosmos/azure-spring-data-cosmos/README.md index ffb66e2c04de..e90871822749 100644 --- a/sdk/cosmos/azure-spring-data-cosmos/README.md +++ b/sdk/cosmos/azure-spring-data-cosmos/README.md @@ -294,6 +294,9 @@ public interface UserRepository extends CosmosRepository { - `findByFirstName` method is custom query method, it will find items per firstName. +#### Query Plan Caching +When query plan caching is enabled, custom query methods like `findByFirstName(String firstName)` where `firstName` is the partition key will result in lower query execution time. Query plan caching can be enabled by setting the `COSMOS.QUERYPLAN_CACHING_ENABLED` System property to 'true'. Currently, query plan caching is only supported for custom query methods targeting a single partition. + #### QueryAnnotation : Using annotated queries in repositories Azure spring data cosmos supports specifying annotated queries in the repositories using `@Query`. - Examples for annotated queries in synchronous CosmosRepository: From 6d03718721267406e9f9bfc154806262d2574b39 Mon Sep 17 00:00:00 2001 From: Ravi Tella Date: Mon, 14 Feb 2022 10:50:30 -0500 Subject: [PATCH 2/3] fix for cosmos spark preferred regions issue --- .../com/azure/cosmos/spark/CosmosConfig.scala | 4 +-- .../azure/cosmos/spark/CosmosConfigSpec.scala | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosConfig.scala b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosConfig.scala index 5a6e9a587464..451de932435a 100644 --- a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosConfig.scala +++ b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosConfig.scala @@ -253,7 +253,7 @@ private object CosmosAccountConfig { helpMessage = "Cosmos DB Account Name") - private val PreferredRegionRegex = "^[a-z0-9]+$"r // this is for the final form after lower-casing and trimming the whitespaces + private val PreferredRegionRegex = "^[a-z0-9\\d]+(?: [a-z0-9\\d]+)*$".r private val PreferredRegionsList = CosmosConfigEntry[Array[String]](key = CosmosConfigNames.PreferredRegionsList, Option.apply(CosmosConfigNames.PreferredRegions), mandatory = false, @@ -268,7 +268,7 @@ private object CosmosAccountConfig { } else { trimmedInput.split(",") .toStream - .map(preferredRegion => preferredRegion.toLowerCase(Locale.ROOT).replace(" ", "")) + .map(preferredRegion => preferredRegion.toLowerCase(Locale.ROOT).trim) .map(preferredRegion => { if (!PreferredRegionRegex.findFirstIn(preferredRegion).isDefined) { throw new IllegalArgumentException(s"$preferredRegionsListAsString is invalid") diff --git a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala index 8ac710c4f10c..4f191cd1c8f7 100644 --- a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala +++ b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala @@ -27,7 +27,7 @@ class CosmosConfigSpec extends UnitSpec { endpointConfig.applicationName.get shouldEqual "myapp" endpointConfig.useGatewayMode shouldEqual true endpointConfig.preferredRegionsList.isDefined shouldEqual true - endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("westus", "eastus1") + endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("west us", "eastus1") } "Config Parser" should "parse account credentials with spark.cosmos.preferredRegions" in { @@ -46,7 +46,7 @@ class CosmosConfigSpec extends UnitSpec { endpointConfig.applicationName.get shouldEqual "myapp" endpointConfig.useGatewayMode shouldEqual true endpointConfig.preferredRegionsList.isDefined shouldEqual true - endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("westus", "eastus1") + endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("west us", "eastus1") } "Config Parser" should "parse account credentials with spark.cosmos.preferredRegions and spark.cosmos.preferredRegionsList" in { @@ -116,6 +116,22 @@ class CosmosConfigSpec extends UnitSpec { "invalid configuration for spark.cosmos.preferredRegionsList:[westus, eastus. Config description: Preferred Region List" } } + + userConfig = Map( + "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, + "spark.cosmos.accountKey" -> "xyz", + "spark.cosmos.preferredRegionsList" -> "[west us, eastus]" + ) + + try { + CosmosAccountConfig.parseCosmosAccountConfig(userConfig) + fail("invalid preferred region list") + } catch { + case e: Exception => { + e.getMessage shouldEqual + "invalid configuration for spark.cosmos.preferredRegionsList:[west us, eastus]. Config description: Preferred Region List" + } + } } it should "preferred regions parsing" in { @@ -126,7 +142,7 @@ class CosmosConfigSpec extends UnitSpec { ) var config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, @@ -135,7 +151,7 @@ class CosmosConfigSpec extends UnitSpec { ) config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, @@ -144,7 +160,7 @@ class CosmosConfigSpec extends UnitSpec { ) config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, @@ -153,7 +169,7 @@ class CosmosConfigSpec extends UnitSpec { ) config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, @@ -162,7 +178,7 @@ class CosmosConfigSpec extends UnitSpec { ) config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, @@ -171,7 +187,7 @@ class CosmosConfigSpec extends UnitSpec { ) config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) - config.preferredRegionsList.get should contain theSameElementsAs Array("westus1") + config.preferredRegionsList.get should contain theSameElementsAs Array("west us1") userConfig = Map( "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, From 94d2fc9b040dce7c299a305c98977019ca1317b5 Mon Sep 17 00:00:00 2001 From: Ravi Tella Date: Tue, 15 Feb 2022 13:44:52 -0500 Subject: [PATCH 3/3] fix for cosmos spark preferred regions issue --- .../scala/com/azure/cosmos/spark/CosmosConfigSpec.scala | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala index 4f191cd1c8f7..86559f362099 100644 --- a/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala +++ b/sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala @@ -198,6 +198,15 @@ class CosmosConfigSpec extends UnitSpec { config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) config.preferredRegionsList.get should contain theSameElementsAs Array[String]() + userConfig = Map( + "spark.cosmos.accountEndpoint" -> sampleProdEndpoint, + "spark.cosmos.accountKey" -> "xyz", + "spark.cosmos.preferredRegionsList" -> "[west us 1, east us 2]" + ) + + config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig) + config.preferredRegionsList.get should contain theSameElementsAs Array("west us 1","east us 2") + }