use of com.google.api.expr.v1alpha1.Expr.CreateStruct.Entry in project cel-java by projectnessie.
the class Unparser method visitStructMap.
void visitStructMap(CreateStruct expr) {
List<Entry> entries = expr.getEntriesList();
str.append("{");
for (int i = 0; i < entries.size(); i++) {
if (i > 0) {
str.append(", ");
}
Entry entry = entries.get(i);
Expr k = entry.getMapKey();
visit(k);
str.append(": ");
Expr v = entry.getValue();
visit(v);
}
str.append("}");
}
use of com.google.api.expr.v1alpha1.Expr.CreateStruct.Entry in project cel-java by projectnessie.
the class AstPruner method prune.
Expr prune(Expr node) {
if (node == null) {
return null;
}
Val val = value(node.getId());
if (val != null && !isUnknownOrError(val)) {
Expr newNode = maybeCreateLiteral(node.getId(), val);
if (newNode != null) {
return newNode;
}
}
switch(node.getExprKindCase()) {
case SELECT_EXPR:
Select select = node.getSelectExpr();
Expr operand = prune(select.getOperand());
if (operand != null && operand != select.getOperand()) {
return Expr.newBuilder().setId(node.getId()).setSelectExpr(Select.newBuilder().setOperand(operand).setField(select.getField()).setTestOnly(select.getTestOnly())).build();
}
break;
case CALL_EXPR:
Call call = node.getCallExpr();
Expr newExpr = maybePruneFunction(node);
if (newExpr != null) {
newExpr = prune(newExpr);
return newExpr;
}
boolean prunedCall = false;
List<Expr> args = call.getArgsList();
List<Expr> newArgs = new ArrayList<>(args.size());
for (int i = 0; i < args.size(); i++) {
Expr arg = args.get(i);
newArgs.add(arg);
Expr newArg = prune(arg);
if (newArg != null && newArg != arg) {
prunedCall = true;
newArgs.set(i, newArg);
}
}
Call newCall = Call.newBuilder().setFunction(call.getFunction()).setTarget(call.getTarget()).addAllArgs(newArgs).build();
Expr newTarget = prune(call.getTarget());
if (newTarget != null && newTarget != call.getTarget()) {
prunedCall = true;
newCall = Call.newBuilder().setFunction(call.getFunction()).setTarget(newTarget).addAllArgs(newArgs).build();
}
if (prunedCall) {
return Expr.newBuilder().setId(node.getId()).setCallExpr(newCall).build();
}
break;
case LIST_EXPR:
CreateList list = node.getListExpr();
List<Expr> elems = list.getElementsList();
List<Expr> newElems = new ArrayList<>(elems.size());
boolean prunedList = false;
for (int i = 0; i < elems.size(); i++) {
Expr elem = elems.get(i);
newElems.add(elem);
Expr newElem = prune(elem);
if (newElem != null && newElem != elem) {
newElems.set(i, newElem);
prunedList = true;
}
}
if (prunedList) {
return Expr.newBuilder().setId(node.getId()).setListExpr(CreateList.newBuilder().addAllElements(newElems)).build();
}
break;
case STRUCT_EXPR:
boolean prunedStruct = false;
CreateStruct struct = node.getStructExpr();
List<Entry> entries = struct.getEntriesList();
String messageType = struct.getMessageName();
List<Entry> newEntries = new ArrayList<>(entries.size());
for (int i = 0; i < entries.size(); i++) {
Entry entry = entries.get(i);
newEntries.add(entry);
Expr mapKey = entry.getMapKey();
Expr newKey = mapKey != Entry.getDefaultInstance().getMapKey() ? prune(mapKey) : null;
Expr newValue = prune(entry.getValue());
if ((newKey == null || newKey == mapKey) && (newValue == null || newValue == entry.getValue())) {
continue;
}
prunedStruct = true;
Entry newEntry;
if (!messageType.isEmpty()) {
newEntry = Entry.newBuilder().setFieldKey(entry.getFieldKey()).setValue(newValue).build();
} else {
newEntry = Entry.newBuilder().setMapKey(newKey).setValue(newValue).build();
}
newEntries.set(i, newEntry);
}
if (prunedStruct) {
return Expr.newBuilder().setId(node.getId()).setStructExpr(CreateStruct.newBuilder().setMessageName(messageType).addAllEntries(entries)).build();
}
break;
case COMPREHENSION_EXPR:
Comprehension compre = node.getComprehensionExpr();
// Only the range of the comprehension is pruned since the state tracking only records
// the last iteration of the comprehension and not each step in the evaluation which
// means that the any residuals computed in between might be inaccurate.
Expr newRange = prune(compre.getIterRange());
if (newRange != null && newRange != compre.getIterRange()) {
return Expr.newBuilder().setId(node.getId()).setComprehensionExpr(Comprehension.newBuilder().setIterVar(compre.getIterVar()).setIterRange(newRange).setAccuVar(compre.getAccuVar()).setAccuInit(compre.getAccuInit()).setLoopCondition(compre.getLoopCondition()).setLoopStep(compre.getLoopStep()).setResult(compre.getResult())).build();
}
}
// allocation cost at another point. So go with the simple approach - at least for now.
return node;
}
use of com.google.api.expr.v1alpha1.Expr.CreateStruct.Entry in project cel-java by projectnessie.
the class ConformanceServiceImpl method valueToRefValue.
/**
* ValueToRefValue converts between exprpb.Value and ref.Val.
*/
static Val valueToRefValue(TypeAdapter adapter, Value v) {
switch(v.getKindCase()) {
case NULL_VALUE:
return NullT.NullValue;
case BOOL_VALUE:
return boolOf(v.getBoolValue());
case INT64_VALUE:
return intOf(v.getInt64Value());
case UINT64_VALUE:
return uintOf(v.getUint64Value());
case DOUBLE_VALUE:
return doubleOf(v.getDoubleValue());
case STRING_VALUE:
return stringOf(v.getStringValue());
case BYTES_VALUE:
return bytesOf(v.getBytesValue().toByteArray());
case OBJECT_VALUE:
Any any = v.getObjectValue();
return adapter.nativeToValue(any);
case MAP_VALUE:
MapValue m = v.getMapValue();
Map<Val, Val> entries = new HashMap<>();
for (Entry entry : m.getEntriesList()) {
Val key = valueToRefValue(adapter, entry.getKey());
Val pb = valueToRefValue(adapter, entry.getValue());
entries.put(key, pb);
}
return adapter.nativeToValue(entries);
case LIST_VALUE:
ListValue l = v.getListValue();
List<Val> elts = l.getValuesList().stream().map(el -> valueToRefValue(adapter, el)).collect(Collectors.toList());
return adapter.nativeToValue(elts);
case TYPE_VALUE:
String typeName = v.getTypeValue();
Type tv = Types.getTypeByName(typeName);
if (tv != null) {
return tv;
}
return newObjectTypeValue(typeName);
default:
throw new IllegalArgumentException("unknown value " + v.getKindCase());
}
}
use of com.google.api.expr.v1alpha1.Expr.CreateStruct.Entry in project cel-java by projectnessie.
the class Unparser method visitStructMsg.
void visitStructMsg(CreateStruct expr) {
List<Entry> entries = expr.getEntriesList();
str.append(expr.getMessageName());
str.append("{");
for (int i = 0; i < entries.size(); i++) {
if (i > 0) {
str.append(", ");
}
Entry entry = entries.get(i);
String f = entry.getFieldKey();
str.append(f);
str.append(": ");
Expr v = entry.getValue();
visit(v);
}
str.append("}");
}
use of com.google.api.expr.v1alpha1.Expr.CreateStruct.Entry in project cel-java by projectnessie.
the class AstPruner method maybeCreateLiteral.
Expr maybeCreateLiteral(long id, Val v) {
Type t = v.type();
switch(t.typeEnum()) {
case Bool:
return createLiteral(id, Constant.newBuilder().setBoolValue((Boolean) v.value()).build());
case Int:
return createLiteral(id, Constant.newBuilder().setInt64Value(((Number) v.value()).longValue()).build());
case Uint:
return createLiteral(id, Constant.newBuilder().setUint64Value(((Number) v.value()).longValue()).build());
case String:
return createLiteral(id, Constant.newBuilder().setStringValue(v.value().toString()).build());
case Double:
return createLiteral(id, Constant.newBuilder().setDoubleValue(((Number) v.value()).doubleValue()).build());
case Bytes:
return createLiteral(id, Constant.newBuilder().setBytesValue(ByteString.copyFrom((byte[]) v.value())).build());
case Null:
return createLiteral(id, Constant.newBuilder().setNullValue(NullValue.NULL_VALUE).build());
}
// Attempt to build a list literal.
if (v instanceof Lister) {
Lister list = (Lister) v;
int sz = (int) list.size().intValue();
List<Expr> elemExprs = new ArrayList<>(sz);
for (int i = 0; i < sz; i++) {
Val elem = list.get(intOf(i));
if (isUnknownOrError(elem)) {
return null;
}
Expr elemExpr = maybeCreateLiteral(nextID(), elem);
if (elemExpr == null) {
return null;
}
elemExprs.add(elemExpr);
}
return Expr.newBuilder().setId(id).setListExpr(CreateList.newBuilder().addAllElements(elemExprs).build()).build();
}
// Create a map literal if possible.
if (v instanceof Mapper) {
Mapper mp = (Mapper) v;
IteratorT it = mp.iterator();
List<Entry> entries = new ArrayList<>((int) mp.size().intValue());
while (it.hasNext() == True) {
Val key = it.next();
Val val = mp.get(key);
if (isUnknownOrError(key) || isUnknownOrError(val)) {
return null;
}
Expr keyExpr = maybeCreateLiteral(nextID(), key);
if (keyExpr == null) {
return null;
}
Expr valExpr = maybeCreateLiteral(nextID(), val);
if (valExpr == null) {
return null;
}
Entry entry = Entry.newBuilder().setId(nextID()).setMapKey(keyExpr).setValue(valExpr).build();
entries.add(entry);
}
return Expr.newBuilder().setId(id).setStructExpr(CreateStruct.newBuilder().addAllEntries(entries)).build();
}
// the enumeration the fields for a given message.
return null;
}
Aggregations