From 27e7a3f2bc85ed1656b81d26b674aedd89c1a2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Thu, 31 Jul 2025 10:29:03 +0200 Subject: [PATCH 1/2] feat: add getNumberEvaluation method delegating to getDoubleEvaluation (#501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- .../dev/openfeature/sdk/FeatureProvider.java | 27 +++++++++++++++++++ .../dev/openfeature/sdk/FlagValueType.java | 1 + .../dev/openfeature/sdk/NoOpProvider.java | 2 ++ .../openfeature/sdk/OpenFeatureClient.java | 6 +++-- .../dev/openfeature/sdk/NoOpProviderTest.java | 7 +++++ .../dev/openfeature/sdk/ProviderSpecTest.java | 6 +++++ 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/FeatureProvider.java b/src/main/java/dev/openfeature/sdk/FeatureProvider.java index 22819ef10..4f7af090c 100644 --- a/src/main/java/dev/openfeature/sdk/FeatureProvider.java +++ b/src/main/java/dev/openfeature/sdk/FeatureProvider.java @@ -15,12 +15,39 @@ default List getProviderHooks() { return new ArrayList<>(); } + /** + * Resolves a feature flag value as a {@link Number}. + * + * @param key the unique identifier for the flag + * @param defaultValue the default value to return if the flag cannot be resolved + * @param ctx the evaluation context containing any relevant information for resolution + * @return a {@link ProviderEvaluation} containing the resolved {@code Number} value and additional evaluation details + */ + default ProviderEvaluation getNumberEvaluation(String key, Number defaultValue, EvaluationContext ctx) { + ProviderEvaluation dep = getDoubleEvaluation(key, defaultValue.doubleValue(), ctx); + return new ProviderEvaluation<>( + dep.getValue(), + dep.getReason(), + dep.getVariant(), + dep.getErrorCode(), + dep.getErrorMessage(), + dep.getFlagMetadata()); + } + ProviderEvaluation getBooleanEvaluation(String key, Boolean defaultValue, EvaluationContext ctx); ProviderEvaluation getStringEvaluation(String key, String defaultValue, EvaluationContext ctx); + /** + * @deprecated please use {@link #getNumberEvaluation(String, Number, EvaluationContext)} + */ + @Deprecated ProviderEvaluation getIntegerEvaluation(String key, Integer defaultValue, EvaluationContext ctx); + /** + * @deprecated please use {@link #getNumberEvaluation(String, Number, EvaluationContext)} + */ + @Deprecated ProviderEvaluation getDoubleEvaluation(String key, Double defaultValue, EvaluationContext ctx); ProviderEvaluation getObjectEvaluation(String key, Value defaultValue, EvaluationContext ctx); diff --git a/src/main/java/dev/openfeature/sdk/FlagValueType.java b/src/main/java/dev/openfeature/sdk/FlagValueType.java index a8938d454..41d6d5c82 100644 --- a/src/main/java/dev/openfeature/sdk/FlagValueType.java +++ b/src/main/java/dev/openfeature/sdk/FlagValueType.java @@ -3,6 +3,7 @@ @SuppressWarnings("checkstyle:MissingJavadocType") public enum FlagValueType { STRING, + NUMBER, INTEGER, DOUBLE, OBJECT, diff --git a/src/main/java/dev/openfeature/sdk/NoOpProvider.java b/src/main/java/dev/openfeature/sdk/NoOpProvider.java index e427b9701..cfd1b164d 100644 --- a/src/main/java/dev/openfeature/sdk/NoOpProvider.java +++ b/src/main/java/dev/openfeature/sdk/NoOpProvider.java @@ -41,6 +41,7 @@ public ProviderEvaluation getStringEvaluation(String key, String default } @Override + @Deprecated public ProviderEvaluation getIntegerEvaluation(String key, Integer defaultValue, EvaluationContext ctx) { return ProviderEvaluation.builder() .value(defaultValue) @@ -50,6 +51,7 @@ public ProviderEvaluation getIntegerEvaluation(String key, Integer defa } @Override + @Deprecated public ProviderEvaluation getDoubleEvaluation(String key, Double defaultValue, EvaluationContext ctx) { return ProviderEvaluation.builder() .value(defaultValue) diff --git a/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java b/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java index b5522b66a..b34714407 100644 --- a/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java +++ b/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java @@ -287,9 +287,11 @@ private ProviderEvaluation createProviderEvaluation( case STRING: return provider.getStringEvaluation(key, (String) defaultValue, invocationContext); case INTEGER: - return provider.getIntegerEvaluation(key, (Integer) defaultValue, invocationContext); + return provider.getNumberEvaluation(key, (Integer) defaultValue, invocationContext); + case NUMBER: + return provider.getNumberEvaluation(key, (Number) defaultValue, invocationContext); case DOUBLE: - return provider.getDoubleEvaluation(key, (Double) defaultValue, invocationContext); + return provider.getNumberEvaluation(key, (Double) defaultValue, invocationContext); case OBJECT: return provider.getObjectEvaluation(key, (Value) defaultValue, invocationContext); default: diff --git a/src/test/java/dev/openfeature/sdk/NoOpProviderTest.java b/src/test/java/dev/openfeature/sdk/NoOpProviderTest.java index d0c7c6014..c4b75ab76 100644 --- a/src/test/java/dev/openfeature/sdk/NoOpProviderTest.java +++ b/src/test/java/dev/openfeature/sdk/NoOpProviderTest.java @@ -41,4 +41,11 @@ void value() { ProviderEvaluation eval = p.getObjectEvaluation("key", s, null); assertEquals(s, eval.getValue()); } + + @Test + void noOpNumber() { + NoOpProvider p = new NoOpProvider(); + ProviderEvaluation eval = p.getNumberEvaluation("key", 123456789L, null); + assertEquals(123456789.0, eval.getValue()); + } } diff --git a/src/test/java/dev/openfeature/sdk/ProviderSpecTest.java b/src/test/java/dev/openfeature/sdk/ProviderSpecTest.java index ec87acd70..3569027d2 100644 --- a/src/test/java/dev/openfeature/sdk/ProviderSpecTest.java +++ b/src/test/java/dev/openfeature/sdk/ProviderSpecTest.java @@ -40,6 +40,9 @@ void flag_value_set() { ProviderEvaluation int_result = p.getIntegerEvaluation("key", 4, new ImmutableContext()); assertNotNull(int_result.getValue()); + ProviderEvaluation number_result = p.getNumberEvaluation("key", 2L, new ImmutableContext()); + assertNotNull(number_result.getValue()); + ProviderEvaluation double_result = p.getDoubleEvaluation("key", 0.4, new ImmutableContext()); assertNotNull(double_result.getValue()); @@ -97,6 +100,9 @@ void variant_set() { ProviderEvaluation int_result = p.getIntegerEvaluation("key", 4, new ImmutableContext()); assertNotNull(int_result.getReason()); + ProviderEvaluation number_result = p.getNumberEvaluation("key", 2L, new ImmutableContext()); + assertNotNull(number_result.getReason()); + ProviderEvaluation double_result = p.getDoubleEvaluation("key", 0.4, new ImmutableContext()); assertNotNull(double_result.getReason()); From d1a48d4e871b5ccef8963881c47b1ca2f79d9a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Thu, 31 Jul 2025 11:44:42 +0200 Subject: [PATCH 2/2] feat: add getNumberEvaluation method delegating to getDoubleEvaluation (#501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- src/main/java/dev/openfeature/sdk/FeatureProvider.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/openfeature/sdk/FeatureProvider.java b/src/main/java/dev/openfeature/sdk/FeatureProvider.java index 4f7af090c..ec9a3d1a8 100644 --- a/src/main/java/dev/openfeature/sdk/FeatureProvider.java +++ b/src/main/java/dev/openfeature/sdk/FeatureProvider.java @@ -21,7 +21,7 @@ default List getProviderHooks() { * @param key the unique identifier for the flag * @param defaultValue the default value to return if the flag cannot be resolved * @param ctx the evaluation context containing any relevant information for resolution - * @return a {@link ProviderEvaluation} containing the resolved {@code Number} value and additional evaluation details + * @return a {@link ProviderEvaluation} containing the resolved {@code Number} value and additional eval details */ default ProviderEvaluation getNumberEvaluation(String key, Number defaultValue, EvaluationContext ctx) { ProviderEvaluation dep = getDoubleEvaluation(key, defaultValue.doubleValue(), ctx); @@ -39,12 +39,16 @@ default ProviderEvaluation getNumberEvaluation(String key, Number defaul ProviderEvaluation getStringEvaluation(String key, String defaultValue, EvaluationContext ctx); /** + * Evaluate feature flag returning an integer value. + * * @deprecated please use {@link #getNumberEvaluation(String, Number, EvaluationContext)} */ @Deprecated ProviderEvaluation getIntegerEvaluation(String key, Integer defaultValue, EvaluationContext ctx); /** + * Evaluate a feature flag returning a double value. + * * @deprecated please use {@link #getNumberEvaluation(String, Number, EvaluationContext)} */ @Deprecated