|
@@ -16,12 +16,23 @@ import java.io.IOException;
|
|
|
|
|
|
public class DotExpandingXContentParserTests extends ESTestCase {
|
|
|
|
|
|
- private void assertXContentMatches(String expected, String actual) throws IOException {
|
|
|
- XContentParser inputParser = createParser(JsonXContent.jsonXContent, actual);
|
|
|
+ private void assertXContentMatches(String dotsExpanded, String withDots) throws IOException {
|
|
|
+ XContentParser inputParser = createParser(JsonXContent.jsonXContent, withDots);
|
|
|
XContentParser expandedParser = DotExpandingXContentParser.expandDots(inputParser);
|
|
|
|
|
|
XContentBuilder actualOutput = XContentBuilder.builder(JsonXContent.jsonXContent).copyCurrentStructure(expandedParser);
|
|
|
- assertEquals(expected, Strings.toString(actualOutput));
|
|
|
+ assertEquals(dotsExpanded, Strings.toString(actualOutput));
|
|
|
+
|
|
|
+ XContentParser expectedParser = createParser(JsonXContent.jsonXContent, dotsExpanded);
|
|
|
+ XContentParser actualParser = DotExpandingXContentParser.expandDots(createParser(JsonXContent.jsonXContent, withDots));
|
|
|
+ XContentParser.Token currentToken;
|
|
|
+ while ((currentToken = actualParser.nextToken()) != null) {
|
|
|
+ assertEquals(currentToken, expectedParser.nextToken());
|
|
|
+ assertEquals(expectedParser.currentToken(), actualParser.currentToken());
|
|
|
+ assertEquals(actualParser.currentToken().name(), expectedParser.currentName(), actualParser.currentName());
|
|
|
+
|
|
|
+ }
|
|
|
+ assertNull(expectedParser.nextToken());
|
|
|
}
|
|
|
|
|
|
public void testEmbeddedObject() throws IOException {
|
|
@@ -33,7 +44,16 @@ public class DotExpandingXContentParserTests extends ESTestCase {
|
|
|
""");
|
|
|
}
|
|
|
|
|
|
- public void testEmbeddedArray() throws IOException {
|
|
|
+ public void testEmbeddedObjects() throws IOException {
|
|
|
+
|
|
|
+ assertXContentMatches("""
|
|
|
+ {"test":{"with":{"dots":{"obj":{"field":"value","array":["value",{"field":"value"}]}}}},"nodots":"value2"}\
|
|
|
+ """, """
|
|
|
+ {"test.with.dots":{"obj":{"field":"value","array":["value",{"field":"value"}]}},"nodots":"value2"}\
|
|
|
+ """);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testEmbeddedArrayOfValues() throws IOException {
|
|
|
|
|
|
assertXContentMatches("""
|
|
|
{"test":{"with":{"dots":["field","value"]}},"nodots":"value2"}\
|
|
@@ -43,6 +63,26 @@ public class DotExpandingXContentParserTests extends ESTestCase {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ public void testEmbeddedArrayOfObjects() throws IOException {
|
|
|
+
|
|
|
+ assertXContentMatches("""
|
|
|
+ {"test":{"with":{"dots":[{"field":"value"},{"field":"value"}]}},"nodots":"value2"}\
|
|
|
+ """, """
|
|
|
+ {"test.with.dots":[{"field":"value"},{"field":"value"}],"nodots":"value2"}\
|
|
|
+ """);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testEmbeddedArrayMixedContent() throws IOException {
|
|
|
+
|
|
|
+ assertXContentMatches("""
|
|
|
+ {"test":{"with":{"dots":["value",{"field":"value"}]}},"nodots":"value2"}\
|
|
|
+ """, """
|
|
|
+ {"test.with.dots":["value",{"field":"value"}],"nodots":"value2"}\
|
|
|
+ """);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public void testEmbeddedValue() throws IOException {
|
|
|
|
|
|
assertXContentMatches("""
|
|
@@ -85,6 +125,40 @@ public class DotExpandingXContentParserTests extends ESTestCase {
|
|
|
assertNull(parser.nextToken());
|
|
|
}
|
|
|
|
|
|
+ public void testSkipChildrenWithinInnerObject() throws IOException {
|
|
|
+ XContentParser parser = DotExpandingXContentParser.expandDots(createParser(JsonXContent.jsonXContent, """
|
|
|
+ { "test.with.dots" : {"obj" : {"field":"value"}}, "nodots" : "value2" }"""));
|
|
|
+
|
|
|
+ parser.nextToken(); // start object
|
|
|
+ assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
|
|
|
+ assertEquals("test", parser.currentName());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.currentToken());
|
|
|
+ assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
|
|
|
+ assertEquals("with", parser.currentName());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.currentToken());
|
|
|
+ assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
|
|
|
+ assertEquals("dots", parser.currentName());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.currentToken());
|
|
|
+ assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
|
|
|
+ assertEquals("obj", parser.currentName());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.START_OBJECT, parser.currentToken());
|
|
|
+ parser.skipChildren();
|
|
|
+ assertEquals(XContentParser.Token.END_OBJECT, parser.currentToken());
|
|
|
+ assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken());
|
|
|
+ assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
|
|
|
+ assertEquals("nodots", parser.currentName());
|
|
|
+ assertEquals(XContentParser.Token.VALUE_STRING, parser.nextToken());
|
|
|
+ assertEquals("value2", parser.text());
|
|
|
+ assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken());
|
|
|
+ assertNull(parser.nextToken());
|
|
|
+ }
|
|
|
+
|
|
|
public void testNestedExpansions() throws IOException {
|
|
|
assertXContentMatches("""
|
|
|
{"first":{"dot":{"second":{"dot":"value"},"third":"value"}},"nodots":"value"}\
|