# Lint as: python2, python3
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import common
from autotest_lib.database import db_utils
import six


RECREATE_VIEWS_UP = """
CREATE VIEW tko_test_view AS
SELECT  tko_tests.test_idx,
        tko_tests.job_idx,
        tko_tests.test,
        tko_tests.subdir,
        tko_tests.kernel_idx,
        tko_tests.status,
        tko_tests.reason,
        tko_tests.machine_idx,
        tko_tests.started_time AS test_started_time,
        tko_tests.finished_time AS test_finished_time,
        tko_jobs.tag AS job_tag,
        tko_jobs.label AS job_label,
        tko_jobs.username AS job_username,
        tko_jobs.queued_time AS job_queued_time,
        tko_jobs.started_time AS job_started_time,
        tko_jobs.finished_time AS job_finished_time,
        tko_machines.hostname AS machine_hostname,
        tko_machines.machine_group,
        tko_machines.owner AS machine_owner,
        tko_kernels.kernel_hash,
        tko_kernels.base AS kernel_base,
        tko_kernels.printable AS kernel_printable,
        tko_status.word AS status_word
FROM tko_tests
INNER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
INNER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
INNER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
INNER JOIN tko_status ON tko_status.status_idx = tko_tests.status;


CREATE VIEW tko_perf_view AS
SELECT  tko_tests.test_idx,
        tko_tests.job_idx,
        tko_tests.test,
        tko_tests.subdir,
        tko_tests.kernel_idx,
        tko_tests.status,
        tko_tests.reason,
        tko_tests.machine_idx,
        tko_tests.started_time AS test_started_time,
        tko_tests.finished_time AS test_finished_time,
        tko_jobs.tag AS job_tag,
        tko_jobs.label AS job_label,
        tko_jobs.username AS job_username,
        tko_jobs.queued_time AS job_queued_time,
        tko_jobs.started_time AS job_started_time,
        tko_jobs.finished_time AS job_finished_time,
        tko_machines.hostname AS machine_hostname,
        tko_machines.machine_group,
        tko_machines.owner AS machine_owner,
        tko_kernels.kernel_hash,
        tko_kernels.base AS kernel_base,
        tko_kernels.printable AS kernel_printable,
        tko_status.word AS status_word,
        tko_iteration_result.iteration,
        tko_iteration_result.attribute AS iteration_key,
        tko_iteration_result.value AS iteration_value
FROM tko_tests
INNER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
INNER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
INNER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
INNER JOIN tko_status ON tko_status.status_idx = tko_tests.status
INNER JOIN tko_iteration_result ON
        tko_iteration_result.test_idx = tko_tests.test_idx;


CREATE VIEW tko_test_view_2 AS
SELECT  tko_tests.test_idx,
        tko_tests.job_idx,
        tko_tests.test AS test_name,
        tko_tests.subdir,
        tko_tests.kernel_idx,
        tko_tests.status AS status_idx,
        tko_tests.reason,
        tko_tests.machine_idx,
        tko_tests.started_time AS test_started_time,
        tko_tests.finished_time AS test_finished_time,
        tko_jobs.tag AS job_tag,
        tko_jobs.label AS job_name,
        tko_jobs.username AS job_owner,
        tko_jobs.queued_time AS job_queued_time,
        tko_jobs.started_time AS job_started_time,
        tko_jobs.finished_time AS job_finished_time,
        tko_jobs.afe_job_id AS afe_job_id,
        tko_machines.hostname AS hostname,
        tko_machines.machine_group AS platform,
        tko_machines.owner AS machine_owner,
        tko_kernels.kernel_hash,
        tko_kernels.base AS kernel_base,
        tko_kernels.printable AS kernel,
        tko_status.word AS status
FROM tko_tests
INNER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
INNER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
INNER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
INNER JOIN tko_status ON tko_status.status_idx = tko_tests.status;


CREATE VIEW tko_test_view_outer_joins AS
SELECT  tko_tests.test_idx,
        tko_tests.job_idx,
        tko_tests.test AS test_name,
        tko_tests.subdir,
        tko_tests.kernel_idx,
        tko_tests.status AS status_idx,
        tko_tests.reason,
        tko_tests.machine_idx,
        tko_tests.started_time AS test_started_time,
        tko_tests.finished_time AS test_finished_time,
        tko_jobs.tag AS job_tag,
        tko_jobs.label AS job_name,
        tko_jobs.username AS job_owner,
        tko_jobs.queued_time AS job_queued_time,
        tko_jobs.started_time AS job_started_time,
        tko_jobs.finished_time AS job_finished_time,
        tko_machines.hostname AS hostname,
        tko_machines.machine_group AS platform,
        tko_machines.owner AS machine_owner,
        tko_kernels.kernel_hash,
        tko_kernels.base AS kernel_base,
        tko_kernels.printable AS kernel,
        tko_status.word AS status
FROM tko_tests
LEFT OUTER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
LEFT OUTER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
LEFT OUTER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
LEFT OUTER JOIN tko_status ON tko_status.status_idx = tko_tests.status;


CREATE VIEW tko_perf_view_2 AS
SELECT  tko_tests.test_idx,
        tko_tests.job_idx,
        tko_tests.test AS test_name,
        tko_tests.subdir,
        tko_tests.kernel_idx,
        tko_tests.status AS status_idx,
        tko_tests.reason,
        tko_tests.machine_idx,
        tko_tests.started_time AS test_started_time,
        tko_tests.finished_time AS test_finished_time,
        tko_jobs.tag AS job_tag,
        tko_jobs.label AS job_name,
        tko_jobs.username AS job_owner,
        tko_jobs.queued_time AS job_queued_time,
        tko_jobs.started_time AS job_started_time,
        tko_jobs.finished_time AS job_finished_time,
        tko_machines.hostname AS hostname,
        tko_machines.machine_group AS platform,
        tko_machines.owner AS machine_owner,
        tko_kernels.kernel_hash,
        tko_kernels.base AS kernel_base,
        tko_kernels.printable AS kernel,
        tko_status.word AS status,
        tko_iteration_result.iteration,
        tko_iteration_result.attribute AS iteration_key,
        tko_iteration_result.value AS iteration_value
FROM tko_tests
LEFT OUTER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
LEFT OUTER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
LEFT OUTER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
LEFT OUTER JOIN tko_status ON tko_status.status_idx = tko_tests.status
LEFT OUTER JOIN tko_iteration_result ON
        tko_iteration_result.test_idx = tko_tests.test_idx;
"""


