Add several unary numeric builtin functions.
- newly added functions include: acos, asin, atan, cos, exp, ln,
log, sign, sin, sqrt and tan;
- refactor and simplify numeric function implementations.
Change-Id: Ic7f945450f3cf8da543b2d68c29ef6eb0f4699d7
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1086
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
index 3201d9e..ee4dc32 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/FunctionCollection.java
@@ -163,18 +163,29 @@
import org.apache.asterix.runtime.evaluators.functions.IsUnknownDescriptor;
import org.apache.asterix.runtime.evaluators.functions.LenDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NotDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericACosDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericASinDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericATanDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericAbsDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericAddDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericCaretDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericCeilingDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericCosDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericDivideDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericExpDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericFloorDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericLnDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericLogDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericModuloDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericMultiplyDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericRoundDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericRoundHalfToEven2Descriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericRoundHalfToEvenDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSignDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSinDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericSqrtDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericSubDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.NumericTanDescriptor;
import org.apache.asterix.runtime.evaluators.functions.NumericUnaryMinusDescriptor;
import org.apache.asterix.runtime.evaluators.functions.OrDescriptor;
import org.apache.asterix.runtime.evaluators.functions.OrderedListConstructorDescriptor;
@@ -428,6 +439,17 @@
functionsToInjectUnkownHandling.add(NumericRoundDescriptor.FACTORY);
functionsToInjectUnkownHandling.add(NumericRoundHalfToEvenDescriptor.FACTORY);
functionsToInjectUnkownHandling.add(NumericRoundHalfToEven2Descriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericACosDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericASinDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericATanDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericCosDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericSinDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericTanDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericExpDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericLnDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericLogDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericSqrtDescriptor.FACTORY);
+ functionsToInjectUnkownHandling.add(NumericSignDescriptor.FACTORY);
// Comparisons.
functionsToInjectUnkownHandling.add(EqualsDescriptor.FACTORY);
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
index 78d6362..0fdf31a 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
@@ -1,6 +1,6 @@
Query:
SELECT [
-FunctionCall null.SQRT@1[
+FunctionCall null.sqrt@1[
OperatorExpr [
FieldAccessor [
Variable [ Name=$t ]
@@ -23,7 +23,7 @@
Groupby
Variable [ Name=$root ]
:=
- FunctionCall null.SQRT@1[
+ FunctionCall null.sqrt@1[
OperatorExpr [
FieldAccessor [
Variable [ Name=$t ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
index 89e3b4b..3177516 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
@@ -1,6 +1,6 @@
Query:
SELECT [
-FunctionCall null.SQRT@1[
+FunctionCall null.sqrt@1[
OperatorExpr [
FunctionCall Metadata.dataset@1[
LiteralExpr [STRING] [t.a]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
index 056fe36..9bf4094 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
@@ -4,7 +4,7 @@
(
LiteralExpr [STRING] [root]
:
- FunctionCall null.SQRT@1[
+ FunctionCall null.sqrt@1[
OperatorExpr [
FieldAccessor [
Variable [ Name=$t ]
@@ -28,7 +28,7 @@
Groupby
Variable [ Name=$root ]
:=
- FunctionCall null.SQRT@1[
+ FunctionCall null.sqrt@1[
OperatorExpr [
FieldAccessor [
Variable [ Name=$t ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/acos/acos.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/acos/acos.1.query.sqlpp
new file mode 100644
index 0000000..c9ae50c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/acos/acos.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": acos(10.0),
+ "b": acos(0.5f),
+ "c": acos(100),
+ "d": acos(int32("0")),
+ "e": acos(int8("-1")),
+ "f": acos(int16("1")),
+ "g": acos(null),
+ "h": acos(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/asin/asin.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/asin/asin.1.query.sqlpp
new file mode 100644
index 0000000..4807859
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/asin/asin.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": asin(10.0),
+ "b": asin(0.5f),
+ "c": asin(100),
+ "d": asin(int32("0")),
+ "e": asin(int8("-1")),
+ "f": asin(int16("1")),
+ "g": asin(null),
+ "h": asin(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/atan/atan.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/atan/atan.1.query.sqlpp
new file mode 100644
index 0000000..1ca0e6e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/atan/atan.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": atan(10.0),
+ "b": atan(0.5f),
+ "c": atan(100),
+ "d": atan(int32("0")),
+ "e": atan(int8("-1")),
+ "f": atan(int16("1")),
+ "g": atan(null),
+ "h": atan(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/cos/cos.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/cos/cos.1.query.sqlpp
new file mode 100644
index 0000000..78940b2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/cos/cos.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": cos(120.0),
+ "b": cos(90.5f),
+ "c": cos(int32("90")),
+ "d": cos(int16("0")),
+ "e": cos(int8("-45")),
+ "f": cos(1),
+ "g": cos(null),
+ "h": cos(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/exp/exp.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/exp/exp.1.query.sqlpp
new file mode 100644
index 0000000..b3f0354
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/exp/exp.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": exp(120.0),
+ "b": exp(90.5f),
+ "c": exp(int32("90")),
+ "d": exp(int16("0")),
+ "e": exp(int8("-45")),
+ "f": exp(1),
+ "g": exp(null),
+ "h": exp(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ln/ln.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ln/ln.1.query.sqlpp
new file mode 100644
index 0000000..ac0b71e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ln/ln.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+
+{
+ "a": ln(120.0),
+ "b": ln(90.5f),
+ "c": ln(int32("90")),
+ "d": ln(int16("0")),
+ "e": ln(int8("-45")),
+ "f": ln(1),
+ "g": ln(null),
+ "h": ln(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/log/log.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/log/log.1.query.sqlpp
new file mode 100644
index 0000000..c9fc2f4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/log/log.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": log(120.0),
+ "b": log(90.5f),
+ "c": log(int32("90")),
+ "d": log(int16("0")),
+ "e": log(int8("-45")),
+ "f": log(1),
+ "g": log(null),
+ "h": log(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sign/sign.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sign/sign.1.query.sqlpp
new file mode 100644
index 0000000..a73cc55
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sign/sign.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": sign(120.0),
+ "b": sign(-90.5f),
+ "c": sign(int32("90")),
+ "d": sign(int16("0")),
+ "e": sign(int8("-45")),
+ "f": sign(1),
+ "g": sign(null),
+ "h": sign(missing)
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sin/sin.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sin/sin.1.query.sqlpp
new file mode 100644
index 0000000..c847b01
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sin/sin.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": sin(120.0),
+ "b": sin(90.5f),
+ "c": sin(int32("90")),
+ "d": sin(int16("0")),
+ "e": sin(int8("-45")),
+ "f": sin(1),
+ "g": sin(null),
+ "h": sin(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sqrt/sqrt.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sqrt/sqrt.1.query.sqlpp
new file mode 100644
index 0000000..09b6160
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/sqrt/sqrt.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": sqrt(120.0),
+ "b": sqrt(90.5f),
+ "c": sqrt(int32("90")),
+ "d": sqrt(int16("0")),
+ "e": sqrt(int8("-45")),
+ "f": sqrt(1),
+ "g": sqrt(null),
+ "h": sqrt(missing)
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/tan/tan.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/tan/tan.1.query.sqlpp
new file mode 100644
index 0000000..3cfa8b6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/tan/tan.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+{
+ "a": tan(120.0),
+ "b": tan(90.5f),
+ "c": tan(int32("90")),
+ "d": tan(int16("0")),
+ "e": tan(int8("-45")),
+ "f": tan(1),
+ "g": tan(null),
+ "h": tan(missing)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/acos/acos.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/acos/acos.1.adm
new file mode 100644
index 0000000..1bbc6b6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/acos/acos.1.adm
@@ -0,0 +1 @@
+{ "a": NaN, "b": 1.0471975511965979, "c": NaN, "d": 1.5707963267948966, "e": 3.141592653589793, "f": 0.0, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/asin/asin.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/asin/asin.1.adm
new file mode 100644
index 0000000..3208c37
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/asin/asin.1.adm
@@ -0,0 +1 @@
+{ "a": NaN, "b": 0.5235987755982989, "c": NaN, "d": 0.0, "e": -1.5707963267948966, "f": 1.5707963267948966, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/atan/atan.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/atan/atan.1.adm
new file mode 100644
index 0000000..1fb93a1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/atan/atan.1.adm
@@ -0,0 +1 @@
+{ "a": 1.4711276743037347, "b": 0.4636476090008061, "c": 1.5607966601082315, "d": 0.0, "e": -0.7853981633974483, "f": 0.7853981633974483, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/cos/cos.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/cos/cos.1.adm
new file mode 100644
index 0000000..1ab47ee
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/cos/cos.1.adm
@@ -0,0 +1 @@
+{ "a": 0.8141809705265618, "b": -0.8218264239151786, "c": -0.4480736161291702, "d": 1.0, "e": 0.5253219888177297, "f": 0.5403023058681398, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/exp/exp.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/exp/exp.1.adm
new file mode 100644
index 0000000..7a2e352
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/exp/exp.1.adm
@@ -0,0 +1 @@
+{ "a": 1.3041808783936323E52, "b": 2.012104870174333E39, "c": 1.2204032943178408E39, "d": 1.0, "e": 2.8625185805493937E-20, "f": 2.718281828459045, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ln/ln.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ln/ln.1.adm
new file mode 100644
index 0000000..598faa4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ln/ln.1.adm
@@ -0,0 +1 @@
+{ "a": 4.787491742782046, "b": 4.505349850705881, "c": 4.499809670330265, "d": -Infinity, "e": NaN, "f": 0.0, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/log/log.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/log/log.1.adm
new file mode 100644
index 0000000..5280bf9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/log/log.1.adm
@@ -0,0 +1 @@
+{ "a": 2.0791812460476247, "b": 1.9566485792052033, "c": 1.954242509439325, "d": -Infinity, "e": NaN, "f": 0.0, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sign/sign.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sign/sign.1.adm
new file mode 100644
index 0000000..7b48b45
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sign/sign.1.adm
@@ -0,0 +1 @@
+{ "a": 1, "b": -1, "c": 1, "d": 0, "e": -1, "f": 1, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sin/sin.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sin/sin.1.adm
new file mode 100644
index 0000000..0c090f5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sin/sin.1.adm
@@ -0,0 +1 @@
+{ "a": 0.5806111842123143, "b": 0.5697379476169631, "c": 0.8939966636005579, "d": 0.0, "e": -0.8509035245341184, "f": 0.8414709848078965, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sqrt/sqrt.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sqrt/sqrt.1.adm
new file mode 100644
index 0000000..7c776f4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/sqrt/sqrt.1.adm
@@ -0,0 +1 @@
+{ "a": 10.954451150103322, "b": 9.513148795220223, "c": 9.486832980505138, "d": 0.0, "e": NaN, "f": 1.0, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/tan/tan.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/tan/tan.1.adm
new file mode 100644
index 0000000..62a1053
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/tan/tan.1.adm
@@ -0,0 +1 @@
+{ "a": 0.7131230097859091, "b": -0.6932582489897723, "c": -1.995200412208242, "d": 0.0, "e": -1.6197751905438615, "f": 1.5574077246549023, "g": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 912b592..9548259 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -4234,6 +4234,61 @@
<!-- <expected-error>org.apache.asterix.common.exceptions.AsterixException</expected-error> -->
</compilation-unit>
</test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="acos">
+ <output-dir compare="Text">acos</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="asin">
+ <output-dir compare="Text">asin</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="atan">
+ <output-dir compare="Text">atan</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="cos">
+ <output-dir compare="Text">cos</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="sin">
+ <output-dir compare="Text">sin</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="tan">
+ <output-dir compare="Text">tan</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="exp">
+ <output-dir compare="Text">exp</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="ln">
+ <output-dir compare="Text">ln</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="log">
+ <output-dir compare="Text">log</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="sqrt">
+ <output-dir compare="Text">sqrt</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="numeric">
+ <compilation-unit name="sign">
+ <output-dir compare="Text">sign</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="open-closed">
<!--
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixBuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixBuiltinFunctions.java
index 97f0ace..d17be1a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixBuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AsterixBuiltinFunctions.java
@@ -199,6 +199,23 @@
"numeric-idiv", 2);
public static final FunctionIdentifier CARET = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "caret", 2);
public static final FunctionIdentifier NUMERIC_ABS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "abs", 1);
+ public static final FunctionIdentifier NUMERIC_ACOS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "acos",
+ 1);
+ public static final FunctionIdentifier NUMERIC_ASIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "asin",
+ 1);
+ public static final FunctionIdentifier NUMERIC_ATAN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "atan",
+ 1);
+ public static final FunctionIdentifier NUMERIC_COS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "cos", 1);
+ public static final FunctionIdentifier NUMERIC_SIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sin", 1);
+ public static final FunctionIdentifier NUMERIC_TAN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "tan", 1);
+ public static final FunctionIdentifier NUMERIC_EXP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "exp", 1);
+ public static final FunctionIdentifier NUMERIC_LN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ln", 1);
+ public static final FunctionIdentifier NUMERIC_LOG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "log", 1);
+ public static final FunctionIdentifier NUMERIC_SQRT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sqrt",
+ 1);
+ public static final FunctionIdentifier NUMERIC_SIGN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sign",
+ 1);
+
public static final FunctionIdentifier NUMERIC_CEILING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
"ceiling", 1);
public static final FunctionIdentifier NUMERIC_FLOOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "floor",
@@ -816,6 +833,17 @@
addPrivateFunction(NUMERIC_MOD, NumericAddSubMulDivTypeComputer.INSTANCE, true);
addPrivateFunction(NUMERIC_IDIV, AInt64TypeComputer.INSTANCE, true);
addFunction(NUMERIC_ABS, NumericUnaryFunctionTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_ACOS, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_ASIN, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_ATAN, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_COS, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_SIN, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_TAN, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_EXP, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_LN, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_LOG, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_SQRT, ADoubleTypeComputer.INSTANCE, true);
+ addFunction(NUMERIC_SIGN, AInt8TypeComputer.INSTANCE, true);
addFunction(NUMERIC_CEILING, NumericUnaryFunctionTypeComputer.INSTANCE, true);
addFunction(NUMERIC_FLOOR, NumericUnaryFunctionTypeComputer.INSTANCE, true);
addFunction(NUMERIC_ROUND, NumericUnaryFunctionTypeComputer.INSTANCE, true);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericDoubleFunctionEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericDoubleFunctionEval.java
new file mode 100644
index 0000000..28e54d1
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericDoubleFunctionEval.java
@@ -0,0 +1,65 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+/**
+ * An abstract class for functions that take a double value as the input and output a double value.
+ */
+abstract class AbstractUnaryNumericDoubleFunctionEval extends AbstractUnaryNumericFunctionEval {
+
+ public AbstractUnaryNumericDoubleFunctionEval(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory,
+ FunctionIdentifier funcID) throws AlgebricksException {
+ super(context, argEvalFactory, funcID);
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ processDouble(arg, resultPointable);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ processDouble(arg, resultPointable);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ processDouble(arg, resultPointable);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ processDouble(arg, resultPointable);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ processDouble(arg, resultPointable);
+ }
+
+ @Override
+ protected abstract void processDouble(double arg, IPointable resultPointable) throws AlgebricksException;
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
new file mode 100644
index 0000000..50ff0de
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
@@ -0,0 +1,211 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
+import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableFloat;
+import org.apache.asterix.om.base.AMutableInt16;
+import org.apache.asterix.om.base.AMutableInt32;
+import org.apache.asterix.om.base.AMutableInt64;
+import org.apache.asterix.om.base.AMutableInt8;
+import org.apache.asterix.om.base.IAObject;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * An abstract class for functions that take a numeric value as input and output a numeric value.
+ */
+abstract class AbstractUnaryNumericFunctionEval implements IScalarEvaluator {
+
+ // For the argument.
+ protected final IPointable argPtr = new VoidPointable();
+
+ // For the result.
+ protected final AMutableDouble aDouble = new AMutableDouble(0);
+ protected final AMutableFloat aFloat = new AMutableFloat(0);
+ protected final AMutableInt64 aInt64 = new AMutableInt64(0);
+ protected final AMutableInt32 aInt32 = new AMutableInt32(0);
+ protected final AMutableInt16 aInt16 = new AMutableInt16((short) 0);
+ protected final AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
+ private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+ private final DataOutput dataOutput = resultStorage.getDataOutput();
+
+ // The evaluator for the argument expression.
+ private final IScalarEvaluator argEval;
+
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer int8Serde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.AINT8);
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer int16Serde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.AINT16);
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer int32Serde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.AINT32);
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer int64Serde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.AINT64);
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer floatSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.AFLOAT);
+ @SuppressWarnings("rawtypes")
+ protected ISerializerDeserializer doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ADOUBLE);
+
+ // The function identifier, used for error messages.
+ private final FunctionIdentifier funcID;
+
+ public AbstractUnaryNumericFunctionEval(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory,
+ FunctionIdentifier funcID) throws AlgebricksException {
+ this.argEval = argEvalFactory.createScalarEvaluator(context);
+ this.funcID = funcID;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
+ resultStorage.reset();
+ argEval.evaluate(tuple, argPtr);
+ byte[] data = argPtr.getByteArray();
+ int offset = argPtr.getStartOffset();
+
+ if (data[offset] == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
+ byte val = AInt8SerializerDeserializer.getByte(data, offset + 1);
+ processInt8(val, result);
+ } else if (data[offset] == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
+ short val = AInt16SerializerDeserializer.getShort(data, offset + 1);
+ processInt16(val, result);
+ } else if (data[offset] == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
+ int val = AInt32SerializerDeserializer.getInt(data, offset + 1);
+ processInt32(val, result);
+ } else if (data[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
+ long val = AInt64SerializerDeserializer.getLong(data, offset + 1);
+ processInt64(val, result);
+ } else if (data[offset] == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
+ float val = AFloatSerializerDeserializer.getFloat(data, offset + 1);
+ processFloat(val, result);
+ } else if (data[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
+ double val = ADoubleSerializerDeserializer.getDouble(data, offset + 1);
+ processDouble(val, result);
+ } else {
+ throw new AlgebricksException(funcID + " expects a numeric input type, but gets "
+ + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(data[offset]));
+ }
+ }
+
+ /**
+ * Processes an int8 argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException;
+
+ /**
+ * Processes an int16 argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processInt16(short arg, IPointable resultPointable) throws AlgebricksException;
+
+ /**
+ * Processes an int32 argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processInt32(int arg, IPointable resultPointable) throws AlgebricksException;
+
+ /**
+ * Processes an int64 argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processInt64(long arg, IPointable resultPointable) throws AlgebricksException;
+
+ /**
+ * Processes a float argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processFloat(float arg, IPointable resultPointable) throws AlgebricksException;
+
+ /**
+ * Processes a double argument.
+ *
+ * @param arg
+ * , the value of the argument.
+ * @param resultPointable
+ * ,
+ * the pointable that should be set to the result location.
+ */
+ protected abstract void processDouble(double arg, IPointable resultPointable) throws AlgebricksException;
+
+ // Serializes result into the result storage.
+ @SuppressWarnings("unchecked")
+ protected void serialize(IAObject result, ISerializerDeserializer serde, IPointable resultPointable)
+ throws AlgebricksException {
+ try {
+ serde.serialize(result, dataOutput);
+ resultPointable.set(resultStorage);
+ } catch (IOException e) {
+ throw new AlgebricksException(e);
+ }
+ }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericACosDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericACosDescriptor.java
new file mode 100644
index 0000000..51609c3
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericACosDescriptor.java
@@ -0,0 +1,72 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericACosDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericACosDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_ACOS;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericACosEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericACosEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericACosEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericACosDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.acos(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericASinDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericASinDescriptor.java
new file mode 100644
index 0000000..1bd0f6e
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericASinDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericASinDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericASinDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_ASIN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericASinEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericASinEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericASinEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericASinDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.asin(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATanDescriptor.java
new file mode 100644
index 0000000..2d5a359
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATanDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericATanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericATanDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_ATAN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericATanEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericATanEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericATanEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericATanDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.atan(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAbsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAbsDescriptor.java
index 373547e..69edb6e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAbsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAbsDescriptor.java
@@ -23,40 +23,16 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.DataOutput;
-
-import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
-import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
-import org.apache.asterix.om.base.AMutableDouble;
-import org.apache.asterix.om.base.AMutableFloat;
-import org.apache.asterix.om.base.AMutableInt16;
-import org.apache.asterix.om.base.AMutableInt32;
-import org.apache.asterix.om.base.AMutableInt64;
-import org.apache.asterix.om.base.AMutableInt8;
import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public class NumericAbsDescriptor extends AbstractScalarFunctionDynamicDescriptor {
private static final long serialVersionUID = 1L;
@@ -73,86 +49,83 @@
}
@Override
- public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
return new IScalarEvaluatorFactory() {
private static final long serialVersionUID = 1L;
@Override
- public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws AlgebricksException {
-
- return new IScalarEvaluator() {
-
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable argPtr = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDouble aDouble = new AMutableDouble(0);
- private AMutableFloat aFloat = new AMutableFloat(0);
- private AMutableInt64 aInt64 = new AMutableInt64(0);
- private AMutableInt32 aInt32 = new AMutableInt32(0);
- private AMutableInt16 aInt16 = new AMutableInt16((short) 0);
- private AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
- @SuppressWarnings("rawtypes")
- private ISerializerDeserializer serde;
-
- @SuppressWarnings("unchecked")
- @Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
- resultStorage.reset();
- eval.evaluate(tuple, argPtr);
- byte[] data = argPtr.getByteArray();
- int offset = argPtr.getStartOffset();
-
- try {
- if (data[offset] == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT8);
- byte val = AInt8SerializerDeserializer.getByte(data, offset + 1);
- aInt8.setValue((val <= 0) ? (byte) (0 - val) : val);
- serde.serialize(aInt8, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT16);
- short val = AInt16SerializerDeserializer.getShort(data, offset + 1);
- aInt16.setValue((val <= 0) ? (short) (0 - val) : val);
- serde.serialize(aInt16, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT32);
- int val = AInt32SerializerDeserializer.getInt(data, offset + 1);
- aInt32.setValue((val <= 0) ? (0 - val) : val);
- serde.serialize(aInt32, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT64);
- long val = AInt64SerializerDeserializer.getLong(data, offset + 1);
- aInt64.setValue((val <= 0L) ? (0L - val) : val);
- serde.serialize(aInt64, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AFLOAT);
- float val = AFloatSerializerDeserializer.getFloat(data, offset + 1);
- aFloat.setValue((val <= 0.0f) ? 0.0f - val : val);
- serde.serialize(aFloat, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.ADOUBLE);
- double val = ADoubleSerializerDeserializer.getDouble(data, offset + 1);
- aDouble.setValue((val <= 0.0D) ? 0.0D - val : val);
- serde.serialize(aDouble, out);
- } else {
- throw new NotImplementedException(
- AsterixBuiltinFunctions.NUMERIC_ABS.getName() + ": not implemented for "
- + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(data[offset]));
- }
- } catch (HyracksDataException e) {
- throw new AlgebricksException(e);
- }
- result.set(resultStorage);
- }
- };
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericAbsEvaluator(ctx, args[0]);
}
};
}
+ private class NumericAbsEvaluator extends AbstractUnaryNumericFunctionEval {
+
+ NumericAbsEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericAbsDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aInt8.setValue((byte) (0 - arg));
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aInt16.setValue((short) (0 - arg));
+ serialize(aInt16, int16Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aInt32.setValue(0 - arg);
+ serialize(aInt32, int32Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aInt64.setValue(0L - arg);
+ serialize(aInt64, int64Serde, resultPointable);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0.0f) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aFloat.setValue(0.0f - arg);
+ serialize(aFloat, floatSerde, resultPointable);
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ if (arg >= 0.0d) {
+ resultPointable.set(argPtr);
+ return;
+ }
+ aDouble.setValue(0.0d - arg);
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCeilingDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCeilingDescriptor.java
index 89854fc..0ba9b00 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCeilingDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCeilingDescriptor.java
@@ -16,47 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Numeric function ceiling
- * Author : Xiaoyu Ma@UC Irvine
- * 01/30/2012
- */
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.DataOutput;
-
-import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
-import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
-import org.apache.asterix.om.base.AMutableDouble;
-import org.apache.asterix.om.base.AMutableFloat;
-import org.apache.asterix.om.base.AMutableInt16;
-import org.apache.asterix.om.base.AMutableInt32;
-import org.apache.asterix.om.base.AMutableInt64;
-import org.apache.asterix.om.base.AMutableInt8;
import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public class NumericCeilingDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -74,86 +45,55 @@
}
@Override
- public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
return new IScalarEvaluatorFactory() {
private static final long serialVersionUID = 1L;
@Override
- public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws AlgebricksException {
-
- return new IScalarEvaluator() {
-
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable argPtr = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDouble aDouble = new AMutableDouble(0);
- private AMutableFloat aFloat = new AMutableFloat(0);
- private AMutableInt64 aInt64 = new AMutableInt64(0);
- private AMutableInt32 aInt32 = new AMutableInt32(0);
- private AMutableInt16 aInt16 = new AMutableInt16((short) 0);
- private AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
- @SuppressWarnings("rawtypes")
- private ISerializerDeserializer serde;
-
- @SuppressWarnings("unchecked")
- @Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
- resultStorage.reset();
- eval.evaluate(tuple, argPtr);
- byte[] data = argPtr.getByteArray();
- int offset = argPtr.getStartOffset();
-
- try {
- if (data[offset] == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT8);
- byte val = AInt8SerializerDeserializer.getByte(data, offset + 1);
- aInt8.setValue(val);
- serde.serialize(aInt8, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT16);
- short val = AInt16SerializerDeserializer.getShort(data, offset + 1);
- aInt16.setValue(val);
- serde.serialize(aInt16, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT32);
- int val = AInt32SerializerDeserializer.getInt(data, offset + 1);
- aInt32.setValue(val);
- serde.serialize(aInt32, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT64);
- long val = AInt64SerializerDeserializer.getLong(data, offset + 1);
- aInt64.setValue(val);
- serde.serialize(aInt64, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AFLOAT);
- float val = AFloatSerializerDeserializer.getFloat(data, offset + 1);
- aFloat.setValue((float) Math.ceil(val));
- serde.serialize(aFloat, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.ADOUBLE);
- double val = ADoubleSerializerDeserializer.getDouble(data, offset + 1);
- aDouble.setValue(Math.ceil(val));
- serde.serialize(aDouble, out);
- } else {
- throw new NotImplementedException(
- AsterixBuiltinFunctions.NUMERIC_CEILING.getName() + ": not implemented for "
- + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(data[offset]));
- }
- result.set(resultStorage);
- } catch (HyracksDataException e) {
- throw new AlgebricksException(e);
- }
- }
- };
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericCeilingEvaluator(ctx, args[0]);
}
};
}
+ private class NumericCeilingEvaluator extends AbstractUnaryNumericFunctionEval {
+
+ NumericCeilingEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericCeilingDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ aFloat.setValue((float) Math.ceil(arg));
+ serialize(aFloat, floatSerde, resultPointable);
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.ceil(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCosDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCosDescriptor.java
new file mode 100644
index 0000000..aaecd0a
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCosDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericCosDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericCosDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_COS;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericCosEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericCosEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericCosEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericCosDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.cos(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericExpDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericExpDescriptor.java
new file mode 100644
index 0000000..efdd85a
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericExpDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericExpDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericExpDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_EXP;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericExpEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericExpEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericExpEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericExpDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.exp(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericFloorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericFloorDescriptor.java
index 336bf15..2a04250 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericFloorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericFloorDescriptor.java
@@ -23,40 +23,16 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.DataOutput;
-
-import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
-import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
-import org.apache.asterix.om.base.AMutableDouble;
-import org.apache.asterix.om.base.AMutableFloat;
-import org.apache.asterix.om.base.AMutableInt16;
-import org.apache.asterix.om.base.AMutableInt32;
-import org.apache.asterix.om.base.AMutableInt64;
-import org.apache.asterix.om.base.AMutableInt8;
import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public class NumericFloorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
private static final long serialVersionUID = 1L;
@@ -73,86 +49,55 @@
}
@Override
- public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
return new IScalarEvaluatorFactory() {
private static final long serialVersionUID = 1L;
@Override
- public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws AlgebricksException {
-
- return new IScalarEvaluator() {
-
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable argPtr = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDouble aDouble = new AMutableDouble(0);
- private AMutableFloat aFloat = new AMutableFloat(0);
- private AMutableInt64 aInt64 = new AMutableInt64(0);
- private AMutableInt32 aInt32 = new AMutableInt32(0);
- private AMutableInt16 aInt16 = new AMutableInt16((short) 0);
- private AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
- @SuppressWarnings("rawtypes")
- private ISerializerDeserializer serde;
-
- @SuppressWarnings("unchecked")
- @Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
- resultStorage.reset();
- eval.evaluate(tuple, argPtr);
- byte[] data = argPtr.getByteArray();
- int offset = argPtr.getStartOffset();
-
- try {
- if (data[offset] == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT8);
- byte val = AInt8SerializerDeserializer.getByte(data, offset + 1);
- aInt8.setValue(val);
- serde.serialize(aInt8, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT16);
- short val = AInt16SerializerDeserializer.getShort(data, offset + 1);
- aInt16.setValue(val);
- serde.serialize(aInt16, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT32);
- int val = AInt32SerializerDeserializer.getInt(data, offset + 1);
- aInt32.setValue(val);
- serde.serialize(aInt32, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT64);
- long val = AInt64SerializerDeserializer.getLong(data, offset + 1);
- aInt64.setValue(val);
- serde.serialize(aInt64, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AFLOAT);
- float val = AFloatSerializerDeserializer.getFloat(data, offset + 1);
- aFloat.setValue((float) Math.floor(val));
- serde.serialize(aFloat, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.ADOUBLE);
- double val = ADoubleSerializerDeserializer.getDouble(data, offset + 1);
- aDouble.setValue(Math.floor(val));
- serde.serialize(aDouble, out);
- } else {
- throw new NotImplementedException(
- AsterixBuiltinFunctions.NUMERIC_FLOOR.getName() + ": not implemented for "
- + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(data[offset]));
- }
- result.set(resultStorage);
- } catch (HyracksDataException e) {
- throw new AlgebricksException(e);
- }
- }
- };
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericFloorEvaluator(ctx, args[0]);
}
};
}
+ private class NumericFloorEvaluator extends AbstractUnaryNumericFunctionEval {
+
+ NumericFloorEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericFloorDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ resultPointable.set(argPtr);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ aFloat.setValue((float) Math.floor(arg));
+ serialize(aFloat, floatSerde, resultPointable);
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.floor(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLnDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLnDescriptor.java
new file mode 100644
index 0000000..d8e8c5c
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLnDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericLnDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericLnDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_LN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericLnEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericLnEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericLnEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericLnDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.log(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLogDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLogDescriptor.java
new file mode 100644
index 0000000..336bfc4
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericLogDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericLogDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericLogDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_LOG;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericLogEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericLogEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericLogEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericLogDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.log10(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSignDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSignDescriptor.java
new file mode 100644
index 0000000..8fda156
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSignDescriptor.java
@@ -0,0 +1,103 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericSignDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericSignDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_SIGN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericSignEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericSignEvaluator extends AbstractUnaryNumericFunctionEval {
+
+ NumericSignEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericSignDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0 ? (byte) (arg > 0 ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0 ? (byte) (arg > 0 ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0 ? (byte) (arg > 0 ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0L ? (byte) (arg > 0L ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0.0f ? (byte) (arg > 0.0f ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue(arg >= 0.0d ? (byte) (arg > 0.0d ? 1 : 0) : -1);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSinDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSinDescriptor.java
new file mode 100644
index 0000000..546e1a1
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSinDescriptor.java
@@ -0,0 +1,74 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericSinDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericSinDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_SIN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericSinEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericSinEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericSinEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericSinDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.sin(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSqrtDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSqrtDescriptor.java
new file mode 100644
index 0000000..aad8551
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSqrtDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericSqrtDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericSqrtDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_SQRT;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericSqrtEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericSqrtEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericSqrtEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericSqrtDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.sqrt(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTanDescriptor.java
new file mode 100644
index 0000000..5986e9c
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTanDescriptor.java
@@ -0,0 +1,73 @@
+/*
+ * 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
+ *
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.data.std.api.IPointable;
+
+public class NumericTanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+ private static final long serialVersionUID = 1L;
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new NumericTanDescriptor();
+ }
+ };
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return AsterixBuiltinFunctions.NUMERIC_TAN;
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericTanEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericTanEvaluator extends AbstractUnaryNumericDoubleFunctionEval {
+
+ NumericTanEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericTanDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(Math.tan(arg));
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericUnaryMinusDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericUnaryMinusDescriptor.java
index 422ab49..43b72c0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericUnaryMinusDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericUnaryMinusDescriptor.java
@@ -18,40 +18,16 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.DataOutput;
-
-import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
-import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
-import org.apache.asterix.om.base.AMutableDouble;
-import org.apache.asterix.om.base.AMutableFloat;
-import org.apache.asterix.om.base.AMutableInt16;
-import org.apache.asterix.om.base.AMutableInt32;
-import org.apache.asterix.om.base.AMutableInt64;
-import org.apache.asterix.om.base.AMutableInt8;
import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
public class NumericUnaryMinusDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -64,85 +40,63 @@
};
@Override
- public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
- return new IScalarEvaluatorFactory() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws AlgebricksException {
-
- return new IScalarEvaluator() {
-
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable argPtr = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDouble aDouble = new AMutableDouble(0);
- private AMutableFloat aFloat = new AMutableFloat(0);
- private AMutableInt64 aInt64 = new AMutableInt64(0);
- private AMutableInt32 aInt32 = new AMutableInt32(0);
- private AMutableInt16 aInt16 = new AMutableInt16((short) 0);
- private AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
- @SuppressWarnings("rawtypes")
- private ISerializerDeserializer serde;
-
- @SuppressWarnings("unchecked")
- @Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
- resultStorage.reset();
- eval.evaluate(tuple, argPtr);
- byte[] data = argPtr.getByteArray();
- int offset = argPtr.getStartOffset();
-
- try {
- if (data[offset] == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT8);
- aInt8.setValue((byte) -AInt8SerializerDeserializer.getByte(data, offset + 1));
- serde.serialize(aInt8, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT16);
- aInt16.setValue((short) -AInt16SerializerDeserializer.getShort(data, offset + 1));
- serde.serialize(aInt16, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT32);
- aInt32.setValue(-AInt32SerializerDeserializer.getInt(data, offset + 1));
- serde.serialize(aInt32, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AINT64);
- aInt64.setValue(-AInt64SerializerDeserializer.getLong(data, offset + 1));
- serde.serialize(aInt64, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.AFLOAT);
- aFloat.setValue(-AFloatSerializerDeserializer.getFloat(data, offset + 1));
- serde.serialize(aFloat, out);
- } else if (data[offset] == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
- serde = AqlSerializerDeserializerProvider.INSTANCE
- .getSerializerDeserializer(BuiltinType.ADOUBLE);
- aDouble.setValue(-ADoubleSerializerDeserializer.getDouble(data, offset + 1));
- serde.serialize(aDouble, out);
- } else {
- throw new NotImplementedException(
- AsterixBuiltinFunctions.NUMERIC_UNARY_MINUS.getName() + ": not implemented for "
- + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(data[offset]));
- }
- } catch (HyracksDataException e) {
- throw new AlgebricksException(e);
- }
- result.set(resultStorage);
- }
- };
- }
- };
- }
-
- @Override
public FunctionIdentifier getIdentifier() {
return AsterixBuiltinFunctions.NUMERIC_UNARY_MINUS;
}
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws AlgebricksException {
+ return new NumericUnaryMinusEvaluator(ctx, args[0]);
+ }
+ };
+ }
+
+ private class NumericUnaryMinusEvaluator extends AbstractUnaryNumericFunctionEval {
+
+ NumericUnaryMinusEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory argEvalFactory)
+ throws AlgebricksException {
+ super(context, argEvalFactory, NumericUnaryMinusDescriptor.this.getIdentifier());
+ }
+
+ @Override
+ protected void processInt8(byte arg, IPointable resultPointable) throws AlgebricksException {
+ aInt8.setValue((byte) -arg);
+ serialize(aInt8, int8Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt16(short arg, IPointable resultPointable) throws AlgebricksException {
+ aInt16.setValue((short) -arg);
+ serialize(aInt16, int16Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt32(int arg, IPointable resultPointable) throws AlgebricksException {
+ aInt32.setValue(-arg);
+ serialize(aInt32, int32Serde, resultPointable);
+ }
+
+ @Override
+ protected void processInt64(long arg, IPointable resultPointable) throws AlgebricksException {
+ aInt64.setValue(-arg);
+ serialize(aInt64, int64Serde, resultPointable);
+ }
+
+ @Override
+ protected void processFloat(float arg, IPointable resultPointable) throws AlgebricksException {
+ aFloat.setValue(-arg);
+ serialize(aFloat, floatSerde, resultPointable);
+ }
+
+ @Override
+ protected void processDouble(double arg, IPointable resultPointable) throws AlgebricksException {
+ aDouble.setValue(-arg);
+ serialize(aDouble, doubleSerde, resultPointable);
+ }
+ }
}