summaryrefslogtreecommitdiff
path: root/tko/query_lib.py
diff options
context:
space:
mode:
Diffstat (limited to 'tko/query_lib.py')
-rw-r--r--tko/query_lib.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/tko/query_lib.py b/tko/query_lib.py
new file mode 100644
index 00000000..402142b2
--- /dev/null
+++ b/tko/query_lib.py
@@ -0,0 +1,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