inject @Json ObjectMapper for to_json_string and parse_json expressions (#12900)
* inject @Json ObjectMapper for to_json_string and parse_json expressions
* fix npe
* better
diff --git a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
index 4cc561a..51fc87f 100644
--- a/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
+++ b/processing/src/main/java/org/apache/druid/query/expression/NestedDataExpressions.java
@@ -24,7 +24,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
-import org.apache.druid.jackson.DefaultObjectMapper;
+import org.apache.druid.guice.annotations.Json;
import org.apache.druid.java.util.common.IAE;
import org.apache.druid.math.expr.Expr;
import org.apache.druid.math.expr.ExprEval;
@@ -38,6 +38,7 @@
import org.apache.druid.segment.nested.StructuredDataProcessor;
import javax.annotation.Nullable;
+import javax.inject.Inject;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -45,8 +46,6 @@
public class NestedDataExpressions
{
- private static final ObjectMapper JSON_MAPPER = new DefaultObjectMapper();
-
public static final ExpressionType TYPE = Preconditions.checkNotNull(
ExpressionType.fromColumnType(NestedDataComplexTypeSerde.TYPE)
);
@@ -108,7 +107,7 @@
public static class JsonObjectExprMacro extends StructExprMacro
{
public static final String NAME = "json_object";
-
+
@Override
public String name()
{
@@ -168,6 +167,16 @@
{
public static final String NAME = "to_json_string";
+ private final ObjectMapper jsonMapper;
+
+ @Inject
+ public ToJsonStringExprMacro(
+ @Json ObjectMapper jsonMapper
+ )
+ {
+ this.jsonMapper = jsonMapper;
+ }
+
@Override
public String name()
{
@@ -190,7 +199,7 @@
ExprEval input = args.get(0).eval(bindings);
try {
final Object unwrapped = maybeUnwrapStructuredData(input);
- final String stringify = unwrapped == null ? null : JSON_MAPPER.writeValueAsString(unwrapped);
+ final String stringify = unwrapped == null ? null : jsonMapper.writeValueAsString(unwrapped);
return ExprEval.ofType(
ExpressionType.STRING,
stringify
@@ -223,6 +232,16 @@
{
public static final String NAME = "parse_json";
+ private final ObjectMapper jsonMapper;
+
+ @Inject
+ public ParseJsonExprMacro(
+ @Json ObjectMapper jsonMapper
+ )
+ {
+ this.jsonMapper = jsonMapper;
+ }
+
@Override
public String name()
{
@@ -246,7 +265,7 @@
Object parsed = maybeUnwrapStructuredData(arg);
if (arg.type().is(ExprType.STRING) && arg.value() != null && maybeJson(arg.asString())) {
try {
- parsed = JSON_MAPPER.readValue(arg.asString(), Object.class);
+ parsed = jsonMapper.readValue(arg.asString(), Object.class);
}
catch (JsonProcessingException e) {
throw new IAE("Bad string input [%s] to [%s]", arg.asString(), name());
diff --git a/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java b/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
index a1c9e43..daa4f14 100644
--- a/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
+++ b/processing/src/test/java/org/apache/druid/query/NestedDataTestUtils.java
@@ -271,7 +271,11 @@
return createIncrementalIndex(Granularities.DAY, true, true, 1000);
}
- public static List<Segment> createDefaultHourlySegments(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+ public static List<Segment> createDefaultHourlySegments(
+ AggregationTestHelper helper,
+ TemporaryFolder tempFolder,
+ Closer closer
+ )
throws Exception
{
return createSegments(
@@ -284,7 +288,11 @@
);
}
- public static List<Segment> createDefaultHourlySegmentsTsv(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+ public static List<Segment> createDefaultHourlySegmentsTsv(
+ AggregationTestHelper helper,
+ TemporaryFolder tempFolder,
+ Closer closer
+ )
throws Exception
{
return createTsvSegments(
@@ -297,7 +305,11 @@
);
}
- public static List<Segment> createDefaultDaySegments(AggregationTestHelper helper, TemporaryFolder tempFolder, Closer closer)
+ public static List<Segment> createDefaultDaySegments(
+ AggregationTestHelper helper,
+ TemporaryFolder tempFolder,
+ Closer closer
+ )
throws Exception
{
return createSegments(
diff --git a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
index 98f2e9c..ff2daf2 100644
--- a/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
+++ b/processing/src/test/java/org/apache/druid/query/expression/NestedDataExpressionsTest.java
@@ -19,9 +19,11 @@
package org.apache.druid.query.expression;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import org.apache.druid.jackson.DefaultObjectMapper;
import org.apache.druid.java.util.common.Pair;
import org.apache.druid.math.expr.Expr;
import org.apache.druid.math.expr.ExprEval;
@@ -38,6 +40,7 @@
public class NestedDataExpressionsTest extends InitializedNullHandlingTest
{
+ private static final ObjectMapper JSON_MAPPER = new DefaultObjectMapper();
private static final ExprMacroTable MACRO_TABLE = new ExprMacroTable(
ImmutableList.of(
new NestedDataExpressions.StructExprMacro(),
@@ -50,8 +53,8 @@
new NestedDataExpressions.JsonValueExprMacro(),
new NestedDataExpressions.JsonQueryExprMacro(),
new NestedDataExpressions.ToJsonExprMacro(),
- new NestedDataExpressions.ToJsonStringExprMacro(),
- new NestedDataExpressions.ParseJsonExprMacro()
+ new NestedDataExpressions.ToJsonStringExprMacro(JSON_MAPPER),
+ new NestedDataExpressions.ParseJsonExprMacro(JSON_MAPPER)
)
);
private static final Map<String, Object> NEST = ImmutableMap.of(
diff --git a/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java b/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
index 3b81187..95aecba 100644
--- a/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
+++ b/processing/src/test/java/org/apache/druid/query/expression/TestExprMacroTable.java
@@ -19,7 +19,9 @@
package org.apache.druid.query.expression;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
+import org.apache.druid.jackson.DefaultObjectMapper;
import org.apache.druid.math.expr.ExprMacroTable;
public class TestExprMacroTable extends ExprMacroTable
@@ -28,6 +30,11 @@
private TestExprMacroTable()
{
+ this(new DefaultObjectMapper());
+ }
+
+ private TestExprMacroTable(ObjectMapper jsonMapper)
+ {
super(
ImmutableList.of(
new IPv4AddressMatchExprMacro(),
@@ -56,8 +63,8 @@
new NestedDataExpressions.JsonValueExprMacro(),
new NestedDataExpressions.JsonQueryExprMacro(),
new NestedDataExpressions.ToJsonExprMacro(),
- new NestedDataExpressions.ToJsonStringExprMacro(),
- new NestedDataExpressions.ParseJsonExprMacro()
+ new NestedDataExpressions.ToJsonStringExprMacro(jsonMapper),
+ new NestedDataExpressions.ParseJsonExprMacro(jsonMapper)
)
);
}