#!/usr/bin/env impala-python
#
# 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.

from impala.dbapi import connect as impala_connect
from optparse import OptionParser

parser = OptionParser()
parser.add_option('--host')
parser.add_option('--port', type='int', default=21050)
parser.add_option('--db_name', default='impala_perf_results')
parser.add_option('--use_secure_connection', default=False, action='store_true')

options, args = parser.parse_args()

CREATE_STATEMENTS = ['''
     CREATE EXTERNAL TABLE IF NOT EXISTS ExecutionResults (
     result_id string,
     run_info_id string,
     query_id string,
     workload_id string,
     file_type_id string,
     num_clients INT,
     num_iterations INT,
     cluster_name string,
     executor_name string,
     exec_time double,
     run_date timestamp,
     version string
) stored as parquet;
''',
'''
CREATE EXTERNAL TABLE IF NOT EXISTS Queries (
     query_id string,
     name string,
     query_string string,
     notes string
) stored as parquet;
''',
'''
CREATE EXTERNAL TABLE IF NOT EXISTS Workloads (
     workload_id string,
     name string,
     scale_factor string
) stored as parquet;
''',
'''
CREATE EXTERNAL TABLE IF NOT EXISTS FileTypes (
     file_type_id string,
     file_format string,
     compression_codec string,
     compression_type string
) stored as parquet;
''',
'''
CREATE EXTERNAL TABLE IF NOT EXISTS RunInfos (
     run_info_id string,
     run_info string,
     user string
) stored as parquet;
''',
'''
CREATE EXTERNAL TABLE IF NOT EXISTS RuntimeProfiles (
     result_id string,
     profile string
) stored as parquet;
''']

def create_database():
  if options.use_secure_connection:
    connection = impala_connect(options.host, options.port,
        use_ssl=True, auth_mechanism='GSSAPI')
  else:
    connection = impala_connect(options.host, options.port)
  cursor = connection.cursor()

  cursor.execute('CREATE DATABASE IF NOT EXISTS {0}'.format(options.db_name))
  cursor.execute('USE {0}'.format(options.db_name))
  for create_statement in CREATE_STATEMENTS:
    cursor.execute(create_statement)

if __name__ == '__main__':
  create_database()
