From 18a12b6c0f03e66a593a8dc468472803257d5161 Mon Sep 17 00:00:00 2001 From: Stephen Roberts Date: Thu, 11 Dec 2025 05:39:23 -0800 Subject: [PATCH] Support constant folding in chained SELECT expressions. PiperOrigin-RevId: 843180459 --- .../cel/optimizer/optimizers/ConstantFoldingOptimizer.java | 1 + .../optimizer/optimizers/ConstantFoldingOptimizerTest.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/optimizer/src/main/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizer.java b/optimizer/src/main/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizer.java index 9d61fb19c..ca1744c88 100644 --- a/optimizer/src/main/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizer.java +++ b/optimizer/src/main/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizer.java @@ -256,6 +256,7 @@ private static boolean areChildrenArgConstant(CelNavigableMutableExpr expr) { if (expr.getKind().equals(Kind.CALL) || expr.getKind().equals(Kind.LIST) || expr.getKind().equals(Kind.MAP) + || expr.getKind().equals(Kind.SELECT) || expr.getKind().equals(Kind.STRUCT)) { return expr.children().allMatch(ConstantFoldingOptimizer::areChildrenArgConstant); } diff --git a/optimizer/src/test/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizerTest.java b/optimizer/src/test/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizerTest.java index 9b3810b99..1a3fac852 100644 --- a/optimizer/src/test/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizerTest.java +++ b/optimizer/src/test/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizerTest.java @@ -170,6 +170,11 @@ public class ConstantFoldingOptimizerTest { + " optional.of(4), ?single_uint64: optional.ofNonZeroValue(x)}', expected:" + " 'cel.expr.conformance.proto3.TestAllTypes{single_int64: 1, single_int32: 4," + " ?single_uint64: optional.ofNonZeroValue(x)}'}") + @TestParameters( + "{source: 'TestAllTypes{single_nested_message: TestAllTypes.NestedMessage{bb:" + + " 42}}.single_nested_message.bb', expected: '42'}") + @TestParameters("{source: '{\"a\": 1}[\"a\"]', expected: '1'}") + @TestParameters("{source: '{\"a\": {\"b\": 2}}[\"a\"][\"b\"]', expected: '2'}") @TestParameters("{source: '{\"hello\": \"world\"}.hello == x', expected: '\"world\" == x'}") @TestParameters("{source: '{\"hello\": \"world\"}[\"hello\"] == x', expected: '\"world\" == x'}") @TestParameters("{source: '{\"hello\": \"world\"}.?hello', expected: 'optional.of(\"world\")'}")