From c78aa63bc342971657fabc3c4d4944889bfd35bb Mon Sep 17 00:00:00 2001 From: Maor Waynshtein Date: Fri, 20 Jun 2025 22:59:42 +0300 Subject: [PATCH 1/2] add string(bool) overload --- .../main/java/dev/cel/checker/CelStandardDeclarations.java | 4 ++++ checker/src/test/resources/standardEnvDump.baseline | 1 + .../main/java/dev/cel/runtime/CelStandardFunctions.java | 2 ++ .../main/java/dev/cel/runtime/standard/StringFunction.java | 7 +++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java b/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java index 8a84c2a48..32a8e9986 100644 --- a/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java +++ b/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java @@ -159,6 +159,7 @@ enum StandardFunction { Overload.Conversions.INT64_TO_STRING, Overload.Conversions.UINT64_TO_STRING, Overload.Conversions.DOUBLE_TO_STRING, + Overload.Conversions.BOOL_TO_STRING, Overload.Conversions.BYTES_TO_STRING, Overload.Conversions.TIMESTAMP_TO_STRING, Overload.Conversions.DURATION_TO_STRING), @@ -679,6 +680,9 @@ public enum Conversions implements StandardOverload { DOUBLE_TO_STRING( CelOverloadDecl.newGlobalOverload( "double_to_string", "type conversion", SimpleType.STRING, SimpleType.DOUBLE)), + BOOL_TO_STRING( + CelOverloadDecl.newGlobalOverload( + "bool_to_string", "type conversion", SimpleType.STRING, SimpleType.BOOL)), BYTES_TO_STRING( CelOverloadDecl.newGlobalOverload( "bytes_to_string", "type conversion", SimpleType.STRING, SimpleType.BYTES)), diff --git a/checker/src/test/resources/standardEnvDump.baseline b/checker/src/test/resources/standardEnvDump.baseline index 60d19f66d..1a3a5ce87 100644 --- a/checker/src/test/resources/standardEnvDump.baseline +++ b/checker/src/test/resources/standardEnvDump.baseline @@ -256,6 +256,7 @@ declare string { function int64_to_string (int) -> string function uint64_to_string (uint) -> string function double_to_string (double) -> string + function bool_to_string (double) -> string function bytes_to_string (bytes) -> string function timestamp_to_string (google.protobuf.Timestamp) -> string function duration_to_string (google.protobuf.Duration) -> string diff --git a/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java b/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java index 0f2b74772..578f428ee 100644 --- a/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java +++ b/runtime/src/main/java/dev/cel/runtime/CelStandardFunctions.java @@ -223,6 +223,7 @@ public enum StandardFunction { 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, @@ -478,6 +479,7 @@ public enum Conversions implements StandardOverload { STRING_TO_STRING(StringOverload.STRING_TO_STRING::newFunctionBinding), INT64_TO_STRING(StringOverload.INT64_TO_STRING::newFunctionBinding), DOUBLE_TO_STRING(StringOverload.DOUBLE_TO_STRING::newFunctionBinding), + BOOL_TO_STRING(StringOverload.BOOL_TO_STRING::newFunctionBinding), BYTES_TO_STRING(StringOverload.BYTES_TO_STRING::newFunctionBinding), TIMESTAMP_TO_STRING(StringOverload.TIMESTAMP_TO_STRING::newFunctionBinding), DURATION_TO_STRING(StringOverload.DURATION_TO_STRING::newFunctionBinding), diff --git a/runtime/src/main/java/dev/cel/runtime/standard/StringFunction.java b/runtime/src/main/java/dev/cel/runtime/standard/StringFunction.java index b7df9bd10..1bde9f7e2 100644 --- a/runtime/src/main/java/dev/cel/runtime/standard/StringFunction.java +++ b/runtime/src/main/java/dev/cel/runtime/standard/StringFunction.java @@ -53,8 +53,11 @@ public enum StringOverload implements CelStandardOverload { (celOptions, runtimeEquality) -> CelFunctionBinding.from("int64_to_string", Long.class, Object::toString)), DOUBLE_TO_STRING( - (celOptions, runtimeEquality) -> - CelFunctionBinding.from("double_to_string", Double.class, Object::toString)), + (celOptions, runtimeEquality) -> + CelFunctionBinding.from("double_to_string", Double.class, Object::toString)), + BOOL_TO_STRING( + (celOptions, runtimeEquality) -> + CelFunctionBinding.from("bool_to_string", Boolean.class, Object::toString)), BYTES_TO_STRING( (celOptions, runtimeEquality) -> CelFunctionBinding.from( From a941e9499d0b0602c70f61cfd6abaed99ee0b7dc Mon Sep 17 00:00:00 2001 From: Maor Waynshtein Date: Mon, 23 Jun 2025 20:31:12 +0300 Subject: [PATCH 2/2] add test --- checker/src/test/resources/standardEnvDump.baseline | 2 +- runtime/src/test/resources/stringConversions.baseline | 5 +++++ .../src/main/java/dev/cel/testing/BaseInterpreterTest.java | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/checker/src/test/resources/standardEnvDump.baseline b/checker/src/test/resources/standardEnvDump.baseline index 1a3a5ce87..e4e810a30 100644 --- a/checker/src/test/resources/standardEnvDump.baseline +++ b/checker/src/test/resources/standardEnvDump.baseline @@ -256,7 +256,7 @@ declare string { function int64_to_string (int) -> string function uint64_to_string (uint) -> string function double_to_string (double) -> string - function bool_to_string (double) -> string + function bool_to_string (bool) -> string function bytes_to_string (bytes) -> string function timestamp_to_string (google.protobuf.Timestamp) -> string function duration_to_string (google.protobuf.Duration) -> string diff --git a/runtime/src/test/resources/stringConversions.baseline b/runtime/src/test/resources/stringConversions.baseline index 59406fc85..9dec559ae 100644 --- a/runtime/src/test/resources/stringConversions.baseline +++ b/runtime/src/test/resources/stringConversions.baseline @@ -13,6 +13,11 @@ Source: string(-1) bindings: {} result: -1 +Source: string(true) +=====> +bindings: {} +result: true + Source: string(b'abc\303\203') =====> bindings: {} diff --git a/testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java b/testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java index 241acfa70..0c29ea038 100644 --- a/testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java +++ b/testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java @@ -1657,6 +1657,9 @@ public void stringConversions() { source = "string(-1)"; // int converts to '-1' runTest(); + source = "string(true)"; // bool converts to 'true' + runTest(); + // Byte literals in Google SQL only take the leading byte of an escape character. // This means that to translate a byte literal to a UTF-8 encoded string, all bytes must be // encoded in the literal as they would be laid out in memory for UTF-8, hence the extra octal