google / cel-java

Fast, portable, non-Turing complete expression evaluation with gradual typing (Java)
https://cel.dev
Apache License 2.0
79 stars 15 forks source link

Evaluating unchecked expressions in CEL-Java #276

Open Frnd-me opened 1 month ago

Frnd-me commented 1 month ago

Describe the bug

In the README, under "Common Questions", it is written that:

Checking is an optional, but strongly suggested, step in CEL expression validation. It is sufficient in some cases to simply Parse and rely on the runtime bindings and error handling to do the right thing.

I believe there currently is no way around checking an expression before evaluation, as an expression must be checked before it can be turned into a program and evaluated. An attempt to create a program from an unchecked AST always results in an error "programs must be created from checked expressions".

Checking in turn requires declaring variables. However, in my particular use case, I cannot acquire a full list of variables to be used in expressions (there may be many, and acquiring variable values is costly, so I would only like to do this whenever required). I believe that the above should be achievable with an unchecked variable and CelVariableResolver.

It seems that this behavior deviates from CEL Go and also does not coincide with a similar question posted in the CEL Go group: https://groups.google.com/g/cel-go-discuss/c/PoyIrdFPwHM. Here, the possibility of evaluating unchecked expression is suggested. An (unrelated) Python implementation supports the same functionality: https://github.com/cloud-custodian/cel-python.

I file this as a bug as the current behavior seems to be conflicting with respect to the documentation.

To Reproduce

Check which components this affects:

When attempting to create a program from an unchecked AST:

var p = cel.createProgram(cel.parse("5").getAst()).eval();

Expected behavior

I expect to be able to evaluate the unchecked expression.

Additional context

None.

l46kok commented 1 month ago

Hi,

This limitation is documented here:

Presently, Java does not support parse-only evaluation

But this is certainly a gap in CEL-Java with respect to the CEL specification. It's something we're aiming to address in the future.