Revision 73c37386
b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/54dbdde2d187_split_plankton_prope.py | ||
---|---|---|
1 |
"""Split plankton properties |
|
2 |
|
|
3 |
Revision ID: 54dbdde2d187 |
|
4 |
Revises: 3b62b3f1bf6c |
|
5 |
Create Date: 2014-01-21 11:44:34.783895 |
|
6 |
|
|
7 |
""" |
|
8 |
|
|
9 |
# revision identifiers, used by Alembic. |
|
10 |
revision = '54dbdde2d187' |
|
11 |
down_revision = '3b62b3f1bf6c' |
|
12 |
|
|
13 |
from alembic import op |
|
14 |
import sqlalchemy as sa |
|
15 |
|
|
16 |
import json |
|
17 |
|
|
18 |
from collections import defaultdict |
|
19 |
|
|
20 |
|
|
21 |
def upgrade(): |
|
22 |
c = op.get_bind() |
|
23 |
a = sa.sql.table( |
|
24 |
'attributes', |
|
25 |
sa.sql.column('serial', sa.Integer), |
|
26 |
sa.sql.column('domain', sa.String), |
|
27 |
sa.sql.column('key', sa.String), |
|
28 |
sa.sql.column('value', sa.String), |
|
29 |
sa.sql.column('node', sa.Integer), |
|
30 |
sa.sql.column('is_latest', sa.Boolean)) |
|
31 |
|
|
32 |
s = sa.select([a.c.serial, |
|
33 |
a.c.domain, |
|
34 |
a.c.key, |
|
35 |
a.c.value, |
|
36 |
a.c.node, |
|
37 |
a.c.is_latest]) |
|
38 |
cond = sa.sql.and_(a.c.domain == 'plankton', |
|
39 |
a.c.key == 'plankton:properties') |
|
40 |
s = s.where(cond) |
|
41 |
entries = c.execute(s).fetchall() |
|
42 |
if not entries: |
|
43 |
return |
|
44 |
|
|
45 |
values = [] |
|
46 |
for e in entries: |
|
47 |
d = dict(e.items()) |
|
48 |
properties = json.loads(e['value']) |
|
49 |
for k, v in properties.items(): |
|
50 |
copy = d.copy() |
|
51 |
copy.update({'key': 'plankton:property:%s' % k, |
|
52 |
'value': v}) |
|
53 |
values.append(copy) |
|
54 |
|
|
55 |
op.bulk_insert(a, values) |
|
56 |
|
|
57 |
d = a.delete().where(cond) |
|
58 |
op.execute(d) |
|
59 |
|
|
60 |
|
|
61 |
def downgrade(): |
|
62 |
c = op.get_bind() |
|
63 |
a = sa.sql.table( |
|
64 |
'attributes', |
|
65 |
sa.sql.column('serial', sa.Integer), |
|
66 |
sa.sql.column('domain', sa.String), |
|
67 |
sa.sql.column('key', sa.String), |
|
68 |
sa.sql.column('value', sa.String), |
|
69 |
sa.sql.column('node', sa.Integer), |
|
70 |
sa.sql.column('is_latest', sa.Boolean)) |
|
71 |
|
|
72 |
s = sa.select([a.c.serial, |
|
73 |
a.c.domain, |
|
74 |
a.c.key, |
|
75 |
a.c.value, |
|
76 |
a.c.node, |
|
77 |
a.c.is_latest]) |
|
78 |
cond = sa.sql.and_(a.c.domain == 'plankton', |
|
79 |
a.c.key.like('plankton:property:%')) |
|
80 |
s = s.where(cond) |
|
81 |
entries = c.execute(s).fetchall() |
|
82 |
if not entries: |
|
83 |
return |
|
84 |
|
|
85 |
props = defaultdict(dict) |
|
86 |
for e in entries: |
|
87 |
k = e.key.replace('plankton:property:', '', 1) |
|
88 |
props[(e.serial, e.domain, e.node, e.is_latest)][k] = e.value |
|
89 |
|
|
90 |
values = [] |
|
91 |
for k in props: |
|
92 |
serial, domain, node, is_latest = k |
|
93 |
values.append({'serial': serial, |
|
94 |
'domain': domain, |
|
95 |
'node': node, |
|
96 |
'is_latest': is_latest, |
|
97 |
'key': 'plankton:properties', |
|
98 |
'value': json.dumps(props[k])}) |
|
99 |
|
|
100 |
op.bulk_insert(a, values) |
|
101 |
|
|
102 |
d = a.delete().where(cond) |
|
103 |
op.execute(d) |
Also available in: Unified diff