From 208da58bbd8ccc6f5076d7e80071ef0ba970bc22 Mon Sep 17 00:00:00 2001 From: jmarkerink Date: Mon, 29 Sep 2025 17:41:22 +0200 Subject: [PATCH] feat: added isNumber expression type operator --- .../mongo/backend/aggregation/Expression.java | 12 ++++++++++++ .../mongo/backend/aggregation/ExpressionTest.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Expression.java b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Expression.java index 404c5f07..d5b81399 100644 --- a/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Expression.java +++ b/core/src/main/java/de/bwaldvogel/mongo/backend/aggregation/Expression.java @@ -43,6 +43,7 @@ import de.bwaldvogel.mongo.backend.NumericUtils; import de.bwaldvogel.mongo.backend.Utils; import de.bwaldvogel.mongo.backend.ValueComparator; +import de.bwaldvogel.mongo.bson.Decimal128; import de.bwaldvogel.mongo.bson.Document; import de.bwaldvogel.mongo.bson.ObjectId; import de.bwaldvogel.mongo.exception.BadValueException; @@ -772,6 +773,17 @@ Object apply(List expressionValue, Document document) { } }, + $isNumber { + @Override + Boolean apply(List expressionValue, Document document) { + Object value = requireSingleValue(expressionValue); + return (value instanceof Integer || + value instanceof Decimal128 || + value instanceof Double || + value instanceof Long); + } + }, + $literal { @Override Object apply(Object expressionValue, Document document) { diff --git a/core/src/test/java/de/bwaldvogel/mongo/backend/aggregation/ExpressionTest.java b/core/src/test/java/de/bwaldvogel/mongo/backend/aggregation/ExpressionTest.java index 0a9b5415..093890cb 100644 --- a/core/src/test/java/de/bwaldvogel/mongo/backend/aggregation/ExpressionTest.java +++ b/core/src/test/java/de/bwaldvogel/mongo/backend/aggregation/ExpressionTest.java @@ -1781,6 +1781,18 @@ void testEvaluateIsArray() throws Exception { .withMessage("[Error 16020] Expression $isArray takes exactly 1 arguments. 2 were passed in."); } + @Test + void testEvaluateIsNumber() throws Exception { + assertThat(Expression.evaluate(json("$isNumber: ['hello']"), json(""))).isEqualTo(false); + assertThat(Expression.evaluate(json("$isNumber: 'pi'}"), json(""))).isEqualTo(false); + assertThat(Expression.evaluate(json("$isNumber: null"), json(""))).isEqualTo(false); + assertThat(Expression.evaluate(json("$isNumber: '$value'"), json("value: 'a'"))).isEqualTo(false); + assertThat(Expression.evaluate(json("$isNumber: '$value'"), json("value: ['abc']"))).isEqualTo(false); + assertThat(Expression.evaluate(json("$isNumber: '$value'"), json("value: 1"))).isEqualTo(true); + assertThat(Expression.evaluate(json("$isNumber: '$value'"), json("value: 2.0"))).isEqualTo(true); + assertThat(Expression.evaluate(json("$isNumber: '$value'"), json("value: 3.141592653589793"))).isEqualTo(true); + } + @Test void testEvaluateLiteral() throws Exception { assertThat(Expression.evaluate(json("$literal: {$add: [2, 3]}"), json(""))).isEqualTo(json("$add: [2, 3]"));