Revision f897bea9 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
45

  
44
from pithos.lib.filter import parse_filters, OPERATORS
46 45

  
47 46
ROOTNODE  = 0
48 47

  
......
830 829
        s = s.where(v.c.cluster != except_cluster)
831 830
        s = s.where(v.c.node.in_(select([self.nodes.c.node],
832 831
            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)
836 832
        
837 833
        s = s.where(n.c.node == v.c.node)
838 834
        s = s.where(and_(n.c.path > bindparam('start'), n.c.path < nextling))
......
843 839
        if conj:
844 840
            s = s.where(or_(*conj))
845 841
        
846
        if domain and filterq:
842
        s = s.order_by(n.c.path)
843
        
844
        def filterout(r):
845
            if not filterq:
846
                return False
847
            path, serial = r
847 848
            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
            
848 858
            if included:
849
                s = s.where(a.c.key.in_(x for x in included))
859
                if not set(included) & keyset:
860
                    return True
850 861
            if excluded:
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
        
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
    
858 874
        if not delimiter:
859 875
            s = s.limit(limit)
860 876
            rp = self.conn.execute(s, start=start)
861
            r = rp.fetchall()
877
            filter_ = lambda r : [t for t in r if not filterout(t)]
878
            r = filter_(rp.fetchall())
862 879
            rp.close()
863 880
            return r, ()
864 881
        
......
875 892
            props = rp.fetchone()
876 893
            if props is None:
877 894
                break
895
            if filterout(props):
896
                continue
878 897
            path, serial = props
879 898
            idx = path.find(delimiter, pfz)
880 899
            

Also available in: Unified diff