Fixed issue with use of delimiter in container queries.
Currently if you have a container with objects named x/y and x0 and you use delimiter=/ in your query, x0 will be excluded from the results. This patch resolves this problem. To replicate the original issue, create a container called 'test' with the following objects: x/y x0 x1 Then do a GET with 'accnt/test?delimiter=/' and the following is returned: x/ x1 i.e. x0 is missing from output. Change-Id: If196e3075612b121ef8da4a9128167d00a248c27
This commit is contained in:
parent
506a2b1fd0
commit
f9c5348f49
@ -1064,6 +1064,7 @@ class ContainerBroker(DatabaseBroker):
|
|||||||
:returns: list of tuples of (name, created_at, size, content_type,
|
:returns: list of tuples of (name, created_at, size, content_type,
|
||||||
etag)
|
etag)
|
||||||
"""
|
"""
|
||||||
|
delim_force_gte = False
|
||||||
(marker, end_marker, prefix, delimiter, path) = utf8encode(
|
(marker, end_marker, prefix, delimiter, path) = utf8encode(
|
||||||
marker, end_marker, prefix, delimiter, path)
|
marker, end_marker, prefix, delimiter, path)
|
||||||
try:
|
try:
|
||||||
@ -1088,7 +1089,12 @@ class ContainerBroker(DatabaseBroker):
|
|||||||
if end_marker:
|
if end_marker:
|
||||||
query += ' name < ? AND'
|
query += ' name < ? AND'
|
||||||
query_args.append(end_marker)
|
query_args.append(end_marker)
|
||||||
if marker and marker >= prefix:
|
if delim_force_gte:
|
||||||
|
query += ' name >= ? AND'
|
||||||
|
query_args.append(marker)
|
||||||
|
# Always set back to False
|
||||||
|
delim_force_gte = False
|
||||||
|
elif marker and marker >= prefix:
|
||||||
query += ' name > ? AND'
|
query += ' name > ? AND'
|
||||||
query_args.append(marker)
|
query_args.append(marker)
|
||||||
elif prefix:
|
elif prefix:
|
||||||
@ -1124,6 +1130,8 @@ class ContainerBroker(DatabaseBroker):
|
|||||||
break
|
break
|
||||||
elif end > 0:
|
elif end > 0:
|
||||||
marker = name[:end] + chr(ord(delimiter) + 1)
|
marker = name[:end] + chr(ord(delimiter) + 1)
|
||||||
|
# we want result to be inclusinve of delim+1
|
||||||
|
delim_force_gte = True
|
||||||
dir_name = name[:end + 1]
|
dir_name = name[:end + 1]
|
||||||
if dir_name != orig_marker:
|
if dir_name != orig_marker:
|
||||||
results.append([dir_name, '0', 0, None, ''])
|
results.append([dir_name, '0', 0, None, ''])
|
||||||
|
@ -1215,19 +1215,53 @@ class TestContainerBroker(unittest.TestCase):
|
|||||||
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
broker.put_object('c', normalize_timestamp(time()), 0,
|
broker.put_object('c', normalize_timestamp(time()), 0,
|
||||||
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
listing = broker.list_objects_iter(15, None, None, None, None)
|
broker.put_object('a/0', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('00', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/0', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/00', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/1', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/1/', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('0/1/0', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('1', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('1/', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
broker.put_object('1/0', normalize_timestamp(time()), 0,
|
||||||
|
'text/plain', 'd41d8cd98f00b204e9800998ecf8427e')
|
||||||
|
listing = broker.list_objects_iter(25, None, None, None, None)
|
||||||
|
self.assertEquals(len(listing), 22)
|
||||||
|
self.assertEquals([row[0] for row in listing],
|
||||||
|
['0', '0/', '0/0', '0/00', '0/1', '0/1/', '0/1/0', '00', '1', '1/',
|
||||||
|
'1/0', 'a', 'a/', 'a/0', 'a/a', 'a/a/a', 'a/a/b', 'a/b', 'b', 'b/a',
|
||||||
|
'b/b', 'c'])
|
||||||
|
listing = broker.list_objects_iter(25, None, None, '', '/')
|
||||||
self.assertEquals(len(listing), 10)
|
self.assertEquals(len(listing), 10)
|
||||||
self.assertEquals([row[0] for row in listing],
|
self.assertEquals([row[0] for row in listing],
|
||||||
['a', 'a/', 'a/a', 'a/a/a', 'a/a/b', 'a/b', 'b', 'b/a', 'b/b', 'c'])
|
['0', '0/', '00', '1', '1/', 'a', 'a/', 'b', 'b/', 'c'])
|
||||||
listing = broker.list_objects_iter(15, None, None, '', '/')
|
listing = broker.list_objects_iter(25, None, None, 'a/', '/')
|
||||||
self.assertEquals(len(listing), 5)
|
self.assertEquals(len(listing), 5)
|
||||||
self.assertEquals([row[0] for row in listing],
|
self.assertEquals([row[0] for row in listing],
|
||||||
['a', 'a/', 'b', 'b/', 'c'])
|
['a/', 'a/0', 'a/a', 'a/a/', 'a/b'])
|
||||||
listing = broker.list_objects_iter(15, None, None, 'a/', '/')
|
listing = broker.list_objects_iter(25, None, None, '0/', '/')
|
||||||
self.assertEquals(len(listing), 4)
|
self.assertEquals(len(listing), 5)
|
||||||
self.assertEquals([row[0] for row in listing],
|
self.assertEquals([row[0] for row in listing],
|
||||||
['a/', 'a/a', 'a/a/', 'a/b'])
|
['0/', '0/0', '0/00', '0/1', '0/1/'])
|
||||||
listing = broker.list_objects_iter(15, None, None, 'b/', '/')
|
listing = broker.list_objects_iter(25, None, None, '0/1/', '/')
|
||||||
|
self.assertEquals(len(listing), 2)
|
||||||
|
self.assertEquals([row[0] for row in listing],
|
||||||
|
['0/1/', '0/1/0'])
|
||||||
|
listing = broker.list_objects_iter(25, None, None, 'b/', '/')
|
||||||
self.assertEquals(len(listing), 2)
|
self.assertEquals(len(listing), 2)
|
||||||
self.assertEquals([row[0] for row in listing], ['b/a', 'b/b'])
|
self.assertEquals([row[0] for row in listing], ['b/a', 'b/b'])
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user