Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / alembic / versions / 54dbdde2d187_split_plankton_prope.py @ 1ec05716

History | View | Annotate | Download (2.7 kB)

1 1ec05716 Sofia Papagiannaki
"""Split plankton properties
2 1ec05716 Sofia Papagiannaki

3 1ec05716 Sofia Papagiannaki
Revision ID: 54dbdde2d187
4 1ec05716 Sofia Papagiannaki
Revises: 3b62b3f1bf6c
5 1ec05716 Sofia Papagiannaki
Create Date: 2014-01-21 11:44:34.783895
6 1ec05716 Sofia Papagiannaki

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