// 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.

syntax = "proto2";

package quickstep.serialization;

import "expressions/Expressions.proto";
import "expressions/aggregation/AggregateFunction.proto";
import "storage/HashTable.proto";

message Aggregate {
  required AggregateFunction function = 1;
  repeated Scalar argument = 2;
  required bool is_distinct = 3;
}

message AggregationOperationState {
  required int32 relation_id = 1;
  repeated Aggregate aggregates = 2;
  repeated Scalar group_by_expressions = 3;
  optional Predicate predicate = 4;
  required uint64 estimated_num_entries = 5;

  // NOTE(chasseur): 'hash_table_impl_type' is marked optional, but it is
  // needed if 'group_by_expressions' is non-empty, and ignored otherwise.
  optional HashTableImplType hash_table_impl_type = 6;

  // Each DISTINCT aggregation has its distinctify hash table impl type.
  repeated HashTableImplType distinctify_hash_table_impl_types = 7;

  optional bool is_partitioned = 8;
  optional uint64 num_partitions = 9 [default = 1];

  // Required if 'hash_table_impl_type' is 'COLLISION_FREE_VECTOR'.
  optional CollisionFreeVectorInfo collision_free_vector_info = 10;
}
