1
2
3 import die
4 import fiatio
5 import g2_select
6 import dictops
7
8 DEBUG = 0
9
10 -def merge(d1, d2, key1, key2, grab, unique=True):
11 m1 = {}
12 d = DEBUG
13 for datum1 in d1:
14 k = tuple( [datum1[t] for t in key1] )
15 if d > 0:
16 die.info('Sample datum key1: %s' % str(k) )
17 d -= 1
18 if unique and k in m1:
19 raise ValueError, "Key=%s seen multiple times in d1" % str(k)
20 dictops.add_dol(m1, k, datum1)
21 m2 = {}
22 d = DEBUG
23 for datum2 in d2:
24 k = tuple( [datum2[t] for t in key2] )
25 if d > 0:
26 die.info('Sample datum key2: %s' % str(k) )
27 d -= 1
28 if unique and k in m2:
29 raise ValueError, "Key=%s seen multiple times in d2" % str(k)
30 dictops.add_dol(m2, k, datum2)
31
32
33 o = []
34 for k in m1.keys():
35 if k in m2:
36 for a in m1[k]:
37 for b in m2[k]:
38 tmp = a.copy()
39 for (g_from, g_to) in grab:
40 tmp[g_to] = g2_select.evaluate(g_from, b)
41 o.append( tmp )
42 return o
43
44
45
46 if __name__ == '__main__':
47 import sys
48 arglist = sys.argv[1:]
49 key = []
50 unique = True
51 grab = []
52 while arglist and arglist[0].startswith('-'):
53 arg = arglist.pop(0)
54 if arg == '--':
55 break
56 elif arg == '-key':
57 key1 = arglist.pop(0).split(',')
58 key2 = key1
59 elif arg == '-key1':
60 key1 = arglist.pop(0).split(',')
61 elif arg == '-key2':
62 key2 = arglist.pop(0).split(',')
63 elif arg == '-grab':
64 gcode = arglist.pop(0)
65 gout = arglist.pop(0)
66 grab.append( (gcode, gout) )
67 elif arg == '-D':
68 DEBUG += 1
69 elif arg == '-multi':
70 unique = False
71 else:
72 die.die('Unknown flag: %s' % arg)
73 h1, d1, c1 = fiatio.read(open(arglist.pop(0), 'r'))
74 h2, d2, c2 = fiatio.read(open(arglist.pop(0), 'r'))
75 assert len(arglist) == 0
76 h2.update(h1)
77 o = merge(d1, d2, key1, key2, grab, unique)
78 fiatio.write(sys.stdout, o, c1 + c2, h2)
79