| #!/usr/bin/python |
| |
| """ |
| Selects all rows and columns that satisfy the condition specified |
| and draws the matrix. There is a seperate SQL query made for every (x,y) |
| in the matrix. |
| """ |
| |
| |
| print "Content-type: text/html\n" |
| import cgi, cgitb, re |
| import sys |
| |
| tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) |
| sys.path.insert(0, tko) |
| |
| import display, frontend, db |
| |
| cgitb.enable() |
| 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: |
| sql += " and %s%s%%s" % (field, operator) |
| value.append(values[0][0]) |
| elif len(values) > 1: |
| sql += " and " |
| expression = [" %s %s %%s" % (field, operator) for val in values] |
| for val in values: |
| value.append(val[0]) |
| 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: |
| sql = "t where %s=%%s " % g.idx_name |
| value = [g.idx_value] |
| 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 ParseCondition(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) |
| if len(match) > 0: |
| condition_list.append((field, operator, match)) |
| else: |
| print "No matching records found for condition %s." % \ |
| condition |
| sys.exit(0) |
| return condition_list |
| |
| |
| def main(): |
| |
| # parse the fields from the form. |
| form = cgi.FieldStorage() |
| columns = 'kernel' |
| rows = 'test' |
| condition = None |
| for field in form: |
| value = form[field].value |
| if field == 'columns': |
| columns = value |
| elif field == 'rows': |
| rows = value |
| elif field == 'condition': |
| condition = value |
| |
| # parse the conditions into sql query and value list. |
| condition_sql = "" |
| condition_value = [] |
| if condition: |
| condition_list = ParseCondition(condition) |
| condition_sql, condition_value = generate_sql_condition(condition_list) |
| |
| # get all possible column values. |
| column_groups = frontend.anygroup.selectunique(db, columns) |
| |
| # get all possible row values. |
| row_groups = frontend.anygroup.selectunique(db,rows) |
| # keep only those values in rows/columns that have a test |
| # corresponding to it. |
| row_groups = prune_list(row_groups, condition_sql, condition_value) |
| column_groups = prune_list(column_groups, condition_sql, condition_value) |
| |
| # prepare the header for the table. |
| headers = [g.name for g in column_groups] |
| |
| header_row = [display.box(x, header=True) for x in headers] |
| header_row.insert(0, display.box("", header=True)) |
| |
| matrix = [header_row] |
| |
| for r_group in row_groups: |
| row = [display.box(r_group.name)] |
| # get individual unit values |
| for c_group in column_groups: |
| sql = "t where %s=%%s and %s=%%s" % (r_group.idx_name, |
| c_group.idx_name) |
| value = [r_group.idx_value, c_group.idx_value] |
| sql += condition_sql |
| value.extend(condition_value) |
| tests = frontend.test.select_sql(db, sql, value) |
| value_str = [str(val) for val in value] |
| link = 'test.cgi?sql=%s&values=%s' % \ |
| (sql, ','.join(value_str)) |
| row.append(display.status_count_box(db, tests, link)) |
| matrix.append(row) |
| display.print_table(matrix) |
| |
| |
| main() |