RECREATE_VIEWS_DOWN = """
CREATE VIEW test_view AS
SELECT  tests.test_idx,
        tests.job_idx,
        tests.test,
        tests.subdir,
        tests.kernel_idx,
        tests.status,
        tests.reason,
        tests.machine_idx,
        tests.started_time AS test_started_time,
        tests.finished_time AS test_finished_time,
        jobs.tag AS job_tag,
        jobs.label AS job_label,
        jobs.username AS job_username,
        jobs.queued_time AS job_queued_time,
        jobs.started_time AS job_started_time,
        jobs.finished_time AS job_finished_time,
        machines.hostname AS machine_hostname,
        machines.machine_group,
        machines.owner AS machine_owner,
        kernels.kernel_hash,
        kernels.base AS kernel_base,
        kernels.printable AS kernel_printable,
        status.word AS status_word
FROM tests
INNER JOIN jobs ON jobs.job_idx = tests.job_idx
INNER JOIN machines ON machines.machine_idx = jobs.machine_idx
INNER JOIN kernels ON kernels.kernel_idx = tests.kernel_idx
INNER JOIN status ON status.status_idx = tests.status;


CREATE VIEW perf_view AS
SELECT  tests.test_idx,
        tests.job_idx,
        tests.test,
        tests.subdir,
        tests.kernel_idx,
        tests.status,
        tests.reason,
        tests.machine_idx,
        tests.started_time AS test_started_time,
        tests.finished_time AS test_finished_time,
        jobs.tag AS job_tag,
        jobs.label AS job_label,
        jobs.username AS job_username,
        jobs.queued_time AS job_queued_time,
        jobs.started_time AS job_started_time,
        jobs.finished_time AS job_finished_time,
        machines.hostname AS machine_hostname,
        machines.machine_group,
        machines.owner AS machine_owner,
        kernels.kernel_hash,
        kernels.base AS kernel_base,
        kernels.printable AS kernel_printable,
        status.word AS status_word,
        iteration_result.iteration,
        iteration_result.attribute AS iteration_key,
        iteration_result.value AS iteration_value
FROM tests
INNER JOIN jobs ON jobs.job_idx = tests.job_idx
INNER JOIN machines ON machines.machine_idx = jobs.machine_idx
INNER JOIN kernels ON kernels.kernel_idx = tests.kernel_idx
INNER JOIN status ON status.status_idx = tests.status
INNER JOIN iteration_result ON iteration_result.test_idx = tests.test_idx;


CREATE VIEW test_view_outer_joins AS
SELECT  tests.test_idx,
        tests.job_idx,
        tests.test AS test_name,
        tests.subdir,
        tests.kernel_idx,
        tests.status AS status_idx,
        tests.reason,
        tests.machine_idx,
        tests.started_time AS test_started_time,
        tests.finished_time AS test_finished_time,
        jobs.tag AS job_tag,
        jobs.label AS job_name,
        jobs.username AS job_owner,
        jobs.queued_time AS job_queued_time,
        jobs.started_time AS job_started_time,
        jobs.finished_time AS job_finished_time,
        machines.hostname AS hostname,
        machines.machine_group AS platform,
        machines.owner AS machine_owner,
        kernels.kernel_hash,
        kernels.base AS kernel_base,
        kernels.printable AS kernel,
        status.word AS status
FROM tests
LEFT OUTER JOIN jobs ON jobs.job_idx = tests.job_idx
LEFT OUTER JOIN machines ON machines.machine_idx = jobs.machine_idx
LEFT OUTER JOIN kernels ON kernels.kernel_idx = tests.kernel_idx
LEFT OUTER JOIN status ON status.status_idx = tests.status;


CREATE VIEW test_view_2 AS
SELECT  tests.test_idx,
        tests.job_idx,
        tests.test AS test_name,
        tests.subdir,
        tests.kernel_idx,
        tests.status AS status_idx,
        tests.reason,
        tests.machine_idx,
        tests.started_time AS test_started_time,
        tests.finished_time AS test_finished_time,
        jobs.tag AS job_tag,
        jobs.label AS job_name,
        jobs.username AS job_owner,
        jobs.queued_time AS job_queued_time,
        jobs.started_time AS job_started_time,
        jobs.finished_time AS job_finished_time,
        jobs.afe_job_id AS afe_job_id,
        machines.hostname AS hostname,
        machines.machine_group AS platform,
        machines.owner AS machine_owner,
        kernels.kernel_hash,
        kernels.base AS kernel_base,
        kernels.printable AS kernel,
        status.word AS status
FROM tests
INNER JOIN jobs ON jobs.job_idx = tests.job_idx
INNER JOIN machines ON machines.machine_idx = jobs.machine_idx
INNER JOIN kernels ON kernels.kernel_idx = tests.kernel_idx
INNER JOIN status ON status.status_idx = tests.status;


CREATE VIEW perf_view_2 AS
SELECT  tests.test_idx,
        tests.job_idx,
        tests.test AS test_name,
        tests.subdir,
        tests.kernel_idx,
        tests.status AS status_idx,
        tests.reason,
        tests.machine_idx,
        tests.started_time AS test_started_time,
        tests.finished_time AS test_finished_time,
        jobs.tag AS job_tag,
        jobs.label AS job_name,
        jobs.username AS job_owner,
        jobs.queued_time AS job_queued_time,
        jobs.started_time AS job_started_time,
        jobs.finished_time AS job_finished_time,
        machines.hostname AS hostname,
        machines.machine_group AS platform,
        machines.owner AS machine_owner,
        kernels.kernel_hash,
        kernels.base AS kernel_base,
        kernels.printable AS kernel,
        status.word AS status,
        iteration_result.iteration,
        iteration_result.attribute AS iteration_key,
        iteration_result.value AS iteration_value
FROM tests
LEFT OUTER JOIN jobs ON jobs.job_idx = tests.job_idx
LEFT OUTER JOIN machines ON machines.machine_idx = jobs.machine_idx
LEFT OUTER JOIN kernels ON kernels.kernel_idx = tests.kernel_idx
LEFT OUTER JOIN status ON status.status_idx = tests.status
LEFT OUTER JOIN iteration_result ON iteration_result.test_idx = tests.test_idx;
"""


ORIG_NAMES = (
        'embedded_graphing_queries',
        'iteration_attributes',
        'iteration_result',
        'jobs',
        'kernels',
        'machines',
        'patches',
        'query_history',
        'saved_queries',
        'status',
        'test_attributes',
        'test_labels',
        'test_labels_tests',
        'tests',
        )

RENAMES_UP = dict((name, 'tko_' + name) for name in ORIG_NAMES)
VIEWS_TO_DROP_UP = (
        'test_view',
        'test_view_2',
        'test_view_outer_joins',
        'perf_view',
        'perf_view_2',
        )

RENAMES_DOWN = dict((value, key) for key, value in six.iteritems(RENAMES_UP))
VIEWS_TO_DROP_DOWN = ['tko_' + view for view in VIEWS_TO_DROP_UP]


def migrate_up(manager):
    db_utils.drop_views(manager, VIEWS_TO_DROP_UP)
    db_utils.rename(manager, RENAMES_UP)
    manager.execute_script(RECREATE_VIEWS_UP)


def migrate_down(manager):
    db_utils.drop_views(manager, VIEWS_TO_DROP_DOWN)
    db_utils.rename(manager, RENAMES_DOWN)
    manager.execute_script(RECREATE_VIEWS_DOWN)
