Skip to content

Commit

Permalink
Support evaluation of dynamic messages constructed via dynamic descri…
Browse files Browse the repository at this point in the history
…ptors

Closes #350

PiperOrigin-RevId: 636755364
  • Loading branch information
l46kok authored and Copybara-Service committed May 24, 2024
1 parent 28de306 commit 29828eb
Show file tree
Hide file tree
Showing 9 changed files with 1,302 additions and 11 deletions.
5 changes: 5 additions & 0 deletions common/resources/testdata/proto3/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ package(
default_visibility = ["//visibility:public"],
)

alias(
name = "test_all_types_file_descriptor_set",
actual = "//common/src/main/resources/testdata/proto3:test_all_types_file_descriptor_set",
)

alias(
name = "test_all_types_java_proto",
actual = "//common/src/main/resources/testdata/proto3:test_all_types_java_proto",
Expand Down
28 changes: 23 additions & 5 deletions common/src/main/java/dev/cel/common/internal/ProtoAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,14 +210,32 @@ public Optional<Object> adaptFieldToValue(FieldDescriptor fieldDescriptor, Objec
}
if (fieldDescriptor.isMapField()) {
Descriptor entryDescriptor = fieldDescriptor.getMessageType();
BidiConverter keyConverter = fieldToValueConverter(entryDescriptor.findFieldByNumber(1));
BidiConverter valueConverter = fieldToValueConverter(entryDescriptor.findFieldByNumber(2));
FieldDescriptor keyFieldDescriptor = entryDescriptor.findFieldByNumber(1);
FieldDescriptor valueFieldDescriptor = entryDescriptor.findFieldByNumber(2);
BidiConverter keyConverter = fieldToValueConverter(keyFieldDescriptor);
BidiConverter valueConverter = fieldToValueConverter(valueFieldDescriptor);

Map<Object, Object> map = new HashMap<>();
for (MapEntry entry : ((List<MapEntry>) fieldValue)) {
Object mapKey;
Object mapValue;
for (Object entry : ((List<Object>) fieldValue)) {
if (entry instanceof MapEntry) {
MapEntry mapEntry = (MapEntry) entry;
mapKey = mapEntry.getKey();
mapValue = mapEntry.getValue();
} else if (entry instanceof DynamicMessage) {
DynamicMessage dynamicMessage = (DynamicMessage) entry;
mapKey = dynamicMessage.getField(keyFieldDescriptor);
mapValue = dynamicMessage.getField(valueFieldDescriptor);
} else {
throw new IllegalStateException("Unexpected map field type: " + entry);
}

map.put(
keyConverter.forwardConverter().convert(entry.getKey()),
valueConverter.forwardConverter().convert(entry.getValue()));
keyConverter.forwardConverter().convert(mapKey),
valueConverter.forwardConverter().convert(mapValue));
}

return Optional.of(map);
}
if (fieldDescriptor.isRepeated()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public CelValue fromJavaObjectToCelValue(Object value) {
}

/** Adapts the protobuf message field into {@link CelValue}. */
@SuppressWarnings("unchecked")
@SuppressWarnings({"unchecked", "rawtypes"})
public CelValue fromProtoMessageFieldToCelValue(
Message message, FieldDescriptor fieldDescriptor) {
Preconditions.checkNotNull(message);
Expand All @@ -202,8 +202,26 @@ public CelValue fromProtoMessageFieldToCelValue(
return NullValue.NULL_VALUE;
} else if (fieldDescriptor.isMapField()) {
Map<Object, Object> map = new HashMap<>();
for (MapEntry<Object, Object> entry : ((List<MapEntry<Object, Object>>) result)) {
map.put(entry.getKey(), entry.getValue());
Object mapKey;
Object mapValue;
for (Object entry : ((List<Object>) result)) {
if (entry instanceof MapEntry) {
MapEntry mapEntry = (MapEntry) entry;
mapKey = mapEntry.getKey();
mapValue = mapEntry.getValue();
} else if (entry instanceof DynamicMessage) {
DynamicMessage dynamicMessage = (DynamicMessage) entry;
FieldDescriptor keyFieldDescriptor =
fieldDescriptor.getMessageType().findFieldByNumber(1);
FieldDescriptor valueFieldDescriptor =
fieldDescriptor.getMessageType().findFieldByNumber(2);
mapKey = dynamicMessage.getField(keyFieldDescriptor);
mapValue = dynamicMessage.getField(valueFieldDescriptor);
} else {
throw new IllegalStateException("Unexpected map field type: " + entry);
}

map.put(mapKey, mapValue);
}
return fromJavaObjectToCelValue(map);
}
Expand Down
5 changes: 5 additions & 0 deletions common/src/main/resources/testdata/proto3/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ package(
],
)

filegroup(
name = "test_all_types_file_descriptor_set",
srcs = ["test_all_types.fds"],
)

proto_library(
name = "test_all_types_proto",
srcs = [
Expand Down
Loading

0 comments on commit 29828eb

Please sign in to comment.