Revision 3d13f97a

b/pithos/api/functions.py
500 500
        included, excluded, opers = parse_filters(keys)
501 501
        keys = []
502 502
        keys += [format_header_key('X-Object-Meta-' + x) for x in included]
503
        keys += [format_header_key('!X-Object-Meta-' + x) for x in excluded]
503
        keys += ['!'+format_header_key('X-Object-Meta-' + x) for x in excluded]
504 504
        keys += ['%s%s%s' % (format_header_key('X-Object-Meta-' + k), o, v) for k, o, v in opers]
505 505
    else:
506 506
        keys = []
b/pithos/backends/lib/sqlalchemy/node.py
35 35
from sqlalchemy import Table, Integer, BigInteger, DECIMAL, Column, String, MetaData, ForeignKey
36 36
from sqlalchemy.types import Text
37 37
from sqlalchemy.schema import Index, Sequence
38
from sqlalchemy.sql import func, and_, or_, null, select, bindparam, text
38
from sqlalchemy.sql import func, and_, or_, not_, null, select, bindparam, text
39 39
from sqlalchemy.ext.compiler import compiles
40 40
from sqlalchemy.engine.reflection import Inspector
41 41

  
42 42
from dbworker import DBWorker
43 43

  
44
from pithos.lib.filter import parse_filters
45

  
44 46
ROOTNODE  = 0
45 47

  
46 48
( SERIAL, NODE, HASH, SIZE, SOURCE, MTIME, MUSER, CLUSTER ) = range(8)
......
82 84
        s += unichr(c-1) + unichr(0xffff)
83 85
    return s
84 86

  
85

  
86 87
_propnames = {
87 88
    'serial'    : 0,
88 89
    'node'      : 1,
......
752 753
    
753 754
    def latest_version_list(self, parent, prefix='', delimiter=None,
754 755
                            start='', limit=10000, before=inf,
755
                            except_cluster=0, pathq=[], filterq=None):
756
                            except_cluster=0, pathq=[], filterq=[]):
756 757
        """Return a (list of (path, serial) tuples, list of common prefixes)
757 758
           for the current versions of the paths with the given parent,
758 759
           matching the following criteria.
......
827 828
            s = s.where(or_(*conj))
828 829
        
829 830
        if filterq:
830
            s = s.where(a.c.key.in_(filterq.split(',')))
831
            included, excluded, opers = parse_filters(filterq)
832
            if included:
833
                s = s.where(a.c.key.in_(x for x in included))
834
            if excluded:
835
                s = s.where(not_(a.c.key.in_(x for x in excluded)))
836
            if opers:
837
                for k, o, v in opers:
838
                    s = s.where(or_(a.c.key == k and a.c.value.op(o)(v)))
831 839
        
832 840
        s = s.order_by(n.c.path)
833 841
        
b/pithos/backends/lib/sqlite/node.py
597 597
        
598 598
        subqlist = []
599 599
        append = subqlist.append
600
        included, excluded, opers = parse_filters(filterq.split(','))
600
        included, excluded, opers = parse_filters(filterq)
601 601
        args = []
602 602
        
603 603
        if included:
......
622 622
        if not subqlist:
623 623
            return None, None
624 624
        
625
        subq = ' ' + ' and '.join(subqlist)
626
        
625
        subq = ' and ' + ' and '.join(subqlist)
627 626
        return subq, args
628 627
    
629 628
    def _construct_paths(self, pathq):
......
665 664
    
666 665
    def latest_version_list(self, parent, prefix='', delimiter=None,
667 666
                            start='', limit=10000, before=inf,
668
                            except_cluster=0, pathq=[], filterq=None):
667
                            except_cluster=0, pathq=[], filterq=[]):
669 668
        """Return a (list of (path, serial) tuples, list of common prefixes)
670 669
           for the current versions of the paths with the given parent,
671 670
           matching the following criteria.
b/pithos/backends/modular.py
799 799
        prefix = cont_prefix + prefix
800 800
        start = cont_prefix + marker if marker else None
801 801
        before = until if until is not None else inf
802
        filterq = ','.join(keys) if keys else None
803 802
        
804
        objects, prefixes = self.node.latest_version_list(parent, prefix, delimiter, start, limit, before, CLUSTER_DELETED, allowed, filterq)
803
        objects, prefixes = self.node.latest_version_list(parent, prefix, delimiter, start, limit, before, CLUSTER_DELETED, allowed, keys)
805 804
        objects.extend([(p, None) for p in prefixes] if virtual else [])
806 805
        objects.sort(key=lambda x: x[0])
807 806
        objects = [(x[0][len(cont_prefix):], x[1]) for x in objects]
b/pithos/lib/filter.py
34 34
import re
35 35

  
36 36

  
37
_regexfilter = re.compile('(!?)\s*([\w-]+)\s*(=|!=|<=|>=|<|>)?\s*(.*)$', re.UNICODE)
37
_regexfilter = re.compile('(!?)\s*(.+)\s*(=|!=|<=|>=|<|>)?\s*(.*)$', re.UNICODE)
38 38

  
39 39

  
40 40
def parse_filters(terms):
b/pithos/tools/pithos-test
1684 1684
        self.assertTrue('o2' not in my_shared_objects)
1685 1685
    
1686 1686
class TestGreek(BaseTestCase):
1687
    def tearDown(self):
1688
        pass
1689
    
1687 1690
    def test_create_container(self):
1688 1691
        self.client.create_container('φάκελος')
1689 1692
        self.assert_container_exists('φάκελος')
......
1783 1786
        meta = {'ποσότητα':'μεγάλη'}
1784 1787
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1785 1788
        objects = self.client.list_objects('φάκελος', meta='ποιότητα, ποσότητα')
1786
        self.assertTrue('ο1' in objects)
1787
        self.assertTrue('ο2' in objects)
1788
        self.assertTrue('ο3' not in objects)
1789
        self.assertEquals(objects, ['ο1', 'ο2'])
1790
        
1791
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα')
1792
        self.assertEquals(objects, ['ο2', 'ο3'])
1793
        
1794
        objects = self.client.list_objects('φάκελος', meta='!ποιότητα, !ποσότητα')
1795
        self.assertEquals(objects, ['ο3'])
1796
        
1797
        meta = {'ποιότητα':'ΑΒ'}
1798
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1799
        objects = self.client.list_objects('φάκελος', meta='ποιότητα==ΑΑΑ')
1800
        self.assertEquals(objects, ['ο1'])
1801
        objects = self.client.list_objects('φάκελος', meta='ποιότητα!=ΑΑΑ')
1802
        self.assertEquals(objects, ['ο2'])
1803
        
1804
        meta = {'έτος':'2011'}
1805
        self.client.update_object_metadata('φάκελος', 'ο3', **meta)
1806
        meta = {'έτος':'2012'}
1807
        self.client.update_object_metadata('φάκελος', 'ο2', **meta)
1808
        objects = self.client.list_objects('φάκελος', meta='έτος<2012')
1809
        self.assertEquals(objects, ['ο1'])
1810
        objects = self.client.list_objects('φάκελος', meta='έτος<=2012')
1811
        self.assertEquals(objects, ['ο1', 'ο2'])
1812
        objects = self.client.list_objects('φάκελος', meta='έτος<2012,έτος!=2012')
1813
        self.assertEquals(objects, ['ο2'])
1789 1814
    
1790 1815
    def test_groups(self):
1791 1816
        #create a group

Also available in: Unified diff