aboutsummaryrefslogtreecommitdiffstats
path: root/parse/tuple_table.py
diff options
context:
space:
mode:
Diffstat (limited to 'parse/tuple_table.py')
-rw-r--r--parse/tuple_table.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/parse/tuple_table.py b/parse/tuple_table.py
new file mode 100644
index 0000000..df80b37
--- /dev/null
+++ b/parse/tuple_table.py
@@ -0,0 +1,76 @@
1from collections import defaultdict
2from point import SummaryPoint
3from dir_map import DirMap
4
5class ColMap(object):
6 def __init__(self):
7 self.rev_map = {}
8 self.col_list = []
9
10 def columns(self):
11 return self.col_list
12
13 def get_key(self, kv):
14 key = ()
15 added = 0
16
17 for col in self.col_list:
18 if col not in kv:
19 key += (None,)
20 else:
21 added += 1
22 key += (kv[col],)
23
24 if added != len(kv):
25 raise Exception("column map '%s' missed field in map\n%s" %
26 (self.col_list, kv))
27
28 return key
29
30 def get_map(self, tuple):
31 map = {}
32 for i in range(0, len(tuple)):
33 map[self.col_list[i]] = tuple[i]
34 return map
35
36 def try_add(self, column):
37 if column not in self.rev_map:
38 self.rev_map[column] = len(self.col_list)
39 self.col_list += [column]
40
41 def __str__(self):
42 return "<ColMap>%s" % (self.rev_map)
43
44class TupleTable(object):
45 def __init__(self, col_map):
46 self.col_map = col_map
47 self.table = defaultdict(lambda: [])
48 self.reduced = False
49
50 def add_exp(self, kv, point):
51 key = self.col_map.get_key(kv)
52 self.table[key] += [point]
53
54 def __reduce(self):
55 if self.reduced:
56 raise Exception("cannot reduce twice!")
57 self.reduced = True
58 for key, values in self.table.iteritems():
59 self.table[key] = SummaryPoint(key, values)
60
61 def write_result(self, out_dir):
62 dir_map = DirMap(out_dir)
63 self.__reduce()
64 for key, point in self.table.iteritems():
65 kv = self.col_map.get_map(key)
66
67 for col in self.col_map.columns():
68 val = kv[col]
69 kv.pop(col)
70
71 dir_map.add_point(col, val, kv, point)
72
73 kv[col] = val
74
75 dir_map.reduce()
76 dir_map.write()