Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion runtime/src/main/java/dev/cel/runtime/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,7 @@ java_library(
"//runtime/standard:not_equals",
"//runtime/standard:optional",
"//runtime/standard:size",
"//runtime/standard:standard_function",
"//runtime/standard:starts_with",
"//runtime/standard:string",
"//runtime/standard:subtract",
Expand Down Expand Up @@ -690,6 +691,7 @@ cel_android_library(
"//runtime/standard:not_equals_android",
"//runtime/standard:optional_android",
"//runtime/standard:size_android",
"//runtime/standard:standard_function_android",
"//runtime/standard:starts_with_android",
"//runtime/standard:string_android",
"//runtime/standard:subtract_android",
Expand Down Expand Up @@ -827,11 +829,11 @@ java_library(
":evaluation_exception",
":function_binding",
":function_resolver",
":standard_functions",
"//:auto_value",
"//common:cel_ast",
"//common:options",
"//common/values:cel_value_provider",
"//runtime/standard:standard_function",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand Down Expand Up @@ -862,6 +864,7 @@ java_library(
"//common:cel_ast",
"//common:options",
"//common/values:cel_value_provider",
"//runtime/standard:standard_function",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand Down Expand Up @@ -892,6 +895,7 @@ cel_android_library(
"//common:cel_ast_android",
"//common:options",
"//common/values:cel_value_provider_android",
"//runtime/standard:standard_function_android",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand Down Expand Up @@ -1087,6 +1091,7 @@ cel_android_library(
"//common:cel_ast_android",
"//common:options",
"//common/values:cel_value_provider_android",
"//runtime/standard:standard_function_android",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_guava_guava",
Expand Down
12 changes: 9 additions & 3 deletions runtime/src/main/java/dev/cel/runtime/CelLiteRuntimeBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.google.errorprone.annotations.CheckReturnValue;
import dev.cel.common.CelOptions;
import dev.cel.common.values.CelValueProvider;
import dev.cel.runtime.standard.CelStandardFunction;

/** Interface for building an instance of {@link CelLiteRuntime} */
public interface CelLiteRuntimeBuilder {
Expand All @@ -27,11 +28,16 @@ public interface CelLiteRuntimeBuilder {
CelLiteRuntimeBuilder setOptions(CelOptions options);

/**
* Override the standard functions for the runtime. This can be used to subset the standard
* environment to only expose the desired function overloads to the runtime.
* Set the standard functions to enable in the runtime. These can be found in {@code
* dev.cel.runtime.standard} package. By default, lite runtime does not include any standard
* functions on its own.
*/
@CanIgnoreReturnValue
CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunctions standardFunctions);
CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunction... standardFunctions);

@CanIgnoreReturnValue
CelLiteRuntimeBuilder setStandardFunctions(
Iterable<? extends CelStandardFunction> standardFunctions);

/** Add one or more {@link CelFunctionBinding} objects to the CEL runtime. */
@CanIgnoreReturnValue
Expand Down
84 changes: 84 additions & 0 deletions runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,45 +32,86 @@
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Relation;
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Size;
import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.StringMatchers;
import dev.cel.runtime.standard.AddOperator;
import dev.cel.runtime.standard.AddOperator.AddOverload;
import dev.cel.runtime.standard.BoolFunction;
import dev.cel.runtime.standard.BoolFunction.BoolOverload;
import dev.cel.runtime.standard.BytesFunction;
import dev.cel.runtime.standard.BytesFunction.BytesOverload;
import dev.cel.runtime.standard.CelStandardFunction;
import dev.cel.runtime.standard.ContainsFunction;
import dev.cel.runtime.standard.ContainsFunction.ContainsOverload;
import dev.cel.runtime.standard.DivideOperator;
import dev.cel.runtime.standard.DivideOperator.DivideOverload;
import dev.cel.runtime.standard.DoubleFunction;
import dev.cel.runtime.standard.DoubleFunction.DoubleOverload;
import dev.cel.runtime.standard.DurationFunction;
import dev.cel.runtime.standard.DurationFunction.DurationOverload;
import dev.cel.runtime.standard.DynFunction;
import dev.cel.runtime.standard.DynFunction.DynOverload;
import dev.cel.runtime.standard.EndsWithFunction;
import dev.cel.runtime.standard.EndsWithFunction.EndsWithOverload;
import dev.cel.runtime.standard.EqualsOperator;
import dev.cel.runtime.standard.EqualsOperator.EqualsOverload;
import dev.cel.runtime.standard.GetDateFunction;
import dev.cel.runtime.standard.GetDateFunction.GetDateOverload;
import dev.cel.runtime.standard.GetDayOfMonthFunction;
import dev.cel.runtime.standard.GetDayOfMonthFunction.GetDayOfMonthOverload;
import dev.cel.runtime.standard.GetDayOfWeekFunction;
import dev.cel.runtime.standard.GetDayOfWeekFunction.GetDayOfWeekOverload;
import dev.cel.runtime.standard.GetDayOfYearFunction;
import dev.cel.runtime.standard.GetDayOfYearFunction.GetDayOfYearOverload;
import dev.cel.runtime.standard.GetFullYearFunction;
import dev.cel.runtime.standard.GetFullYearFunction.GetFullYearOverload;
import dev.cel.runtime.standard.GetHoursFunction;
import dev.cel.runtime.standard.GetHoursFunction.GetHoursOverload;
import dev.cel.runtime.standard.GetMillisecondsFunction;
import dev.cel.runtime.standard.GetMillisecondsFunction.GetMillisecondsOverload;
import dev.cel.runtime.standard.GetMinutesFunction;
import dev.cel.runtime.standard.GetMinutesFunction.GetMinutesOverload;
import dev.cel.runtime.standard.GetMonthFunction;
import dev.cel.runtime.standard.GetMonthFunction.GetMonthOverload;
import dev.cel.runtime.standard.GetSecondsFunction;
import dev.cel.runtime.standard.GetSecondsFunction.GetSecondsOverload;
import dev.cel.runtime.standard.GreaterEqualsOperator;
import dev.cel.runtime.standard.GreaterEqualsOperator.GreaterEqualsOverload;
import dev.cel.runtime.standard.GreaterOperator;
import dev.cel.runtime.standard.GreaterOperator.GreaterOverload;
import dev.cel.runtime.standard.InOperator;
import dev.cel.runtime.standard.InOperator.InOverload;
import dev.cel.runtime.standard.IndexOperator;
import dev.cel.runtime.standard.IndexOperator.IndexOverload;
import dev.cel.runtime.standard.IntFunction;
import dev.cel.runtime.standard.IntFunction.IntOverload;
import dev.cel.runtime.standard.LessEqualsOperator;
import dev.cel.runtime.standard.LessEqualsOperator.LessEqualsOverload;
import dev.cel.runtime.standard.LessOperator;
import dev.cel.runtime.standard.LessOperator.LessOverload;
import dev.cel.runtime.standard.LogicalNotOperator;
import dev.cel.runtime.standard.LogicalNotOperator.LogicalNotOverload;
import dev.cel.runtime.standard.MatchesFunction;
import dev.cel.runtime.standard.MatchesFunction.MatchesOverload;
import dev.cel.runtime.standard.ModuloOperator;
import dev.cel.runtime.standard.ModuloOperator.ModuloOverload;
import dev.cel.runtime.standard.MultiplyOperator;
import dev.cel.runtime.standard.MultiplyOperator.MultiplyOverload;
import dev.cel.runtime.standard.NegateOperator;
import dev.cel.runtime.standard.NegateOperator.NegateOverload;
import dev.cel.runtime.standard.NotEqualsOperator;
import dev.cel.runtime.standard.NotEqualsOperator.NotEqualsOverload;
import dev.cel.runtime.standard.OptionalFunction;
import dev.cel.runtime.standard.OptionalFunction.OptionalOverload;
import dev.cel.runtime.standard.SizeFunction;
import dev.cel.runtime.standard.SizeFunction.SizeOverload;
import dev.cel.runtime.standard.StartsWithFunction;
import dev.cel.runtime.standard.StartsWithFunction.StartsWithOverload;
import dev.cel.runtime.standard.StringFunction;
import dev.cel.runtime.standard.StringFunction.StringOverload;
import dev.cel.runtime.standard.SubtractOperator;
import dev.cel.runtime.standard.SubtractOperator.SubtractOverload;
import dev.cel.runtime.standard.TimestampFunction;
import dev.cel.runtime.standard.TimestampFunction.TimestampOverload;
import dev.cel.runtime.standard.UintFunction;
import dev.cel.runtime.standard.UintFunction.UintOverload;

/** Runtime function bindings for the standard functions in CEL. */
Expand All @@ -79,6 +120,49 @@ public final class CelStandardFunctions {

private final ImmutableSet<StandardOverload> standardOverloads;

public static final ImmutableSet<CelStandardFunction> ALL_STANDARD_FUNCTIONS =
ImmutableSet.of(
AddOperator.create(),
BoolFunction.create(),
BytesFunction.create(),
ContainsFunction.create(),
DivideOperator.create(),
DoubleFunction.create(),
DurationFunction.create(),
DynFunction.create(),
EndsWithFunction.create(),
EqualsOperator.create(),
GetDateFunction.create(),
GetDayOfMonthFunction.create(),
GetDayOfWeekFunction.create(),
GetDayOfYearFunction.create(),
GetFullYearFunction.create(),
GetHoursFunction.create(),
GetMillisecondsFunction.create(),
GetMinutesFunction.create(),
GetMonthFunction.create(),
GetSecondsFunction.create(),
GreaterEqualsOperator.create(),
GreaterOperator.create(),
IndexOperator.create(),
InOperator.create(),
IntFunction.create(),
LessEqualsOperator.create(),
LessOperator.create(),
LogicalNotOperator.create(),
MatchesFunction.create(),
ModuloOperator.create(),
MultiplyOperator.create(),
NegateOperator.create(),
NotEqualsOperator.create(),
OptionalFunction.create(),
SizeFunction.create(),
StartsWithFunction.create(),
StringFunction.create(),
SubtractOperator.create(),
TimestampFunction.create(),
UintFunction.create());

/**
* Enumeration of Standard Function bindings.
*
Expand Down
34 changes: 23 additions & 11 deletions runtime/src/main/java/dev/cel/runtime/LiteRuntimeImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import dev.cel.common.CelAbstractSyntaxTree;
import dev.cel.common.CelOptions;
import dev.cel.common.values.CelValueProvider;
import dev.cel.runtime.standard.CelStandardFunction;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Optional;
Expand All @@ -34,7 +35,7 @@ final class LiteRuntimeImpl implements CelLiteRuntime {
private final Interpreter interpreter;
private final CelOptions celOptions;
private final ImmutableList<CelFunctionBinding> customFunctionBindings;
private final CelStandardFunctions celStandardFunctions;
private final ImmutableSet<CelStandardFunction> celStandardFunctions;
private final CelValueProvider celValueProvider;

// This does not affect the evaluation behavior in any manner.
Expand Down Expand Up @@ -69,7 +70,7 @@ static final class Builder implements CelLiteRuntimeBuilder {
@VisibleForTesting CelOptions celOptions;
@VisibleForTesting final HashMap<String, CelFunctionBinding> customFunctionBindings;
@VisibleForTesting final ImmutableSet.Builder<CelLiteRuntimeLibrary> runtimeLibrariesBuilder;
@VisibleForTesting CelStandardFunctions celStandardFunctions;
@VisibleForTesting final ImmutableSet.Builder<CelStandardFunction> standardFunctionBuilder;
@VisibleForTesting CelValueProvider celValueProvider;

@Override
Expand All @@ -79,8 +80,14 @@ public CelLiteRuntimeBuilder setOptions(CelOptions celOptions) {
}

@Override
public CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunctions standardFunctions) {
this.celStandardFunctions = standardFunctions;
public CelLiteRuntimeBuilder setStandardFunctions(CelStandardFunction... standardFunctions) {
return setStandardFunctions(Arrays.asList(standardFunctions));
}

@Override
public CelLiteRuntimeBuilder setStandardFunctions(
Iterable<? extends CelStandardFunction> standardFunctions) {
standardFunctionBuilder.addAll(standardFunctions);
return this;
}

Expand Down Expand Up @@ -153,13 +160,17 @@ public CelLiteRuntime build() {

ImmutableMap.Builder<String, CelFunctionBinding> functionBindingsBuilder =
ImmutableMap.builder();
if (celStandardFunctions != null) {

ImmutableSet<CelStandardFunction> standardFunctions = standardFunctionBuilder.build();
if (!standardFunctions.isEmpty()) {
RuntimeHelpers runtimeHelpers = RuntimeHelpers.create();
RuntimeEquality runtimeEquality = RuntimeEquality.create(runtimeHelpers, celOptions);
ImmutableSet<CelFunctionBinding> standardFunctionBinding =
celStandardFunctions.newFunctionBindings(runtimeEquality, celOptions);
for (CelFunctionBinding func : standardFunctionBinding) {
functionBindingsBuilder.put(func.getOverloadId(), func);
for (CelStandardFunction standardFunction : standardFunctions) {
ImmutableSet<CelFunctionBinding> standardFunctionBinding =
standardFunction.newFunctionBindings(celOptions, runtimeEquality);
for (CelFunctionBinding func : standardFunctionBinding) {
functionBindingsBuilder.put(func.getOverloadId(), func);
}
}
}

Expand All @@ -184,7 +195,7 @@ public CelLiteRuntime build() {
interpreter,
celOptions,
customFunctionBindings.values(),
celStandardFunctions,
standardFunctions,
runtimeLibs,
celValueProvider);
}
Expand All @@ -193,6 +204,7 @@ private Builder() {
this.celOptions = CelOptions.current().enableCelValue(true).build();
this.celValueProvider = (structType, fields) -> Optional.empty();
this.customFunctionBindings = new HashMap<>();
this.standardFunctionBuilder = ImmutableSet.builder();
this.runtimeLibrariesBuilder = ImmutableSet.builder();
}
}
Expand All @@ -205,7 +217,7 @@ private LiteRuntimeImpl(
Interpreter interpreter,
CelOptions celOptions,
Iterable<CelFunctionBinding> customFunctionBindings,
CelStandardFunctions celStandardFunctions,
ImmutableSet<CelStandardFunction> celStandardFunctions,
ImmutableSet<CelLiteRuntimeLibrary> runtimeLibraries,
CelValueProvider celValueProvider) {
this.interpreter = interpreter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@

/** Standard function for the addition (+) operator. */
public final class AddOperator extends CelStandardFunction {
private static final AddOperator ALL_OVERLOADS = create(AddOverload.values());

public static AddOperator create() {
return ALL_OVERLOADS;
}

public static AddOperator create(AddOverload... overloads) {
return create(Arrays.asList(overloads));
Expand Down
2 changes: 2 additions & 0 deletions runtime/src/main/java/dev/cel/runtime/standard/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ java_library(
"//common:options",
"//runtime:function_binding",
"//runtime:runtime_equality",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
],
)
Expand All @@ -33,6 +34,7 @@ cel_android_library(
"//common:options",
"//runtime:function_binding_android",
"//runtime:runtime_equality_android",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_guava_guava",
],
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@

/** Standard function for {@code bool} conversion function. */
public final class BoolFunction extends CelStandardFunction {
private static final BoolFunction ALL_OVERLOADS = create(BoolOverload.values());

public static BoolFunction create() {
return ALL_OVERLOADS;
}

public static BoolFunction create(BoolFunction.BoolOverload... overloads) {
return create(Arrays.asList(overloads));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@

/** Standard function for {@code bytes} conversion function. */
public final class BytesFunction extends CelStandardFunction {
private static final BytesFunction ALL_OVERLOADS = create(BytesOverload.values());

public static BytesFunction create() {
return ALL_OVERLOADS;
}

public static BytesFunction create(BytesFunction.BytesOverload... overloads) {
return create(Arrays.asList(overloads));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import static com.google.common.base.Preconditions.checkState;

import com.google.common.collect.ImmutableSet;
import com.google.errorprone.annotations.Immutable;
import dev.cel.common.CelOptions;
import dev.cel.runtime.CelFunctionBinding;
import dev.cel.runtime.RuntimeEquality;
Expand All @@ -25,6 +26,7 @@
* An abstract class that describes a CEL standard function. An implementation should provide a set
* of overloads for the standard function
*/
@Immutable
public abstract class CelStandardFunction {
private final ImmutableSet<CelStandardOverload> overloads;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
* implementation should produce a concrete {@link CelFunctionBinding} for the standard function's
* overload.
*/
@Immutable
interface CelStandardOverload {

CelFunctionBinding newFunctionBinding(CelOptions celOptions, RuntimeEquality runtimeEquality);
Expand Down
Loading