From 17ca9217fa2d4b989bd42cef5ba83b97fc7b61d9 Mon Sep 17 00:00:00 2001 From: Sokwhan Huh Date: Mon, 29 Dec 2025 11:44:33 -0800 Subject: [PATCH] Remove grouped overloads from CelStandardFunctions PiperOrigin-RevId: 850118838 --- .../src/main/java/dev/cel/runtime/BUILD.bazel | 3 + .../dev/cel/runtime/CelRuntimeLegacyImpl.java | 21 +- .../dev/cel/runtime/CelStandardFunctions.java | 679 +++++------------- .../src/test/java/dev/cel/runtime/BUILD.bazel | 2 + .../cel/runtime/CelStandardFunctionsTest.java | 9 +- 5 files changed, 198 insertions(+), 516 deletions(-) diff --git a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel index b55aec00f..cf89d0a80 100644 --- a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel +++ b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel @@ -828,6 +828,9 @@ java_library( "//common/types:cel_types", "//common/values:cel_value_provider", "//common/values:proto_message_value_provider", + "//runtime/standard:add", + "//runtime/standard:int", + "//runtime/standard:timestamp", "@maven//:com_google_code_findbugs_annotations", "@maven//:com_google_errorprone_error_prone_annotations", "@maven//:com_google_guava_guava", diff --git a/runtime/src/main/java/dev/cel/runtime/CelRuntimeLegacyImpl.java b/runtime/src/main/java/dev/cel/runtime/CelRuntimeLegacyImpl.java index 1b7071505..15591e680 100644 --- a/runtime/src/main/java/dev/cel/runtime/CelRuntimeLegacyImpl.java +++ b/runtime/src/main/java/dev/cel/runtime/CelRuntimeLegacyImpl.java @@ -43,9 +43,9 @@ import dev.cel.common.types.CelTypes; import dev.cel.common.values.CelValueProvider; import dev.cel.common.values.ProtoMessageValueProvider; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Arithmetic; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Comparison; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Conversions; +import dev.cel.runtime.standard.AddOperator.AddOverload; +import dev.cel.runtime.standard.IntFunction.IntOverload; +import dev.cel.runtime.standard.TimestampFunction.TimestampOverload; import java.util.Arrays; import java.util.HashMap; import java.util.Optional; @@ -339,7 +339,7 @@ private ImmutableSet newStandardFunctionBindings( (standardFunction, standardOverload) -> { switch (standardFunction) { case INT: - if (standardOverload.equals(Conversions.INT64_TO_INT64)) { + if (standardOverload.equals(IntOverload.INT64_TO_INT64)) { // Note that we require UnsignedLong flag here to avoid ambiguous // overloads against "uint64_to_int64", because they both use the same // Java Long class. We skip adding this identity function if the flag is @@ -350,26 +350,23 @@ private ImmutableSet newStandardFunctionBindings( case TIMESTAMP: // TODO: Remove this flag guard once the feature has been // auto-enabled. - if (standardOverload.equals(Conversions.INT64_TO_TIMESTAMP)) { + if (standardOverload.equals(TimestampOverload.INT64_TO_TIMESTAMP)) { return options.enableTimestampEpoch(); } break; case STRING: return options.enableStringConversion(); case ADD: - Arithmetic arithmetic = (Arithmetic) standardOverload; - if (arithmetic.equals(Arithmetic.ADD_STRING)) { + if (standardOverload.equals(AddOverload.ADD_STRING)) { return options.enableStringConcatenation(); } - if (arithmetic.equals(Arithmetic.ADD_LIST)) { + if (standardOverload.equals(AddOverload.ADD_LIST)) { return options.enableListConcatenation(); } break; default: - if (standardOverload instanceof Comparison - && !options.enableHeterogeneousNumericComparisons()) { - Comparison comparison = (Comparison) standardOverload; - return !comparison.isHeterogeneousComparison(); + if (!options.enableHeterogeneousNumericComparisons()) { + return !CelStandardFunctions.isHeterogeneousComparison(standardOverload); } break; } diff --git a/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java b/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java index 98e4c8636..bedd41728 100644 --- a/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java +++ b/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java @@ -22,16 +22,6 @@ import com.google.errorprone.annotations.Immutable; import dev.cel.common.CelOptions; import dev.cel.common.annotations.Internal; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Arithmetic; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.BooleanOperator; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Comparison; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Conversions; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.DateTime; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Index; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.InternalOperator; -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; @@ -118,6 +108,32 @@ /** Runtime function bindings for the standard functions in CEL. */ @Immutable public final class CelStandardFunctions { + private static final ImmutableSet HETEROGENEOUS_COMPARISON_OPERATORS = + ImmutableSet.of( + LessOverload.LESS_DOUBLE_UINT64, + LessOverload.LESS_INT64_UINT64, + LessOverload.LESS_UINT64_INT64, + LessOverload.LESS_INT64_DOUBLE, + LessOverload.LESS_DOUBLE_INT64, + LessOverload.LESS_UINT64_DOUBLE, + LessEqualsOverload.LESS_EQUALS_INT64_UINT64, + LessEqualsOverload.LESS_EQUALS_UINT64_INT64, + LessEqualsOverload.LESS_EQUALS_INT64_DOUBLE, + LessEqualsOverload.LESS_EQUALS_DOUBLE_INT64, + LessEqualsOverload.LESS_EQUALS_UINT64_DOUBLE, + LessEqualsOverload.LESS_EQUALS_DOUBLE_UINT64, + GreaterOverload.GREATER_INT64_UINT64, + GreaterOverload.GREATER_UINT64_INT64, + GreaterOverload.GREATER_INT64_DOUBLE, + GreaterOverload.GREATER_DOUBLE_INT64, + GreaterOverload.GREATER_UINT64_DOUBLE, + GreaterOverload.GREATER_DOUBLE_UINT64, + GreaterEqualsOverload.GREATER_EQUALS_INT64_UINT64, + GreaterEqualsOverload.GREATER_EQUALS_UINT64_INT64, + GreaterEqualsOverload.GREATER_EQUALS_INT64_DOUBLE, + GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_INT64, + GreaterEqualsOverload.GREATER_EQUALS_UINT64_DOUBLE, + GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_UINT64); private final ImmutableSet standardOverloads; @@ -171,516 +187,175 @@ public final class CelStandardFunctions { * special-cased, and does not appear in this enum. */ public enum StandardFunction { - LOGICAL_NOT(BooleanOperator.LOGICAL_NOT), - IN(InternalOperator.IN_LIST, InternalOperator.IN_MAP), - NOT_STRICTLY_FALSE(InternalOperator.NOT_STRICTLY_FALSE), - EQUALS(Relation.EQUALS), - NOT_EQUALS(Relation.NOT_EQUALS), - BOOL(Conversions.BOOL_TO_BOOL, Conversions.STRING_TO_BOOL), + LOGICAL_NOT(LogicalNotOverload.LOGICAL_NOT), + IN(InOverload.IN_LIST, InOverload.IN_MAP), + NOT_STRICTLY_FALSE(NotStrictlyFalseOverload.NOT_STRICTLY_FALSE), + EQUALS(EqualsOverload.EQUALS), + NOT_EQUALS(NotEqualsOverload.NOT_EQUALS), + BOOL(BoolOverload.BOOL_TO_BOOL, BoolOverload.STRING_TO_BOOL), ADD( - Arithmetic.ADD_INT64, - Arithmetic.ADD_UINT64, - Arithmetic.ADD_DOUBLE, - Arithmetic.ADD_STRING, - Arithmetic.ADD_BYTES, - Arithmetic.ADD_LIST, - Arithmetic.ADD_TIMESTAMP_DURATION, - Arithmetic.ADD_DURATION_TIMESTAMP, - Arithmetic.ADD_DURATION_DURATION), + AddOverload.ADD_INT64, + AddOverload.ADD_UINT64, + AddOverload.ADD_DOUBLE, + AddOverload.ADD_STRING, + AddOverload.ADD_BYTES, + AddOverload.ADD_LIST, + AddOverload.ADD_TIMESTAMP_DURATION, + AddOverload.ADD_DURATION_TIMESTAMP, + AddOverload.ADD_DURATION_DURATION), SUBTRACT( - Arithmetic.SUBTRACT_INT64, - Arithmetic.SUBTRACT_TIMESTAMP_TIMESTAMP, - Arithmetic.SUBTRACT_TIMESTAMP_DURATION, - Arithmetic.SUBTRACT_UINT64, - Arithmetic.SUBTRACT_DOUBLE, - Arithmetic.SUBTRACT_DURATION_DURATION), - MULTIPLY(Arithmetic.MULTIPLY_INT64, Arithmetic.MULTIPLY_DOUBLE, Arithmetic.MULTIPLY_UINT64), - DIVIDE(Arithmetic.DIVIDE_DOUBLE, Arithmetic.DIVIDE_INT64, Arithmetic.DIVIDE_UINT64), - MODULO(Arithmetic.MODULO_INT64, Arithmetic.MODULO_UINT64), - NEGATE(Arithmetic.NEGATE_INT64, Arithmetic.NEGATE_DOUBLE), - INDEX(Index.INDEX_LIST, Index.INDEX_MAP), + SubtractOverload.SUBTRACT_INT64, + SubtractOverload.SUBTRACT_TIMESTAMP_TIMESTAMP, + SubtractOverload.SUBTRACT_TIMESTAMP_DURATION, + SubtractOverload.SUBTRACT_UINT64, + SubtractOverload.SUBTRACT_DOUBLE, + SubtractOverload.SUBTRACT_DURATION_DURATION), + MULTIPLY( + MultiplyOverload.MULTIPLY_INT64, + MultiplyOverload.MULTIPLY_DOUBLE, + MultiplyOverload.MULTIPLY_UINT64), + DIVIDE(DivideOverload.DIVIDE_DOUBLE, DivideOverload.DIVIDE_INT64, DivideOverload.DIVIDE_UINT64), + MODULO(ModuloOverload.MODULO_INT64, ModuloOverload.MODULO_UINT64), + NEGATE(NegateOverload.NEGATE_INT64, NegateOverload.NEGATE_DOUBLE), + INDEX(IndexOverload.INDEX_LIST, IndexOverload.INDEX_MAP), SIZE( - Size.SIZE_STRING, - Size.SIZE_BYTES, - Size.SIZE_LIST, - Size.SIZE_MAP, - Size.STRING_SIZE, - Size.BYTES_SIZE, - Size.LIST_SIZE, - Size.MAP_SIZE), + SizeOverload.SIZE_STRING, + SizeOverload.SIZE_BYTES, + SizeOverload.SIZE_LIST, + SizeOverload.SIZE_MAP, + SizeOverload.STRING_SIZE, + SizeOverload.BYTES_SIZE, + SizeOverload.LIST_SIZE, + SizeOverload.MAP_SIZE), INT( - Conversions.INT64_TO_INT64, - Conversions.UINT64_TO_INT64, - Conversions.DOUBLE_TO_INT64, - Conversions.STRING_TO_INT64, - Conversions.TIMESTAMP_TO_INT64), + IntOverload.INT64_TO_INT64, + IntOverload.UINT64_TO_INT64, + IntOverload.DOUBLE_TO_INT64, + IntOverload.STRING_TO_INT64, + IntOverload.TIMESTAMP_TO_INT64), UINT( - Conversions.UINT64_TO_UINT64, - Conversions.INT64_TO_UINT64, - Conversions.DOUBLE_TO_UINT64, - Conversions.STRING_TO_UINT64), + UintOverload.UINT64_TO_UINT64, + UintOverload.INT64_TO_UINT64, + UintOverload.DOUBLE_TO_UINT64, + UintOverload.STRING_TO_UINT64), DOUBLE( - Conversions.DOUBLE_TO_DOUBLE, - Conversions.INT64_TO_DOUBLE, - Conversions.STRING_TO_DOUBLE, - Conversions.UINT64_TO_DOUBLE), + DoubleOverload.DOUBLE_TO_DOUBLE, + DoubleOverload.INT64_TO_DOUBLE, + DoubleOverload.STRING_TO_DOUBLE, + DoubleOverload.UINT64_TO_DOUBLE), STRING( - Conversions.STRING_TO_STRING, - Conversions.INT64_TO_STRING, - Conversions.DOUBLE_TO_STRING, - Conversions.BOOL_TO_STRING, - Conversions.BYTES_TO_STRING, - Conversions.TIMESTAMP_TO_STRING, - Conversions.DURATION_TO_STRING, - Conversions.UINT64_TO_STRING), - BYTES(Conversions.BYTES_TO_BYTES, Conversions.STRING_TO_BYTES), - DURATION(Conversions.DURATION_TO_DURATION, Conversions.STRING_TO_DURATION), + StringOverload.STRING_TO_STRING, + StringOverload.INT64_TO_STRING, + StringOverload.DOUBLE_TO_STRING, + StringOverload.BOOL_TO_STRING, + StringOverload.BYTES_TO_STRING, + StringOverload.TIMESTAMP_TO_STRING, + StringOverload.DURATION_TO_STRING, + StringOverload.UINT64_TO_STRING), + BYTES(BytesOverload.BYTES_TO_BYTES, BytesOverload.STRING_TO_BYTES), + DURATION(DurationOverload.DURATION_TO_DURATION, DurationOverload.STRING_TO_DURATION), TIMESTAMP( - Conversions.STRING_TO_TIMESTAMP, - Conversions.TIMESTAMP_TO_TIMESTAMP, - Conversions.INT64_TO_TIMESTAMP), - DYN(Conversions.TO_DYN), - MATCHES(StringMatchers.MATCHES, StringMatchers.MATCHES_STRING), - CONTAINS(StringMatchers.CONTAINS_STRING), - ENDS_WITH(StringMatchers.ENDS_WITH_STRING), - STARTS_WITH(StringMatchers.STARTS_WITH_STRING), + TimestampOverload.STRING_TO_TIMESTAMP, + TimestampOverload.TIMESTAMP_TO_TIMESTAMP, + TimestampOverload.INT64_TO_TIMESTAMP), + DYN(DynOverload.TO_DYN), + MATCHES(MatchesOverload.MATCHES, MatchesOverload.MATCHES_STRING), + CONTAINS(ContainsOverload.CONTAINS_STRING), + ENDS_WITH(EndsWithOverload.ENDS_WITH_STRING), + STARTS_WITH(StartsWithOverload.STARTS_WITH_STRING), // Date/time Functions - GET_FULL_YEAR(DateTime.TIMESTAMP_TO_YEAR, DateTime.TIMESTAMP_TO_YEAR_WITH_TZ), - GET_MONTH(DateTime.TIMESTAMP_TO_MONTH, DateTime.TIMESTAMP_TO_MONTH_WITH_TZ), - GET_DAY_OF_YEAR(DateTime.TIMESTAMP_TO_DAY_OF_YEAR, DateTime.TIMESTAMP_TO_DAY_OF_YEAR_WITH_TZ), + GET_FULL_YEAR( + GetFullYearOverload.TIMESTAMP_TO_YEAR, GetFullYearOverload.TIMESTAMP_TO_YEAR_WITH_TZ), + GET_MONTH(GetMonthOverload.TIMESTAMP_TO_MONTH, GetMonthOverload.TIMESTAMP_TO_MONTH_WITH_TZ), + GET_DAY_OF_YEAR( + GetDayOfYearOverload.TIMESTAMP_TO_DAY_OF_YEAR, + GetDayOfYearOverload.TIMESTAMP_TO_DAY_OF_YEAR_WITH_TZ), GET_DAY_OF_MONTH( - DateTime.TIMESTAMP_TO_DAY_OF_MONTH, DateTime.TIMESTAMP_TO_DAY_OF_MONTH_WITH_TZ), + GetDayOfMonthOverload.TIMESTAMP_TO_DAY_OF_MONTH, + GetDayOfMonthOverload.TIMESTAMP_TO_DAY_OF_MONTH_WITH_TZ), GET_DATE( - DateTime.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED, - DateTime.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED_WITH_TZ), - GET_DAY_OF_WEEK(DateTime.TIMESTAMP_TO_DAY_OF_WEEK, DateTime.TIMESTAMP_TO_DAY_OF_WEEK_WITH_TZ), + GetDateOverload.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED, + GetDateOverload.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED_WITH_TZ), + GET_DAY_OF_WEEK( + GetDayOfWeekOverload.TIMESTAMP_TO_DAY_OF_WEEK, + GetDayOfWeekOverload.TIMESTAMP_TO_DAY_OF_WEEK_WITH_TZ), GET_HOURS( - DateTime.TIMESTAMP_TO_HOURS, - DateTime.TIMESTAMP_TO_HOURS_WITH_TZ, - DateTime.DURATION_TO_HOURS), + GetHoursOverload.TIMESTAMP_TO_HOURS, + GetHoursOverload.TIMESTAMP_TO_HOURS_WITH_TZ, + GetHoursOverload.DURATION_TO_HOURS), GET_MINUTES( - DateTime.TIMESTAMP_TO_MINUTES, - DateTime.TIMESTAMP_TO_MINUTES_WITH_TZ, - DateTime.DURATION_TO_MINUTES), + GetMinutesOverload.TIMESTAMP_TO_MINUTES, + GetMinutesOverload.TIMESTAMP_TO_MINUTES_WITH_TZ, + GetMinutesOverload.DURATION_TO_MINUTES), GET_SECONDS( - DateTime.TIMESTAMP_TO_SECONDS, - DateTime.TIMESTAMP_TO_SECONDS_WITH_TZ, - DateTime.DURATION_TO_SECONDS), + GetSecondsOverload.TIMESTAMP_TO_SECONDS, + GetSecondsOverload.TIMESTAMP_TO_SECONDS_WITH_TZ, + GetSecondsOverload.DURATION_TO_SECONDS), GET_MILLISECONDS( - DateTime.TIMESTAMP_TO_MILLISECONDS, - DateTime.TIMESTAMP_TO_MILLISECONDS_WITH_TZ, - DateTime.DURATION_TO_MILLISECONDS), + GetMillisecondsOverload.TIMESTAMP_TO_MILLISECONDS, + GetMillisecondsOverload.TIMESTAMP_TO_MILLISECONDS_WITH_TZ, + GetMillisecondsOverload.DURATION_TO_MILLISECONDS), LESS( - Comparison.LESS_BOOL, - Comparison.LESS_INT64, - Comparison.LESS_UINT64, - Comparison.LESS_DOUBLE, - Comparison.LESS_STRING, - Comparison.LESS_BYTES, - Comparison.LESS_TIMESTAMP, - Comparison.LESS_DURATION, - Comparison.LESS_INT64_UINT64, - Comparison.LESS_UINT64_INT64, - Comparison.LESS_INT64_DOUBLE, - Comparison.LESS_DOUBLE_INT64, - Comparison.LESS_UINT64_DOUBLE, - Comparison.LESS_DOUBLE_UINT64), + LessOverload.LESS_BOOL, + LessOverload.LESS_INT64, + LessOverload.LESS_UINT64, + LessOverload.LESS_DOUBLE, + LessOverload.LESS_STRING, + LessOverload.LESS_BYTES, + LessOverload.LESS_TIMESTAMP, + LessOverload.LESS_DURATION, + LessOverload.LESS_INT64_UINT64, + LessOverload.LESS_UINT64_INT64, + LessOverload.LESS_INT64_DOUBLE, + LessOverload.LESS_DOUBLE_INT64, + LessOverload.LESS_UINT64_DOUBLE, + LessOverload.LESS_DOUBLE_UINT64), LESS_EQUALS( - Comparison.LESS_EQUALS_BOOL, - Comparison.LESS_EQUALS_INT64, - Comparison.LESS_EQUALS_UINT64, - Comparison.LESS_EQUALS_DOUBLE, - Comparison.LESS_EQUALS_STRING, - Comparison.LESS_EQUALS_BYTES, - Comparison.LESS_EQUALS_TIMESTAMP, - Comparison.LESS_EQUALS_DURATION, - Comparison.LESS_EQUALS_INT64_UINT64, - Comparison.LESS_EQUALS_UINT64_INT64, - Comparison.LESS_EQUALS_INT64_DOUBLE, - Comparison.LESS_EQUALS_DOUBLE_INT64, - Comparison.LESS_EQUALS_UINT64_DOUBLE, - Comparison.LESS_EQUALS_DOUBLE_UINT64), + LessEqualsOverload.LESS_EQUALS_BOOL, + LessEqualsOverload.LESS_EQUALS_INT64, + LessEqualsOverload.LESS_EQUALS_UINT64, + LessEqualsOverload.LESS_EQUALS_DOUBLE, + LessEqualsOverload.LESS_EQUALS_STRING, + LessEqualsOverload.LESS_EQUALS_BYTES, + LessEqualsOverload.LESS_EQUALS_TIMESTAMP, + LessEqualsOverload.LESS_EQUALS_DURATION, + LessEqualsOverload.LESS_EQUALS_INT64_UINT64, + LessEqualsOverload.LESS_EQUALS_UINT64_INT64, + LessEqualsOverload.LESS_EQUALS_INT64_DOUBLE, + LessEqualsOverload.LESS_EQUALS_DOUBLE_INT64, + LessEqualsOverload.LESS_EQUALS_UINT64_DOUBLE, + LessEqualsOverload.LESS_EQUALS_DOUBLE_UINT64), GREATER( - Comparison.GREATER_BOOL, - Comparison.GREATER_INT64, - Comparison.GREATER_UINT64, - Comparison.GREATER_DOUBLE, - Comparison.GREATER_STRING, - Comparison.GREATER_BYTES, - Comparison.GREATER_TIMESTAMP, - Comparison.GREATER_DURATION, - Comparison.GREATER_INT64_UINT64, - Comparison.GREATER_UINT64_INT64, - Comparison.GREATER_INT64_DOUBLE, - Comparison.GREATER_DOUBLE_INT64, - Comparison.GREATER_UINT64_DOUBLE, - Comparison.GREATER_DOUBLE_UINT64), + GreaterOverload.GREATER_BOOL, + GreaterOverload.GREATER_INT64, + GreaterOverload.GREATER_UINT64, + GreaterOverload.GREATER_DOUBLE, + GreaterOverload.GREATER_STRING, + GreaterOverload.GREATER_BYTES, + GreaterOverload.GREATER_TIMESTAMP, + GreaterOverload.GREATER_DURATION, + GreaterOverload.GREATER_INT64_UINT64, + GreaterOverload.GREATER_UINT64_INT64, + GreaterOverload.GREATER_INT64_DOUBLE, + GreaterOverload.GREATER_DOUBLE_INT64, + GreaterOverload.GREATER_UINT64_DOUBLE, + GreaterOverload.GREATER_DOUBLE_UINT64), GREATER_EQUALS( - Comparison.GREATER_EQUALS_BOOL, - Comparison.GREATER_EQUALS_BYTES, - Comparison.GREATER_EQUALS_DOUBLE, - Comparison.GREATER_EQUALS_DURATION, - Comparison.GREATER_EQUALS_INT64, - Comparison.GREATER_EQUALS_STRING, - Comparison.GREATER_EQUALS_TIMESTAMP, - Comparison.GREATER_EQUALS_UINT64, - Comparison.GREATER_EQUALS_INT64_UINT64, - Comparison.GREATER_EQUALS_UINT64_INT64, - Comparison.GREATER_EQUALS_INT64_DOUBLE, - Comparison.GREATER_EQUALS_DOUBLE_INT64, - Comparison.GREATER_EQUALS_UINT64_DOUBLE, - Comparison.GREATER_EQUALS_DOUBLE_UINT64); - - /** Container class for CEL standard function overloads. */ - public static final class Overload { - - /** - * Overloads for internal functions that may have been rewritten by macros - * (ex: @in, @not_strictly_false) - */ - public enum InternalOperator implements CelStandardOverload { - IN_LIST(InOverload.IN_LIST), - IN_MAP(InOverload.IN_MAP), - NOT_STRICTLY_FALSE(NotStrictlyFalseOverload.NOT_STRICTLY_FALSE); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - InternalOperator(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for functions that test relations. */ - public enum Relation implements CelStandardOverload { - EQUALS(EqualsOverload.EQUALS), - NOT_EQUALS(NotEqualsOverload.NOT_EQUALS); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Relation(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for performing arithmetic operations. */ - public enum Arithmetic implements CelStandardOverload { - ADD_INT64(AddOverload.ADD_INT64), - ADD_UINT64(AddOverload.ADD_UINT64), - ADD_BYTES(AddOverload.ADD_BYTES), - ADD_DOUBLE(AddOverload.ADD_DOUBLE), - ADD_DURATION_DURATION(AddOverload.ADD_DURATION_DURATION), - ADD_TIMESTAMP_DURATION(AddOverload.ADD_TIMESTAMP_DURATION), - ADD_STRING(AddOverload.ADD_STRING), - ADD_DURATION_TIMESTAMP(AddOverload.ADD_DURATION_TIMESTAMP), - ADD_LIST(AddOverload.ADD_LIST), - - SUBTRACT_INT64(SubtractOverload.SUBTRACT_INT64), - SUBTRACT_TIMESTAMP_TIMESTAMP(SubtractOverload.SUBTRACT_TIMESTAMP_TIMESTAMP), - SUBTRACT_TIMESTAMP_DURATION(SubtractOverload.SUBTRACT_TIMESTAMP_DURATION), - SUBTRACT_UINT64(SubtractOverload.SUBTRACT_UINT64), - SUBTRACT_DOUBLE(SubtractOverload.SUBTRACT_DOUBLE), - SUBTRACT_DURATION_DURATION(SubtractOverload.SUBTRACT_DURATION_DURATION), - - MULTIPLY_INT64(MultiplyOverload.MULTIPLY_INT64), - MULTIPLY_DOUBLE(MultiplyOverload.MULTIPLY_DOUBLE), - MULTIPLY_UINT64(MultiplyOverload.MULTIPLY_UINT64), - - DIVIDE_DOUBLE(DivideOverload.DIVIDE_DOUBLE), - DIVIDE_INT64(DivideOverload.DIVIDE_INT64), - DIVIDE_UINT64(DivideOverload.DIVIDE_UINT64), - - MODULO_INT64(ModuloOverload.MODULO_INT64), - MODULO_UINT64(ModuloOverload.MODULO_UINT64), - - NEGATE_INT64(NegateOverload.NEGATE_INT64), - NEGATE_DOUBLE(NegateOverload.NEGATE_DOUBLE); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Arithmetic(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for indexing a list or a map. */ - public enum Index implements CelStandardOverload { - INDEX_LIST(IndexOverload.INDEX_LIST), - INDEX_MAP(IndexOverload.INDEX_MAP); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Index(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for retrieving the size of a literal or a collection. */ - public enum Size implements CelStandardOverload { - SIZE_BYTES(SizeOverload.SIZE_BYTES), - BYTES_SIZE(SizeOverload.BYTES_SIZE), - SIZE_LIST(SizeOverload.SIZE_LIST), - LIST_SIZE(SizeOverload.LIST_SIZE), - SIZE_STRING(SizeOverload.SIZE_STRING), - STRING_SIZE(SizeOverload.STRING_SIZE), - SIZE_MAP(SizeOverload.SIZE_MAP), - MAP_SIZE(SizeOverload.MAP_SIZE); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Size(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for performing type conversions. */ - public enum Conversions implements CelStandardOverload { - BOOL_TO_BOOL(BoolOverload.BOOL_TO_BOOL), - STRING_TO_BOOL(BoolOverload.STRING_TO_BOOL), - INT64_TO_INT64(IntOverload.INT64_TO_INT64), - DOUBLE_TO_INT64(IntOverload.DOUBLE_TO_INT64), - STRING_TO_INT64(IntOverload.STRING_TO_INT64), - TIMESTAMP_TO_INT64(IntOverload.TIMESTAMP_TO_INT64), - UINT64_TO_INT64(IntOverload.UINT64_TO_INT64), - - UINT64_TO_UINT64(UintOverload.UINT64_TO_UINT64), - INT64_TO_UINT64(UintOverload.INT64_TO_UINT64), - DOUBLE_TO_UINT64(UintOverload.DOUBLE_TO_UINT64), - STRING_TO_UINT64(UintOverload.STRING_TO_UINT64), - - DOUBLE_TO_DOUBLE(DoubleOverload.DOUBLE_TO_DOUBLE), - INT64_TO_DOUBLE(DoubleOverload.INT64_TO_DOUBLE), - STRING_TO_DOUBLE(DoubleOverload.STRING_TO_DOUBLE), - UINT64_TO_DOUBLE(DoubleOverload.UINT64_TO_DOUBLE), - - STRING_TO_STRING(StringOverload.STRING_TO_STRING), - INT64_TO_STRING(StringOverload.INT64_TO_STRING), - DOUBLE_TO_STRING(StringOverload.DOUBLE_TO_STRING), - BOOL_TO_STRING(StringOverload.BOOL_TO_STRING), - BYTES_TO_STRING(StringOverload.BYTES_TO_STRING), - TIMESTAMP_TO_STRING(StringOverload.TIMESTAMP_TO_STRING), - DURATION_TO_STRING(StringOverload.DURATION_TO_STRING), - UINT64_TO_STRING(StringOverload.UINT64_TO_STRING), - - BYTES_TO_BYTES(BytesOverload.BYTES_TO_BYTES), - STRING_TO_BYTES(BytesOverload.STRING_TO_BYTES), - - DURATION_TO_DURATION(DurationOverload.DURATION_TO_DURATION), - STRING_TO_DURATION(DurationOverload.STRING_TO_DURATION), - - STRING_TO_TIMESTAMP(TimestampOverload.STRING_TO_TIMESTAMP), - TIMESTAMP_TO_TIMESTAMP(TimestampOverload.TIMESTAMP_TO_TIMESTAMP), - INT64_TO_TIMESTAMP(TimestampOverload.INT64_TO_TIMESTAMP), - - TO_DYN(DynOverload.TO_DYN); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Conversions(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** - * Overloads for functions performing string matching, such as regular expressions or contains - * check. - */ - public enum StringMatchers implements CelStandardOverload { - MATCHES(MatchesOverload.MATCHES), - MATCHES_STRING(MatchesOverload.MATCHES_STRING), - CONTAINS_STRING(ContainsOverload.CONTAINS_STRING), - ENDS_WITH_STRING(EndsWithOverload.ENDS_WITH_STRING), - STARTS_WITH_STRING(StartsWithOverload.STARTS_WITH_STRING); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - StringMatchers(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for logical operators that return a bool as a result. */ - public enum BooleanOperator implements CelStandardOverload { - LOGICAL_NOT(LogicalNotOverload.LOGICAL_NOT); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - BooleanOperator(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for functions performing date/time operations. */ - public enum DateTime implements CelStandardOverload { - TIMESTAMP_TO_YEAR(GetFullYearOverload.TIMESTAMP_TO_YEAR), - TIMESTAMP_TO_YEAR_WITH_TZ(GetFullYearOverload.TIMESTAMP_TO_YEAR_WITH_TZ), - TIMESTAMP_TO_MONTH(GetMonthOverload.TIMESTAMP_TO_MONTH), - TIMESTAMP_TO_MONTH_WITH_TZ(GetMonthOverload.TIMESTAMP_TO_MONTH_WITH_TZ), - TIMESTAMP_TO_DAY_OF_YEAR(GetDayOfYearOverload.TIMESTAMP_TO_DAY_OF_YEAR), - TIMESTAMP_TO_DAY_OF_YEAR_WITH_TZ(GetDayOfYearOverload.TIMESTAMP_TO_DAY_OF_YEAR_WITH_TZ), - TIMESTAMP_TO_DAY_OF_MONTH(GetDayOfMonthOverload.TIMESTAMP_TO_DAY_OF_MONTH), - TIMESTAMP_TO_DAY_OF_MONTH_WITH_TZ(GetDayOfMonthOverload.TIMESTAMP_TO_DAY_OF_MONTH_WITH_TZ), - TIMESTAMP_TO_DAY_OF_MONTH_1_BASED(GetDateOverload.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED), - TIMESTAMP_TO_DAY_OF_MONTH_1_BASED_WITH_TZ( - GetDateOverload.TIMESTAMP_TO_DAY_OF_MONTH_1_BASED_WITH_TZ), - - TIMESTAMP_TO_DAY_OF_WEEK(GetDayOfWeekOverload.TIMESTAMP_TO_DAY_OF_WEEK), - TIMESTAMP_TO_DAY_OF_WEEK_WITH_TZ(GetDayOfWeekOverload.TIMESTAMP_TO_DAY_OF_WEEK_WITH_TZ), - TIMESTAMP_TO_HOURS(GetHoursOverload.TIMESTAMP_TO_HOURS), - TIMESTAMP_TO_HOURS_WITH_TZ(GetHoursOverload.TIMESTAMP_TO_HOURS_WITH_TZ), - TIMESTAMP_TO_MINUTES(GetMinutesOverload.TIMESTAMP_TO_MINUTES), - TIMESTAMP_TO_MINUTES_WITH_TZ(GetMinutesOverload.TIMESTAMP_TO_MINUTES_WITH_TZ), - TIMESTAMP_TO_SECONDS(GetSecondsOverload.TIMESTAMP_TO_SECONDS), - TIMESTAMP_TO_SECONDS_WITH_TZ(GetSecondsOverload.TIMESTAMP_TO_SECONDS_WITH_TZ), - TIMESTAMP_TO_MILLISECONDS(GetMillisecondsOverload.TIMESTAMP_TO_MILLISECONDS), - TIMESTAMP_TO_MILLISECONDS_WITH_TZ( - GetMillisecondsOverload.TIMESTAMP_TO_MILLISECONDS_WITH_TZ), - DURATION_TO_HOURS(GetHoursOverload.DURATION_TO_HOURS), - DURATION_TO_MINUTES(GetMinutesOverload.DURATION_TO_MINUTES), - DURATION_TO_SECONDS(GetSecondsOverload.DURATION_TO_SECONDS), - DURATION_TO_MILLISECONDS(GetMillisecondsOverload.DURATION_TO_MILLISECONDS); - - private final CelStandardOverload standardOverload; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - DateTime(CelStandardOverload standardOverload) { - this.standardOverload = standardOverload; - } - } - - /** Overloads for performing numeric comparisons. */ - public enum Comparison implements CelStandardOverload { - LESS_BOOL(LessOverload.LESS_BOOL, false), - LESS_INT64(LessOverload.LESS_INT64, false), - LESS_UINT64(LessOverload.LESS_UINT64, false), - LESS_BYTES(LessOverload.LESS_BYTES, false), - LESS_DOUBLE(LessOverload.LESS_DOUBLE, false), - LESS_DOUBLE_UINT64(LessOverload.LESS_DOUBLE_UINT64, true), - LESS_INT64_UINT64(LessOverload.LESS_INT64_UINT64, true), - LESS_UINT64_INT64(LessOverload.LESS_UINT64_INT64, true), - LESS_INT64_DOUBLE(LessOverload.LESS_INT64_DOUBLE, true), - LESS_DOUBLE_INT64(LessOverload.LESS_DOUBLE_INT64, true), - LESS_UINT64_DOUBLE(LessOverload.LESS_UINT64_DOUBLE, true), - LESS_DURATION(LessOverload.LESS_DURATION, false), - LESS_STRING(LessOverload.LESS_STRING, false), - LESS_TIMESTAMP(LessOverload.LESS_TIMESTAMP, false), - LESS_EQUALS_BOOL(LessEqualsOverload.LESS_EQUALS_BOOL, false), - LESS_EQUALS_BYTES(LessEqualsOverload.LESS_EQUALS_BYTES, false), - LESS_EQUALS_DOUBLE(LessEqualsOverload.LESS_EQUALS_DOUBLE, false), - LESS_EQUALS_DURATION(LessEqualsOverload.LESS_EQUALS_DURATION, false), - LESS_EQUALS_INT64(LessEqualsOverload.LESS_EQUALS_INT64, false), - LESS_EQUALS_STRING(LessEqualsOverload.LESS_EQUALS_STRING, false), - LESS_EQUALS_TIMESTAMP(LessEqualsOverload.LESS_EQUALS_TIMESTAMP, false), - LESS_EQUALS_UINT64(LessEqualsOverload.LESS_EQUALS_UINT64, false), - LESS_EQUALS_INT64_UINT64(LessEqualsOverload.LESS_EQUALS_INT64_UINT64, true), - LESS_EQUALS_UINT64_INT64(LessEqualsOverload.LESS_EQUALS_UINT64_INT64, true), - LESS_EQUALS_INT64_DOUBLE(LessEqualsOverload.LESS_EQUALS_INT64_DOUBLE, true), - LESS_EQUALS_DOUBLE_INT64(LessEqualsOverload.LESS_EQUALS_DOUBLE_INT64, true), - LESS_EQUALS_UINT64_DOUBLE(LessEqualsOverload.LESS_EQUALS_UINT64_DOUBLE, true), - LESS_EQUALS_DOUBLE_UINT64(LessEqualsOverload.LESS_EQUALS_DOUBLE_UINT64, true), - GREATER_BOOL(GreaterOverload.GREATER_BOOL, false), - GREATER_BYTES(GreaterOverload.GREATER_BYTES, false), - GREATER_DOUBLE(GreaterOverload.GREATER_DOUBLE, false), - GREATER_DURATION(GreaterOverload.GREATER_DURATION, false), - GREATER_INT64(GreaterOverload.GREATER_INT64, false), - GREATER_STRING(GreaterOverload.GREATER_STRING, false), - GREATER_TIMESTAMP(GreaterOverload.GREATER_TIMESTAMP, false), - GREATER_UINT64(GreaterOverload.GREATER_UINT64, false), - GREATER_INT64_UINT64(GreaterOverload.GREATER_INT64_UINT64, true), - GREATER_UINT64_INT64(GreaterOverload.GREATER_UINT64_INT64, true), - GREATER_INT64_DOUBLE(GreaterOverload.GREATER_INT64_DOUBLE, true), - GREATER_DOUBLE_INT64(GreaterOverload.GREATER_DOUBLE_INT64, true), - GREATER_UINT64_DOUBLE(GreaterOverload.GREATER_UINT64_DOUBLE, true), - GREATER_DOUBLE_UINT64(GreaterOverload.GREATER_DOUBLE_UINT64, true), - GREATER_EQUALS_BOOL(GreaterEqualsOverload.GREATER_EQUALS_BOOL, false), - GREATER_EQUALS_BYTES(GreaterEqualsOverload.GREATER_EQUALS_BYTES, false), - GREATER_EQUALS_DOUBLE(GreaterEqualsOverload.GREATER_EQUALS_DOUBLE, false), - GREATER_EQUALS_DURATION(GreaterEqualsOverload.GREATER_EQUALS_DURATION, false), - GREATER_EQUALS_INT64(GreaterEqualsOverload.GREATER_EQUALS_INT64, false), - GREATER_EQUALS_STRING(GreaterEqualsOverload.GREATER_EQUALS_STRING, false), - GREATER_EQUALS_TIMESTAMP(GreaterEqualsOverload.GREATER_EQUALS_TIMESTAMP, false), - GREATER_EQUALS_UINT64(GreaterEqualsOverload.GREATER_EQUALS_UINT64, false), - GREATER_EQUALS_INT64_UINT64(GreaterEqualsOverload.GREATER_EQUALS_INT64_UINT64, true), - GREATER_EQUALS_UINT64_INT64(GreaterEqualsOverload.GREATER_EQUALS_UINT64_INT64, true), - GREATER_EQUALS_INT64_DOUBLE(GreaterEqualsOverload.GREATER_EQUALS_INT64_DOUBLE, true), - GREATER_EQUALS_DOUBLE_INT64(GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_INT64, true), - GREATER_EQUALS_UINT64_DOUBLE(GreaterEqualsOverload.GREATER_EQUALS_UINT64_DOUBLE, true), - GREATER_EQUALS_DOUBLE_UINT64(GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_UINT64, true); - - private final CelStandardOverload standardOverload; - private final boolean isHeterogeneousComparison; - - @Override - public CelFunctionBinding newFunctionBinding( - CelOptions celOptions, RuntimeEquality runtimeEquality) { - return standardOverload.newFunctionBinding(celOptions, runtimeEquality); - } - - Comparison(CelStandardOverload standardOverload, boolean isHeterogeneousComparison) { - this.standardOverload = standardOverload; - this.isHeterogeneousComparison = isHeterogeneousComparison; - } - - public boolean isHeterogeneousComparison() { - return isHeterogeneousComparison; - } - } - - private Overload() {} - } + GreaterEqualsOverload.GREATER_EQUALS_BOOL, + GreaterEqualsOverload.GREATER_EQUALS_BYTES, + GreaterEqualsOverload.GREATER_EQUALS_DOUBLE, + GreaterEqualsOverload.GREATER_EQUALS_DURATION, + GreaterEqualsOverload.GREATER_EQUALS_INT64, + GreaterEqualsOverload.GREATER_EQUALS_STRING, + GreaterEqualsOverload.GREATER_EQUALS_TIMESTAMP, + GreaterEqualsOverload.GREATER_EQUALS_UINT64, + GreaterEqualsOverload.GREATER_EQUALS_INT64_UINT64, + GreaterEqualsOverload.GREATER_EQUALS_UINT64_INT64, + GreaterEqualsOverload.GREATER_EQUALS_INT64_DOUBLE, + GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_INT64, + GreaterEqualsOverload.GREATER_EQUALS_UINT64_DOUBLE, + GreaterEqualsOverload.GREATER_EQUALS_DOUBLE_UINT64); private final ImmutableSet standardOverloads; @@ -832,6 +507,10 @@ public static Builder newBuilder() { return new Builder(); } + static boolean isHeterogeneousComparison(CelStandardOverload overload) { + return HETEROGENEOUS_COMPARISON_OPERATORS.contains(overload); + } + private CelStandardFunctions(ImmutableSet standardOverloads) { this.standardOverloads = standardOverloads; } diff --git a/runtime/src/test/java/dev/cel/runtime/BUILD.bazel b/runtime/src/test/java/dev/cel/runtime/BUILD.bazel index 1541e9c84..eb0d652f1 100644 --- a/runtime/src/test/java/dev/cel/runtime/BUILD.bazel +++ b/runtime/src/test/java/dev/cel/runtime/BUILD.bazel @@ -81,8 +81,10 @@ java_library( "//runtime:type_resolver", "//runtime:unknown_attributes", "//runtime:unknown_options", + "//runtime/standard:add", "//runtime/standard:not_strictly_false", "//runtime/standard:standard_overload", + "//runtime/standard:subtract", "//testing/protos:message_with_enum_cel_java_proto", "//testing/protos:message_with_enum_java_proto", "//testing/protos:multi_file_cel_java_proto", diff --git a/runtime/src/test/java/dev/cel/runtime/CelStandardFunctionsTest.java b/runtime/src/test/java/dev/cel/runtime/CelStandardFunctionsTest.java index eac68fb63..d85ef7424 100644 --- a/runtime/src/test/java/dev/cel/runtime/CelStandardFunctionsTest.java +++ b/runtime/src/test/java/dev/cel/runtime/CelStandardFunctionsTest.java @@ -24,8 +24,9 @@ import dev.cel.compiler.CelCompiler; import dev.cel.compiler.CelCompilerFactory; import dev.cel.runtime.CelStandardFunctions.StandardFunction; -import dev.cel.runtime.CelStandardFunctions.StandardFunction.Overload.Arithmetic; +import dev.cel.runtime.standard.AddOperator.AddOverload; import dev.cel.runtime.standard.CelStandardOverload; +import dev.cel.runtime.standard.SubtractOperator.SubtractOverload; import org.junit.Test; import org.junit.runner.RunWith; @@ -118,12 +119,12 @@ public void standardFunctions_filterFunctions() { .filterFunctions( (func, over) -> { if (func.equals(CelStandardFunctions.StandardFunction.ADD) - && over.equals(Arithmetic.ADD_INT64)) { + && over.equals(AddOverload.ADD_INT64)) { return true; } if (func.equals(CelStandardFunctions.StandardFunction.SUBTRACT) - && over.equals(Arithmetic.SUBTRACT_INT64)) { + && over.equals(SubtractOverload.SUBTRACT_INT64)) { return true; } @@ -132,7 +133,7 @@ public void standardFunctions_filterFunctions() { .build(); assertThat(celStandardFunction.getOverloads()) - .containsExactly(Arithmetic.ADD_INT64, Arithmetic.SUBTRACT_INT64); + .containsExactly(AddOverload.ADD_INT64, SubtractOverload.SUBTRACT_INT64); } @Test