diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperators.java index e26e41f65..4de258b4e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperators.java @@ -719,6 +719,51 @@ public class ArithmeticOperators { return usesFieldRef() ? Sinh.sinhOf(fieldReference, unit) : Sinh.sinhOf(expression, unit); } + /** + * Creates new {@link AggregationExpression} that calculates the cosine of a numeric value given in + * {@link AngularDimension#RADIANS radians}. + * + * @return new instance of {@link Sin}. + * @since 3.3 + */ + public Cos cos() { + return cos(AngularDimension.RADIANS); + } + + /** + * Creates new {@link AggregationExpression} that calculates the cosine of a numeric value in the given + * {@link AngularDimension unit}. + * + * @param unit the unit of measure. + * @return new instance of {@link Sin}. + * @since 3.3 + */ + public Cos cos(AngularDimension unit) { + return usesFieldRef() ? Cos.cosOf(fieldReference, unit) : Cos.cosOf(expression, unit); + } + + /** + * Creates new {@link AggregationExpression} that calculates the hyperbolic cosine of a numeric value given in + * {@link AngularDimension#RADIANS radians}. + * + * @return new instance of {@link Sin}. + * @since 3.3 + */ + public Cosh cosh() { + return cosh(AngularDimension.RADIANS); + } + + /** + * Creates new {@link AggregationExpression} that calculates the hyperbolic cosine of a numeric value. + * + * @param unit the unit of measure. + * @return new instance of {@link Sin}. + * @since 3.3 + */ + public Cosh cosh(AngularDimension unit) { + return usesFieldRef() ? Cosh.coshOf(fieldReference, unit) : Cosh.coshOf(expression, unit); + } + /** * Creates new {@link AggregationExpression} that calculates the tangent of a numeric value given in * {@link AngularDimension#RADIANS radians}. @@ -2199,6 +2244,212 @@ public class ArithmeticOperators { } } + /** + * An {@link AggregationExpression expression} that calculates the cosine of a value that is measured in radians. + * + * @author Christoph Strobl + * @since 3.3 + */ + public static class Cos extends AbstractAggregationExpression { + + private Cos(Object value) { + super(value); + } + + /** + * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in + * {@link AngularDimension#RADIANS radians}. + *
+ * Use {@code cosOf("angle", DEGREES)} as shortcut for + * + *
+ * { $cos : { $degreesToRadians : "$angle" } }
+ *
+ *
+ * .
+ *
+ * @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cosOf(String fieldReference) {
+ return cosOf(fieldReference, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in the given
+ * {@link AngularDimension unit}.
+ *
+ * @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cosOf(String fieldReference, AngularDimension unit) {
+ return cos(Fields.field(fieldReference), unit);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cosOf(AggregationExpression expression) {
+ return cosOf(expression, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in the given
+ * {@link AngularDimension unit}.
+ *
+ * @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cosOf(AggregationExpression expression, AngularDimension unit) {
+ return cos(expression, unit);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
+ * numeric value
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cos(Object value) {
+ return cos(value, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the cosine of a value that is measured in the given
+ * {@link AngularDimension unit}.
+ *
+ * @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
+ * numeric value.
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cos}.
+ */
+ public static Cos cos(Object value, AngularDimension unit) {
+
+ if (ObjectUtils.nullSafeEquals(AngularDimension.DEGREES, unit)) {
+ return new Cos(ConvertOperators.DegreesToRadians.degreesToRadians(value));
+ }
+ return new Cos(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$cos";
+ }
+ }
+
+ /**
+ * An {@link AggregationExpression expression} that calculates the hyperbolic cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * @author Christoph Strobl
+ * @since 3.3
+ */
+ public static class Cosh extends AbstractAggregationExpression {
+
+ private Cosh(Object value) {
+ super(value);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh coshOf(String fieldReference) {
+ return coshOf(fieldReference, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * the given {@link AngularDimension unit}.
+ *
+ * Use {@code coshOf("angle", DEGREES)} as shortcut for
+ *
+ *
+ * { $cosh : { $degreesToRadians : "$angle" } }
+ *
+ *
+ * .
+ *
+ * @param fieldReference the name of the {@link Field field} that resolves to a numeric value.
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh coshOf(String fieldReference, AngularDimension unit) {
+ return cosh(Fields.field(fieldReference), unit);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * Use {@code sinhOf("angle", DEGREES)} as shortcut for eg.
+ * {@code sinhOf(ConvertOperators.valueOf("angle").degreesToRadians())}.
+ *
+ * @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh coshOf(AggregationExpression expression) {
+ return coshOf(expression, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * the given {@link AngularDimension unit}.
+ *
+ * @param expression the {@link AggregationExpression expression} that resolves to a numeric value.
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh coshOf(AggregationExpression expression, AngularDimension unit) {
+ return cosh(expression, unit);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * {@link AngularDimension#RADIANS}.
+ *
+ * @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
+ * numeric value.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh cosh(Object value) {
+ return cosh(value, AngularDimension.RADIANS);
+ }
+
+ /**
+ * Creates a new {@link AggregationExpression} that calculates the hyperbolic cosine of a value that is measured in
+ * the given {@link AngularDimension unit}.
+ *
+ * @param value anything ({@link Field field}, {@link AggregationExpression expression}, ...) that resolves to a
+ * numeric value
+ * @param unit the unit of measure used by the value of the given field.
+ * @return new instance of {@link Cosh}.
+ */
+ public static Cosh cosh(Object value, AngularDimension unit) {
+
+ if (ObjectUtils.nullSafeEquals(AngularDimension.DEGREES, unit)) {
+ return new Cosh(ConvertOperators.DegreesToRadians.degreesToRadians(value));
+ }
+ return new Cosh(value);
+ }
+
+ @Override
+ protected String getMongoMethod() {
+ return "$cosh";
+ }
+ }
+
/**
* An {@link AggregationExpression expression} that calculates the tangent of a value that is measured in radians.
*
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java
index a2d011d6a..1efe94c75 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java
@@ -95,6 +95,8 @@ public class MethodReferenceNode extends ExpressionNode {
map.put("integral", mapArgRef().forOperator("$integral").mappingParametersTo("input", "unit"));
map.put("sin", singleArgRef().forOperator("$sin"));
map.put("sinh", singleArgRef().forOperator("$sinh"));
+ map.put("cos", singleArgRef().forOperator("$cos"));
+ map.put("cosh", singleArgRef().forOperator("$cosh"));
map.put("tan", singleArgRef().forOperator("$tan"));
map.put("tanh", singleArgRef().forOperator("$tanh"));
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperatorsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperatorsUnitTests.java
index 9a77d093c..55d164756 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperatorsUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArithmeticOperatorsUnitTests.java
@@ -110,6 +110,34 @@ class ArithmeticOperatorsUnitTests {
.isEqualTo(Document.parse("{ $sinh : { $degreesToRadians : \"$angle\" } }"));
}
+ @Test // GH-3710
+ void rendersCos() {
+
+ assertThat(valueOf("angle").cos().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $cos : \"$angle\" }"));
+ }
+
+ @Test // GH-3710
+ void rendersCosWithValueInDegrees() {
+
+ assertThat(valueOf("angle").cos(AngularDimension.DEGREES).toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $cos : { $degreesToRadians : \"$angle\" } }"));
+ }
+
+ @Test // GH-3710
+ void rendersCosh() {
+
+ assertThat(valueOf("angle").cosh().toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $cosh : \"$angle\" }"));
+ }
+
+ @Test // GH-3710
+ void rendersCoshWithValueInDegrees() {
+
+ assertThat(valueOf("angle").cosh(AngularDimension.DEGREES).toDocument(Aggregation.DEFAULT_CONTEXT))
+ .isEqualTo(Document.parse("{ $cosh : { $degreesToRadians : \"$angle\" } }"));
+ }
+
@Test // GH-3730
void rendersTan() {
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java
index cc59a9170..e30f7f9fb 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java
@@ -1014,6 +1014,16 @@ public class SpelExpressionTransformerUnitTests {
assertThat(transform("sinh(angle)")).isEqualTo(Document.parse("{ \"$sinh\" : \"$angle\"}"));
}
+ @Test // GH-3710
+ void shouldRenderCos() {
+ assertThat(transform("cos(angle)")).isEqualTo(Document.parse("{ \"$cos\" : \"$angle\"}"));
+ }
+
+ @Test // GH-3710
+ void shouldRenderCosh() {
+ assertThat(transform("cosh(angle)")).isEqualTo(Document.parse("{ \"$cosh\" : \"$angle\"}"));
+ }
+
@Test // GH-3730
void shouldRenderTan() {
assertThat(transform("tan(angle)")).isEqualTo(Document.parse("{ \"$tan\" : \"$angle\"}"));