Skip to content

Commit f5b4094

Browse files
authored
fix: allow nested expression in array accessor (#151)
1 parent 308f841 commit f5b4094

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

src/data_factory_testing_framework/_expression_runtime/data_factory_expression/expression_transformer.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(self) -> None:
4040

4141
expression_grammar = f"""
4242
expression_start: "@" expression_evaluation
43-
expression_evaluation: (expression_logical_bool | expression_branch | expression_call) ((EXPRESSION_NULL_CONDITIONAL_OPERATOR? (expression_field_reference | EXPRESSION_ARRAY_INDEX))+)? EXPRESSION_WS*
43+
expression_evaluation: (expression_logical_bool | expression_branch | expression_call) ((EXPRESSION_NULL_CONDITIONAL_OPERATOR? (expression_field_reference | expression_object_or_array_accessor))+)? EXPRESSION_WS*
4444
?expression_call: expression_function_call
4545
// used to translate to expression_pipeline_reference
4646
| expression_datafactory_parameters_reference
@@ -57,6 +57,7 @@ def __init__(self) -> None:
5757
expression_item_reference: "item" "()"
5858
expression_pipeline_reference: "pipeline" "()" EXPRESSION_NULL_CONDITIONAL_OPERATOR? "." EXPRESSION_PIPELINE_PROPERTY
5959
expression_field_reference: "." EXPRESSION_PARAMETER_NAME
60+
expression_object_or_array_accessor: "[" expression_evaluation "]" | EXPRESSION_ARRAY_INDEX | EXPRESSION_ARRAY_OBJECT_ACCESSOR // resolves array[0], array["key"] or array[<expression>]
6061
6162
// branch rules
6263
expression_logical_bool: EXPRESSION_LOGICAL_BOOL "(" expression_parameter "," expression_parameter ")"
@@ -71,6 +72,7 @@ def __init__(self) -> None:
7172
EXPRESSION_DATAFACTORY_REFERENCE: "dataset" | "linkedService"
7273
EXPRESSION_ACTIVITY_NAME: "'" /[^']*/ "'"
7374
EXPRESSION_ARRAY_INDEX: ARRAY_INDEX
75+
EXPRESSION_ARRAY_OBJECT_ACCESSOR: "[" SINGLE_QUOTED_STRING "]"
7476
EXPRESSION_BOOLEAN: BOOLEAN
7577
EXPRESSION_FLOAT: SIGNED_FLOAT
7678
EXPRESSION_FUNCTION_NAME: {self._supported_functions()}

tests/unit/functions/test_data_factory_testing_framework_expression_evaluator.py

+52
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,58 @@
327327
"variable_test_valueparameter_test_value",
328328
id="variable_and_parameter_reference",
329329
),
330+
p(
331+
"@activity('get nested object').output.pipelineReturnValue.returnValue.attribute1[pipeline().parameters.parameter]",
332+
PipelineRunState(
333+
parameters=[
334+
RunParameter(RunParameterType.Pipeline, "parameter", "param1"),
335+
],
336+
activity_results=[
337+
ActivityResult(
338+
activity_name="get nested object",
339+
status=DependencyCondition.SUCCEEDED,
340+
output={
341+
"pipelineReturnValue": {
342+
"returnValue": {
343+
"attribute1": {
344+
"param1": "value1",
345+
},
346+
}
347+
}
348+
},
349+
)
350+
],
351+
),
352+
"@activity('get nested object').output.pipelineReturnValue.returnValue.attribute1[pipeline().parameters.parameter]",
353+
"value1",
354+
id="activity_reference_with_nested_property_and_parameter_reference",
355+
),
356+
p(
357+
"@activity('get nested object').output.pipelineReturnValue.returnValue.attribute1['param1']",
358+
PipelineRunState(
359+
parameters=[
360+
RunParameter(RunParameterType.Pipeline, "parameter", "param1"),
361+
],
362+
activity_results=[
363+
ActivityResult(
364+
activity_name="get nested object",
365+
status=DependencyCondition.SUCCEEDED,
366+
output={
367+
"pipelineReturnValue": {
368+
"returnValue": {
369+
"attribute1": {
370+
"param1": "value1",
371+
},
372+
}
373+
}
374+
},
375+
)
376+
],
377+
),
378+
"@activity('get nested object').output.pipelineReturnValue.returnValue.attribute1['param1']",
379+
"value1",
380+
id="activity_reference_with_nested_property_and_string_reference",
381+
),
330382
],
331383
)
332384
def test_evaluate(

0 commit comments

Comments
 (0)