evaluationDependsOn(xpackModule('core'))

apply plugin: 'elasticsearch.esplugin'
esplugin {
    name 'x-pack-sql'
    description 'The Elasticsearch plugin that powers SQL for Elasticsearch'
    classname 'org.elasticsearch.xpack.sql.plugin.SqlPlugin'
    extendedPlugins = ['x-pack-core', 'lang-painless']
}

ext {
    // SQL dependency versions
    jlineVersion="3.10.0"
    antlrVersion="4.5.3"
    
    // SQL test dependency versions
    csvjdbcVersion="1.0.34"
    h2Version="1.4.197"
    h2gisVersion="1.5.0"
}

configurations {
    // Bundles the sql-cli.jar into the distribution
    bin
}

archivesBaseName = 'x-pack-sql'

// All integration tests live in qa modules
integTest.enabled = false

task internalClusterTest(type: Test) {
    mustRunAfter test
    include '**/*IT.class'
    systemProperty 'es.set.netty.runtime.available.processors', 'false'
}

check.dependsOn internalClusterTest

dependencies {
    compileOnly project(path: xpackModule('core'), configuration: 'default')
    compileOnly(project(':modules:lang-painless')) {
        // exclude ASM to not affect featureAware task on Java 10+
        exclude group: "org.ow2.asm"
    }
    compile project('sql-action')
    compile project(':modules:aggs-matrix-stats')
    compile "org.antlr:antlr4-runtime:4.5.3"
    testCompile project(':test:framework')
    testCompile project(path: xpackModule('core'), configuration: 'testArtifacts')
    testCompile project(path: xpackModule('security'), configuration: 'testArtifacts')
    testCompile project(path: ':modules:reindex', configuration: 'runtime')
    testCompile project(path: ':modules:parent-join', configuration: 'runtime')
    testCompile project(path: ':modules:analysis-common', configuration: 'runtime')

    bin(project(path: xpackModule('sql:sql-cli'))) {
        // sql-cli bundles all of its dependencies into a single executable jar
        transitive = false
    }
}

/* Bundle the sql-cli into the binary files. It should end up
 * in $ES_HOME/bin/x-pack/. This is useful because it is an
 * executable jar that can be moved wherever it is needed.
 */
bundlePlugin {
    from (configurations.bin) {
        into 'bin'
    }
}

// add all sub-projects of the qa sub-project
gradle.projectsEvaluated {
    project.subprojects
            .find { it.path == project.path + ":qa" }
            .subprojects
            .findAll { it.path.startsWith(project.path + ":qa") }
            .each { check.dependsOn it.check }
}


/**********************************************
 *          SQL Parser regeneration           *
 **********************************************/

configurations {
    regenerate
}

dependencies {
    regenerate "org.antlr:antlr4:${antlrVersion}"
}

String grammarPath = 'src/main/antlr'
String outputPath = 'src/main/java/org/elasticsearch/xpack/sql/parser'

task cleanGenerated(type: Delete) {
    delete fileTree(grammarPath) {
        include '*.tokens'
    }
    delete fileTree(outputPath) {
        include 'SqlBase*.java'
    }
}

task regenParser(type: JavaExec) {
    dependsOn cleanGenerated
    main = 'org.antlr.v4.Tool'
    classpath = configurations.regenerate
    systemProperty 'file.encoding', 'UTF-8'
    systemProperty 'user.language', 'en'
    systemProperty 'user.country', 'US'
    systemProperty 'user.variant', ''
    args '-Werror',
         '-package', 'org.elasticsearch.xpack.sql.parser',
         '-listener',
         '-visitor',
         '-o', outputPath,
         "${file(grammarPath)}/SqlBase.g4"
}

task regen {
    dependsOn regenParser
    doLast {
        // moves token files to grammar directory for use with IDE's
        ant.move(file: "${outputPath}/SqlBase.tokens", toDir: grammarPath)
        ant.move(file: "${outputPath}/SqlBaseLexer.tokens", toDir: grammarPath)
        // make the generated classes package private
        ant.replaceregexp(match: 'public ((interface|class) \\QSqlBase\\E\\w+)',
                          replace: '\\1',
                          encoding: 'UTF-8') {
            fileset(dir: outputPath, includes: 'SqlBase*.java')
        }
        // nuke timestamps/filenames in generated files
        ant.replaceregexp(match: '\\Q// Generated from \\E.*',
                          replace: '\\/\\/ ANTLR GENERATED CODE: DO NOT EDIT',
                          encoding: 'UTF-8') {
            fileset(dir: outputPath, includes: 'SqlBase*.java')
        }
        // remove tabs in antlr generated files
        ant.replaceregexp(match: '\t', flags: 'g', replace: '  ', encoding: 'UTF-8') {
            fileset(dir: outputPath, includes: 'SqlBase*.java')
        }
        // fix line endings
        ant.fixcrlf(srcdir: outputPath, eol: 'lf') {
            patternset(includes: 'SqlBase*.java')
        }
    }
}