|
36 | 36 | import dev.cel.common.CelProtoV1Alpha1AbstractSyntaxTree; |
37 | 37 | import dev.cel.extensions.CelExtensions; |
38 | 38 | import dev.cel.extensions.CelOptionalLibrary; |
| 39 | +import dev.cel.optimizer.CelAstOptimizer; |
39 | 40 | import dev.cel.optimizer.optimizers.ConstantFoldingOptimizer; |
| 41 | +import dev.cel.optimizer.optimizers.ConstantFoldingOptimizer.ConstantFoldingOptions; |
40 | 42 | import dev.cel.optimizer.optimizers.SelectOptimizer; |
41 | 43 | import dev.cel.optimizer.optimizers.SelectOptimizer.SelectOptimizerOptions; |
42 | 44 | import dev.cel.optimizer.optimizers.SubexpressionOptimizer; |
@@ -125,6 +127,12 @@ public final class CelPolicyCompilerTool implements Callable<Integer> { |
125 | 127 | description = "Enable inline variable definitions (e.g., '- var_name: expr') in the policy") |
126 | 128 | private boolean simpleVariables = false; |
127 | 129 |
|
| 130 | + @Option( |
| 131 | + names = {"--iteration_limit"}, |
| 132 | + defaultValue = "1000", |
| 133 | + description = "Maximum iteration limit for composing and optimizing the policy") |
| 134 | + private int iterationLimit = 1000; |
| 135 | + |
128 | 136 | private static final CelOptions CEL_OPTIONS = |
129 | 137 | CelOptions.current() |
130 | 138 | .populateMacroCalls(true) |
@@ -214,19 +222,29 @@ public Integer call() { |
214 | 222 | } |
215 | 223 |
|
216 | 224 | try { |
217 | | - CelPolicyCompilerBuilder policyCompilerBuilder = |
218 | | - CelPolicyCompilerFactory.newPolicyCompiler(cel); |
219 | | - |
| 225 | + ImmutableList.Builder<CelAstOptimizer> optimizersBuilder = |
| 226 | + ImmutableList.<CelAstOptimizer>builder() |
| 227 | + .add( |
| 228 | + ConstantFoldingOptimizer.newInstance( |
| 229 | + ConstantFoldingOptions.newBuilder() |
| 230 | + .maxIterationLimit(iterationLimit) |
| 231 | + .build()), |
| 232 | + SubexpressionOptimizer.newInstance( |
| 233 | + SubexpressionOptimizerOptions.newBuilder() |
| 234 | + .iterationLimit(iterationLimit) |
| 235 | + .populateMacroCalls(true) |
| 236 | + .build())); |
220 | 237 | if (optimizeFieldSelection) { |
221 | | - policyCompilerBuilder.setOptimizers( |
222 | | - ImmutableList.of( |
223 | | - ConstantFoldingOptimizer.getInstance(), |
224 | | - SubexpressionOptimizer.newInstance( |
225 | | - SubexpressionOptimizerOptions.newBuilder().populateMacroCalls(true).build()), |
226 | | - SelectOptimizer.newInstance( |
227 | | - SelectOptimizerOptions.newBuilder().build(), transitiveFileDescriptors))); |
| 238 | + optimizersBuilder.add( |
| 239 | + SelectOptimizer.newInstance( |
| 240 | + SelectOptimizerOptions.newBuilder().build(), transitiveFileDescriptors)); |
228 | 241 | } |
229 | 242 |
|
| 243 | + CelPolicyCompilerBuilder policyCompilerBuilder = |
| 244 | + CelPolicyCompilerFactory.newPolicyCompiler(cel) |
| 245 | + .setIterationLimit(iterationLimit) |
| 246 | + .setOptimizers(optimizersBuilder.build()); |
| 247 | + |
230 | 248 | CelPolicyCompiler policyCompiler = policyCompilerBuilder.build(); |
231 | 249 | CelAbstractSyntaxTree ast = policyCompiler.compile(policy); |
232 | 250 |
|
|
0 commit comments