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]