// 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 = "proto3";

package datafusion_java;

import "cache_manager_options.proto";
import "object_store_options.proto";

option java_package = "org.apache.datafusion.protobuf";
option java_multiple_files = true;

// Options used to construct a SessionContext. All fields are optional —
// unset fields leave DataFusion's default behavior in place.
//
// `options` is a free-form escape hatch matching DataFusion's
// `ConfigOptions::set(key, value)` API: any `datafusion.*` config key
// can be set as a string. Entries are applied AFTER the typed fields
// above (so an explicit `options` entry overrides a typed setter for
// the same knob) and IN INSERTION ORDER (so for keys whose setters
// have side effects on other keys -- e.g.
// `datafusion.optimizer.enable_dynamic_filter_pushdown` rewrites the
// specific `enable_*_dynamic_filter_pushdown` flags -- the caller's
// last write wins deterministically).
//
// `repeated ConfigOption` is used instead of `map<string,string>`
// because protobuf maps decode into `HashMap` on the Rust side, whose
// iteration order is randomized and would otherwise break the
// last-write-wins contract for overlapping keys.
//
// Unknown keys or unparseable values surface as a RuntimeException at
// SessionContext construction.
message SessionOptions {
  optional uint64 batch_size = 1;
  optional uint64 target_partitions = 2;
  optional bool collect_statistics = 3;
  optional bool information_schema = 4;
  optional MemoryLimit memory_limit = 5;
  optional string temp_directory = 6;
  repeated ConfigOption options = 7;
  // Object store registrations to apply to the new context's RuntimeEnv.
  // Applied in order; if two registrations resolve to the same URL, the
  // later one wins (matching upstream's `RuntimeEnv::register_object_store`
  // semantics).
  repeated ObjectStoreRegistration object_stores = 8;
  // Configuration for DataFusion's built-in CacheManager. Unset = leave
  // the upstream default in place (matches existing callers).
  optional CacheManagerOptionsProto cache_manager = 9;
}

message ConfigOption {
  string key = 1;
  string value = 2;
}

message MemoryLimit {
  uint64 max_memory_bytes = 1;
  double memory_fraction = 2;
}
