-
Notifications
You must be signed in to change notification settings - Fork 11
/
create-results-db.py
executable file
·51 lines (45 loc) · 2.62 KB
/
create-results-db.py
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
#! /usr/bin/python3
# This script creates a database of Yuck integration test results (results.db).
#
# To import results, call the script with a list of JSON result files on the command line.
# When the database already exists, the given results will be added unless they are
# already in the database.
import argparse
import json
import sqlite3
from itertools import repeat
def createDb(cursor):
cursor.execute('CREATE TABLE IF NOT EXISTS result (run TEXT NOT NULL, suite TEXT NOT NULL, problem TEXT NOT NULL, model TEXT NOT NULL, instance TEXT NOT NULL, problem_type TEXT NOT NULL CONSTRAINT result_problem_type_constraint CHECK (problem_type IN ("MIN", "MAX", "SAT")), optimum INT, high_score INT, solved INT NOT NULL CONSTRAINT result_solved_constraint CHECK (solved in (0, 1)), violation INT CONSTRAINT result_violation_constraint CHECK (violation >= 0), quality INT, runtime_in_seconds DOUBLE CONSTRAINT result_runtime_in_seconds_constraint CHECK (runtime_in_seconds >= 0), moves_per_second DOUBLE CONSTRAINT result_moves_per_second_constraint CHECK (moves_per_second >= 0), CONSTRAINT result_unique_constraint UNIQUE (run, problem, model, instance) ON CONFLICT IGNORE)')
cursor.execute('CREATE INDEX IF NOT EXISTS result_index ON result(run, problem, model, instance)')
def importResults(run, file, cursor):
results = json.load(file)
solverStatistics = results.get('solver-statistics')
cursor.execute(
'INSERT INTO result VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
(run,
results['task']['suite'],
results['task']['problem'],
results['task']['model'],
results['task']['instance'],
results['task']['problem-type'],
results['task'].get('optimum'),
results['task'].get('high-score'),
results['result']['solved'],
results['result'].get('violation'),
results['result'].get('quality'),
solverStatistics['runtime-in-seconds'] if solverStatistics else None,
solverStatistics['moves-per-second'] if solverStatistics else None))
def main():
parser = argparse.ArgumentParser(description = 'Puts Yuck integration test results into database')
parser.add_argument('run', metavar = 'run')
parser.add_argument('filenames', metavar = 'json-result-file', nargs = '+')
args = parser.parse_args()
with sqlite3.connect("results.db") as conn:
cursor = conn.cursor()
createDb(cursor)
cursor.execute('PRAGMA foreign_keys = ON');
for filename in args.filenames:
with open(filename) as file:
importResults(args.run, file, cursor)
conn.commit()
main()