Skip to content

Commit ab9be75

Browse files
committed
Clean up merge conflicts
Signed-off-by: Andrew Carbonetto <[email protected]>
1 parent e8b6df3 commit ab9be75

File tree

7 files changed

+59
-39
lines changed

7 files changed

+59
-39
lines changed

core/src/main/java/org/opensearch/sql/expression/DSL.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,10 @@ public static FunctionExpression jsonValid(Expression... expressions) {
687687
return compile(FunctionProperties.None, BuiltinFunctionName.JSON_VALID, expressions);
688688
}
689689

690+
public static FunctionExpression stringToJson(Expression value) {
691+
return compile(FunctionProperties.None, BuiltinFunctionName.JSON, value);
692+
}
693+
690694
public static Aggregator avg(Expression... expressions) {
691695
return aggregate(BuiltinFunctionName.AVG, expressions);
692696
}
@@ -977,10 +981,6 @@ public static FunctionExpression utc_timestamp(
977981
return compile(functionProperties, BuiltinFunctionName.UTC_TIMESTAMP, args);
978982
}
979983

980-
public static FunctionExpression json_function(Expression value) {
981-
return compile(FunctionProperties.None, BuiltinFunctionName.JSON, value);
982-
}
983-
984984
@SuppressWarnings("unchecked")
985985
private static <T extends FunctionImplementation> T compile(
986986
FunctionProperties functionProperties, BuiltinFunctionName bfn, Expression... args) {

core/src/main/java/org/opensearch/sql/expression/json/JsonFunctions.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@
55

66
package org.opensearch.sql.expression.json;
77

8-
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import lombok.experimental.UtilityClass;
10-
import org.opensearch.sql.expression.function.BuiltinFunctionName;
11-
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
12-
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
13-
148
import static org.opensearch.sql.data.type.ExprCoreType.BOOLEAN;
159
import static org.opensearch.sql.data.type.ExprCoreType.STRING;
1610
import static org.opensearch.sql.data.type.ExprCoreType.UNDEFINED;

core/src/main/java/org/opensearch/sql/expression/operator/convert/TypeCastOperators.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ private static DefaultFunctionResolver castToByte() {
9292
STRING),
9393
impl(nullMissingHandling((v) -> new ExprByteValue(v.byteValue())), BYTE, DOUBLE),
9494
impl(
95-
nullMissingHandling((v) -> new ExprByteValue(v.booleanValue() ? 1 : 0)), BYTE, BOOLEAN),
96-
impl(nullMissingHandling((v) -> v), BYTE, UNDEFINED));
95+
nullMissingHandling((v) -> new ExprByteValue(v.booleanValue() ? 1 : 0)),
96+
BYTE,
97+
BOOLEAN));
9798
}
9899

