-
Notifications
You must be signed in to change notification settings - Fork 27
/
workload.py
87 lines (61 loc) · 2.16 KB
/
workload.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
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
from typing import List
from selection.index import Index
class Query:
def __init__(self, query_id, query_text, columns=None):
self.nr = query_id
self.text = query_text
# Indexable columns
if columns is None:
self.columns = []
else:
self.columns = columns
def __repr__(self):
return f"Q{self.nr}"
class Workload:
queries: List[Query]
def __init__(self, queries):
self.queries = queries
def indexable_columns(self):
indexable_columns = set()
for query in self.queries:
indexable_columns |= set(query.columns)
return sorted(list(indexable_columns))
def potential_indexes(self):
return sorted([Index([c]) for c in self.indexable_columns()])
class Column:
def __init__(self, name):
self.name = name.lower()
self.table = None
def __lt__(self, other):
return self.name < other.name
def __repr__(self):
return f"C {self.table}.{self.name}"
# We cannot check self.table == other.table here since Table.__eq__()
# internally checks Column.__eq__. This would lead to endless recursions.
def __eq__(self, other):
if not isinstance(other, Column):
return False
assert (
self.table is not None and other.table is not None
), "Table objects should not be None for Column.__eq__()"
return self.table.name == other.table.name and self.name == other.name
def __hash__(self):
return hash((self.name, self.table.name))
class Table:
def __init__(self, name):
self.name = name.lower()
self.columns = []
def add_column(self, column):
column.table = self
self.columns.append(column)
def add_columns(self, columns):
for column in columns:
self.add_column(column)
def __repr__(self):
return self.name
def __eq__(self, other):
if not isinstance(other, Table):
return False
return self.name == other.name and tuple(self.columns) == tuple(other.columns)
def __hash__(self):
return hash((self.name, tuple(self.columns)))