This is an automated email from the ASF dual-hosted git repository.

gian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new d3015d0f8e DruidQuery: Return a copy from withScanSignatureIfNeeded, 
as promised. (#12906)
d3015d0f8e is described below

commit d3015d0f8e3e22ae338c9396a12aec17979d9f29
Author: Gian Merlino <[email protected]>
AuthorDate: Tue Aug 16 13:23:14 2022 -0700

    DruidQuery: Return a copy from withScanSignatureIfNeeded, as promised. 
(#12906)
    
    The method wasn't following its contract, leading to pollution of the
    overall planner context, when really we just want to create a new
    context for a specific query.
---
 .../java/org/apache/druid/query/QueryContext.java  | 31 +++++++++++++++++++---
 .../org/apache/druid/query/QueryContextTest.java   | 29 ++++++++++++++++++++
 .../apache/druid/sql/calcite/rel/DruidQuery.java   |  5 ++--
 3 files changed, 59 insertions(+), 6 deletions(-)

diff --git a/processing/src/main/java/org/apache/druid/query/QueryContext.java 
b/processing/src/main/java/org/apache/druid/query/QueryContext.java
index af7352c8d9..29f967429b 100644
--- a/processing/src/main/java/org/apache/druid/query/QueryContext.java
+++ b/processing/src/main/java/org/apache/druid/query/QueryContext.java
@@ -64,10 +64,23 @@ public class QueryContext
 
   public QueryContext(@Nullable Map<String, Object> userParams)
   {
-    this.defaultParams = new TreeMap<>();
-    this.userParams = userParams == null ? new TreeMap<>() : new 
TreeMap<>(userParams);
-    this.systemParams = new TreeMap<>();
-    invalidateMergedParams();
+    this(
+        new TreeMap<>(),
+        userParams == null ? new TreeMap<>() : new TreeMap<>(userParams),
+        new TreeMap<>()
+    );
+  }
+
+  private QueryContext(
+      final Map<String, Object> defaultParams,
+      final Map<String, Object> userParams,
+      final Map<String, Object> systemParams
+  )
+  {
+    this.defaultParams = defaultParams;
+    this.userParams = userParams;
+    this.systemParams = systemParams;
+    this.mergedParams = null;
   }
 
   private void invalidateMergedParams()
@@ -127,6 +140,7 @@ public class QueryContext
         QueryContexts.DEFAULT_ENABLE_SQL_JOIN_LEFT_SCAN_DIRECT
     );
   }
+
   @SuppressWarnings("unused")
   public boolean containsKey(String key)
   {
@@ -194,6 +208,15 @@ public class QueryContext
     return mergedParams;
   }
 
+  public QueryContext copy()
+  {
+    return new QueryContext(
+        new TreeMap<>(defaultParams),
+        new TreeMap<>(userParams),
+        new TreeMap<>(systemParams)
+    );
+  }
+
   @Override
   public boolean equals(Object o)
   {
diff --git 
a/processing/src/test/java/org/apache/druid/query/QueryContextTest.java 
b/processing/src/test/java/org/apache/druid/query/QueryContextTest.java
index dd522b2fc2..b3f794b1c6 100644
--- a/processing/src/test/java/org/apache/druid/query/QueryContextTest.java
+++ b/processing/src/test/java/org/apache/druid/query/QueryContextTest.java
@@ -262,6 +262,35 @@ public class QueryContextTest
     Assert.assertSame(context.getMergedParams(), context.getMergedParams());
   }
 
+  @Test
+  public void testCopy()
+  {
+    final QueryContext context = new QueryContext(
+        ImmutableMap.of(
+            "user1", "userVal1",
+            "conflict", "userVal2"
+        )
+    );
+
+    context.addDefaultParams(
+        ImmutableMap.of(
+            "default1", "defaultVal1",
+            "conflict", "defaultVal2"
+        )
+    );
+
+    context.addSystemParam("sys1", "val1");
+
+    final Map<String, Object> merged = 
ImmutableMap.copyOf(context.getMergedParams());
+
+    final QueryContext context2 = context.copy();
+    context2.removeUserParam("conflict");
+    context2.addSystemParam("sys2", "val2");
+    context2.addDefaultParam("default3", "defaultVal3");
+
+    Assert.assertEquals(merged, context.getMergedParams());
+  }
+
   @Test
   public void testLegacyReturnsLegacy()
   {
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
index 9c6616cbd7..185d96b945 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
@@ -1366,11 +1366,12 @@ public class DruidQuery
       final RowSignature signature = scanSignatureBuilder.build();
 
       try {
-        queryContext.addSystemParam(
+        final QueryContext newContext = queryContext.copy();
+        newContext.addSystemParam(
             CTX_SCAN_SIGNATURE,
             plannerContext.getJsonMapper().writeValueAsString(signature)
         );
-        return queryContext;
+        return newContext;
       }
       catch (JsonProcessingException e) {
         throw new RuntimeException(e);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to