Skip to content

Commit f968d4d

Browse files
committed
Plan message creation
1 parent bdc7af4 commit f968d4d

7 files changed

Lines changed: 78 additions & 47 deletions

File tree

common/src/main/java/dev/cel/common/ast/CelConstant.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,7 @@ public static CelConstant ofObjectValue(Object value) {
207207

208208
throw new IllegalArgumentException("Value is not a CelConstant: " + value);
209209
}
210-
* TODO
211-
*/
210+
212211
public Object objectValue() {
213212
switch (getKind()) {
214213
case NULL_VALUE:
@@ -229,6 +228,4 @@ public Object objectValue() {
229228
throw new IllegalStateException("Unsupported kind: " + getKind());
230229
}
231230
}
232-
233-
/**
234231
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ java_library(
1717
":eval_and",
1818
":eval_attribute",
1919
":eval_const",
20-
":eval_create_object",
20+
":eval_create_struct",
2121
":eval_or",
2222
":eval_unary",
2323
":eval_var_args_call",
@@ -201,8 +201,8 @@ java_library(
201201
)
202202

203203
java_library(
204-
name = "eval_create_object",
205-
srcs = ["EvalCreateObject.java"],
204+
name = "eval_create_struct",
205+
srcs = ["EvalCreateStruct.java"],
206206
deps = [
207207
":attribute",
208208
":cel_value_interpretable",

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

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package dev.cel.runtime.planner;
2+
3+
import com.google.errorprone.annotations.Immutable;
4+
import dev.cel.common.values.CelValue;
5+
import dev.cel.common.values.CelValueProvider;
6+
import dev.cel.runtime.CelEvaluationException;
7+
import dev.cel.runtime.GlobalResolver;
8+
import java.util.Collections;
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
import java.util.Map.Entry;
12+
13+
@Immutable
14+
final class EvalCreateStruct implements CelValueInterpretable {
15+
16+
private final CelValueProvider valueProvider;
17+
private final String typeName;
18+
19+
// Regular hashmap used for performance. Planner must not mutate the map post-construction.
20+
@SuppressWarnings("Immutable")
21+
private final Map<String, CelValueInterpretable> fields;
22+
23+
@Override
24+
public CelValue eval(GlobalResolver resolver) throws CelEvaluationException {
25+
Map<String, Object> fieldValues = new HashMap<>();
26+
for (Entry<String, CelValueInterpretable> entry : fields.entrySet()) {
27+
Object value = entry.getValue().eval(resolver).value();
28+
fieldValues.put(entry.getKey(), value);
29+
}
30+
31+
return valueProvider.newValue(typeName, Collections.unmodifiableMap(fieldValues))
32+
.orElseThrow(() -> new IllegalArgumentException("Type name not found: " + typeName));
33+
}
34+
35+
static EvalCreateStruct create(
36+
CelValueProvider valueProvider,
37+
String typeName,
38+
Map<String, CelValueInterpretable> fields
39+
) {
40+
return new EvalCreateStruct(valueProvider, typeName, fields);
41+
}
42+
43+
private EvalCreateStruct(
44+
CelValueProvider valueProvider,
45+
String typeName,
46+
Map<String, CelValueInterpretable> fields
47+
) {
48+
this.valueProvider = valueProvider;
49+
this.typeName = typeName;
50+
this.fields = fields;
51+
}
52+
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import dev.cel.common.ast.CelExpr;
1212
import dev.cel.common.ast.CelExpr.CelCall;
1313
import dev.cel.common.ast.CelExpr.CelStruct;
14+
import dev.cel.common.ast.CelExpr.CelStruct.Entry;
1415
import dev.cel.common.ast.CelReference;
1516
import dev.cel.common.types.CelKind;
1617
import dev.cel.common.types.CelType;
@@ -23,6 +24,7 @@
2324
import dev.cel.runtime.CelLiteRuntime.Program;
2425
import dev.cel.runtime.DefaultDispatcher;
2526

27+
import java.util.Collections;
2628
import java.util.HashMap;
2729
import java.util.NoSuchElementException;
2830
import java.util.Optional;
@@ -153,7 +155,14 @@ private CelValueInterpretable planCreateObject(CelExpr celExpr, PlannerContext c
153155
valueProvider.newValue(struct.messageName(), new HashMap<>())
154156
.orElseThrow(() -> new IllegalArgumentException("Undefined type name: " + struct.messageName()));
155157

156-
return EvalCreateObject.create(valueProvider, struct.messageName());
158+
HashMap<String, CelValueInterpretable> fieldMap = new HashMap<>();
159+
for (Entry entry : struct.entries()) {
160+
CelValueInterpretable value = plan(entry.value(), ctx);
161+
fieldMap.put(entry.fieldKey(), value);
162+
}
163+
164+
return EvalCreateStruct.create(valueProvider, struct.messageName(),
165+
Collections.unmodifiableMap(fieldMap));
157166
}
158167

159168
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ java_library(
4545
"//common/values:cel_value_provider",
4646
"//common/values:proto_message_lite_value",
4747
"//common/values:proto_message_lite_value_provider",
48+
"//common/values:proto_message_value_provider",
4849
"//compiler",
4950
"//compiler:compiler_builder",
5051
"//extensions:optional_library",

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616
import com.google.testing.junit.testparameterinjector.TestParameterInjector;
1717
import com.google.testing.junit.testparameterinjector.TestParameters;
1818
import dev.cel.common.CelAbstractSyntaxTree;
19+
import dev.cel.common.CelDescriptorUtil;
1920
import dev.cel.common.CelErrorCode;
2021
import dev.cel.common.CelOptions;
22+
import dev.cel.common.internal.CelDescriptorPool;
23+
import dev.cel.common.internal.DefaultDescriptorPool;
24+
import dev.cel.common.internal.DefaultMessageFactory;
25+
import dev.cel.common.internal.DynamicProto;
2126
import dev.cel.common.types.CelType;
2227
import dev.cel.common.types.DefaultTypeProvider;
2328
import dev.cel.common.types.ListType;
@@ -28,11 +33,10 @@
2833
import dev.cel.common.values.CelByteString;
2934
import dev.cel.common.values.CelValueConverter;
3035
import dev.cel.common.values.NullValue;
31-
import dev.cel.common.values.ProtoMessageLiteValueProvider;
36+
import dev.cel.common.values.ProtoMessageValueProvider;
3237
import dev.cel.compiler.CelCompiler;
3338
import dev.cel.compiler.CelCompilerFactory;
3439
import dev.cel.expr.conformance.proto3.TestAllTypes;
35-
import dev.cel.expr.conformance.proto3.TestAllTypesCelDescriptor;
3640
import dev.cel.extensions.CelOptionalLibrary;
3741
import dev.cel.parser.Operator;
3842
import dev.cel.runtime.CelEvaluationException;
@@ -75,10 +79,13 @@ public final class ProgramPlannerTest {
7579
.addMessageTypes(TestAllTypes.getDescriptor())
7680
.build();
7781

82+
private static final CelDescriptorPool DESCRIPTOR_POOL =
83+
DefaultDescriptorPool.create(CelDescriptorUtil.getAllDescriptorsFromFileDescriptor(TestAllTypes.getDescriptor().getFile()));
7884
private static final ProgramPlanner PLANNER = ProgramPlanner.newPlanner(
7985
DefaultTypeProvider.create(),
80-
ProtoMessageLiteValueProvider.newInstance(
81-
TestAllTypesCelDescriptor.getDescriptor()
86+
ProtoMessageValueProvider.newInstance(
87+
CEL_OPTIONS,
88+
DynamicProto.create(DefaultMessageFactory.create(DESCRIPTOR_POOL))
8289
),
8390
new CelValueConverter(),
8491
newDispatcher()

0 commit comments

Comments
 (0)