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