Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id ECD3D200B32 for ; Thu, 23 Jun 2016 23:03:20 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id EB7F1160A35; Thu, 23 Jun 2016 21:03:20 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id E50AE160A68 for ; Thu, 23 Jun 2016 23:03:19 +0200 (CEST) Received: (qmail 30536 invoked by uid 500); 23 Jun 2016 21:03:19 -0000 Mailing-List: contact commits-help@quickstep.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@quickstep.incubator.apache.org Delivered-To: mailing list commits@quickstep.incubator.apache.org Received: (qmail 30504 invoked by uid 99); 23 Jun 2016 21:03:19 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 23 Jun 2016 21:03:19 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 5B96C180E3A for ; Thu, 23 Jun 2016 21:03:18 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.646 X-Spam-Level: X-Spam-Status: No, score=-4.646 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-1.426] autolearn=disabled Received: from mx2-lw-us.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id bAAcLVWsZvSW for ; Thu, 23 Jun 2016 21:03:16 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx2-lw-us.apache.org (ASF Mail Server at mx2-lw-us.apache.org) with SMTP id 5D2445F3FF for ; Thu, 23 Jun 2016 21:03:15 +0000 (UTC) Received: (qmail 27563 invoked by uid 99); 23 Jun 2016 21:03:14 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 23 Jun 2016 21:03:14 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 6B9BCE38B1; Thu, 23 Jun 2016 21:03:14 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: shixuan@apache.org To: commits@quickstep.incubator.apache.org Message-Id: <5cbc06a62ea8431f8990a766166b1172@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-quickstep git commit: fixed cpplint issue Date: Thu, 23 Jun 2016 21:03:14 +0000 (UTC) archived-at: Thu, 23 Jun 2016 21:03:21 -0000 Repository: incubator-quickstep Updated Branches: refs/heads/SQL-window-aggregation 5aa705835 -> 0210099e0 fixed cpplint issue Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/0210099e Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/0210099e Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/0210099e Branch: refs/heads/SQL-window-aggregation Commit: 0210099e0655813311a973581f70cb69886320d9 Parents: 5aa7058 Author: shixuan-fan Authored: Thu Jun 23 21:03:02 2016 +0000 Committer: shixuan-fan Committed: Thu Jun 23 21:03:02 2016 +0000 ---------------------------------------------------------------------- query_optimizer/expressions/CMakeLists.txt | 2 +- query_optimizer/expressions/PatternMatcher.hpp | 3 ++ .../expressions/WindowAggregateFunction.cpp | 4 +- .../expressions/WindowAggregateFunction.hpp | 4 +- query_optimizer/logical/PatternMatcher.hpp | 2 + query_optimizer/logical/WindowAggregate.cpp | 1 - query_optimizer/resolver/Resolver.cpp | 51 ++++++++++---------- 7 files changed, 36 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/expressions/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/query_optimizer/expressions/CMakeLists.txt b/query_optimizer/expressions/CMakeLists.txt index cde56b2..08d7df5 100644 --- a/query_optimizer/expressions/CMakeLists.txt +++ b/query_optimizer/expressions/CMakeLists.txt @@ -345,4 +345,4 @@ target_link_libraries(quickstep_queryoptimizer_expressions quickstep_queryoptimizer_expressions_SimpleCase quickstep_queryoptimizer_expressions_SubqueryExpression quickstep_queryoptimizer_expressions_UnaryExpression - quickstep_queryoptimizer_expressions_WindowAggregate) + quickstep_queryoptimizer_expressions_WindowAggregateFunction) http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/expressions/PatternMatcher.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/expressions/PatternMatcher.hpp b/query_optimizer/expressions/PatternMatcher.hpp index 87bc52a..2cc91d6 100644 --- a/query_optimizer/expressions/PatternMatcher.hpp +++ b/query_optimizer/expressions/PatternMatcher.hpp @@ -52,6 +52,7 @@ class Scalar; class ScalarLiteral; class Sum; class UnaryExpression; +class WindowAggregateFunction; /** \addtogroup OptimizerExpressions * @{ @@ -155,6 +156,8 @@ using SomeScalar = SomeExpressionNode; using SomeScalarLiteral = SomeExpressionNode; using SomeUnaryExpression = SomeExpressionNode; +using SomeWindowAggregateFunction = SomeExpressionNode; using SomeAggregateFunction = SomeExpressionNode; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/expressions/WindowAggregateFunction.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/expressions/WindowAggregateFunction.cpp b/query_optimizer/expressions/WindowAggregateFunction.cpp index 39b5abf..5cab5d6 100644 --- a/query_optimizer/expressions/WindowAggregateFunction.cpp +++ b/query_optimizer/expressions/WindowAggregateFunction.cpp @@ -111,7 +111,7 @@ std::vector WindowAggregateFunction::getReferencedAttribu referenced_attributes.insert(referenced_attributes.end(), window_info_.order_by_attributes.begin(), window_info_.order_by_attributes.end()); - + return referenced_attributes; } @@ -171,7 +171,7 @@ void WindowAggregateFunction::getFieldStringItems( if (window_info_.frame_info != nullptr) { const WindowFrameInfo *frame_info = window_info_.frame_info; - + inline_field_names->push_back("frame_mode"); inline_field_values->push_back(frame_info->is_row ? "row" : "range"); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/expressions/WindowAggregateFunction.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/expressions/WindowAggregateFunction.hpp b/query_optimizer/expressions/WindowAggregateFunction.hpp index 977f0b4..319dccd 100644 --- a/query_optimizer/expressions/WindowAggregateFunction.hpp +++ b/query_optimizer/expressions/WindowAggregateFunction.hpp @@ -60,7 +60,7 @@ struct WindowFrameInfo { : is_row(is_row_in), num_preceding(num_preceding_in), num_following(num_following_in) {} - + const bool is_row; const int num_preceding; const int num_following; @@ -87,7 +87,7 @@ struct WindowInfo { order_by_directions(order_by_directions_in), nulls_first(nulls_first_in), frame_info(frame_info_in) {} - + const std::vector partition_by_attributes; const std::vector order_by_attributes; const std::vector order_by_directions; http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/logical/PatternMatcher.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/logical/PatternMatcher.hpp b/query_optimizer/logical/PatternMatcher.hpp index ff8f3d0..de8609e 100644 --- a/query_optimizer/logical/PatternMatcher.hpp +++ b/query_optimizer/logical/PatternMatcher.hpp @@ -45,6 +45,7 @@ class Sort; class TableReference; class TopLevelPlan; class UpdateTable; +class WindowAggregate; /** \addtogroup OptimizerLogical * @{ @@ -130,6 +131,7 @@ using SomeSort = SomeLogicalNode; using SomeTableReference = SomeLogicalNode; using SomeTopLevelPlan = SomeLogicalNode; using SomeUpdateTable = SomeLogicalNode; +using SomeWindowAggregate = SomeLogicalNode; /** @} */ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/logical/WindowAggregate.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/logical/WindowAggregate.cpp b/query_optimizer/logical/WindowAggregate.cpp index 0eb634d..4dc787b 100644 --- a/query_optimizer/logical/WindowAggregate.cpp +++ b/query_optimizer/logical/WindowAggregate.cpp @@ -47,7 +47,6 @@ LogicalPtr WindowAggregate::copyWithNewChildren( std::vector WindowAggregate::getOutputAttributes() const { std::vector output_attributes(input_->getOutputAttributes()); output_attributes.push_back(E::ToRef(window_aggregate_expression_)); - return output_attributes; } http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0210099e/query_optimizer/resolver/Resolver.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/resolver/Resolver.cpp b/query_optimizer/resolver/Resolver.cpp index bad818f..bcd0357 100644 --- a/query_optimizer/resolver/Resolver.cpp +++ b/query_optimizer/resolver/Resolver.cpp @@ -208,7 +208,7 @@ struct Resolver::ExpressionResolutionInfo { // Alias expressions that wraps window aggregate functions. WindowAggregationInfo *window_aggregation_info = nullptr; - + // Can be NULL if alias references to SELECT-list expressions are not allowed. SelectListInfo *select_list_info = nullptr; // The first aggregate in the expression. @@ -1027,21 +1027,21 @@ L::LogicalPtr Resolver::resolveSelect( THROW_SQL_ERROR_AT(window.name()) << "Duplicate definition of window " << window.name()->value(); } - + E::WindowInfo resolved_window = resolveWindow(window, *name_resolver); L::LogicalPtr sorted_logical_plan = resolveSortInWindow(logical_plan, resolved_window); WindowPlan window_plan(resolved_window, sorted_logical_plan); - + sorted_window_map.emplace(window.name()->value(), window_plan); } } QueryAggregationInfo query_aggregation_info( (select_query.group_by() != nullptr)); - WindowAggregationInfo window_aggregation_info(sorted_window_map); - + WindowAggregationInfo window_aggregation_info(sorted_window_map); + // Resolve SELECT-list clause. std::vector select_list_expressions; std::vector has_aggregate_per_expression; @@ -1061,16 +1061,19 @@ L::LogicalPtr Resolver::resolveSelect( // Create window aggregate node if needed for (E::AliasPtr alias : window_aggregation_info.window_aggregate_expressions) { - E::WindowAggregateFunctionPtr window_aggregate_function - = std::static_pointer_cast(alias->expression()); + E::WindowAggregateFunctionPtr window_aggregate_function; + if (!E::SomeWindowAggregateFunction::MatchesWithConditionalCast(alias->expression(), + &window_aggregate_function)) { + THROW_SQL_ERROR() + << "Unexpected expression in window aggregation function"; + } L::LogicalPtr sorted_logical_plan; // Get the sorted logical plan const std::string window_name = window_aggregate_function->window_name(); if (window_name != "") { sorted_logical_plan = sorted_window_map.at(window_name).logical_plan; - } - else { + } else { sorted_logical_plan = resolveSortInWindow(logical_plan, window_aggregate_function->window_info()); } @@ -1664,7 +1667,7 @@ E::WindowInfo Resolver::resolveWindow(const ParseWindow &parse_window, *order_by_item.ordering_expression(), nullptr, // No Type hint. &expr_resolution_info); - + if (order_by_scalar->isConstant()) { THROW_SQL_ERROR_AT(&order_by_item) << "Constant expression not allowed in ORDER BY"; @@ -1862,19 +1865,19 @@ L::LogicalPtr Resolver::resolveSortInWindow( sort_attributes.insert(sort_attributes.end(), window_info.order_by_attributes.begin(), window_info.order_by_attributes.end()); - + std::vector sort_directions( window_info.partition_by_attributes.size(), true); sort_directions.insert(sort_directions.end(), window_info.order_by_directions.begin(), window_info.order_by_directions.end()); - + std::vector sort_nulls_first( window_info.partition_by_attributes.size(), false); sort_nulls_first.insert(sort_nulls_first.end(), window_info.nulls_first.begin(), window_info.nulls_first.end()); - + L::LogicalPtr sorted_logical_plan = L::Sort::Create(logical_plan, sort_attributes, @@ -1884,7 +1887,6 @@ L::LogicalPtr Resolver::resolveSortInWindow( return sorted_logical_plan; } - void Resolver::resolveSelectClause( const ParseSelectionClause &parse_selection, @@ -2684,9 +2686,9 @@ E::ScalarPtr Resolver::resolveWindowAggregateFunction( THROW_SQL_ERROR_AT(&parse_function_call) << "Currently we only support single window aggregate in the query"; } - + std::string function_name = ToLower(parse_function_call.name()->value()); - + // First check for the special case COUNT(*). bool count_star = false; if (parse_function_call.star() != nullptr) { @@ -2711,9 +2713,9 @@ E::ScalarPtr Resolver::resolveWindowAggregateFunction( resolveExpression(unresolved_argument, nullptr, // No Type hint. &expr_resolution_info)); - + // We don't allow aggregate or window aggregate nested in a window - // aggregate function + // aggregate function. if (expr_resolution_info.hasAggregate() && first_aggregate_function == nullptr) { first_aggregate_function = @@ -2787,23 +2789,22 @@ E::ScalarPtr Resolver::resolveWindowAggregateFunction( std::string window_name = parse_function_call.window_name()->value(); std::unordered_map::const_iterator map_it = window_map.find(window_name); - + if (map_it == window_map.end()) { THROW_SQL_ERROR_AT(parse_function_call.window_name()) << "Undefined window " << window_name; } - + window_aggregate_function = E::WindowAggregateFunction::Create(*window_aggregate, resolved_arguments, map_it->second.window_info, parse_function_call.window_name()->value(), parse_function_call.is_distinct()); - } - else { + } else { E::WindowInfo resolved_window = resolveWindow(*parse_function_call.window(), expression_resolution_info->name_resolver); - + window_aggregate_function = E::WindowAggregateFunction::Create(*window_aggregate, resolved_arguments, @@ -2819,13 +2820,13 @@ E::ScalarPtr Resolver::resolveWindowAggregateFunction( "" /* attribute_name */, internal_alias, "$window_aggregate" /* relation_name */); - + expression_resolution_info->window_aggregation_info ->window_aggregate_expressions.emplace_back(aggregate_alias); expression_resolution_info->parse_window_aggregate_expression = &parse_function_call; return E::ToRef(aggregate_alias); } - + std::vector Resolver::resolvePredicates( const PtrList &parse_predicates, ExpressionResolutionInfo *expression_resolution_info) {