99100
private static DefaultFunctionResolver castToShort() {

core/src/main/java/org/opensearch/sql/utils/JsonUtils.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
import java.util.List;
1313
import java.util.Map;
1414
import lombok.experimental.UtilityClass;
15+
import org.opensearch.sql.data.model.ExprBooleanValue;
1516
import org.opensearch.sql.data.model.ExprCollectionValue;
1617
import org.opensearch.sql.data.model.ExprDoubleValue;
1718
import org.opensearch.sql.data.model.ExprIntegerValue;
19+
import org.opensearch.sql.data.model.ExprNullValue;
1820
import org.opensearch.sql.data.model.ExprStringValue;
1921
import org.opensearch.sql.data.model.ExprTupleValue;
2022
import org.opensearch.sql.data.model.ExprValue;
@@ -27,7 +29,7 @@ public class JsonUtils {
2729
* Checks if given JSON string can be parsed as valid JSON.
2830
*
2931
* @param jsonExprValue JSON string (e.g. "{\"hello\": \"world\"}").
30-
* @return true if the string can be parsed as valid JSON, else false.
32+
* @return true if the string can be parsed as valid JSON, else false (including null or missing).
3133
*/
3234
public static ExprValue isValidJson(ExprValue jsonExprValue) {
3335
ObjectMapper objectMapper = new ObjectMapper();
@@ -44,7 +46,21 @@ public static ExprValue isValidJson(ExprValue jsonExprValue) {
4446
}
4547
}
4648

47-
/** Converts a JSON encoded string to an Expression object. */
49+
/**
50+
* Converts a JSON encoded string to a {@link ExprValue}. Expression type will be UNDEFINED.
51+
*
52+
* @param json JSON string (e.g. "{\"hello\": \"world\"}").
53+
* @return ExprValue returns an expression that best represents the provided JSON-encoded string.
54+
* <ol>
55+
* <li>{@link ExprTupleValue} if the JSON is an object
56+
* <li>{@link ExprCollectionValue} if the JSON is an array
57+
* <li>{@link ExprDoubleValue} if the JSON is a floating-point number scalar
58+
* <li>{@link ExprIntegerValue} if the JSON is an integral number scalar
59+
* <li>{@link ExprStringValue} if the JSON is a string scalar
60+
* <li>{@link ExprBooleanValue} if the JSON is a boolean scalar
61+
* <li>{@link ExprNullValue} if the JSON is null, empty, or invalid
62+
* </ol>
63+
*/
4864
public static ExprValue castJson(ExprValue json) {
4965
ObjectMapper objectMapper = new ObjectMapper();
5066
JsonNode jsonNode;

core/src/test/java/org/opensearch/sql/expression/json/JsonFunctionsTest.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,8 @@ public void json_valid_returns_false() {
5151
@Test
5252
public void json_valid_throws_ExpressionEvaluationException() {
5353
assertThrows(
54-
ExpressionEvaluationException.class, () -> execute(ExprValueUtils.booleanValue(true)));
55-
56-
// caught by nullMissingHandling and returns null
57-
assertEquals(LITERAL_NULL, execute(LITERAL_NULL));
54+
ExpressionEvaluationException.class,
55+
() -> DSL.jsonValid(DSL.literal((ExprValueUtils.booleanValue(true)))).valueOf());
5856
}
5957

6058
@Test
@@ -115,12 +113,16 @@ void json_returnsJsonObject() {
115113
ExprValue expectedTupleExpr = ExprTupleValue.fromExprValueMap(objectMap);
116114

117115
// exercise
118-
exp = DSL.json_function(DSL.literal(objectJson));
116+
exp = DSL.stringToJson(DSL.literal(objectJson));
119117

120118
// Verify
121119
var value = exp.valueOf();
122120
assertTrue(value instanceof ExprTupleValue);
123121
assertEquals(expectedTupleExpr, value);
122+
123+
// also test the empty object case
124+
assertEquals(
125+
ExprTupleValue.fromExprValueMap(Map.of()), DSL.stringToJson(DSL.literal("{}")).valueOf());
124126
}
125127

126128
@Test
@@ -141,35 +143,35 @@ void json_returnsJsonArray() {
141143
LITERAL_NULL));
142144

143145
// exercise
144-
exp = DSL.json_function(DSL.literal(arrayJson));
146+
exp = DSL.stringToJson(DSL.literal(arrayJson));
145147

146148
// Verify
147149
var value = exp.valueOf();
148150
assertTrue(value instanceof ExprCollectionValue);
149151
assertEquals(expectedArrayExpr, value);
152+
153+
// also test the empty-array case
154+
assertEquals(new ExprCollectionValue(List.of()), DSL.stringToJson(DSL.literal("[]")).valueOf());
150155
}
151156

152157
@Test
153158
void json_returnsScalar() {
154159
assertEquals(
155-
new ExprStringValue("foobar"), DSL.json_function(DSL.literal("\"foobar\"")).valueOf());
156-
157-
assertEquals(new ExprIntegerValue(1234), DSL.json_function(DSL.literal("1234")).valueOf());
160+
new ExprStringValue("foobar"), DSL.stringToJson(DSL.literal("\"foobar\"")).valueOf());
158161

159-
assertEquals(new ExprDoubleValue(12.34), DSL.json_function(DSL.literal("12.34")).valueOf());
162+
assertEquals(new ExprIntegerValue(1234), DSL.stringToJson(DSL.literal("1234")).valueOf());
160163

161-
assertEquals(LITERAL_TRUE, DSL.json_function(DSL.literal("true")).valueOf());
164+
assertEquals(new ExprDoubleValue(12.34), DSL.stringToJson(DSL.literal("12.34")).valueOf());
162165

163-
assertEquals(LITERAL_NULL, DSL.json_function(DSL.literal("null")).valueOf());
166+
assertEquals(LITERAL_TRUE, DSL.stringToJson(DSL.literal("true")).valueOf());
164167

165-
assertEquals(LITERAL_NULL, DSL.json_function(DSL.literal(LITERAL_NULL)).valueOf());
168+
assertEquals(LITERAL_NULL, DSL.stringToJson(DSL.literal("null")).valueOf());
166169

167-
assertEquals(LITERAL_MISSING, DSL.json_function(DSL.literal(LITERAL_MISSING)).valueOf());
170+
assertEquals(LITERAL_NULL, DSL.stringToJson(DSL.literal(LITERAL_NULL)).valueOf());
168171

169-
assertEquals(LITERAL_NULL, DSL.json_function(DSL.literal("")).valueOf());
172+
assertEquals(LITERAL_MISSING, DSL.stringToJson(DSL.literal(LITERAL_MISSING)).valueOf());
170173

171-
assertEquals(
172-
ExprTupleValue.fromExprValueMap(Map.of()), DSL.json_function(DSL.literal("{}")).valueOf());
174+
assertEquals(LITERAL_NULL, DSL.stringToJson(DSL.literal("")).valueOf());
173175
}
174176

