summaryrefslogtreecommitdiff
path: root/tko/query_lib.py
blob: 402142b2bd9e1a47570288d56bf2bc2e4cd41fa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/python
"""
This library provides a bunch of miscellaneous parameter parsing,
sql generating and list cleanup library functions that are used
by both the reporting cli and web interface.
"""

import sys, os, re

tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
sys.path.insert(0, tko)

import display, frontend, db

db = db.db()

def generate_sql_condition(condition_list):
	""" generate the sql for the condition list."""
	sql = ''
	value = []
	for field, operator, values in condition_list:
		if len(values) == 1:
			if sql != '':
				sql += " and "
			sql += " %s%s%%s" % (field, operator)
			value.append(values[0][0])
		elif len(values) > 1:
			expression = [" %s %s %%s" % (field, operator) for val in values]
			for val in values:
				value.append(val[0])
			if sql != '':
				sql += " and "
			sql += "(%s)" % " or ".join(expression)
	return sql, value


def prune_list(thelist, condition_sql, condition_value):
	""" keep track of which columns do not have any elements."""
	pruned_list = []
	for g in thelist:
		# check for multiple index values in the db.
		sql = "t where "
		expr = [" %s = %%s" % (g.idx_name) for val in g.idx_value]
		sql += " (%s) " % " or ".join(expr)
		value = []
		value.extend(g.idx_value)
		if condition_sql:
			sql += " and "
			sql += condition_sql
			value.extend(condition_value)
		tests = frontend.test.select_sql(db, sql, value)
		if len(tests) > 0:
			pruned_list.append(g)
	return pruned_list


def parse_condition(condition):
	""" parse the condition into independent clauses."""
	condition_list = []
	if not condition:
		return condition_list
	attribute_re = r"(\w+)"
	op_re = r"(=|!=)"
	value_re = r"('[^']*')"
	# condition is clause & clause & ..
	clause_re = r"%s\s*%s\s*%s" % (attribute_re, op_re, value_re)
	condition_re = re.compile(r"^\s*%s(\s*&\s*%s)*\s*$" % (clause_re, clause_re))
	if not condition_re.match(condition):
		print "Condition not in the correct format: %s" % condition
		sys.exit(0)
	triples = []
	for clause in [c.strip() for c in condition.split('&')]:
		attribute, op, value = re.match(clause_re, clause).groups()
		triples.append((attribute, op, value))
	for (field_name, operator, value) in triples:
		match, field = frontend.select(db, field_name, value, distinct=True)
		if len(match) > 0:
			condition_list.append((field, operator, match))
		else:
			print "No matching results found for condition %s." % \
			      condition
			sys.exit(0)
	return condition_list


def get_value(test, field):
	""" get specific field values from the given test object."""
	if field == 'test':
		return test.testname
	elif field == 'kernel_idx':
		return test.kernel_idx
	elif field == 'machine_idx':
		return test.machine_idx
	elif field == 'status':
		return test.status_num


def get_tests(condition_sql, condition_value):
	# get all the tests that satify the given condition.
	if condition_sql:
		sql = "t where "
		sql += condition_sql
		value = [str(val) for val in condition_value]
		#print sql , value
		tests = frontend.test.select_sql(db, sql, value)
	else:
		sql = None
		value = None
		tests = frontend.test.select_sql(db, " t ", None)
	return tests