#!/usr/bin/python
"""
Selects all rows and columns that satisfy the condition specified
and prints the matrix.
"""
import optparse
import common
from autotest_lib.cli import rpc
from autotest_lib.database import database_connection


# First do all the options parsing
parser = optparse.OptionParser()
parser.add_option(
        '-C', '--columns', action='store', dest='columns',
        default='test_name,reason,test_started_time,test_finished_time,job_tag,'
                'job_name,hostname,platform,kernel,status',
        help='Comma-separated list of column names to display')
parser.add_option('-w', '--where', action='store', dest='condition',
            help=("The WHERE condition for the query witten in the 'new style' "
                  "condition syntax for new tko (see "
                  "http://autotest.kernel.org/wiki/TkoHowTo for more info)"))
parser.add_option(
        '--test-attribute-field', action='append', default=[],
        help='Specifies a test attribute to include as a field.  The attribute '
             'value will be available as a field named attribute_<attribute '
             'name>.  This option may be specified multiple times.  Filtering '
             'must be done slightly differently -- see '
             'http://autotest.kernel.org/wiki/TkoHowTo#attribute_filtering '
             'for more details.')
parser.add_option('--test-label-field', action='append', default=[],
                  help='Specifies a test label to include as a field.  See '
                       '--attribute-field for more details')
parser.add_option('--iteration-result-field', action='append', default=[],
                  help='Specifies an iteration result to include as a field.  '
                       'See --attribute-field for more details.  Note that '
                       'this causes the rows returned to represent iterations '
                       'rather than plain test results.')
parser.add_option('--machine-label-field', action='append', default=[],
                  help='Specifies a machine label to include as a field.  See '
                       '--attribute-field for more details')
parser.add_option('--job-keyval-field', action='append', default=[],
                  help='Specifies a job keyval to include as a field. See '
                       '--attribute-field for more details')
parser.add_option('--iteration-attribute-field', action='append', default=[],
                  help='Specifies an iteration attribute to include as a '
                       'field. See --attribute-field for more details.  Note '
                       'that this causes the rows returned to represent '
                       'iterations rather than plain test results.')
parser.add_option('-s', '--separator', action='store', default = ' | ',
            dest='separator', help = 'output separator')
parser.add_option('-n', '--nocount', action='store_true', default=False,
                  help='Do not display line counts before each line')
parser.add_option('-l', '--logpath', action='store_true', default=False,
                  help='Reformats the the tag column into a URL \
                        like http://autotest/results/[tag]. \
                        This will append the tag column if it isn\'t provided.')
parser.add_option('--host-label', action='store', dest='host_label',
                  help=('Return results only for machines currently '
                        'in the specified label'))

(options, args) = parser.parse_args()

if not options.condition:
    parser.error('You must specify a condition.')

where = options.condition.replace('%', '%%')
tag = 'job_tag'

columns = options.columns.split(',')

url_prefix = rpc.get_autotest_server() + '/results/'
if options.logpath:
    if tag not in columns:
        columns.append(tag)
    tag_index=columns.index(tag)

if options.host_label:
    database = database_connection.DatabaseConnection("AUTOTEST_WEB")
    database.connect()
    sql = ("SELECT hostname FROM afe_labels JOIN afe_hosts_labels "
           "ON afe_labels.id=afe_hosts_labels.label_id JOIN afe_hosts "
           "ON afe_hosts_labels.host_id=afe_hosts.id WHERE name=%s")
    results = database.execute(sql, options.host_label)
    hosts = [row[0] for row in results]
    where += " AND hostname IN ('" + "','".join(hosts) + "')"

# Grab the data
tko = rpc.tko_comm()
count = 0
test_views = tko.run(
        'get_test_views', extra_where=where,
        test_attribute_fields=options.test_attribute_field,
        test_label_fields=options.test_label_field,
        iteration_result_fields=options.iteration_result_field,
        machine_label_fields=options.machine_label_field,
        job_keyval_fields=options.job_keyval_field,
        iteration_attribute_fields=options.iteration_attribute_field)
for test_view in test_views:
    values = [str(test_view[column]) for column in columns]
    if options.logpath:
        values[tag_index] = url_prefix + values[tag_index]
    if not options.nocount:
        print '[%d] ' % count,
        count += 1
    print options.separator.join(values)