175177
@Test
@@ -181,7 +183,7 @@ void json_returnsSemanticCheckException() {
181183
// missing bracket
182184
assertThrows(SemanticCheckException.class, () -> DSL.castJson(DSL.literal("{{[}}")).valueOf());
183185

184-
// mnissing quote
186+
// missing quote
185187
assertThrows(
186188
SemanticCheckException.class, () -> DSL.castJson(DSL.literal("\"missing quote")).valueOf());
187189
}

core/src/test/java/org/opensearch/sql/expression/operator/convert/TypeCastOperatorTest.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ void castBooleanToDouble() {
312312
void castUndefinedToDouble() {
313313
Double value = 23.45e5;
314314
// json cast is an UNDEFINED type expression
315-
FunctionExpression expression = DSL.castDouble(DSL.castJson(DSL.literal(value)));
315+
FunctionExpression expression = DSL.castDouble(DSL.castJson(DSL.literal(value.toString())));
316316
assertEquals(DOUBLE, expression.type());
317317
assertEquals(new ExprDoubleValue(value), expression.valueOf());
318318
}
@@ -480,6 +480,10 @@ void castJson_returnsJsonObject() {
480480
var value = exp.valueOf();
481481
assertTrue(value instanceof ExprTupleValue);
482482
assertEquals(expectedTupleExpr, value);
483+
484+
// also test the empty-object case
485+
assertEquals(
486+
ExprTupleValue.fromExprValueMap(Map.of()), DSL.castJson(DSL.literal("{}")).valueOf());
483487
}
484488

485489
@Test
@@ -506,6 +510,9 @@ void castJson_returnsJsonArray() {
506510
var value = exp.valueOf();
507511
assertTrue(value instanceof ExprCollectionValue);
508512
assertEquals(expectedArrayExpr, value);
513+
514+
// also test the empty-array case
515+
assertEquals(new ExprCollectionValue(List.of()), DSL.castJson(DSL.literal("[]")).valueOf());
509516
}
510517

511518
@Test
@@ -525,11 +532,6 @@ void castJson_returnsScalar() {
525532

526533
String empty = "";
527534
assertEquals(LITERAL_NULL, DSL.castJson(DSL.literal(empty)).valueOf());
528-
529-
String emptyObject = "{}";
530-
assertEquals(
531-
ExprTupleValue.fromExprValueMap(Map.of()),
532-
DSL.castJson(DSL.literal(emptyObject)).valueOf());
533535
}
534536

535537
@Test

integ-test/src/test/java/org/opensearch/sql/ppl/JsonFunctionsIT.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public void test_json_valid() throws IOException {
4040
rows("json object"),
4141
rows("json array"),
4242
rows("json scalar string"),
43+
rows("json scalar int"),
44+
rows("json scalar float"),
45+
rows("json scalar double"),
46+
rows("json scalar boolean true"),
47+
rows("json scalar boolean false"),
4348
rows("json empty string"));
4449
}
4550

@@ -102,7 +107,7 @@ public void test_json() throws IOException {
102107
rows("json array", new JSONArray(List.of(1, 2, 3, 4))),
103108
rows("json scalar string", "abc"),
104109
rows("json scalar int", 1234),
105-
rows("json scalar long", 42),
110+
rows("json scalar float", 12.34),
106111
rows("json scalar double", 2.99792458e8),
107112
rows("json scalar boolean true", true),
108113
rows("json scalar boolean false", false),

0 commit comments

Comments
 (0)