// 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 "relational_operators/SortMergeRunOperator.proto";

enum WorkOrderType {
  AGGREGATION = 1;
  BUILD_HASH = 2;
  BUILD_LIP_FILTER = 3;
  CREATE_INDEX = 4;  // Placeholder.
  CREATE_TABLE = 5;  // Placeholder.
  DELETE = 6;
  DESTROY_HASH = 7;
  DROP_TABLE = 8;
  FINALIZE_AGGREGATION = 9;
  HASH_JOIN = 10;
  INSERT = 11;
  NESTED_LOOP_JOIN = 12;
  SAMPLE = 13;
  SAVE_BLOCKS = 14;
  SELECT = 15;
  SORT_MERGE_RUN = 16;
  SORT_RUN_GENERATION = 17;
  TABLE_GENERATOR = 18;
  TEXT_SCAN = 19;
  UPDATE = 20;
  WINDOW_AGGREGATION = 21;
  DESTROY_AGGREGATION_STATE = 22;
  BUILD_AGGREGATION_EXISTENCE_MAP = 23;
}

message WorkOrder {
  required WorkOrderType work_order_type = 1;
  required uint64 query_id = 2;

  // The convention for extension numbering is that extensions for a particular
  // WorkOrderID should begin from (operator_type + 1) * 16.
  extensions 16 to max;
}

message AggregationWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint32 aggr_state_index = 16;
    optional fixed64 block_id = 17;
    optional int32 lip_deployment_index = 18;
  }
}

// Next tag: 39.
message BuildHashWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 relation_id = 32;
    repeated int32 join_key_attributes = 33;
    optional bool any_join_key_attributes_nullable = 34;
    optional uint32 join_hash_table_index = 35;
    optional uint64 partition_id = 38;
    optional fixed64 block_id = 36;
    optional int32 lip_deployment_index = 37;
  }
}

message BuildLIPFilterWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 relation_id = 48;
    optional fixed64 build_block_id = 49;
    optional int32 build_side_predicate_index = 50;
    optional int32 lip_deployment_index = 51;
  }
}

message DeleteWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint64 operator_index = 96;
    optional int32 relation_id = 97;
    optional int32 predicate_index = 98;
    optional fixed64 block_id = 99;
  }
}

message DestroyHashWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint32 join_hash_table_index = 112;
    optional uint64 partition_id = 113;
  }
}

message DropTableWorkOrder {
  extend WorkOrder {
    // If set, CatalogDatabaseCache will drop the relation.
    optional int32 relation_id = 128;
    // Optional, and maybe empty.
    repeated fixed64 block_ids = 129;
  }
}

message FinalizeAggregationWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint32 aggr_state_index = 144;
    optional int32 insert_destination_index = 145;
  }
}

// Next tag: 173.
message HashJoinWorkOrder {
  enum HashJoinWorkOrderType {
    HASH_ANTI_JOIN = 0;
    HASH_INNER_JOIN = 1;
    HASH_OUTER_JOIN = 2;
    HASH_SEMI_JOIN = 3;
  }

  extend WorkOrder {
    // All required.
    optional HashJoinWorkOrderType hash_join_work_order_type = 160;
    optional int32 build_relation_id = 161;
    optional int32 probe_relation_id = 162;
    repeated int32 join_key_attributes = 163;
    optional bool any_join_key_attributes_nullable = 164;
    optional int32 insert_destination_index = 165;
    optional uint32 join_hash_table_index = 166;
    optional uint64 partition_id = 172;
    optional int32 selection_index = 167;
    optional fixed64 block_id = 168;

    // Used by all but HashOuterJoinWorkOrder.
    optional int32 residual_predicate_index = 169;
    // Used by HashOuterJoinWorkOrder only.
    repeated bool is_selection_on_build = 170;

    optional int32 lip_deployment_index = 171;
  }
}

message InsertWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 insert_destination_index = 176;
    optional uint32 tuple_index = 177;
  }
}

message NestedLoopsJoinWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 left_relation_id = 192;
    optional int32 right_relation_id = 193;
    optional fixed64 left_block_id = 194;
    optional fixed64 right_block_id = 195;
    optional int32 insert_destination_index = 196;
    optional int32 join_predicate_index = 197;
    optional int32 selection_index = 198;
  }
}

message SampleWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 relation_id = 208;
    optional fixed64 block_id = 209;
    optional bool is_block_sample = 210;
    optional int32 percentage = 211;
    optional int32 insert_destination_index = 212;
  }
}

message SaveBlocksWorkOrder {
  extend WorkOrder {
    // All required.
    optional fixed64 block_id = 224;
    optional bool force = 225;
  }
}

message SelectWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 relation_id = 240;
    optional int32 insert_destination_index = 241;
    optional int32 predicate_index = 242;
    optional fixed64 block_id = 243;
    optional bool simple_projection = 244;

    // When 'simple_projection' is true.
    repeated int32 simple_selection = 245;
    // Otherwise.
    optional int32 selection_index = 246;

    optional int32 lip_deployment_index = 247;
  }
}

message SortMergeRunWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint64 operator_index = 256;
    optional uint64 sort_config_index = 257;
    repeated Run runs = 258;
    optional uint64 top_k = 259;
    optional uint64 merge_level = 260;
    optional int32 relation_id = 261;
    optional int32 insert_destination_index = 262;
  }
}

message SortRunGenerationWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint64 sort_config_index = 272;
    optional int32 relation_id = 273;
    optional int32 insert_destination_index = 274;
    optional fixed64 block_id = 275;
  }
}

message TableGeneratorWorkOrder {
  extend WorkOrder {
    // All required.
    optional int32 generator_function_index = 288;
    optional int32 insert_destination_index = 289;
  }
}

message TextScanWorkOrder {
  extend WorkOrder {
    // All required.
    optional string filename = 301;
    optional uint64 text_offset = 302;
    optional uint64 text_segment_size = 303;
    optional uint32 field_terminator = 304;  // For one-byte char.
    optional bool process_escape_sequences = 305;
    optional int32 insert_destination_index = 306;
  }
}

message UpdateWorkOrder {
  extend WorkOrder {
    // All required.
    optional uint64 operator_index = 320;
    optional int32 relation_id = 321;
    optional int32 insert_destination_index = 322;
    optional int32 predicate_index = 323;
    optional uint32 update_group_index = 324;
    optional fixed64 block_id = 325;
  }
}

message WindowAggregationWorkOrder {
  extend WorkOrder {
    // All required
    optional uint32 window_aggr_state_index = 336;
    repeated fixed64 block_ids = 337;
    optional int32 insert_destination_index = 338;
  }
}

message DestroyAggregationStateWorkOrder {
  extend WorkOrder {
    optional uint32 aggr_state_index = 352;
  }
}

message BuildAggregationExistenceMapWorkOrder {
  extend WorkOrder {
    optional int32 relation_id = 368;
    optional fixed64 build_block_id = 369;
    optional int32 build_attribute = 370;
    optional uint32 aggr_state_index = 371;
  }
}
