@@ -785,7 +785,11 @@ class PhysicalAggregationNode : public PhysicalProjectNode {
785785 public:
786786 PhysicalAggregationNode (PhysicalOpNode *node, const ColumnProjects &project, const node::ExprNode *condition)
787787 : PhysicalProjectNode(node, kAggregation , project, true ), having_condition_(condition) {
788- output_type_ = kSchemaTypeRow ;
788+ if (node->GetOutputType () == kSchemaTypeGroup ) {
789+ output_type_ = kSchemaTypeGroup ;
790+ } else {
791+ output_type_ = kSchemaTypeRow ;
792+ }
789793 fn_infos_.push_back (&having_condition_.fn_info ());
790794 }
791795 virtual ~PhysicalAggregationNode () {}
@@ -1065,7 +1069,7 @@ class RequestWindowUnionList {
10651069 RequestWindowUnionList () : window_unions_() {}
10661070 virtual ~RequestWindowUnionList () {}
10671071 void AddWindowUnion (PhysicalOpNode *node, const RequestWindowOp &window) {
1068- window_unions_.push_back ( std::make_pair ( node, window) );
1072+ window_unions_.emplace_back ( node, window);
10691073 }
10701074 const PhysicalOpNode *GetKey (uint32_t index) {
10711075 auto iter = window_unions_.begin ();
@@ -1415,7 +1419,7 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14151419 instance_not_in_window_(false ),
14161420 exclude_current_time_(false ),
14171421 output_request_row_(true ) {
1418- output_type_ = kSchemaTypeTable ;
1422+ InitOuptput () ;
14191423
14201424 fn_infos_.push_back (&window_.partition_ .fn_info ());
14211425 fn_infos_.push_back (&window_.index_key_ .fn_info ());
@@ -1427,7 +1431,7 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14271431 instance_not_in_window_(w_ptr->instance_not_in_window ()),
14281432 exclude_current_time_(w_ptr->exclude_current_time ()),
14291433 output_request_row_(true ) {
1430- output_type_ = kSchemaTypeTable ;
1434+ InitOuptput () ;
14311435
14321436 fn_infos_.push_back (&window_.partition_ .fn_info ());
14331437 fn_infos_.push_back (&window_.sort_ .fn_info ());
@@ -1443,7 +1447,7 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14431447 instance_not_in_window_(instance_not_in_window),
14441448 exclude_current_time_(exclude_current_time),
14451449 output_request_row_(output_request_row) {
1446- output_type_ = kSchemaTypeTable ;
1450+ InitOuptput () ;
14471451
14481452 fn_infos_.push_back (&window_.partition_ .fn_info ());
14491453 fn_infos_.push_back (&window_.sort_ .fn_info ());
@@ -1455,7 +1459,8 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14551459 virtual void Print (std::ostream &output, const std::string &tab) const ;
14561460 const bool Valid () { return true ; }
14571461 static PhysicalRequestUnionNode *CastFrom (PhysicalOpNode *node);
1458- bool AddWindowUnion (PhysicalOpNode *node) {
1462+ bool AddWindowUnion (PhysicalOpNode *node) { return AddWindowUnion (node, window_); }
1463+ bool AddWindowUnion (PhysicalOpNode *node, const RequestWindowOp& window) {
14591464 if (nullptr == node) {
14601465 LOG (WARNING) << " Fail to add window union : table is null" ;
14611466 return false ;
@@ -1472,9 +1477,8 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14721477 << " Union Table and window input schema aren't consistent" ;
14731478 return false ;
14741479 }
1475- window_unions_.AddWindowUnion (node, window_);
1476- RequestWindowOp &window_union =
1477- window_unions_.window_unions_ .back ().second ;
1480+ window_unions_.AddWindowUnion (node, window);
1481+ RequestWindowOp &window_union = window_unions_.window_unions_ .back ().second ;
14781482 fn_infos_.push_back (&window_union.partition_ .fn_info ());
14791483 fn_infos_.push_back (&window_union.sort_ .fn_info ());
14801484 fn_infos_.push_back (&window_union.range_ .fn_info ());
@@ -1484,11 +1488,10 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
14841488
14851489 std::vector<PhysicalOpNode *> GetDependents () const override ;
14861490
1487- const bool instance_not_in_window () const {
1488- return instance_not_in_window_;
1489- }
1490- const bool exclude_current_time () const { return exclude_current_time_; }
1491- const bool output_request_row () const { return output_request_row_; }
1491+ bool instance_not_in_window () const { return instance_not_in_window_; }
1492+ bool exclude_current_time () const { return exclude_current_time_; }
1493+ bool output_request_row () const { return output_request_row_; }
1494+ void set_output_request_row (bool flag) { output_request_row_ = flag; }
14921495 const RequestWindowOp &window () const { return window_; }
14931496 const RequestWindowUnionList &window_unions () const {
14941497 return window_unions_;
@@ -1506,10 +1509,20 @@ class PhysicalRequestUnionNode : public PhysicalBinaryNode {
15061509 }
15071510
15081511 RequestWindowOp window_;
1509- const bool instance_not_in_window_;
1510- const bool exclude_current_time_;
1511- const bool output_request_row_;
1512+ bool instance_not_in_window_;
1513+ bool exclude_current_time_;
1514+ bool output_request_row_;
15121515 RequestWindowUnionList window_unions_;
1516+
1517+ private:
1518+ void InitOuptput () {
1519+ auto left = GetProducer (0 );
1520+ if (left->GetOutputType () == kSchemaTypeRow ) {
1521+ output_type_ = kSchemaTypeTable ;
1522+ } else {
1523+ output_type_ = kSchemaTypeGroup ;
1524+ }
1525+ }
15131526};
15141527
15151528class PhysicalRequestAggUnionNode : public PhysicalOpNode {
0 commit comments