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

// overriding default versions for Hive3
def hiveVersion = "3.1.3"
def hadoopVersion = "3.3.5"
def tezVersion = "0.10.2"

project(':iceberg-hive3') {

  // run the tests in iceberg-mr with Hive3 dependencies
  sourceSets {
    test {
      java.srcDirs = ['../mr/src/test/java', 'src/test/java']
      resources.srcDirs = ['../mr/src/test/resources', 'src/test/resources']
    }
  }

  // exclude these Hive2-specific tests from iceberg-mr
  test {
    exclude '**/TestIcebergDateObjectInspector.class'
    exclude '**/TestIcebergTimestampObjectInspector.class'
    exclude '**/TestIcebergTimestampWithZoneObjectInspector.class'
  }

  dependencies {
    compileOnly project(path: ':iceberg-bundled-guava', configuration: 'shadow')
    compileOnly project(':iceberg-api')
    compileOnly project(':iceberg-core')
    compileOnly project(':iceberg-common')
    compileOnly project(':iceberg-hive-metastore')
    compileOnly project(':iceberg-parquet')
    compileOnly project(':iceberg-hive3-orc-bundle')
    compileOnly project(':iceberg-mr')
    compileOnly project(':iceberg-data')
    compileOnly project(':iceberg-orc')

    compileOnly("org.apache.hadoop:hadoop-client:${hadoopVersion}") {
      exclude group: 'org.apache.avro', module: 'avro'
    }

    compileOnly("org.apache.hive:hive-exec:${hiveVersion}:core") {
      exclude group: 'com.google.code.findbugs', module: 'jsr305'
      exclude group: 'com.google.guava'
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.avro', module: 'avro'
      exclude group: 'org.apache.calcite.avatica'
      exclude group: 'org.apache.hive', module: 'hive-llap-tez'
      exclude group: 'org.apache.logging.log4j'
      exclude group: 'org.pentaho' // missing dependency
      exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }

    compileOnly("org.apache.orc:orc-core::nohive") {
      exclude group: 'org.apache.hadoop'
      exclude group: 'commons-lang'
      // These artifacts are shaded and included in the orc-core fat jar
      exclude group: 'com.google.protobuf', module: 'protobuf-java'
      exclude group: 'org.apache.hive', module: 'hive-storage-api'
    }

    compileOnly("org.apache.hive:hive-metastore:${hiveVersion}") {
      exclude group: 'org.apache.orc'
      exclude group: 'org.apache.parquet'
    }
    compileOnly("org.apache.hive:hive-serde:${hiveVersion}") {
      exclude group: 'org.apache.orc'
      exclude group: 'org.apache.parquet'
    }

    compileOnly("org.apache.parquet:parquet-avro") {
      exclude group: 'org.apache.avro', module: 'avro'
      // already shaded by Parquet
      exclude group: 'it.unimi.dsi'
      exclude group: 'org.codehaus.jackson'
    }

    testImplementation project(path: ':iceberg-api', configuration: 'testArtifacts')
    testImplementation project(path: ':iceberg-core', configuration: 'testArtifacts')
    testImplementation project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
    testImplementation project(path: ':iceberg-data', configuration: 'testArtifacts')

    testImplementation("org.apache.avro:avro")
    testImplementation("org.apache.calcite:calcite-core")
    testImplementation("com.esotericsoftware:kryo-shaded:4.0.3")
    testImplementation("com.fasterxml.jackson.core:jackson-annotations:2.15.0")
    testImplementation("org.apache.hive:hive-service:${hiveVersion}") {
      exclude group: 'org.apache.hive', module: 'hive-exec'
      exclude group: 'org.apache.orc'
    }
    testImplementation("org.apache.tez:tez-dag:${tezVersion}")
    testImplementation("org.apache.tez:tez-mapreduce:${tezVersion}")
  }

  test {
    // testJoinTables / testScanTable
    maxHeapSize '2500m'
  }
}
