| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF 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 |
| * <p> |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * <p> |
| * 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. |
| */ |
| |
| package org.apache.tajo.engine.function; |
| |
| import org.apache.tajo.catalog.Schema; |
| import org.apache.tajo.catalog.SchemaBuilder; |
| import org.apache.tajo.datum.NullDatum; |
| import org.apache.tajo.engine.eval.ExprTestBase; |
| import org.apache.tajo.exception.TajoException; |
| import org.junit.Test; |
| |
| import static org.apache.tajo.common.TajoDataTypes.Type.*; |
| |
| public class TestMathFunctions extends ExprTestBase { |
| @Test |
| public void testRound() throws TajoException { |
| testSimpleEval("select round(5.1) as col1 ", new String[]{"5"}); |
| testSimpleEval("select round(5.5) as col1 ", new String[]{"6"}); |
| testSimpleEval("select round(5.6) as col1 ", new String[]{"6"}); |
| |
| testSimpleEval("select round(-5.1) as col1 ", new String[]{"-5"}); |
| testSimpleEval("select round(-5.5) as col1 ", new String[]{"-6"}); |
| testSimpleEval("select round(-5.6) as col1 ", new String[]{"-6"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.4", "select round(col1 + col2 + col3) from table1", |
| new String[]{"2"}); |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", INT4) |
| .add("col2", INT8) |
| .add("col3", FLOAT4) |
| .add("col4", FLOAT8) |
| .build(); |
| |
| testEval(schema2, "table1", "9,9,9.5,9.5", |
| "select round(col1), round (col2), round(col3), round(col4) from table1", |
| new String[]{"9", "9", "10", "10"}); |
| } |
| |
| @Test |
| public void testFloor() throws TajoException { |
| testSimpleEval("select floor(5.1) as col1 ", new String[]{"5"}); |
| testSimpleEval("select floor(5.5) as col1 ", new String[]{"5"}); |
| testSimpleEval("select floor(5.6) as col1 ", new String[]{"5"}); |
| |
| testSimpleEval("select floor(-5.1) as col1 ", new String[]{"-6"}); |
| testSimpleEval("select floor(-5.6) as col1 ", new String[]{"-6"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.4", "select floor(col1 + col2 + col3) from table1", |
| new String[]{"1"}); |
| } |
| |
| @Test |
| public void testCeil() throws TajoException { |
| testSimpleEval("select ceil(5.0) as col1 ", new String[]{"5"}); |
| testSimpleEval("select ceil(5.1) as col1 ", new String[]{"6"}); |
| testSimpleEval("select ceil(5.5) as col1 ", new String[]{"6"}); |
| testSimpleEval("select ceil(5.6) as col1 ", new String[]{"6"}); |
| |
| testSimpleEval("select ceil(-5.1) as col1 ", new String[]{"-5"}); |
| testSimpleEval("select ceil(-5.6) as col1 ", new String[]{"-5"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select ceil(col1 + col2 + col3) from table1", |
| new String[]{"2"}); |
| } |
| |
| @Test |
| public void testCeiling() throws TajoException { |
| testSimpleEval("select ceiling(5.0) as col1 ", new String[]{"5"}); |
| testSimpleEval("select ceiling(5.1) as col1 ", new String[]{"6"}); |
| testSimpleEval("select ceiling(5.5) as col1 ", new String[]{"6"}); |
| testSimpleEval("select ceiling(5.6) as col1 ", new String[]{"6"}); |
| |
| testSimpleEval("select ceiling(-5.1) as col1 ", new String[]{"-5"}); |
| testSimpleEval("select ceiling(-5.6) as col1 ", new String[]{"-5"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select ceiling(col1 + col2 + col3) from table1", |
| new String[]{"2"}); |
| } |
| |
| @Test |
| public void testSin() throws TajoException { |
| testSimpleEval("select sin(0.0) as col1 ", new String[]{"0.0"}); |
| testSimpleEval("select sin(0.7) as col1 ", new String[]{"0.644217687237691"}); |
| testSimpleEval("select sin(1.2) as col1 ", new String[]{"0.9320390859672263"}); |
| testSimpleEval("select sin(-0.5) as col1 ", new String[]{"-0.479425538604203"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select sin(col1 + col2 + col3) from table1", |
| new String[]{"0.963558185417193"}); |
| } |
| |
| |
| @Test |
| public void testCos() throws TajoException { |
| testSimpleEval("select cos(0.0) as col1 ", new String[]{"1.0"}); |
| testSimpleEval("select cos(0.7) as col1 ", new String[]{"0.7648421872844885"}); |
| testSimpleEval("select cos(1.2) as col1 ", new String[]{"0.3623577544766736"}); |
| testSimpleEval("select cos(-0.5) as col1 ", new String[]{"0.8775825618903728"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select cos(col1 + col2 + col3) from table1", |
| new String[]{"0.26749882862458735"}); |
| } |
| |
| @Test |
| public void testTan() throws TajoException { |
| testSimpleEval("select tan(0.0) as col1 ", new String[]{"0.0"}); |
| testSimpleEval("select tan(0.3) as col1 ", new String[]{"0.30933624960962325"}); |
| testSimpleEval("select tan(0.8) as col1 ", new String[]{"1.0296385570503641"}); |
| testSimpleEval("select tan(-0.5) as col1 ", new String[]{"-0.5463024898437905"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select tan(col1 - col2 - col3) from table1", |
| new String[]{"0.8422883804630795"}); |
| } |
| |
| @Test |
| public void testAsin() throws TajoException { |
| testSimpleEval("select asin(0.0) as col1 ", new String[]{"0.0"}); |
| testSimpleEval("select asin(0.3) as col1 ", new String[]{"0.3046926540153975"}); |
| testSimpleEval("select asin(0.8) as col1 ", new String[]{"0.9272952180016123"}); |
| testSimpleEval("select asin(-0.5) as col1 ", new String[]{"-0.5235987755982989"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select asin(col1 - col2 - col3) from table1", |
| new String[]{"0.7753974966107532"}); |
| } |
| |
| @Test |
| public void testAcos() throws TajoException { |
| testSimpleEval("select acos(0.0) as col1 ", new String[]{"1.5707963267948966"}); |
| testSimpleEval("select acos(0.3) as col1 ", new String[]{"1.2661036727794992"}); |
| testSimpleEval("select acos(0.8) as col1 ", new String[]{"0.6435011087932843"}); |
| testSimpleEval("select acos(-0.5) as col1 ", new String[]{"2.0943951023931957"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select acos(col1 - col2 - col3) from table1", |
| new String[]{"0.7953988301841435"}); |
| } |
| |
| @Test |
| public void testAtan() throws TajoException { |
| testSimpleEval("select atan(0.0) as col1 ", new String[]{"0.0"}); |
| testSimpleEval("select atan(0.8) as col1 ", new String[]{"0.6747409422235527"}); |
| testSimpleEval("select atan(1.2) as col1 ", new String[]{"0.8760580505981934"}); |
| testSimpleEval("select atan(-0.5) as col1 ", new String[]{"-0.4636476090008061"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select atan(col1 + col2 + col3) from table1", |
| new String[]{"0.9151007005533605"}); |
| } |
| |
| @Test |
| public void testAtan2() throws TajoException { |
| testSimpleEval("select atan2(0.8, 0.0) as col1 ", new String[]{"1.5707963267948966"}); |
| testSimpleEval("select atan2(0.8, 1.1) as col1 ", new String[]{"0.628796286415433"}); |
| testSimpleEval("select atan2(2.7, 0.3) as col1 ", new String[]{"1.460139105621001"}); |
| testSimpleEval("select atan2(-0.5, 0.3) as col1 ", new String[]{"-1.0303768265243125"}); |
| testSimpleEval("select atan2(-0.2, -1.3) as col1 ", new String[]{"-2.988943325194528"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select atan2(col1 + col2, col3) from table1", |
| new String[]{"1.4876550949064553"}); |
| } |
| |
| @Test |
| public void testMod() throws TajoException { |
| testSimpleEval("select mod(9,4) as col1 ", new String[]{"1"}); |
| testSimpleEval("select mod(200000000001,200000000000) as col1 ", new String[]{"1"}); |
| testSimpleEval("select mod(200000000000,2) as col1 ", new String[]{"0"}); |
| testSimpleEval("select mod(2,200000000000) as col1 ", new String[]{"2"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", INT8) |
| .add("col2", INT8) |
| .add("col3", INT8) |
| .build(); |
| |
| testEval(schema, "table1", "9,2,3", "select mod(col1 + col2, col3) from table1", |
| new String[]{"2"}); |
| } |
| |
| @Test |
| public void testDiv() throws TajoException { |
| testSimpleEval("select div(9,4) as col1 ", new String[]{"2"}); |
| testSimpleEval("select div(200000000001,200000000000) as col1 ", new String[]{"1"}); |
| testSimpleEval("select div(200000000000,2) as col1 ", new String[]{"100000000000"}); |
| testSimpleEval("select div(2,200000000000) as col1 ", new String[]{"0"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", INT8) |
| .add("col2", INT8) |
| .add("col3", INT8) |
| .build(); |
| |
| testEval(schema, "table1", "9,2,3", "select div(col1 + col2, col3) from table1", |
| new String[]{"3"}); |
| } |
| |
| @Test |
| public void testSign() throws TajoException { |
| testSimpleEval("select sign(2) as col1 ", new String[]{"1.0"}); |
| testSimpleEval("select sign(2.345) as col1 ", new String[]{"1.0"}); |
| testSimpleEval("select sign(0.3) as col1 ", new String[]{"1.0"}); |
| |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT4) |
| .add("col3", FLOAT4) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select sign(col1 + col2 + col3) from table1", |
| new String[]{"1.0"}); |
| |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema2, "table1", "1.0, 0.2, 0.1", "select sign(col1 + col2 + col3) from table1", |
| new String[]{"1.0"}); |
| } |
| |
| @Test |
| public void testSqrt() throws TajoException { |
| testSimpleEval("select sqrt(27.0) as col1 ", new String[]{"5.196152422706632"}); |
| testSimpleEval("select sqrt(64.0) as col1 ", new String[]{"8.0"}); |
| testSimpleEval("select sqrt(8.0) as col1 ", new String[]{"2.8284271247461903"}); |
| |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT4) |
| .add("col3", FLOAT4) |
| .build(); |
| |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select sqrt(col1 + col2 + col3) from table1", |
| new String[]{"1.1401754564651765"}); |
| |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema2, "table1", "1.0, 0.2, 0.1", "select sqrt(col1 + col2 + col3) from table1", |
| new String[]{"1.140175425099138"}); |
| } |
| |
| @Test |
| public void testExp() throws TajoException { |
| testSimpleEval("select exp(1.0) as col1 ", new String[]{String.valueOf(Math.exp(1.0d))}); |
| testSimpleEval("select exp(1.1) as col1 ", new String[]{String.valueOf(Math.exp(1.1d))}); |
| testSimpleEval("select exp(1.2) as col1 ", new String[]{String.valueOf(Math.exp(1.2d))}); |
| |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .build(); |
| |
| testEval(schema, "table1", "1.123", "select exp(col1) from table1", |
| new String[]{String.valueOf(Math.exp(1.123f))}); |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .build(); |
| |
| testEval(schema2, "table1", "1.123", "select exp(col1) from table1", |
| new String[]{String.valueOf(Math.exp(1.123d))}); |
| } |
| |
| |
| @Test |
| public void testAbs() throws TajoException { |
| testSimpleEval("select abs(9) as col1 ", new String[]{"9"}); |
| testSimpleEval("select abs(-9) as col1 ", new String[]{"9"}); |
| testSimpleEval("select abs(200000000000) as col1 ", new String[]{"200000000000"}); |
| testSimpleEval("select abs(-200000000000) as col1 ", new String[]{"200000000000"}); |
| testSimpleEval("select abs(2.0) as col1 ", new String[]{"2.0"}); |
| testSimpleEval("select abs(-2.0) as col1 ", new String[]{"2.0"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT4) |
| .build(); |
| testEval(schema, "table1", "0.39,-0.39", "select abs(col1), abs(col2) from table1", new String[]{"0.39", "0.39"}); |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .build(); |
| testEval(schema2, "table1", "0.033312347,-0.033312347", "select abs(col1), abs(col2) from table1", |
| new String[]{"0.033312347", "0.033312347"}); |
| } |
| |
| @Test |
| public void testCbrt() throws TajoException { |
| testSimpleEval("select cbrt(27.0) as col1 ", new String[]{"3.0"}); |
| testSimpleEval("select cbrt(64.0) as col1 ", new String[]{"4.0"}); |
| testSimpleEval("select cbrt(8.0) as col1 ", new String[]{"2.0"}); |
| |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT4) |
| .add("col3", FLOAT4) |
| .build(); |
| testEval(schema, "table1", "1.0, 0.2, 0.1", "select cbrt(col1 + col2 + col3) from table1", |
| new String[]{"1.0913929030771317"}); |
| |
| Schema schema2 = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| testEval(schema2, "table1", "1.0, 0.2, 0.1", "select cbrt(col1 + col2 + col3) from table1", |
| new String[]{"1.091392883061106"}); |
| } |
| |
| @Test |
| public void testDegrees() throws TajoException { |
| testSimpleEval("select degrees(0.0) as col1 ", new String[]{String.valueOf(Math.toDegrees(0.0))}); |
| testSimpleEval("select degrees(0.8) as col1 ", new String[]{String.valueOf(Math.toDegrees(0.8))}); |
| testSimpleEval("select degrees(2.7) as col1 ", new String[]{String.valueOf(Math.toDegrees(2.7))}); |
| testSimpleEval("select degrees(-0.8) as col1 ", new String[]{String.valueOf(Math.toDegrees(-0.8))}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "0.8,2.7,-0.8", "select degrees(col1), degrees(col2), degrees(col3) from table1", |
| new String[]{ |
| String.valueOf(Math.toDegrees((float) 0.8)), |
| String.valueOf(Math.toDegrees(2.7)), |
| String.valueOf(Math.toDegrees(-0.8)) |
| }); |
| } |
| |
| @Test |
| public void testPow() throws TajoException { |
| testSimpleEval("select pow(9,3) as col1 ", new String[]{String.valueOf(Math.pow(9, 3))}); |
| testSimpleEval("select pow(1.0,3) as col1 ", new String[]{String.valueOf(Math.pow(1.0, 3))}); |
| testSimpleEval("select pow(20.1,3.1) as col1 ", new String[]{String.valueOf(Math.pow(20.1, 3.1))}); |
| testSimpleEval("select pow(null,3.1) as col1 ", new String[]{NullDatum.get().toString()}); |
| testSimpleEval("select pow(20.1,null) as col1 ", new String[]{NullDatum.get().toString()}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT8) |
| .add("col3", INT4) |
| .add("col4", INT8) |
| .build(); |
| |
| testEval(schema, "table1", "0.4,2.7,3,2", "select pow(col1, col2), pow(col3, col4) from table1", |
| new String[]{ |
| String.valueOf(Math.pow((float) 0.4, 2.7)), |
| String.valueOf(Math.pow(3, 2)) |
| }); |
| } |
| |
| @Test |
| public void testRadians() throws TajoException { |
| testSimpleEval("select radians(0.0) as col1 ", new String[]{String.valueOf(Math.toRadians(0.0))}); |
| testSimpleEval("select radians(0.8) as col1 ", new String[]{String.valueOf(Math.toRadians(0.8))}); |
| testSimpleEval("select radians(2.7) as col1 ", new String[]{String.valueOf(Math.toRadians(2.7))}); |
| testSimpleEval("select radians(-0.8) as col1 ", new String[]{String.valueOf(Math.toRadians(-0.8))}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT4) |
| .add("col2", FLOAT8) |
| .add("col3", FLOAT8) |
| .build(); |
| |
| testEval(schema, "table1", "0.8,2.7,-0.8", "select radians(col1), radians(col2), radians(col3) from table1", |
| new String[]{ |
| String.valueOf(Math.toRadians((float) 0.8)), |
| String.valueOf(Math.toRadians(2.7)), |
| String.valueOf(Math.toRadians(-0.8)) |
| }); |
| } |
| |
| @Test |
| public void testPi() throws TajoException { |
| testSimpleEval("select pi() as col1 ", new String[]{String.valueOf(Math.PI)}); |
| } |
| |
| @Test |
| public void testRoundWithSpecifiedPrecision() throws TajoException { |
| // TODO - in order to make this test possible, testSimpleEval should take session variables. Now, we disable it. |
| // divide zero |
| // try { |
| // testSimpleEval("select round(10.0/0.0,2) ", new String[]{""}); |
| // fail("10.0/0 should throw InvalidOperationException"); |
| // } catch (InvalidOperationException e) { |
| // //success |
| // } |
| |
| testSimpleEval("select round(42.4382,2) ", new String[]{"42.44"}); |
| testSimpleEval("select round(-42.4382,2) ", new String[]{"-42.44"}); |
| testSimpleEval("select round(-425,2) ", new String[]{"-425.0"}); |
| testSimpleEval("select round(425,2) ", new String[]{"425.0"}); |
| |
| testSimpleEval("select round(1234567890,0) ", new String[]{"1.23456789E9"}); |
| testSimpleEval("select round(1234567890,1) ", new String[]{"1.23456789E9"}); |
| testSimpleEval("select round(1234567890,2) ", new String[]{"1.23456789E9"}); |
| |
| testSimpleEval("select round(1.2345678901234567,13) ", new String[]{"1.2345678901235"}); |
| testSimpleEval("select round(1234567890.1234567,3) ", new String[]{"1.234567890123E9"}); |
| testSimpleEval("select round(1234567890.1234567,5) ", new String[]{"1.23456789012346E9"}); |
| |
| Schema schema = SchemaBuilder.builder() |
| .add("col1", FLOAT8) |
| .add("col2", INT4) |
| .build(); |
| |
| testEval(schema, "table1", ",", "select round(col1, col2) from table1", new String[]{NullDatum.get().toString()}); |
| } |
| } |