/* * Licensed to Crate under one or more contributor license agreements. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. Crate licenses this file * to you under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * However, if you have executed another commercial license agreement * with Crate these terms will supersede the license and you may use the * software solely pursuant to the terms of the relevant commercial * agreement. */ package io.crate.operation.scalar.arithmetic; import io.crate.analyze.symbol.Literal; import io.crate.operation.scalar.AbstractScalarFunctionsTest; import io.crate.types.DataTypes; import org.junit.Test; import static io.crate.testing.SymbolMatchers.isFunction; import static io.crate.testing.SymbolMatchers.isLiteral; public class TrigonometricFunctionsTest extends AbstractScalarFunctionsTest { @Test public void testEvaluate() throws Exception { assertEvaluate("sin(double_val)", 0.8414709848078965, Literal.of(1.0)); assertEvaluate("sin(float_val)", 0.9092974268256817, Literal.of(2.0F)); assertEvaluate("sin(x)", 0.1411200080598672, Literal.of(3L)); assertEvaluate("sin(id)", -0.7568024953079282, Literal.of(4)); assertEvaluate("sin(short_val)", -0.9589242746631385, Literal.of(DataTypes.SHORT, (short) 5)); assertEvaluate("asin(double_val)", 0.12371534584255098, Literal.of(0.1234)); assertEvaluate("asin(float_val)", 0.44682008883801516, Literal.of(0.4321F)); assertEvaluate("asin(x)", 0.0, Literal.of(0L)); assertEvaluate("asin(id)", 1.5707963267948966, Literal.of(1)); assertEvaluate("asin(short_val)", -1.5707963267948966, Literal.of(DataTypes.SHORT, (short) -1)); assertEvaluate("cos(double_val)", 0.5403023058681398, Literal.of(1.0)); assertEvaluate("cos(float_val)", -0.4161468365471424, Literal.of(2.0F)); assertEvaluate("cos(x)", -0.9899924966004454, Literal.of(3L)); assertEvaluate("cos(id)", -0.6536436208636119, Literal.of(4)); assertEvaluate("cos(short_val)", 0.28366218546322625, Literal.of(DataTypes.SHORT, (short) 5)); assertEvaluate("acos(double_val)", 1.4470809809523457, Literal.of(0.1234)); assertEvaluate("acos(float_val)", 1.1239762379568814, Literal.of(0.4321F)); assertEvaluate("acos(x)", 1.5707963267948966, Literal.of(0L)); assertEvaluate("acos(id)", 0.0, Literal.of(1)); assertEvaluate("acos(short_val)", 3.141592653589793, Literal.of(DataTypes.SHORT, (short) -1)); assertEvaluate("tan(double_val)", 1.5574077246549023, Literal.of(1.0)); assertEvaluate("tan(float_val)", -2.185039863261519, Literal.of(2.0F)); assertEvaluate("tan(x)", -0.1425465430742778, Literal.of(3L)); assertEvaluate("tan(id)", 1.1578212823495777, Literal.of(4)); assertEvaluate("tan(short_val)", -3.380515006246586, Literal.of(DataTypes.SHORT, (short) 5)); assertEvaluate("atan(double_val)", 0.12277930094473836, Literal.of(0.1234)); assertEvaluate("atan(float_val)", 0.4078690066146179, Literal.of(0.4321F)); assertEvaluate("atan(x)", 0.0, Literal.of(0L)); assertEvaluate("atan(id)", 0.7853981633974483, Literal.of(1)); assertEvaluate("atan(short_val)", -0.7853981633974483, Literal.of(DataTypes.SHORT, (short) -1)); } @Test public void testEvaluateAsinOnIllegalArgument() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("input value 2.0 is out of range. Values must be in range of [-1.0, 1.0]"); assertEvaluate("asin(2.0)", 0); } @Test public void testEvaluateAcosOnIllegalArgument() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("input value 2.0 is out of range. Values must be in range of [-1.0, 1.0]"); assertEvaluate("acos(2.0)", 0); } @Test public void testEvaluateAtanOnIllegalArgument() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("input value 2.0 is out of range. Values must be in range of [-1.0, 1.0]"); assertEvaluate("atan(2.0)", 0); } @Test public void testEvaluateOnNull() throws Exception { assertEvaluate("sin(null)", null); assertEvaluate("asin(null)", null); assertEvaluate("cos(null)", null); assertEvaluate("acos(null)", null); assertEvaluate("tan(null)", null); assertEvaluate("atan(null)", null); } @Test public void testNormalize() throws Exception { // SinFunction assertNormalize("sin(1.0)", isLiteral(0.8414709848078965, DataTypes.DOUBLE)); assertNormalize("sin(cast (2.0 as float))", isLiteral(0.9092974268256817, DataTypes.DOUBLE)); assertNormalize("sin(3)", isLiteral(0.1411200080598672, DataTypes.DOUBLE)); assertNormalize("sin(cast (4 as integer))", isLiteral(-0.7568024953079282, DataTypes.DOUBLE)); assertNormalize("sin(cast (5 as short))", isLiteral(-0.9589242746631385, DataTypes.DOUBLE)); // AsinFunction assertNormalize("asin(0.1234)", isLiteral(0.12371534584255098, DataTypes.DOUBLE)); assertNormalize("asin(cast (0.4321 as float))", isLiteral(0.44682008883801516, DataTypes.DOUBLE)); assertNormalize("asin(0)", isLiteral(0.0, DataTypes.DOUBLE)); assertNormalize("asin(cast (1 as integer))", isLiteral(1.5707963267948966, DataTypes.DOUBLE)); assertNormalize("asin(cast (-1 as short))", isLiteral(-1.5707963267948966, DataTypes.DOUBLE)); // CosFunction assertNormalize("cos(1.0)", isLiteral(0.5403023058681398, DataTypes.DOUBLE)); assertNormalize("cos(cast (2.0 as float))", isLiteral(-0.4161468365471424, DataTypes.DOUBLE)); assertNormalize("cos(3)", isLiteral(-0.9899924966004454, DataTypes.DOUBLE)); assertNormalize("cos(cast (4 as integer))", isLiteral(-0.6536436208636119, DataTypes.DOUBLE)); assertNormalize("cos(cast (5 as short))", isLiteral(0.28366218546322625, DataTypes.DOUBLE)); // AcosFunction assertNormalize("acos(0.1234)", isLiteral(1.4470809809523457, DataTypes.DOUBLE)); assertNormalize("acos(cast (0.4321 as float))", isLiteral(1.1239762379568814, DataTypes.DOUBLE)); assertNormalize("acos(0)", isLiteral(1.5707963267948966, DataTypes.DOUBLE)); assertNormalize("acos(cast (1 as integer))", isLiteral(0.0, DataTypes.DOUBLE)); assertNormalize("acos(cast (-1 as short))", isLiteral(3.141592653589793, DataTypes.DOUBLE)); // TanFunction assertNormalize("tan(1.0)", isLiteral(1.5574077246549023, DataTypes.DOUBLE)); assertNormalize("tan(cast (2.0 as float))", isLiteral(-2.185039863261519, DataTypes.DOUBLE)); assertNormalize("tan(3)", isLiteral(-0.1425465430742778, DataTypes.DOUBLE)); assertNormalize("tan(cast (4 as integer))", isLiteral(1.1578212823495777, DataTypes.DOUBLE)); assertNormalize("tan(cast (5 as short))", isLiteral(-3.380515006246586, DataTypes.DOUBLE)); // AtanFunction assertNormalize("atan(0.1234)", isLiteral(0.12277930094473836, DataTypes.DOUBLE)); assertNormalize("atan(cast (0.4321 as float))", isLiteral(0.4078690066146179, DataTypes.DOUBLE)); assertNormalize("atan(0)", isLiteral(0.0, DataTypes.DOUBLE)); assertNormalize("atan(cast (1 as integer))", isLiteral(0.7853981633974483, DataTypes.DOUBLE)); assertNormalize("atan(cast (-1 as short))", isLiteral(-0.7853981633974483, DataTypes.DOUBLE)); } @Test public void testNormalizeOnNull() throws Exception { // SinFunction assertNormalize("sin(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("sin(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("sin(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("sin(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("sin(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); // AsinFunction assertNormalize("asin(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("asin(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("asin(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("asin(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("asin(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); // CosFunction assertNormalize("cos(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("cos(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("cos(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("cos(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("cos(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); // AcosFunction assertNormalize("acos(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("acos(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("acos(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("acos(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("acos(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); // TanFunction assertNormalize("tan(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("tan(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("tan(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("tan(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("tan(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); // AtanFunction assertNormalize("atan(cast(null as double))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("atan(cast(null as float))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("atan(cast(null as long))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("atan(cast(null as integer))", isLiteral(null, DataTypes.DOUBLE)); assertNormalize("atan(cast(null as short))", isLiteral(null, DataTypes.DOUBLE)); } @Test public void testNormalizeReference() throws Exception { assertNormalize("sin(age)", isFunction("sin")); assertNormalize("asin(age)", isFunction("asin")); assertNormalize("cos(age)", isFunction("cos")); assertNormalize("acos(age)", isFunction("acos")); assertNormalize("tan(age)", isFunction("tan")); assertNormalize("atan(age)", isFunction("atan")); } }