Skip to content

Commit 2fe41c3

Browse files
authored
Support triple quote strings to disambiguate between String and EscapedJsonPointer (#5655)
* Introduce RawString type to allow strings that begin with forward slash Signed-off-by: Craig Perkins <cwperx@amazon.com> * Add tests in GenericExpressionEvaluator_ConditionalIT Signed-off-by: Craig Perkins <cwperx@amazon.com> * Address comments Signed-off-by: Craig Perkins <cwperx@amazon.com> * Improve coverage Signed-off-by: Craig Perkins <cwperx@amazon.com> --------- Signed-off-by: Craig Perkins <cwperx@amazon.com> Signed-off-by: Craig Perkins <craig5008@gmail.com>
1 parent 65e7033 commit 2fe41c3

4 files changed

Lines changed: 16 additions & 3 deletions

File tree

data-prepper-expression/src/main/antlr/DataPrepperExpression.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ VariableNameCharacter
271271
272272
String
273273
: DOUBLEQUOTE StringCharacters? DOUBLEQUOTE
274+
| DOUBLEQUOTE DOUBLEQUOTE DOUBLEQUOTE StringCharacters? DOUBLEQUOTE DOUBLEQUOTE DOUBLEQUOTE
274275
;
275276
276277
fragment

data-prepper-expression/src/main/java/org/opensearch/dataprepper/expression/ParseTreeCoercionService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ public Object coercePrimaryTerminalNode(final TerminalNode node, final Event eve
7878
case DataPrepperExpressionParser.JsonPointer:
7979
return resolveJsonPointerValue(nodeStringValue, event);
8080
case DataPrepperExpressionParser.String:
81-
final String nodeStringValueWithQuotesStripped = nodeStringValue.substring(1,
82-
nodeStringValue.length() - 1);
83-
return nodeStringValueWithQuotesStripped;
81+
return nodeStringValue.replaceAll("^\"{1,3}|\"{1,3}$", "");
8482
case DataPrepperExpressionParser.Integer:
8583
Long longValue = Long.valueOf(nodeStringValue);
8684
if (longValue > Integer.MAX_VALUE || longValue < Integer.MIN_VALUE) {

data-prepper-expression/src/test/java/org/opensearch/dataprepper/expression/GenericExpressionEvaluator_ConditionalIT.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ private static Stream<Arguments> validExpressionArguments() {
192192
arguments("/should_drop", event("{\"should_drop\": true}"), true),
193193
arguments("/should_drop", event("{\"should_drop\": false}"), false),
194194
arguments("/logs/2/should_drop", event("{\"logs\": [{}, {}, {\"should_drop\": true}]}"), true),
195+
arguments("/path == \"\"\"/path/to/route\"\"\"", event("{\"path\": \"/path/to/route\"}"), true),
196+
arguments("/path == \"\"\"/path/to/route\"\"\"", event("{\"path\": \"/incorrect/path\"}"), false),
195197
arguments(
196198
escapedJsonPointer(ALL_JACKSON_EVENT_GET_SUPPORTED_CHARACTERS) + " == true",
197199
complexEvent(ALL_JACKSON_EVENT_GET_SUPPORTED_CHARACTERS, true),

data-prepper-expression/src/test/java/org/opensearch/dataprepper/expression/ParseTreeCoercionServiceTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,18 @@ void testCoerceTerminalNodeEscapeJsonPointerTypeUnSupportedValues() {
226226
assertThrows(ExpressionCoercionException.class, () -> objectUnderTest.coercePrimaryTerminalNode(terminalNode, testEvent));
227227
}
228228

229+
@ParameterizedTest
230+
@MethodSource("provideSupportedJsonPointerValues")
231+
void testCoerceTerminalNodeTripleQuoteStringTypeSupportedValues(final Object testValue) {
232+
final String testKey = "/testKey";
233+
final String testTruipleQuoteStringKey = "\"\"\"/testKey\"\"\"";
234+
when(token.getType()).thenReturn(DataPrepperExpressionParser.String);
235+
when(terminalNode.getSymbol()).thenReturn(token);
236+
when(terminalNode.getText()).thenReturn(testTruipleQuoteStringKey);
237+
final Object result = objectUnderTest.coercePrimaryTerminalNode(terminalNode, null);
238+
assertThat(result, equalTo(testKey));
239+
}
240+
229241
@Test
230242
void testCoerceTerminalNodeJsonPointerTypeUnSupportedValues() {
231243
final String testKey1 = "key1";

0 commit comments

Comments
 (0)