Merge branch 'gerrit/trinity' into 'master'
Change-Id: I9c5c3a6deb9a277cbe74255022cddffc550b4d94
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AsterixOptimizationContext.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AsterixOptimizationContext.java
index f13e3f2..7c6b150 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AsterixOptimizationContext.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AsterixOptimizationContext.java
@@ -25,6 +25,7 @@
import org.apache.asterix.common.metadata.MetadataConstants;
import org.apache.asterix.metadata.declared.DataSource;
+import org.apache.asterix.metadata.declared.FunctionDataSource;
import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
import org.apache.hyracks.algebricks.core.algebra.expressions.IConflictingTypeResolver;
import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionEvalSizeComputer;
@@ -83,10 +84,10 @@
}
for (Int2ObjectMap.Entry<Set<DataSource>> me : dataSourceMap.int2ObjectEntrySet()) {
int dataSourceType = me.getIntKey();
- if (dataSourceType != DataSource.Type.INTERNAL_DATASET) {
+ if (dataSourceType != DataSource.Type.INTERNAL_DATASET && dataSourceType != DataSource.Type.FUNCTION) {
return false;
}
- Predicate<DataSource> dataSourceTest = AsterixOptimizationContext::isMetadata;
+ Predicate<DataSource> dataSourceTest = AsterixOptimizationContext::skipJobCapacityAssignment;
if (!me.getValue().stream().allMatch(dataSourceTest)) {
return false;
}
@@ -94,7 +95,11 @@
return true;
}
- private static boolean isMetadata(DataSource ds) {
- return MetadataConstants.METADATA_DATAVERSE_NAME.equals(ds.getId().getDataverseName());
+ private static boolean skipJobCapacityAssignment(DataSource ds) {
+ return MetadataConstants.METADATA_DATAVERSE_NAME.equals(ds.getId().getDataverseName()) || isSkipping(ds);
+ }
+
+ private static boolean isSkipping(DataSource ds) {
+ return (ds instanceof FunctionDataSource) && ((FunctionDataSource) ds).skipJobCapacityAssignment();
}
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/ActiveRequestsDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/ActiveRequestsDatasource.java
index 24a127a..5239d01 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/ActiveRequestsDatasource.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/ActiveRequestsDatasource.java
@@ -43,4 +43,9 @@
AlgebricksAbsolutePartitionConstraint.randomLocation(locations.getLocations());
return new ClientRequestsFunction(randomLocation, ClientRequestsRequest.RequestType.RUNNING);
}
+
+ @Override
+ public boolean skipJobCapacityAssignment() {
+ return true;
+ }
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/CompletedRequestsDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/CompletedRequestsDatasource.java
index 0bfbff1..f02af21 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/CompletedRequestsDatasource.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/CompletedRequestsDatasource.java
@@ -43,4 +43,9 @@
AlgebricksAbsolutePartitionConstraint.randomLocation(locations.getLocations());
return new ClientRequestsFunction(randomLocation, ClientRequestsRequest.RequestType.COMPLETED);
}
+
+ @Override
+ public boolean skipJobCapacityAssignment() {
+ return true;
+ }
}
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-3334.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-3334.sqlpp
new file mode 100644
index 0000000..c21b569
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-ASTERIXDB-3334.sqlpp
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type dt1 as {Id:int};
+create dataset collection0(dt1) primary key Id;
+
+CREATE VIEW `Staples`(
+`Item Count` BIGINT NOT UNKNOWN, `Ship Priority` STRING NOT UNKNOWN, `Order Priority` STRING NOT UNKNOWN,
+`Order Status` STRING NOT UNKNOWN, `Order Quantity` DOUBLE NOT UNKNOWN, `Sales Total` DOUBLE NOT UNKNOWN,
+`Discount` DOUBLE NOT UNKNOWN, `Tax Rate` DOUBLE NOT UNKNOWN, `Ship Mode` STRING NOT UNKNOWN, `Fill Time` DOUBLE NOT UNKNOWN,
+`Gross Profit` DOUBLE NOT UNKNOWN, `Price` DOUBLE NOT UNKNOWN, `Ship Handle Cost` DOUBLE NOT UNKNOWN, `Employee Name` STRING NOT UNKNOWN,
+`Employee Dept` STRING NOT UNKNOWN, `Manager Name` STRING NOT UNKNOWN, `Employee Yrs Exp` DOUBLE NOT UNKNOWN, `Employee Salary` DOUBLE NOT UNKNOWN,
+`Customer Name` STRING NOT UNKNOWN, `Customer State` STRING NOT UNKNOWN, `Call Center Region` STRING NOT UNKNOWN, `Customer Balance` DOUBLE NOT UNKNOWN,
+`Customer Segment` STRING NOT UNKNOWN, `Prod Type1` STRING NOT UNKNOWN, `Prod Type2` STRING NOT UNKNOWN, `Prod Type3` STRING NOT UNKNOWN,
+`Prod Type4` STRING NOT UNKNOWN, `Product Name` STRING NOT UNKNOWN, `Product Container` STRING NOT UNKNOWN, `Ship Promo` STRING NOT UNKNOWN,
+`Supplier Name` STRING NOT UNKNOWN, `Supplier Balance` DOUBLE NOT UNKNOWN, `Supplier Region` STRING NOT UNKNOWN, `Supplier State` STRING NOT UNKNOWN,
+`Order ID` STRING NOT UNKNOWN, `Order Year` BIGINT NOT UNKNOWN, `Order Month` BIGINT NOT UNKNOWN, `Order Day` BIGINT NOT UNKNOWN,
+`Order Date` DATETIME NOT UNKNOWN, `Order Quarter` STRING NOT UNKNOWN, `Product Base Margin` DOUBLE NOT UNKNOWN, `Product ID` STRING NOT UNKNOWN,
+`Receive Time` DOUBLE NOT UNKNOWN, `Received Date` DATETIME NOT UNKNOWN, `Ship Date` DATETIME NOT UNKNOWN, `Ship Charge` DOUBLE NOT UNKNOWN,
+`Total Cycle Time` DOUBLE NOT UNKNOWN, `Product In Stock` STRING NOT UNKNOWN, `PID` BIGINT NOT UNKNOWN, `Market Segment` STRING NOT UNKNOWN)
+default NULL AS `collection0`;
+
+SELECT `Staples`.`Employee Name` AS `Employee Name`,
+ AVG(`Staples`.`Employee Salary`) AS `avg:Employee Salary:ok`
+FROM `Staples` `Staples`
+ INNER JOIN (
+ SELECT `Staples`.`Call Center Region` AS `Call Center Region`,
+ `Staples`.`Employee Name` AS `Employee Name`
+ FROM `Staples` `Staples`
+ GROUP BY `Staples`.`Call Center Region`,
+ `Staples`.`Employee Name`
+ HAVING ((AVG(`Staples`.`Employee Salary`)>=102499.99999999898) AND (AVG(`Staples`.`Employee Salary`)<=110000.00000000111))
+) `t0` ON ((`Staples`.`Call Center Region` = `t0`.`Call Center Region`) AND (`Staples`.`Employee Name` = `t0`.`Employee Name`))
+GROUP BY `Staples`.`Employee Name`;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-3334.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-3334.plan
new file mode 100644
index 0000000..bbb94e3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-3334.plan
@@ -0,0 +1,61 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- SORT_GROUP_BY[$$1112] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- HASH_PARTITION_EXCHANGE [$$1112] |PARTITIONED|
+ -- SORT_GROUP_BY[$$1113] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$1113, $$1114][$$Employee Name, $$Call Center Region] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$1114, $$1113] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- SORT_GROUP_BY[$$1109, $$1110] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- HASH_PARTITION_EXCHANGE [$$1109, $$1110] |PARTITIONED|
+ -- SORT_GROUP_BY[$$1117, $$1116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query-ASTERIXDB-3334.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query-ASTERIXDB-3334.plan
new file mode 100644
index 0000000..bbb94e3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query-ASTERIXDB-3334.plan
@@ -0,0 +1,61 @@
+-- DISTRIBUTE_RESULT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- SORT_GROUP_BY[$$1112] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- HASH_PARTITION_EXCHANGE [$$1112] |PARTITIONED|
+ -- SORT_GROUP_BY[$$1113] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$1113, $$1114][$$Employee Name, $$Call Center Region] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$1114, $$1113] |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- SORT_GROUP_BY[$$1109, $$1110] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- HASH_PARTITION_EXCHANGE [$$1109, $$1110] |PARTITIONED|
+ -- SORT_GROUP_BY[$$1117, $$1116] |PARTITIONED|
+ {
+ -- AGGREGATE |LOCAL|
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- STREAM_SELECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.1.ddl.sqlpp
new file mode 100644
index 0000000..ac587d4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.1.ddl.sqlpp
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-2947
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type dt1 as {Id:int};
+create dataset collection0(dt1) primary key Id;
+
+CREATE VIEW `Staples`(
+`Item Count` BIGINT NOT UNKNOWN, `Ship Priority` STRING NOT UNKNOWN, `Order Priority` STRING NOT UNKNOWN,
+`Order Status` STRING NOT UNKNOWN, `Order Quantity` DOUBLE NOT UNKNOWN, `Sales Total` DOUBLE NOT UNKNOWN,
+`Discount` DOUBLE NOT UNKNOWN, `Tax Rate` DOUBLE NOT UNKNOWN, `Ship Mode` STRING NOT UNKNOWN, `Fill Time` DOUBLE NOT UNKNOWN,
+`Gross Profit` DOUBLE NOT UNKNOWN, `Price` DOUBLE NOT UNKNOWN, `Ship Handle Cost` DOUBLE NOT UNKNOWN, `Employee Name` STRING NOT UNKNOWN,
+`Employee Dept` STRING NOT UNKNOWN, `Manager Name` STRING NOT UNKNOWN, `Employee Yrs Exp` DOUBLE NOT UNKNOWN, `Employee Salary` DOUBLE NOT UNKNOWN,
+`Customer Name` STRING NOT UNKNOWN, `Customer State` STRING NOT UNKNOWN, `Call Center Region` STRING NOT UNKNOWN, `Customer Balance` DOUBLE NOT UNKNOWN,
+`Customer Segment` STRING NOT UNKNOWN, `Prod Type1` STRING NOT UNKNOWN, `Prod Type2` STRING NOT UNKNOWN, `Prod Type3` STRING NOT UNKNOWN,
+`Prod Type4` STRING NOT UNKNOWN, `Product Name` STRING NOT UNKNOWN, `Product Container` STRING NOT UNKNOWN, `Ship Promo` STRING NOT UNKNOWN,
+`Supplier Name` STRING NOT UNKNOWN, `Supplier Balance` DOUBLE NOT UNKNOWN, `Supplier Region` STRING NOT UNKNOWN, `Supplier State` STRING NOT UNKNOWN,
+`Order ID` STRING NOT UNKNOWN, `Order Year` BIGINT NOT UNKNOWN, `Order Month` BIGINT NOT UNKNOWN, `Order Day` BIGINT NOT UNKNOWN,
+`Order Date` DATETIME NOT UNKNOWN, `Order Quarter` STRING NOT UNKNOWN, `Product Base Margin` DOUBLE NOT UNKNOWN, `Product ID` STRING NOT UNKNOWN,
+`Receive Time` DOUBLE NOT UNKNOWN, `Received Date` DATETIME NOT UNKNOWN, `Ship Date` DATETIME NOT UNKNOWN, `Ship Charge` DOUBLE NOT UNKNOWN,
+`Total Cycle Time` DOUBLE NOT UNKNOWN, `Product In Stock` STRING NOT UNKNOWN, `PID` BIGINT NOT UNKNOWN, `Market Segment` STRING NOT UNKNOWN)
+default NULL AS `collection0`
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.2.update.sqlpp
new file mode 100644
index 0000000..c971b27
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.2.update.sqlpp
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ */
+
+use test;
+
+insert into collection0
+([
+ {
+ "Id": 1,
+ "Item Count": 1,
+ "Ship Priority": "0",
+ "Order Priority": "1-URGENT",
+ "Order Status": "F",
+ "Order Quantity": 38,
+ "Sales Total": 195.19,
+ "Discount": 0.08,
+ "Tax Rate": 0.03,
+ "Ship Mode": "REGULAR AIR",
+ "Fill Time": 2,
+ "Gross Profit": -71.33,
+ "Price": 5.28,
+ "Ship Handle Cost": 5.06,
+ "Employee Name": "Purkey, Jan",
+ "Employee Dept": "1054",
+ "Manager Name": "Collins, Babs",
+ "Employee Yrs Exp": 6,
+ "Employee Salary": 104677,
+ "Customer Name": "Roy Skaria",
+ "Customer State": "OHIO",
+ "Call Center Region": "CENTRAL",
+ "Customer Balance": 6496,
+ "Customer Segment": "CONSUMER",
+ "Prod Type1": "OFFICE SUPPLIES",
+ "Prod Type2": "PAPER",
+ "Prod Type3": "STATIONARY",
+ "Prod Type4": "BUSINESS STATIONARY",
+ "Product Name": "Astroparche® Fine Business Paper",
+ "Product Container": "SMALL BOX",
+ "Ship Promo": "REGULAR SHIPPING",
+ "Supplier Name": "Supplier_098",
+ "Supplier Balance": 5873,
+ "Supplier Region": "WEST",
+ "Supplier State": "CALIFORNIA",
+ "Order ID": "21284",
+ "Order Year": 1997,
+ "Order Month": 9,
+ "Order Day": 15,
+ "Order Date": "1997-09-15T00:00:00.000",
+ "Order Quarter": "Q3",
+ "Product Base Margin": 0.37,
+ "Product ID": "1811",
+ "Receive Time": 3,
+ "Received Date": "1997-09-20T00:00:00.000",
+ "Ship Date": "1997-09-17T00:00:00.000",
+ "Ship Charge": 5.06,
+ "Total Cycle Time": 5,
+ "Product In Stock": "YES",
+ "PID": 6632,
+ "Market Segment": "CONSUMER"
+ },
+{
+ "Id": 2,
+ "Item Count": 1,
+ "Ship Priority": "0",
+ "Order Priority": "4-NOT SPECIFIED",
+ "Order Status": "F",
+ "Order Quantity": 36,
+ "Sales Total": 603.9,
+ "Discount": 0.07,
+ "Tax Rate": 0.02,
+ "Ship Mode": "REGULAR AIR",
+ "Fill Time": 1,
+ "Gross Profit": 168.93,
+ "Price": 17.52,
+ "Ship Handle Cost": 5.6,
+ "Employee Name": "Purkey, Jan",
+ "Employee Dept": "1054",
+ "Manager Name": "Collins, Babs",
+ "Employee Yrs Exp": 6,
+ "Employee Salary": 104677,
+ "Customer Name": "Nathan Mautz",
+ "Customer State": "ILLINOIS",
+ "Call Center Region": "CENTRAL",
+ "Customer Balance": 1820,
+ "Customer Segment": "HOME OFFICE",
+ "Prod Type1": "OFFICE SUPPLIES",
+ "Prod Type2": "PAPER",
+ "Prod Type3": "WRITINGS PADS",
+ "Prod Type4": "MEMO SLIPS",
+ "Product Name": "TOPS Carbonless Receipt Book, Four 2-3/4 x 7-1/4 Money Receipts per Page",
+ "Product Container": "WRAP BAG",
+ "Ship Promo": "REGULAR SHIPPING",
+ "Supplier Name": "Supplier_090",
+ "Supplier Balance": 6202,
+ "Supplier Region": "WEST",
+ "Supplier State": "NEW MEXICO",
+ "Order ID": "1250",
+ "Order Year": 1997,
+ "Order Month": 9,
+ "Order Day": 29,
+ "Order Date": "1997-09-29T00:00:00.000",
+ "Order Quarter": "Q3",
+ "Product Base Margin": 0.37,
+ "Product ID": "1860",
+ "Receive Time": 2,
+ "Received Date": "1997-10-02T00:00:00.000",
+ "Ship Date": "1997-09-30T00:00:00.000",
+ "Ship Charge": 5.6,
+ "Total Cycle Time": 3,
+ "Product In Stock": "YES",
+ "PID": 6981,
+ "Market Segment": "HOME OFFICE"
+}
+]);
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.query.sqlpp
new file mode 100644
index 0000000..b6104e5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.query.sqlpp
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3316
+ */
+
+use test;
+
+SELECT `Staples`.`Employee Name` AS `Employee Name`,
+ AVG(`Staples`.`Employee Salary`) AS `avg:Employee Salary:ok`
+FROM `Staples` `Staples`
+ INNER JOIN (
+ SELECT `Staples`.`Call Center Region` AS `Call Center Region`,
+ `Staples`.`Employee Name` AS `Employee Name`
+ FROM `Staples` `Staples`
+ GROUP BY `Staples`.`Call Center Region`,
+ `Staples`.`Employee Name`
+ HAVING ((AVG(`Staples`.`Employee Salary`)>=102499.99999999898) AND (AVG(`Staples`.`Employee Salary`)<=110000.00000000111))
+) `t0` ON ((`Staples`.`Call Center Region` = `t0`.`Call Center Region`) AND (`Staples`.`Employee Name` = `t0`.`Employee Name`))
+GROUP BY `Staples`.`Employee Name`
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/active_requests/active_requests.4.regex b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/active_requests/active_requests.4.regex
index e2d166b..695472c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/active_requests/active_requests.4.regex
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/active_requests/active_requests.4.regex
@@ -1 +1 @@
-/memory\D+229376/
\ No newline at end of file
+/memory\D+0/
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/completed_requests/completed_requests.3.regex b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/completed_requests/completed_requests.3.regex
index e2d166b..695472c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/completed_requests/completed_requests.3.regex
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/completed_requests/completed_requests.3.regex
@@ -1 +1 @@
-/memory\D+229376/
\ No newline at end of file
+/memory\D+0/
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.adm
new file mode 100644
index 0000000..e99dc40
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3334/query-ASTERIXDB-3334.3.adm
@@ -0,0 +1 @@
+{ "Employee Name": "Purkey, Jan", "avg:Employee Salary:ok": 104677.0 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index d6096a7..831cf6b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -7369,6 +7369,11 @@
<output-dir compare="Text">query-ASTERIXDB-3316</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="misc">
+ <compilation-unit name="query-ASTERIXDB-3334">
+ <output-dir compare="Text">query-ASTERIXDB-3334</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="multipart-dataverse">
<test-case FilePath="multipart-dataverse">
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
index a4f1d7b..e9b6111 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
@@ -121,6 +121,10 @@
outputLimit);
}
+ public boolean skipJobCapacityAssignment() {
+ return false;
+ }
+
protected abstract IDatasourceFunction createFunction(MetadataProvider metadataProvider,
AlgebricksAbsolutePartitionConstraint locations);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/UnorderedPartitionedProperty.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/UnorderedPartitionedProperty.java
index 6d4c389..7778de5 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/UnorderedPartitionedProperty.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/UnorderedPartitionedProperty.java
@@ -85,11 +85,13 @@
@Override
public IPartitioningProperty substituteColumnVars(Map<LogicalVariable, LogicalVariable> varMap) {
boolean applied = false;
- Set<LogicalVariable> newColumnSet = new ListSet<>(columnSet);
- for (Map.Entry<LogicalVariable, LogicalVariable> me : varMap.entrySet()) {
- if (newColumnSet.remove(me.getKey())) {
- newColumnSet.add(me.getValue());
+ Set<LogicalVariable> newColumnSet = new ListSet<>();
+ for (LogicalVariable variable : columnSet) {
+ if (varMap.containsKey(variable)) {
+ newColumnSet.add(varMap.get(variable));
applied = true;
+ } else {
+ newColumnSet.add(variable);
}
}
return applied ? new UnorderedPartitionedProperty(newColumnSet, domain, partitionsMap) : this;
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletRequest.java
index a049412..59c0ae0 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/api/IServletRequest.java
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Set;
+import io.netty.channel.Channel;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpScheme;
@@ -78,7 +79,9 @@
* @param name header name
* @return the header or null if not found
*/
- String getHeader(CharSequence name);
+ default String getHeader(CharSequence name) {
+ return getHttpRequest().headers().get(name);
+ }
/**
* Get a request header if found, return the default value, otherwise
@@ -110,4 +113,6 @@
* @return the remote address
*/
InetSocketAddress getLocalAddress();
+
+ Channel getChannel();
}
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
index c3c7dbc..4a72d53 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/BaseRequest.java
@@ -29,6 +29,7 @@
import org.apache.hyracks.http.api.IServletRequest;
+import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpScheme;
@@ -37,26 +38,22 @@
public class BaseRequest implements IServletRequest {
private static final List<String> NO_PARAM = Collections.singletonList(null);
+ private final Channel channel;
protected final FullHttpRequest request;
protected final Map<? extends CharSequence, List<String>> parameters;
- protected final InetSocketAddress remoteAddress;
protected final HttpScheme scheme;
- protected final InetSocketAddress localAddress;
public static IServletRequest create(ChannelHandlerContext ctx, FullHttpRequest request, HttpScheme scheme,
boolean ignoreQueryParameters) {
Map<? extends CharSequence, List<String>> param =
ignoreQueryParameters ? Collections.emptyMap() : new QueryStringDecoder(request.uri()).parameters();
- InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
- InetSocketAddress localAddress = (InetSocketAddress) ctx.channel().localAddress();
- return new BaseRequest(request, localAddress, remoteAddress, param, scheme);
+ return new BaseRequest(ctx.channel(), request, param, scheme);
}
- protected BaseRequest(FullHttpRequest request, InetSocketAddress localAddress, InetSocketAddress remoteAddress,
+ protected BaseRequest(Channel channel, FullHttpRequest request,
Map<? extends CharSequence, List<String>> parameters, HttpScheme scheme) {
+ this.channel = channel;
this.request = request;
- this.localAddress = localAddress;
- this.remoteAddress = remoteAddress;
this.parameters = parameters;
this.scheme = scheme;
}
@@ -104,7 +101,7 @@
@Override
public InetSocketAddress getRemoteAddress() {
- return remoteAddress;
+ return (InetSocketAddress) channel.remoteAddress();
}
@Override
@@ -114,6 +111,11 @@
@Override
public InetSocketAddress getLocalAddress() {
- return localAddress;
+ return (InetSocketAddress) channel.localAddress();
+ }
+
+ @Override
+ public Channel getChannel() {
+ return channel;
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/CLFLogger.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/CLFLogger.java
index 219995b..a24ed95 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/CLFLogger.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/CLFLogger.java
@@ -120,21 +120,22 @@
@Override
public void flush(ChannelHandlerContext ctx) throws Exception {
if (lastChunk) {
- printAndPrepare();
+ printAndPrepare(ctx);
lastChunk = false;
}
ctx.flush();
}
- private void printAndPrepare() {
+ private void printAndPrepare(ChannelHandlerContext ctx) {
if (!accessLogger.isEnabled(ACCESS_LOG_LEVEL)) {
return;
}
logLineBuilder.append(clientIp);
//identd value - not relevant here
logLineBuilder.append(" - ");
+ logLineBuilder.append(getUserId(ctx));
//no http auth or any auth either for that matter
- logLineBuilder.append(" - [");
+ logLineBuilder.append(" [");
logLineBuilder.append(DATE_TIME_FORMATTER.format(requestTime));
logLineBuilder.append("] \"");
logLineBuilder.append(reqLine);
@@ -146,4 +147,8 @@
respSize = 0;
logLineBuilder.setLength(0);
}
+
+ protected String getUserId(ChannelHandlerContext ctx) {
+ return "-";
+ }
}
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FormUrlEncodedRequest.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FormUrlEncodedRequest.java
index fa7ef66..983a1fd 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FormUrlEncodedRequest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/FormUrlEncodedRequest.java
@@ -18,7 +18,6 @@
*/
package org.apache.hyracks.http.server;
-import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -29,6 +28,7 @@
import org.apache.hyracks.http.api.IServletRequest;
import org.apache.hyracks.http.server.utils.HttpUtil;
+import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpScheme;
@@ -46,13 +46,11 @@
new QueryStringDecoder(request.uri()).parameters()
.forEach((name, value) -> parameters.computeIfAbsent(name, a -> new ArrayList<>()).addAll(value));
}
- InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
- InetSocketAddress localAddress = (InetSocketAddress) ctx.channel().localAddress();
- return new FormUrlEncodedRequest(request, localAddress, remoteAddress, parameters, scheme);
+ return new FormUrlEncodedRequest(ctx.channel(), request, parameters, scheme);
}
- private FormUrlEncodedRequest(FullHttpRequest request, InetSocketAddress localAddress,
- InetSocketAddress remoteAddress, Map<String, List<String>> parameters, HttpScheme scheme) {
- super(request, localAddress, remoteAddress, parameters, scheme);
+ private FormUrlEncodedRequest(Channel channel, FullHttpRequest request, Map<String, List<String>> parameters,
+ HttpScheme scheme) {
+ super(channel, request, parameters, scheme);
}
}