You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by dl...@apache.org on 2017/09/19 17:52:12 UTC
[2/7] asterixdb git commit: [ASTERIXDB-2078][SQL] DISTINCT modifier
for aggregate functions
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
index 11cb25f..f05d5e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
@@ -10,7 +10,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_count]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
FunctionCall Metadata.resolve@-1[
@@ -31,7 +31,7 @@ RecordConstructor [
OperatorExpr [
LiteralExpr [DOUBLE] [0.2]
*
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -60,7 +60,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_max_suppkey]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -88,7 +88,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_max_linenumber]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -116,7 +116,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_avg_extendedprice]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -144,7 +144,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_avg_discount]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -172,7 +172,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_avg_tax]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -200,7 +200,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_max_shipdate]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -228,7 +228,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_min_commitdate]
:
- FunctionCall tpch.min@1[
+ FunctionCall asterix.min@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -256,7 +256,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_min_receiptdate]
:
- FunctionCall tpch.min@1[
+ FunctionCall asterix.min@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -284,7 +284,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [t_max_comment]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
index 6bb9429..adb46b5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
@@ -30,7 +30,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_quantity]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -82,7 +82,7 @@ FROM [ FunctionCall Metadata.dataset@1[
(
LiteralExpr [STRING] [t_sum_quantity]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
index cc6a71b..8afd86a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
@@ -2,7 +2,7 @@ DataverseUse tpch
Set import-private-functions=true
Query:
SELECT ELEMENT [
-FunctionCall tpch.sum@1[
+FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
OperatorExpr [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
index 88f61d2..aa7187e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
@@ -52,7 +52,7 @@ FROM [ (
OperatorExpr [
LiteralExpr [DOUBLE] [0.5]
*
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
index 51bdde2..01b9b14 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
@@ -11,7 +11,7 @@ FunctionDecl tmp1([]) {
(
LiteralExpr [STRING] [count_suppkey]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -38,7 +38,7 @@ FunctionDecl tmp1([]) {
(
LiteralExpr [STRING] [max_suppkey]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -123,7 +123,7 @@ FunctionDecl tmp2([]) {
(
LiteralExpr [STRING] [count_suppkey]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -150,7 +150,7 @@ FunctionDecl tmp2([]) {
(
LiteralExpr [STRING] [max_suppkey]
:
- FunctionCall tpch.max@1[
+ FunctionCall asterix.max@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -481,7 +481,7 @@ Groupby
Let Variable [ Name=$numwait ]
:=
- FunctionCall tpch.sql-count@1[
+ FunctionCall asterix.sql-count@1[
(
SELECT ELEMENT [
(
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
index 1ca3eb5..45790cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
@@ -42,7 +42,7 @@ FunctionDecl q22_customer_tmp([]) {
Query:
Let Variable [ Name=$avg ]
:=
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -76,7 +76,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [numcust]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
FunctionCall Metadata.resolve@-1[
@@ -94,7 +94,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [totacctbal]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
index a77edfe..45c344d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
@@ -89,7 +89,7 @@ FunctionDecl q22_customer_tmp([]) {
Query:
Let Variable [ Name=$avg ]
:=
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -179,7 +179,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [numcust]
:
- FunctionCall tpch.sql-count@1[
+ FunctionCall asterix.sql-count@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -196,7 +196,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [totacctbal]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -229,7 +229,7 @@ FROM [ FunctionCall tpch.q22_customer_tmp@0[
]
Where
OperatorExpr [
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
Variable [ Name=$o ]
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
index d12032a..3dde59d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
@@ -17,7 +17,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_order]
:
- FunctionCall tpch.sql-count@1[
+ FunctionCall asterix.sql-count@1[
(
SELECT ELEMENT [
(
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
index 14ed390..177f281 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
@@ -15,7 +15,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_profit]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
index f4cb736..3681810 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
@@ -129,7 +129,7 @@ Let Variable [ Name=$X ]
Let Variable [ Name=$sum ]
:=
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
index a3643c5..9d44d8f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
@@ -45,7 +45,7 @@ RecordConstructor [
Let Variable [ Name=$sum ]
:=
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -90,7 +90,7 @@ FROM [ (
(
LiteralExpr [STRING] [sum_price]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
index 78d629d..9302eb3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
@@ -87,7 +87,7 @@ RecordConstructor [
Let Variable [ Name=$sum ]
:=
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
index ab45142..4f8a868 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
@@ -15,14 +15,14 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_cheaps]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
Variable [ Name=$cheaps ]
]
)
(
LiteralExpr [STRING] [total_charges]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
Variable [ Name=$charges ]
]
)
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
index 0fe8f7e..bc03eae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
@@ -15,28 +15,28 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_cheaps]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
Variable [ Name=$cheaps ]
]
)
(
LiteralExpr [STRING] [avg_expensive_discounts]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
Variable [ Name=$expensives ]
]
)
(
LiteralExpr [STRING] [sum_disc_prices]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
Variable [ Name=$disc_prices ]
]
)
(
LiteralExpr [STRING] [total_charges]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
Variable [ Name=$charges ]
]
)
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
index 6787c4f..6a25433 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
@@ -15,14 +15,14 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_cheaps]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
Variable [ Name=$cheap ]
]
)
(
LiteralExpr [STRING] [count_expensives]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
Variable [ Name=$expensive ]
]
)
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
index a11b5e2..13647f7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
@@ -4,7 +4,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_qty_partial]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -32,7 +32,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_base_price]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -51,7 +51,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_disc_price]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
OperatorExpr [
@@ -81,7 +81,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [sum_charge]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
OperatorExpr [
@@ -120,7 +120,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [ave_qty]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -148,7 +148,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [ave_price]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -167,7 +167,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [ave_disc]
:
- FunctionCall tpch.avg@1[
+ FunctionCall asterix.avg@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -186,7 +186,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_order]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
Variable [ Name=$l ]
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
index 7ebf5f7..c970c9f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
@@ -4,7 +4,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_cheaps]
:
- FunctionCall tpch.count@1[
+ FunctionCall asterix.count@1[
(
SELECT ELEMENT [
FieldAccessor [
@@ -23,7 +23,7 @@ RecordConstructor [
(
LiteralExpr [STRING] [count_expensives]
:
- FunctionCall tpch.sum@1[
+ FunctionCall asterix.sum@1[
(
SELECT ELEMENT [
Variable [ Name=$e ]
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
index 4826f57..d5b9c31 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
@@ -1,6 +1,6 @@
Query:
SELECT ELEMENT [
-FunctionCall null.count@1[
+FunctionCall asterix.count@1[
(
SELECT ELEMENT [
Variable [ Name=$x ]
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
index 4826f57..d5b9c31 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
@@ -1,6 +1,6 @@
Query:
SELECT ELEMENT [
-FunctionCall null.count@1[
+FunctionCall asterix.count@1[
(
SELECT ELEMENT [
Variable [ Name=$x ]
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
----------------------------------------------------------------------
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 16d4cb3..920f0f0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -295,6 +295,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate">
+ <compilation-unit name="avg_distinct">
+ <output-dir compare="Text">avg_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate">
<compilation-unit name="count_01">
<output-dir compare="Text">count_01</output-dir>
</compilation-unit>
@@ -314,6 +319,11 @@
<output-dir compare="Text">count_null</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="aggregate">
+ <compilation-unit name="count_distinct">
+ <output-dir compare="Text">count_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
<!--
<test-case FilePath="aggregate">
<compilation-unit name="droptype">
@@ -406,6 +416,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate">
+ <compilation-unit name="max_distinct">
+ <output-dir compare="Text">max_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate">
<compilation-unit name="min_empty_01">
<output-dir compare="Text">min_empty_01</output-dir>
</compilation-unit>
@@ -416,6 +431,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate">
+ <compilation-unit name="min_distinct">
+ <output-dir compare="Text">min_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate">
<compilation-unit name="scalar_avg">
<output-dir compare="Text">scalar_avg</output-dir>
</compilation-unit>
@@ -570,6 +590,11 @@
<output-dir compare="Text">sum_numeric_null</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="aggregate">
+ <compilation-unit name="sum_distinct">
+ <output-dir compare="Text">sum_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="aggregate-sql">
<test-case FilePath="aggregate-sql">
@@ -731,6 +756,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate-sql">
+ <compilation-unit name="avg_distinct">
+ <output-dir compare="Text">avg_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate-sql">
<compilation-unit name="count_01">
<output-dir compare="Text">count_01</output-dir>
</compilation-unit>
@@ -751,6 +781,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate-sql">
+ <compilation-unit name="count_distinct">
+ <output-dir compare="Text">count_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate-sql">
<compilation-unit name="max_empty_01">
<output-dir compare="Text">max_empty_01</output-dir>
</compilation-unit>
@@ -761,6 +796,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate-sql">
+ <compilation-unit name="max_distinct">
+ <output-dir compare="Text">max_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate-sql">
<compilation-unit name="min_empty_01">
<output-dir compare="Text">min_empty_01</output-dir>
</compilation-unit>
@@ -771,6 +811,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="aggregate-sql">
+ <compilation-unit name="min_distinct">
+ <output-dir compare="Text">min_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="aggregate-sql">
<compilation-unit name="scalar_avg">
<output-dir compare="Text">scalar_avg</output-dir>
</compilation-unit>
@@ -925,6 +970,11 @@
<output-dir compare="Text">sum_numeric_null</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="aggregate-sql">
+ <compilation-unit name="sum_distinct">
+ <output-dir compare="Text">sum_distinct</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="boolean">
<test-case FilePath="boolean">
@@ -2832,6 +2882,11 @@
</compilation-unit>
</test-case>
<test-case FilePath="group-by">
+ <compilation-unit name="sugar-06-distinct">
+ <output-dir compare="Text">sugar-06-distinct</output-dir>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="group-by">
<compilation-unit name="null">
<output-dir compare="Text">null</output-dir>
</compilation-unit>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index fb5a6fb..60ccea6 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -56,6 +56,7 @@ import org.apache.asterix.lang.sqlpp.rewrites.visitor.InlineWithExpressionVisito
import org.apache.asterix.lang.sqlpp.rewrites.visitor.OperatorExpressionVisitor;
import org.apache.asterix.lang.sqlpp.rewrites.visitor.SetOperationVisitor;
import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppBuiltinFunctionRewriteVisitor;
+import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppDistinctAggregationSugarVisitor;
import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGlobalAggregationSugarVisitor;
import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByVisitor;
import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppInlineUdfsVisitor;
@@ -135,6 +136,9 @@ class SqlppQueryRewriter implements IQueryRewriter {
// names could be case sensitive.
rewriteFunctionNames();
+ // Rewrites distinct aggregates into regular aggregates
+ rewriteDistinctAggregations();
+
// Resets the variable counter to the previous marked value.
// Therefore, the variable ids in the final query plans will not be perturbed
// by the additon or removal of intermediate AST rewrites.
@@ -152,6 +156,12 @@ class SqlppQueryRewriter implements IQueryRewriter {
topExpr.accept(globalAggregationVisitor, null);
}
+ protected void rewriteDistinctAggregations() throws CompilationException {
+ SqlppDistinctAggregationSugarVisitor distinctAggregationVisitor =
+ new SqlppDistinctAggregationSugarVisitor(context);
+ topExpr.accept(distinctAggregationVisitor, null);
+ }
+
protected void rewriteListInputFunctions() throws CompilationException {
SqlppListInputFunctionRewriteVisitor listInputFunctionVisitor = new SqlppListInputFunctionRewriteVisitor();
topExpr.accept(listInputFunctionVisitor, null);
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
new file mode 100644
index 0000000..e9b8334
--- /dev/null
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
@@ -0,0 +1,96 @@
+/*
+ * 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.lang.sqlpp.rewrites.visitor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.util.FunctionUtil;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectElement;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
+
+/**
+ * An AST pre-processor to rewrite distinct aggregates into regular aggregates as follows: <br/>
+ * {@code agg-distinct(expr) -> agg((FROM expr AS i SELECT DISTINCT VALUE i))} <br/>
+ * where {@code agg-distinct} is a distinct aggregate function, {@code agg} - a regular aggregate function
+ */
+public class SqlppDistinctAggregationSugarVisitor extends AbstractSqlppExpressionScopingVisitor {
+ public SqlppDistinctAggregationSugarVisitor(LangRewritingContext context) {
+ super(context);
+ }
+
+ @Override
+ public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+ FunctionSignature signature = callExpr.getFunctionSignature();
+ IFunctionInfo finfo = FunctionUtil.getFunctionInfo(signature);
+ FunctionIdentifier aggFn =
+ finfo != null ? BuiltinFunctions.getAggregateFunction(finfo.getFunctionIdentifier()) : null;
+ FunctionIdentifier newAggFn = aggFn != null ? BuiltinFunctions.getAggregateFunctionForDistinct(aggFn) : null;
+ if (newAggFn == null) {
+ return super.visit(callExpr, arg);
+ }
+ List<Expression> exprList = callExpr.getExprList();
+ List<Expression> newExprList = new ArrayList<>(exprList.size());
+ for (Expression expr : exprList) {
+ Expression newExpr = rewriteArgument(expr);
+ newExprList.add(newExpr.accept(this, arg));
+ }
+ callExpr.setFunctionSignature(
+ new FunctionSignature(newAggFn.getNamespace(), newAggFn.getName(), newAggFn.getArity()));
+ callExpr.setExprList(newExprList);
+ return callExpr;
+ }
+
+ /**
+ * rewrites {@code expr -> FROM expr AS i SELECT DISTINCT VALUE i}
+ */
+ private Expression rewriteArgument(Expression argExpr) throws CompilationException {
+ // From clause
+ VariableExpr fromBindingVar = new VariableExpr(context.newVariable());
+ FromTerm fromTerm = new FromTerm(argExpr, fromBindingVar, null, null);
+ FromClause fromClause = new FromClause(Collections.singletonList(fromTerm));
+
+ // Select clause.
+ SelectClause selectClause = new SelectClause(new SelectElement(fromBindingVar), null, true);
+
+ // Construct the select expression.
+ SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null, null, null);
+ SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
+ return new SelectExpression(null, selectSetOperation, null, null, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
index 6346994..b7604ab 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
@@ -72,10 +72,10 @@ import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScoping
// GROUP AS eis(e AS e, i AS i, s AS s)
// SELECT ELEMENT {
// 'deptId': deptId,
-// 'star_cost': coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
+// 'star_cost': array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
// };
//
-// where SUM(e.salary + i.bonus) is turned into coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
+// where SUM(e.salary + i.bonus) is turned into array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
public class SqlppGroupBySugarVisitor extends AbstractSqlppExpressionScopingVisitor {
@@ -102,7 +102,7 @@ public class SqlppGroupBySugarVisitor extends AbstractSqlppExpressionScopingVisi
}
if (rewritten) {
// Rewrites the SQL-92 function name to core functions,
- // e.g., SUM --> coll_sum
+ // e.g., SUM --> array_sum
callExpr.setFunctionSignature(FunctionMapUtil.sql92ToCoreAggregateFunction(signature));
}
callExpr.setExprList(newExprList);
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
index 7f2e6c9..dfe371e 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
@@ -72,7 +72,7 @@ import org.apache.hyracks.algebricks.common.utils.Pair;
// GROUP AS eis(e AS e, i AS i, s AS s)
// SELECT ELEMENT {
// 'deptId': deptId,
-// 'star_cost': coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
+// 'star_cost': array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
// };
/**
* The transformation include three things:
@@ -81,7 +81,7 @@ import org.apache.hyracks.algebricks.common.utils.Pair;
* expression is not a subquery;
* 3. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 2, e.g.,
* SUM(e.salary + i.bonus) becomes
- * coll_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
+ * array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
*/
public class SqlppGroupByVisitor extends AbstractSqlppExpressionScopingVisitor {
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
index 8f04980..8a8465d 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
@@ -104,7 +104,7 @@ public class FunctionMapUtil {
if (!isSql92AggregateFunction(fs)) {
return fs;
}
- return new FunctionSignature(fs.getNamespace(), CORE_SQL_AGGREGATE_PREFIX + fs.getName(),
+ return new FunctionSignature(FunctionConstants.ASTERIX_NS, CORE_SQL_AGGREGATE_PREFIX + fs.getName(),
fs.getArity());
}
@@ -161,7 +161,7 @@ public class FunctionMapUtil {
boolean coreAgg = name.startsWith(CORE_AGGREGATE_PREFIX);
String lowerCaseName = coreAgg ? name.substring(CORE_AGGREGATE_PREFIX.length())
: (INTERNAL_SQL_AGGREGATE_PREFIX + name.substring(CORE_SQL_AGGREGATE_PREFIX.length()));
- return new FunctionSignature(fs.getNamespace(), lowerCaseName, fs.getArity());
+ return new FunctionSignature(FunctionConstants.ASTERIX_NS, lowerCaseName, fs.getArity());
}
}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index b76adb8..68c1cba 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -2484,13 +2484,16 @@ Expression FunctionCallExpr() throws ParseException:
FunctionName funcName = null;
String hint = null;
boolean star = false;
+ boolean distinct = false;
}
{
funcName = FunctionName()
{
hint = funcName.hint;
}
- <LEFTPAREN> ( ( tmp = Expression() | <MUL> { star = true; } )
+ <LEFTPAREN> (
+ ( <DISTINCT> { distinct = true; } )?
+ ( tmp = Expression() | <MUL> { star = true; } )
{
if(star){
if(!funcName.function.toLowerCase().equals("count")){
@@ -2509,8 +2512,12 @@ Expression FunctionCallExpr() throws ParseException:
}
)*)? <RIGHTPAREN>
{
+ String name = funcName.function;
+ if (distinct) {
+ name += "-distinct";
+ }
// TODO use funcName.library
- String fqFunctionName = funcName.library == null ? funcName.function : funcName.library + "#" + funcName.function;
+ String fqFunctionName = funcName.library == null ? name : funcName.library + "#" + name;
FunctionSignature signature
= lookupFunctionSignature(funcName.dataverse, fqFunctionName, arity);
if (signature == null) {
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AbstractFunctionDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AbstractFunctionDescriptor.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AbstractFunctionDescriptor.java
index c070719..35440e4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AbstractFunctionDescriptor.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/AbstractFunctionDescriptor.java
@@ -40,31 +40,31 @@ public abstract class AbstractFunctionDescriptor implements IFunctionDescriptor
@Override
public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) throws AlgebricksException {
- throw new NotImplementedException("Not Implemented");
+ throw new NotImplementedException("Not Implemented: " + getIdentifier());
}
@Override
public IRunningAggregateEvaluatorFactory createRunningAggregateEvaluatorFactory(IScalarEvaluatorFactory[] args)
throws AlgebricksException {
- throw new NotImplementedException("Not Implemented");
+ throw new NotImplementedException("Not Implemented: " + getIdentifier());
}
@Override
public ISerializedAggregateEvaluatorFactory createSerializableAggregateEvaluatorFactory(
IScalarEvaluatorFactory[] args) throws AlgebricksException {
- throw new NotImplementedException("Not Implemented");
+ throw new NotImplementedException("Not Implemented: " + getIdentifier());
}
@Override
public IUnnestingEvaluatorFactory createUnnestingEvaluatorFactory(IScalarEvaluatorFactory[] args)
throws AlgebricksException {
- throw new NotImplementedException("Not Implemented");
+ throw new NotImplementedException("Not Implemented: " + getIdentifier());
}
@Override
public IAggregateEvaluatorFactory createAggregateEvaluatorFactory(IScalarEvaluatorFactory[] args)
throws AlgebricksException {
- throw new NotImplementedException("Not Implemented");
+ throw new NotImplementedException("Not Implemented: " + getIdentifier());
}
}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index 695483b..863847b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -143,6 +143,9 @@ public class BuiltinFunctions {
private static final Map<IFunctionInfo, IFunctionInfo> aggregateToSerializableAggregate = new HashMap<>();
private static final Map<IFunctionInfo, Boolean> builtinUnnestingFunctions = new HashMap<>();
private static final Map<IFunctionInfo, IFunctionInfo> scalarToAggregateFunctionMap = new HashMap<>();
+ private static final Map<IFunctionInfo, IFunctionInfo> distinctToRegularScalarAggregateFunctionMap =
+ new HashMap<>();
+
private static final Map<IFunctionInfo, SpatialFilterKind> spatialFilterFunctions = new HashMap<>();
public static final FunctionIdentifier TYPE_OF = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "type-of", 1);
@@ -398,6 +401,29 @@ public class BuiltinFunctions {
public static final FunctionIdentifier SERIAL_INTERMEDIATE_AVG = new FunctionIdentifier(
FunctionConstants.ASTERIX_NS, "intermediate-avg-serial", 1);
+ // distinct aggregate functions
+
+ public static final FunctionIdentifier COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-count-distinct", 1);
+ public static final FunctionIdentifier SCALAR_COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "count-distinct", 1);
+ public static final FunctionIdentifier SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sum-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "sum-distinct", 1);
+ public static final FunctionIdentifier AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-avg-distinct", 1);
+ public static final FunctionIdentifier SCALAR_AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "avg-distinct", 1);
+ public static final FunctionIdentifier MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-max-distinct", 1);
+ public static final FunctionIdentifier SCALAR_MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "max-distinct", 1);
+ public static final FunctionIdentifier MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-min-distinct", 1);
+ public static final FunctionIdentifier SCALAR_MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "min-distinct", 1);
+
// sql aggregate functions
public static final FunctionIdentifier SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-avg",
1);
@@ -453,6 +479,28 @@ public class BuiltinFunctions {
public static final FunctionIdentifier SERIAL_LOCAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
"local-sql-avg-serial", 1);
+ // distinct sql aggregate functions
+ public static final FunctionIdentifier SQL_COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sql-count-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SQL_COUNT_DISTINCT = new FunctionIdentifier(
+ FunctionConstants.ASTERIX_NS, "sql-count-distinct", 1);
+ public static final FunctionIdentifier SQL_SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sql-sum-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SQL_SUM_DISTINCT = new FunctionIdentifier(
+ FunctionConstants.ASTERIX_NS, "sql-sum-distinct", 1);
+ public static final FunctionIdentifier SQL_AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sql-avg-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SQL_AVG_DISTINCT = new FunctionIdentifier(
+ FunctionConstants.ASTERIX_NS, "sql-avg-distinct", 1);
+ public static final FunctionIdentifier SQL_MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sql-max-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SQL_MAX_DISTINCT = new FunctionIdentifier(
+ FunctionConstants.ASTERIX_NS, "sql-max-distinct", 1);
+ public static final FunctionIdentifier SQL_MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+ "agg-sql-min-distinct", 1);
+ public static final FunctionIdentifier SCALAR_SQL_MIN_DISTINCT = new FunctionIdentifier(
+ FunctionConstants.ASTERIX_NS, "sql-min-distinct", 1);
+
public static final FunctionIdentifier SCAN_COLLECTION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
"scan-collection", 1);
public static final FunctionIdentifier SUBSET_COLLECTION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
@@ -899,9 +947,9 @@ public class BuiltinFunctions {
addPrivateFunction(GRAM_TOKENS, OrderedListOfAStringTypeComputer.INSTANCE, true);
addPrivateFunction(HASHED_GRAM_TOKENS, OrderedListOfAInt32TypeComputer.INSTANCE, true);
addPrivateFunction(HASHED_WORD_TOKENS, OrderedListOfAInt32TypeComputer.INSTANCE, true);
- addFunction(IF_MISSING_OR_NULL, IfMissingOrNullTypeComputer.INSTANCE, true);
- addFunction(IF_MISSING, IfMissingTypeComputer.INSTANCE, true);
- addFunction(IF_NULL, IfNullTypeComputer.INSTANCE, true);
+ addFunction(IF_MISSING_OR_NULL, IfMissingOrNullTypeComputer.INSTANCE, true);
+ addFunction(IF_MISSING, IfMissingTypeComputer.INSTANCE, true);
+ addFunction(IF_NULL, IfNullTypeComputer.INSTANCE, true);
addPrivateFunction(INDEX_SEARCH, AnyTypeComputer.INSTANCE, true);
addFunction(INT8_CONSTRUCTOR, AInt8TypeComputer.INSTANCE, true);
addFunction(INT16_CONSTRUCTOR, AInt16TypeComputer.INSTANCE, true);
@@ -1056,6 +1104,33 @@ public class BuiltinFunctions {
addPrivateFunction(SERIAL_SUM, NumericAggTypeComputer.INSTANCE, true);
addPrivateFunction(SERIAL_LOCAL_SUM, NumericAggTypeComputer.INSTANCE, true);
+ // Distinct aggregate functions
+
+ addFunction(COUNT_DISTINCT, AInt64TypeComputer.INSTANCE, true);
+ addFunction(SCALAR_COUNT_DISTINCT, AInt64TypeComputer.INSTANCE, true);
+ addFunction(SQL_COUNT_DISTINCT, AInt64TypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SQL_COUNT_DISTINCT, AInt64TypeComputer.INSTANCE, true);
+
+ addFunction(SUM_DISTINCT, NumericAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SUM_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+ addFunction(SQL_SUM_DISTINCT, NumericAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SQL_SUM_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+
+ addFunction(AVG_DISTINCT, NullableDoubleTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_AVG_DISTINCT, NullableDoubleTypeComputer.INSTANCE, true);
+ addFunction(SQL_AVG_DISTINCT, NullableDoubleTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SQL_AVG_DISTINCT, NullableDoubleTypeComputer.INSTANCE, true);
+
+ addFunction(MAX_DISTINCT, MinMaxAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_MAX_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+ addFunction(SQL_MAX_DISTINCT, MinMaxAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SQL_MAX_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+
+ addFunction(MIN_DISTINCT, MinMaxAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_MIN_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+ addFunction(SQL_MIN_DISTINCT, MinMaxAggTypeComputer.INSTANCE, true);
+ addFunction(SCALAR_SQL_MIN_DISTINCT, ScalarVersionOfAggregateResultType.INSTANCE, true);
+
// Similarity functions
addFunction(EDIT_DISTANCE_CONTAINS, OrderedListOfAnyTypeComputer.INSTANCE, true);
addFunction(SIMILARITY_JACCARD, AFloatTypeComputer.INSTANCE, true);
@@ -1212,28 +1287,10 @@ public class BuiltinFunctions {
}
static {
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_AVG), getAsterixFunctionInfo(AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_COUNT), getAsterixFunctionInfo(COUNT));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_GLOBAL_AVG), getAsterixFunctionInfo(GLOBAL_AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_LOCAL_AVG), getAsterixFunctionInfo(LOCAL_AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_MAX), getAsterixFunctionInfo(MAX));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_MIN), getAsterixFunctionInfo(MIN));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SUM), getAsterixFunctionInfo(SUM));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_FIRST_ELEMENT),
- getAsterixFunctionInfo(FIRST_ELEMENT));
- // SQL Aggregate Functions
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SQL_AVG), getAsterixFunctionInfo(SQL_AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SQL_COUNT), getAsterixFunctionInfo(SQL_COUNT));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_GLOBAL_SQL_AVG),
- getAsterixFunctionInfo(GLOBAL_SQL_AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_LOCAL_SQL_AVG),
- getAsterixFunctionInfo(LOCAL_SQL_AVG));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SQL_MAX), getAsterixFunctionInfo(SQL_MAX));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SQL_MIN), getAsterixFunctionInfo(SQL_MIN));
- scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(SCALAR_SQL_SUM), getAsterixFunctionInfo(SQL_SUM));
- }
+ // Aggregate functions
+
+ // AVG
- static {
addAgg(AVG);
addAgg(LOCAL_AVG);
addAgg(GLOBAL_AVG);
@@ -1243,11 +1300,49 @@ public class BuiltinFunctions {
addIntermediateAgg(GLOBAL_AVG, INTERMEDIATE_AVG);
addGlobalAgg(AVG, GLOBAL_AVG);
+ addScalarAgg(AVG, SCALAR_AVG);
+ addScalarAgg(GLOBAL_AVG, SCALAR_GLOBAL_AVG);
+ addScalarAgg(LOCAL_AVG, SCALAR_LOCAL_AVG);
+
+ addSerialAgg(AVG, SERIAL_AVG);
+ addSerialAgg(LOCAL_AVG, SERIAL_LOCAL_AVG);
+ addSerialAgg(GLOBAL_AVG, SERIAL_GLOBAL_AVG);
+ addAgg(SERIAL_AVG);
+ addAgg(SERIAL_LOCAL_AVG);
+ addAgg(SERIAL_GLOBAL_AVG);
+ addLocalAgg(SERIAL_AVG, SERIAL_LOCAL_AVG);
+ addIntermediateAgg(SERIAL_AVG, SERIAL_INTERMEDIATE_AVG);
+ addIntermediateAgg(SERIAL_LOCAL_AVG, SERIAL_INTERMEDIATE_AVG);
+ addIntermediateAgg(SERIAL_GLOBAL_AVG, SERIAL_INTERMEDIATE_AVG);
+ addGlobalAgg(SERIAL_AVG, SERIAL_GLOBAL_AVG);
+
+ // AVG DISTINCT
+
+ addDistinctAgg(AVG_DISTINCT, SCALAR_AVG);
+ addScalarAgg(AVG_DISTINCT, SCALAR_AVG_DISTINCT);
+
+ // COUNT
+
addAgg(COUNT);
addLocalAgg(COUNT, COUNT);
addIntermediateAgg(COUNT, SUM);
addGlobalAgg(COUNT, SUM);
+ addScalarAgg(COUNT, SCALAR_COUNT);
+
+ addSerialAgg(COUNT, SERIAL_COUNT);
+ addAgg(SERIAL_COUNT);
+ addLocalAgg(SERIAL_COUNT, SERIAL_COUNT);
+ addIntermediateAgg(SERIAL_COUNT, SERIAL_SUM);
+ addGlobalAgg(SERIAL_COUNT, SERIAL_SUM);
+
+ // COUNT DISTINCT
+
+ addDistinctAgg(COUNT_DISTINCT, SCALAR_COUNT);
+ addScalarAgg(COUNT_DISTINCT, SCALAR_COUNT_DISTINCT);
+
+ // MAX
+
addAgg(MAX);
addAgg(LOCAL_MAX);
addLocalAgg(MAX, LOCAL_MAX);
@@ -1255,6 +1350,15 @@ public class BuiltinFunctions {
addIntermediateAgg(MAX, MAX);
addGlobalAgg(MAX, MAX);
+ addScalarAgg(MAX, SCALAR_MAX);
+
+ // MAX DISTINCT
+
+ addDistinctAgg(MAX_DISTINCT, SCALAR_MAX);
+ addScalarAgg(MAX_DISTINCT, SCALAR_MAX_DISTINCT);
+
+ // FIRST_ELEMENT
+
addAgg(SCALAR_FIRST_ELEMENT);
addAgg(LOCAL_FIRST_ELEMENT);
addLocalAgg(FIRST_ELEMENT, LOCAL_FIRST_ELEMENT);
@@ -1262,12 +1366,25 @@ public class BuiltinFunctions {
addIntermediateAgg(FIRST_ELEMENT, FIRST_ELEMENT);
addGlobalAgg(FIRST_ELEMENT, FIRST_ELEMENT);
+ addScalarAgg(FIRST_ELEMENT, SCALAR_FIRST_ELEMENT);
+
+ // MIN
+
addAgg(MIN);
addLocalAgg(MIN, LOCAL_MIN);
addIntermediateAgg(LOCAL_MIN, MIN);
addIntermediateAgg(MIN, MIN);
addGlobalAgg(MIN, MIN);
+ addScalarAgg(MIN, SCALAR_MIN);
+
+ // MIN DISTINCT
+
+ addDistinctAgg(MIN_DISTINCT, SCALAR_MIN);
+ addScalarAgg(MIN_DISTINCT, SCALAR_MIN_DISTINCT);
+
+ // SUM
+
addAgg(SUM);
addAgg(LOCAL_SUM);
addLocalAgg(SUM, LOCAL_SUM);
@@ -1275,30 +1392,10 @@ public class BuiltinFunctions {
addIntermediateAgg(SUM, SUM);
addGlobalAgg(SUM, SUM);
- addAgg(LISTIFY);
+ addScalarAgg(SUM, SCALAR_SUM);
- // serializable aggregate functions
- addSerialAgg(AVG, SERIAL_AVG);
- addSerialAgg(COUNT, SERIAL_COUNT);
addSerialAgg(SUM, SERIAL_SUM);
addSerialAgg(LOCAL_SUM, SERIAL_LOCAL_SUM);
- addSerialAgg(LOCAL_AVG, SERIAL_LOCAL_AVG);
- addSerialAgg(GLOBAL_AVG, SERIAL_GLOBAL_AVG);
-
- addAgg(SERIAL_COUNT);
- addLocalAgg(SERIAL_COUNT, SERIAL_COUNT);
- addIntermediateAgg(SERIAL_COUNT, SERIAL_SUM);
- addGlobalAgg(SERIAL_COUNT, SERIAL_SUM);
-
- addAgg(SERIAL_AVG);
- addAgg(SERIAL_LOCAL_AVG);
- addAgg(SERIAL_GLOBAL_AVG);
- addLocalAgg(SERIAL_AVG, SERIAL_LOCAL_AVG);
- addIntermediateAgg(SERIAL_AVG, SERIAL_INTERMEDIATE_AVG);
- addIntermediateAgg(SERIAL_LOCAL_AVG, SERIAL_INTERMEDIATE_AVG);
- addIntermediateAgg(SERIAL_GLOBAL_AVG, SERIAL_INTERMEDIATE_AVG);
- addGlobalAgg(SERIAL_AVG, SERIAL_GLOBAL_AVG);
-
addAgg(SERIAL_SUM);
addAgg(SERIAL_LOCAL_SUM);
addLocalAgg(SERIAL_SUM, SERIAL_LOCAL_SUM);
@@ -1306,7 +1403,19 @@ public class BuiltinFunctions {
addIntermediateAgg(SERIAL_LOCAL_SUM, SERIAL_SUM);
addGlobalAgg(SERIAL_SUM, SERIAL_SUM);
+ // SUM DISTINCT
+
+ addDistinctAgg(SUM_DISTINCT, SCALAR_SUM);
+ addScalarAgg(SUM_DISTINCT, SCALAR_SUM_DISTINCT);
+
+ // LISTIFY
+
+ addAgg(LISTIFY);
+
// SQL Aggregate Functions
+
+ // SQL AVG
+
addAgg(SQL_AVG);
addAgg(LOCAL_SQL_AVG);
addAgg(GLOBAL_SQL_AVG);
@@ -1316,11 +1425,49 @@ public class BuiltinFunctions {
addIntermediateAgg(GLOBAL_SQL_AVG, INTERMEDIATE_SQL_AVG);
addGlobalAgg(SQL_AVG, GLOBAL_SQL_AVG);
+ addScalarAgg(SQL_AVG, SCALAR_SQL_AVG);
+ addScalarAgg(GLOBAL_SQL_AVG, SCALAR_GLOBAL_SQL_AVG);
+ addScalarAgg(LOCAL_SQL_AVG, SCALAR_LOCAL_SQL_AVG);
+
+ addSerialAgg(SQL_AVG, SERIAL_SQL_AVG);
+ addSerialAgg(LOCAL_SQL_AVG, SERIAL_LOCAL_SQL_AVG);
+ addSerialAgg(GLOBAL_SQL_AVG, SERIAL_GLOBAL_SQL_AVG);
+ addAgg(SERIAL_SQL_AVG);
+ addAgg(SERIAL_LOCAL_SQL_AVG);
+ addAgg(SERIAL_GLOBAL_SQL_AVG);
+ addLocalAgg(SERIAL_SQL_AVG, SERIAL_LOCAL_SQL_AVG);
+ addIntermediateAgg(SERIAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
+ addIntermediateAgg(SERIAL_LOCAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
+ addIntermediateAgg(SERIAL_GLOBAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
+ addGlobalAgg(SERIAL_SQL_AVG, SERIAL_GLOBAL_SQL_AVG);
+
+ // SQL AVG DISTINCT
+
+ addDistinctAgg(SQL_AVG_DISTINCT, SCALAR_SQL_AVG);
+ addScalarAgg(SQL_AVG_DISTINCT, SCALAR_SQL_AVG_DISTINCT);
+
+ // SQL COUNT
+
addAgg(SQL_COUNT);
addLocalAgg(SQL_COUNT, SQL_COUNT);
addIntermediateAgg(SQL_COUNT, SQL_SUM);
addGlobalAgg(SQL_COUNT, SQL_SUM);
+ addScalarAgg(SQL_COUNT, SCALAR_SQL_COUNT);
+
+ addSerialAgg(SQL_COUNT, SERIAL_SQL_COUNT);
+ addAgg(SERIAL_SQL_COUNT);
+ addLocalAgg(SERIAL_SQL_COUNT, SERIAL_SQL_COUNT);
+ addIntermediateAgg(SERIAL_SQL_COUNT, SERIAL_SQL_SUM);
+ addGlobalAgg(SERIAL_SQL_COUNT, SERIAL_SQL_SUM);
+
+ // SQL COUNT DISTINCT
+
+ addDistinctAgg(SQL_COUNT_DISTINCT, SCALAR_SQL_COUNT);
+ addScalarAgg(SQL_COUNT_DISTINCT, SCALAR_SQL_COUNT_DISTINCT);
+
+ // SQL MAX
+
addAgg(SQL_MAX);
addAgg(LOCAL_SQL_MAX);
addLocalAgg(SQL_MAX, LOCAL_SQL_MAX);
@@ -1328,12 +1475,30 @@ public class BuiltinFunctions {
addIntermediateAgg(SQL_MAX, SQL_MAX);
addGlobalAgg(SQL_MAX, SQL_MAX);
+ addScalarAgg(SQL_MAX, SCALAR_SQL_MAX);
+
+ // SQL MAX DISTINCT
+
+ addDistinctAgg(SQL_MAX_DISTINCT, SCALAR_SQL_MAX);
+ addScalarAgg(SQL_MAX_DISTINCT, SCALAR_SQL_MAX_DISTINCT);
+
+ // SQL MIN
+
addAgg(SQL_MIN);
addLocalAgg(SQL_MIN, LOCAL_SQL_MIN);
addIntermediateAgg(LOCAL_SQL_MIN, SQL_MIN);
addIntermediateAgg(SQL_MIN, SQL_MIN);
addGlobalAgg(SQL_MIN, SQL_MIN);
+ addScalarAgg(SQL_MIN, SCALAR_SQL_MIN);
+
+ // SQL MIN DISTINCT
+
+ addDistinctAgg(SQL_MIN_DISTINCT, SCALAR_SQL_MIN);
+ addScalarAgg(SQL_MIN_DISTINCT, SCALAR_SQL_MIN_DISTINCT);
+
+ // SQL SUM
+
addAgg(SQL_SUM);
addAgg(LOCAL_SQL_SUM);
addLocalAgg(SQL_SUM, LOCAL_SQL_SUM);
@@ -1341,28 +1506,10 @@ public class BuiltinFunctions {
addIntermediateAgg(SQL_SUM, SQL_SUM);
addGlobalAgg(SQL_SUM, SQL_SUM);
- // SQL serializable aggregate functions
- addSerialAgg(SQL_AVG, SERIAL_SQL_AVG);
- addSerialAgg(SQL_COUNT, SERIAL_SQL_COUNT);
+ addScalarAgg(SQL_SUM, SCALAR_SQL_SUM);
+
addSerialAgg(SQL_SUM, SERIAL_SQL_SUM);
addSerialAgg(LOCAL_SQL_SUM, SERIAL_LOCAL_SQL_SUM);
- addSerialAgg(LOCAL_SQL_AVG, SERIAL_LOCAL_SQL_AVG);
- addSerialAgg(GLOBAL_SQL_AVG, SERIAL_GLOBAL_SQL_AVG);
-
- addAgg(SERIAL_SQL_COUNT);
- addLocalAgg(SERIAL_SQL_COUNT, SERIAL_SQL_COUNT);
- addIntermediateAgg(SERIAL_SQL_COUNT, SERIAL_SQL_SUM);
- addGlobalAgg(SERIAL_SQL_COUNT, SERIAL_SQL_SUM);
-
- addAgg(SERIAL_SQL_AVG);
- addAgg(SERIAL_LOCAL_SQL_AVG);
- addAgg(SERIAL_GLOBAL_SQL_AVG);
- addLocalAgg(SERIAL_SQL_AVG, SERIAL_LOCAL_SQL_AVG);
- addIntermediateAgg(SERIAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
- addIntermediateAgg(SERIAL_LOCAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
- addIntermediateAgg(SERIAL_GLOBAL_SQL_AVG, SERIAL_INTERMEDIATE_SQL_AVG);
- addGlobalAgg(SERIAL_SQL_AVG, SERIAL_GLOBAL_SQL_AVG);
-
addAgg(SERIAL_SQL_SUM);
addAgg(SERIAL_LOCAL_SQL_SUM);
addLocalAgg(SERIAL_SQL_SUM, SERIAL_LOCAL_SQL_SUM);
@@ -1370,6 +1517,10 @@ public class BuiltinFunctions {
addIntermediateAgg(SERIAL_SQL_SUM, SERIAL_SQL_SUM);
addGlobalAgg(SERIAL_SQL_SUM, SERIAL_SQL_SUM);
+ // SQL SUM DISTINCT
+
+ addDistinctAgg(SQL_SUM_DISTINCT, SCALAR_SQL_SUM);
+ addScalarAgg(SQL_SUM_DISTINCT, SCALAR_SQL_SUM_DISTINCT);
}
static {
@@ -1502,6 +1653,12 @@ public class BuiltinFunctions {
return finfo == null ? null : finfo.getFunctionIdentifier();
}
+ public static FunctionIdentifier getAggregateFunctionForDistinct(FunctionIdentifier distinctVersionOfAggregate) {
+ IFunctionInfo finfo =
+ distinctToRegularScalarAggregateFunctionMap.get(getAsterixFunctionInfo(distinctVersionOfAggregate));
+ return finfo == null ? null : finfo.getFunctionIdentifier();
+ }
+
public static void addFunction(FunctionIdentifier fi, IResultTypeComputer typeComputer, boolean isFunctional) {
addFunctionWithDomain(fi, ATypeHierarchy.Domain.ANY, typeComputer, isFunctional);
}
@@ -1548,6 +1705,15 @@ public class BuiltinFunctions {
aggregateToSerializableAggregate.put(getAsterixFunctionInfo(fi), getAsterixFunctionInfo(serialfi));
}
+ private static void addScalarAgg(FunctionIdentifier fi, FunctionIdentifier scalarfi) {
+ scalarToAggregateFunctionMap.put(getAsterixFunctionInfo(scalarfi), getAsterixFunctionInfo(fi));
+ }
+
+ private static void addDistinctAgg(FunctionIdentifier distinctfi, FunctionIdentifier regularscalarfi) {
+ distinctToRegularScalarAggregateFunctionMap.put(getAsterixFunctionInfo(distinctfi),
+ getAsterixFunctionInfo(regularscalarfi));
+ }
+
static {
spatialFilterFunctions.put(getAsterixFunctionInfo(BuiltinFunctions.SPATIAL_INTERSECT),
SpatialFilterKind.SI);
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
index 4ceeb5c..75b63f1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
@@ -43,6 +43,7 @@ public enum PhysicalOperatorTag {
LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH,
MATERIALIZE,
MICRO_PRE_CLUSTERED_GROUP_BY,
+ MICRO_PRE_SORTED_DISTINCT_BY,
NESTED_LOOP,
NESTED_TUPLE_SOURCE,
ONE_TO_ONE_EXCHANGE,
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
index 8bc39b8..80d6f95 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/AbstractFunctionCallExpression.java
@@ -193,9 +193,14 @@ public abstract class AbstractFunctionCallExpression extends AbstractLogicalExpr
if (!equal) {
return false;
}
- for (int i = 0; i < arguments.size(); i++) {
+ int argumentCount = arguments.size();
+ List<Mutable<ILogicalExpression>> fceArguments = fce.getArguments();
+ if (argumentCount != fceArguments.size()) {
+ return false;
+ }
+ for (int i = 0; i < argumentCount; i++) {
ILogicalExpression argument = arguments.get(i).getValue();
- ILogicalExpression fceArgument = fce.getArguments().get(i).getValue();
+ ILogicalExpression fceArgument = fceArguments.get(i).getValue();
if (!argument.equals(fceArgument)) {
return false;
}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreSortedDistinctByPOperator.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreSortedDistinctByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreSortedDistinctByPOperator.java
new file mode 100644
index 0000000..c604e5c
--- /dev/null
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreSortedDistinctByPOperator.java
@@ -0,0 +1,108 @@
+/*
+ * 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.hyracks.algebricks.core.algebra.operators.physical;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hyracks.algebricks.common.utils.ListSet;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator;
+import org.apache.hyracks.algebricks.core.algebra.properties.ILocalStructuralProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningRequirementsCoordinator;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector;
+import org.apache.hyracks.algebricks.core.algebra.properties.LocalOrderProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.OrderColumn;
+import org.apache.hyracks.algebricks.core.algebra.properties.PhysicalRequirements;
+import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector;
+import org.apache.hyracks.algebricks.core.algebra.properties.UnorderedPartitionedProperty;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenHelper;
+
+public abstract class AbstractPreSortedDistinctByPOperator extends AbstractPhysicalOperator {
+
+ protected List<LogicalVariable> columnList;
+
+ public AbstractPreSortedDistinctByPOperator(List<LogicalVariable> columnList) {
+ this.columnList = columnList;
+ }
+
+ public void setDistinctByColumns(List<LogicalVariable> distinctByColumns) {
+ this.columnList = distinctByColumns;
+ }
+
+ @Override
+ public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
+ AbstractLogicalOperator op2 = (AbstractLogicalOperator) op.getInputs().get(0).getValue();
+ IPartitioningProperty pp = op2.getDeliveredPhysicalProperties().getPartitioningProperty();
+ List<ILocalStructuralProperty> propsLocal = op2.getDeliveredPhysicalProperties().getLocalProperties();
+ deliveredProperties = new StructuralPropertiesVector(pp, propsLocal);
+ }
+
+ @Override
+ public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op,
+ IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
+ StructuralPropertiesVector[] pv = new StructuralPropertiesVector[1];
+ List<ILocalStructuralProperty> localProps = new ArrayList<>();
+ List<OrderColumn> orderColumns = new ArrayList<>();
+ for (LogicalVariable column : columnList) {
+ orderColumns.add(new OrderColumn(column, OrderOperator.IOrder.OrderKind.ASC));
+ }
+ localProps.add(new LocalOrderProperty(orderColumns));
+ IPartitioningProperty pp = null;
+ AbstractLogicalOperator aop = (AbstractLogicalOperator) op;
+ if (aop.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.PARTITIONED) {
+ pp = new UnorderedPartitionedProperty(new ListSet<>(columnList), context.getComputationNodeDomain());
+ }
+ pv[0] = new StructuralPropertiesVector(pp, localProps);
+ return new PhysicalRequirements(pv, IPartitioningRequirementsCoordinator.NO_COORDINATION);
+ }
+
+ @Override
+ public boolean expensiveThanMaterialization() {
+ return true;
+ }
+
+ protected int[] getKeysAndDecs(IOperatorSchema inputSchema) {
+ int keys[] = JobGenHelper.variablesToFieldIndexes(columnList, inputSchema);
+ int sz = inputSchema.getSize();
+ int fdSz = sz - columnList.size();
+ int[] fdColumns = new int[fdSz];
+ int j = 0;
+ for (LogicalVariable v : inputSchema) {
+ if (!columnList.contains(v)) {
+ fdColumns[j++] = inputSchema.findVariable(v);
+ }
+ }
+ int[] keysAndDecs = new int[keys.length + fdColumns.length];
+ for (int i = 0; i < keys.length; i++) {
+ keysAndDecs[i] = keys[i];
+ }
+ for (int i = 0; i < fdColumns.length; i++) {
+ keysAndDecs[i + keys.length] = fdColumns[i];
+ }
+ return keysAndDecs;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7a4b5681/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreSortedDistinctByPOperator.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreSortedDistinctByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreSortedDistinctByPOperator.java
new file mode 100644
index 0000000..94d5fd4
--- /dev/null
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreSortedDistinctByPOperator.java
@@ -0,0 +1,80 @@
+/*
+ * 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.hyracks.algebricks.core.algebra.operators.physical;
+
+import java.util.List;
+
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.IHyracksJobBuilder;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenHelper;
+import org.apache.hyracks.algebricks.runtime.base.IAggregateEvaluatorFactory;
+import org.apache.hyracks.algebricks.runtime.operators.aggreg.SimpleAlgebricksAccumulatingAggregatorFactory;
+import org.apache.hyracks.algebricks.runtime.operators.group.MicroPreClusteredGroupRuntimeFactory;
+import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.dataflow.std.group.IAggregatorDescriptorFactory;
+
+public class MicroPreSortedDistinctByPOperator extends AbstractPreSortedDistinctByPOperator {
+
+ public MicroPreSortedDistinctByPOperator(List<LogicalVariable> columnList) {
+ super(columnList);
+ }
+
+ @Override
+ public PhysicalOperatorTag getOperatorTag() {
+ return PhysicalOperatorTag.MICRO_PRE_SORTED_DISTINCT_BY;
+ }
+
+ @Override
+ public boolean isMicroOperator() {
+ return true;
+ }
+
+ @Override
+ public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
+ IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
+ throws AlgebricksException {
+
+ int[] keysAndDecs = getKeysAndDecs(inputSchemas[0]);
+
+ IBinaryComparatorFactory[] comparatorFactories = JobGenHelper
+ .variablesToAscBinaryComparatorFactories(columnList, context.getTypeEnvironment(op), context);
+ IAggregateEvaluatorFactory[] aggFactories = new IAggregateEvaluatorFactory[] {};
+ IAggregatorDescriptorFactory aggregatorFactory =
+ new SimpleAlgebricksAccumulatingAggregatorFactory(aggFactories, keysAndDecs);
+
+ RecordDescriptor recordDescriptor =
+ JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+ RecordDescriptor inputRecordDesc = JobGenHelper.mkRecordDescriptor(
+ context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
+
+ /* make fd columns part of the key but the comparator only compares the distinct key columns */
+ MicroPreClusteredGroupRuntimeFactory runtime = new MicroPreClusteredGroupRuntimeFactory(keysAndDecs,
+ comparatorFactories, aggregatorFactory, inputRecordDesc, recordDescriptor, null);
+ builder.contributeMicroOperator(op, runtime, recordDescriptor);
+ ILogicalOperator src = op.getInputs().get(0).getValue();
+ builder.contributeGraphEdge(src, 0, op, 0);
+ }
+}