Revision 9d41b050 pithos/backends/lib/sqlalchemy/node.py
b/pithos/backends/lib/sqlalchemy/node.py | ||
---|---|---|
41 | 41 |
|
42 | 42 |
from dbworker import DBWorker |
43 | 43 |
|
44 |
from pithos.lib.filter import parse_filters, OPERATORS |
|
44 |
from pithos.lib.filter import parse_filters |
|
45 |
|
|
45 | 46 |
|
46 | 47 |
ROOTNODE = 0 |
47 | 48 |
|
... | ... | |
829 | 830 |
s = s.where(v.c.cluster != except_cluster) |
830 | 831 |
s = s.where(v.c.node.in_(select([self.nodes.c.node], |
831 | 832 |
self.nodes.c.parent == parent))) |
833 |
if domain and filterq: |
|
834 |
s = s.where(a.c.serial == v.c.serial) |
|
835 |
s = s.where(a.c.domain == domain) |
|
832 | 836 |
|
833 | 837 |
s = s.where(n.c.node == v.c.node) |
834 | 838 |
s = s.where(and_(n.c.path > bindparam('start'), n.c.path < nextling)) |
... | ... | |
839 | 843 |
if conj: |
840 | 844 |
s = s.where(or_(*conj)) |
841 | 845 |
|
842 |
s = s.order_by(n.c.path) |
|
843 |
|
|
844 |
def filterout(r): |
|
845 |
if not filterq: |
|
846 |
return False |
|
847 |
path, serial = r |
|
846 |
if domain and filterq: |
|
848 | 847 |
included, excluded, opers = parse_filters(filterq) |
849 |
|
|
850 |
#retrieve metadata |
|
851 |
s = select([a.c.key, a.c.value]) |
|
852 |
s = s.where(a.c.domain == domain) |
|
853 |
s = s.where(a.c.serial == serial) |
|
854 |
rp = self.conn.execute(s) |
|
855 |
meta = dict(rp.fetchall()) |
|
856 |
keyset= set([k.encode('utf8') for k in meta.keys()]) |
|
857 |
|
|
858 | 848 |
if included: |
859 |
if not set(included) & keyset: |
|
860 |
return True |
|
849 |
s = s.where(a.c.key.in_(x for x in included)) |
|
861 | 850 |
if excluded: |
862 |
if set(excluded) & keyset: |
|
863 |
return True |
|
864 |
for k, op, v in opers: |
|
865 |
k = k.decode('utf8') |
|
866 |
v = v.decode('utf8') |
|
867 |
if k not in meta: |
|
868 |
return True |
|
869 |
operation = OPERATORS[op] |
|
870 |
if not operation(meta[k], v): |
|
871 |
return True |
|
872 |
return False |
|
873 |
|
|
851 |
s = s.where(not_(a.c.key.in_(x for x in excluded))) |
|
852 |
if opers: |
|
853 |
for k, o, v in opers: |
|
854 |
s = s.where(or_(a.c.key == k and a.c.value.op(o)(v))) |
|
855 |
|
|
856 |
s = s.order_by(n.c.path) |
|
857 |
|
|
874 | 858 |
if not delimiter: |
875 | 859 |
s = s.limit(limit) |
876 | 860 |
rp = self.conn.execute(s, start=start) |
877 |
filter_ = lambda r : [t for t in r if not filterout(t)] |
|
878 |
r = filter_(rp.fetchall()) |
|
861 |
r = rp.fetchall() |
|
879 | 862 |
rp.close() |
880 | 863 |
return r, () |
881 | 864 |
|
... | ... | |
892 | 875 |
props = rp.fetchone() |
893 | 876 |
if props is None: |
894 | 877 |
break |
895 |
if filterout(props): |
|
896 |
continue |
|
897 | 878 |
path, serial = props |
898 | 879 |
idx = path.find(delimiter, pfz) |
899 | 880 |
|
Also available in: Unified diff