Skip to content

Commit 9f749de

Browse files
committed
Plan create list
1 parent 1f3e08f commit 9f749de

4 files changed

Lines changed: 81 additions & 1 deletion

File tree

runtime/src/main/java/dev/cel/runtime/planner/BUILD.bazel

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ java_library(
1717
":eval_and",
1818
":eval_attribute",
1919
":eval_const",
20+
":eval_create_list",
2021
":eval_create_map",
2122
":eval_create_struct",
2223
":eval_or",
@@ -217,6 +218,22 @@ java_library(
217218
],
218219
)
219220

221+
java_library(
222+
name = "eval_create_list",
223+
srcs = ["EvalCreateList.java"],
224+
deps = [
225+
":attribute",
226+
":cel_value_interpretable",
227+
"//common/values",
228+
"//common/values:cel_value",
229+
"//common/values:cel_value_provider",
230+
"//runtime:evaluation_exception",
231+
"//runtime:interpretable",
232+
"@maven//:com_google_errorprone_error_prone_annotations",
233+
"@maven//:com_google_guava_guava",
234+
],
235+
)
236+
220237
java_library(
221238
name = "eval_create_map",
222239
srcs = ["EvalCreateMap.java"],
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.cel.runtime.planner;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.errorprone.annotations.Immutable;
5+
import dev.cel.common.values.CelValue;
6+
import dev.cel.common.values.ImmutableListValue;
7+
import dev.cel.runtime.CelEvaluationException;
8+
import dev.cel.runtime.GlobalResolver;
9+
10+
@Immutable
11+
final class EvalCreateList implements CelValueInterpretable {
12+
13+
@SuppressWarnings("Immutable")
14+
private final CelValueInterpretable[] values;
15+
16+
17+
@Override
18+
public CelValue eval(GlobalResolver resolver) throws CelEvaluationException {
19+
ImmutableList.Builder<CelValue> builder = ImmutableList.builder();
20+
for (int i = 0; i < values.length; i++) {
21+
builder.add(values[i].eval(resolver));
22+
}
23+
return ImmutableListValue.create(builder.build());
24+
}
25+
26+
static EvalCreateList create(
27+
CelValueInterpretable[] values
28+
) {
29+
return new EvalCreateList(values);
30+
}
31+
32+
private EvalCreateList(
33+
CelValueInterpretable[] values
34+
) {
35+
this.values = values;
36+
}
37+
}

runtime/src/main/java/dev/cel/runtime/planner/ProgramPlanner.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import dev.cel.common.ast.CelConstant;
1111
import dev.cel.common.ast.CelExpr;
1212
import dev.cel.common.ast.CelExpr.CelCall;
13+
import dev.cel.common.ast.CelExpr.CelList;
1314
import dev.cel.common.ast.CelExpr.CelMap;
1415
import dev.cel.common.ast.CelExpr.CelStruct;
1516
import dev.cel.common.ast.CelExpr.CelStruct.Entry;
@@ -53,7 +54,7 @@ private CelValueInterpretable plan(
5354
case CALL:
5455
return planCall(celExpr, ctx);
5556
case LIST:
56-
break;
57+
return planCreateList(celExpr, ctx);
5758
case STRUCT:
5859
return planCreateStruct(celExpr, ctx);
5960
case MAP:
@@ -169,6 +170,19 @@ private CelValueInterpretable planCreateStruct(CelExpr celExpr, PlannerContext c
169170
return EvalCreateStruct.create(valueProvider, struct.messageName(), keys, values);
170171
}
171172

173+
private CelValueInterpretable planCreateList(CelExpr celExpr, PlannerContext ctx) {
174+
CelList list = celExpr.list();
175+
176+
List<CelExpr> elements = list.elements();
177+
CelValueInterpretable[] values = new CelValueInterpretable[elements.size()];
178+
179+
for (int i = 0; i < elements.size(); i++) {
180+
values[i] = plan(elements.get(i), ctx);
181+
}
182+
183+
return EvalCreateList.create(values);
184+
}
185+
172186
private CelValueInterpretable planCreateMap(CelExpr celExpr, PlannerContext ctx) {
173187
CelMap map = celExpr.map();
174188

runtime/src/test/java/dev/cel/runtime/planner/ProgramPlannerTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.nio.charset.StandardCharsets;
5353

5454
import dev.cel.runtime.DefaultDispatcher;
55+
import java.util.List;
5556
import java.util.Map;
5657
import org.junit.Test;
5758
import org.junit.runner.RunWith;
@@ -234,6 +235,17 @@ public void planCreateStruct_withFields() throws Exception {
234235
assertThat(result).isEqualTo(TestAllTypes.newBuilder().setSingleString("foo").setSingleBool(true).build());
235236
}
236237

238+
@Test
239+
public void planCreateList() throws Exception {
240+
CelAbstractSyntaxTree ast = compile("[1, 'foo', true]");
241+
242+
Program program = PLANNER.plan(ast);
243+
244+
List<Object> result = (List<Object>) program.eval();
245+
246+
assertThat(result).containsExactly(1L, "foo", true).inOrder();
247+
}
248+
237249
@Test
238250
public void planCreateMap() throws Exception {
239251
CelAbstractSyntaxTree ast = compile("{'foo': 1, true: 'bar'}");

0 commit comments

Comments
 (0)