You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
To make CEL environment setup consistent across CEL implementations, I propose to add CelOptions.maxRegexProgramSize(int) to CEL-Java. This option should work similar to InterpreterOptions.regex_max_program_size in CEL-Cpp (see nuances below).
RE2 program size should be verified when the CEL program is created from the AST (AFAIK this is how cel-cpp works).
Nuances
The program size represents a very approximate measure of a regexp's "cost". There are no guarantees on the implementation details or claims about the properties of the program size (except "larger numbers are more expensive than smaller numbers").
Currently the program size is the same as the number of instructions of the regex program. However, the number of instructions in a regex depends on the concrete RE2 implementation. The implication of using the number of instructions as the program size is that:
Important
There's no guarantee that RE2 program size has the exact same value in CPP, Go and Java.
We should communicate this in the docs.
For example:
["", "a", "^", "^$", "a+b", "a+b?", "(a+b)", "a+b.*", "(a+b?)"] # pattern
[4, 5, 2, 2, 7, 8, 9, 15, 10 ] # cpp re2 program size
[4, 5, 5, 6, 7, 8, 9, 9, 10 ] # cpp liteal=true# go re2 seems to be identical to java
Context
Unlike the canonical C++ RE2 implementation, re2j (Java RE2 port) didn't expose the program size in public APIs. To address this inconsistency I made google/re2j#180, and it was recently merged.
When the next re2j version is released, we'll be able to determine the program size using Pattern.programSize().
Feature request checklist
Change
To make CEL environment setup consistent across CEL implementations, I propose to add
CelOptions.maxRegexProgramSize(int)
to CEL-Java. This option should work similar toInterpreterOptions.regex_max_program_size
in CEL-Cpp (see nuances below).RE2 program size should be verified when the CEL program is created from the AST (AFAIK this is how cel-cpp works).
Nuances
The program size represents a very approximate measure of a regexp's "cost". There are no guarantees on the implementation details or claims about the properties of the program size (except "larger numbers are more expensive than smaller numbers").
Currently the program size is the same as the number of instructions of the regex program. However, the number of instructions in a regex depends on the concrete RE2 implementation. The implication of using the number of instructions as the program size is that:
Important
There's no guarantee that RE2 program size has the exact same value in CPP, Go and Java.
We should communicate this in the docs.
For example:
Context
Unlike the canonical C++ RE2 implementation, re2j (Java RE2 port) didn't expose the program size in public APIs. To address this inconsistency I made google/re2j#180, and it was recently merged.
When the next re2j version is released, we'll be able to determine the program size using
Pattern.programSize()
.Example
Some other known regex program sizes for java can be found in re2j's
PatternTest.java
.Related
Pattern.programSize()
andMatcher.programSize()
re2j#180CC @l46kok, @TristonianJones
The text was updated successfully, but these errors were encountered: