| 96 | resource_profile_(taggregator.resource_profile){}; |
| 97 | |
| 98 | Status GroupingAggregatorConfig::Init( |
| 99 | const TAggregator& taggregator, FragmentState* state, PlanNode* pnode) { |
| 100 | RETURN_IF_ERROR(ScalarExpr::Create( |
| 101 | taggregator.grouping_exprs, input_row_desc_, state, &grouping_exprs_)); |
| 102 | |
| 103 | // Construct build exprs from intermediate_row_desc_ |
| 104 | for (int i = 0; i < grouping_exprs_.size(); ++i) { |
| 105 | SlotDescriptor* desc = intermediate_tuple_desc_->slots()[i]; |
| 106 | DCHECK(desc->type().type == TYPE_NULL || desc->type() == grouping_exprs_[i]->type()); |
| 107 | // Use SlotRef::TypeSafeCreate() to avoid TYPE_NULL SlotRefs. |
| 108 | SlotRef* build_expr = state->obj_pool()->Add(SlotRef::TypeSafeCreate(desc)); |
| 109 | build_exprs_.push_back(build_expr); |
| 110 | // Not an entry point because all hash table callers support codegen. |
| 111 | RETURN_IF_ERROR( |
| 112 | build_expr->Init(intermediate_row_desc_, /* is_entry_point */ false, state)); |
| 113 | if (build_expr->type().IsVarLenStringType()) string_grouping_exprs_.push_back(i); |
| 114 | } |
| 115 | |
| 116 | RETURN_IF_ERROR(AggregatorConfig::Init(taggregator, state, pnode)); |
| 117 | for (int i = 0; i < aggregate_functions_.size(); ++i) { |
| 118 | needs_serialize_ |= aggregate_functions_[i]->SupportsSerialize(); |
| 119 | } |
| 120 | |
| 121 | hash_table_config_ = state->obj_pool()->Add(new HashTableConfig( |
| 122 | build_exprs_, grouping_exprs_, true, vector<bool>(build_exprs_.size(), true))); |
| 123 | return Status::OK(); |
| 124 | } |
| 125 | |
| 126 | void GroupingAggregatorConfig::Close() { |
| 127 | ScalarExpr::Close(build_exprs_); |