Skip to content

Commit

Permalink
Merge pull request #19 from maethu/master
Browse files Browse the repository at this point in the history
Implement multipath queries.
  • Loading branch information
davisagli committed Mar 30, 2014
2 parents 4d04e40 + d406f22 commit cf4326f
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 9 deletions.
7 changes: 6 additions & 1 deletion CHANGES.rst
Expand Up @@ -4,7 +4,12 @@ Changelog
1.1.2 (unreleased)
------------------

- Nothing changed yet.
- Implement multipath queries:
- Parsing a path returns always a list.
- Special handling for paths in parseFormquery.

Fixes https://dev.plone.org/ticket/13251
[mathias.leimgruber]


1.1.1 (2014-01-27)
Expand Down
17 changes: 12 additions & 5 deletions plone/app/querystring/queryparser.py
Expand Up @@ -38,7 +38,12 @@ def parseFormquery(context, formquery, sort_on=None, sort_order=None):
kwargs = {}
parser = resolve(row.operator)
kwargs = parser(context, row)
query.update(kwargs)

# Special path handling - since multipath queries are possible
if 'path' in query and 'path' in kwargs:
query['path']['query'].extend(kwargs['path']['query'])
else:
query.update(kwargs)

if not query:
# If the query is empty fall back onto the equality query
Expand Down Expand Up @@ -213,14 +218,16 @@ def _path(context, row):
if not values.startswith(nav_root):
values = nav_root + values

query = {'query': values}
query = {}
if depth is not None:
query['depth'] = depth
# when a depth value is specified, a trailing slash matters on the
# query
query['query'] = query['query'].rstrip('/')
tmp = {row.index: query}
return tmp
values = values.rstrip('/')

query['query'] = [values]

return {row.index: query}


def _relativePath(context, row):
Expand Down
44 changes: 41 additions & 3 deletions plone/app/querystring/tests/testQueryParser.py
Expand Up @@ -140,7 +140,8 @@ def test_path_explicit(self):
'v': '/foo',
}
parsed = queryparser.parseFormquery(MockSite(), [data, ])
self.assertEqual(parsed, {'path': {'query': '/%s/foo' % MOCK_SITE_ID}})
self.assertEqual(
parsed, {'path': {'query': ['/%s/foo' % MOCK_SITE_ID]}})

def test_path_computed(self):
data = {
Expand All @@ -150,7 +151,8 @@ def test_path_computed(self):
}

parsed = queryparser.parseFormquery(MockSite(), [data, ])
self.assertEqual(parsed, {'path': {'query': '/%s/foo' % MOCK_SITE_ID}})
self.assertEqual(
parsed, {'path': {'query': ['/%s/foo' % MOCK_SITE_ID]}})

def test_path_with_depth_computed(self):
data = {
Expand All @@ -162,11 +164,47 @@ def test_path_with_depth_computed(self):
parsed = queryparser.parseFormquery(MockSite(), [data, ])
self.assertEqual(parsed, {
'path': {
'query': '/%s/foo' % MOCK_SITE_ID,
'query': ['/%s/foo' % MOCK_SITE_ID],
'depth': 2
}
})

def test_multi_path(self):
data_1 = {
'i': 'path',
'o': 'plone.app.querystring.operation.string.path',
'v': '/foo',
}
data_2 = {
'i': 'path',
'o': 'plone.app.querystring.operation.string.path',
'v': '/bar',
}

parsed = queryparser.parseFormquery(MockSite(), [data_1, data_2])
self.assertEqual(
parsed, {'path': {'query': [
'/%s/foo' % MOCK_SITE_ID,
'/%s/bar' % MOCK_SITE_ID]}})

def test_multi_path_with_depth_computet(self):
data_1 = {
'i': 'path',
'o': 'plone.app.querystring.operation.string.path',
'v': '/foo::2',
}
data_2 = {
'i': 'path',
'o': 'plone.app.querystring.operation.string.path',
'v': '/bar::5',
}

parsed = queryparser.parseFormquery(MockSite(), [data_1, data_2])
self.assertEqual(
parsed, {'path': {'query': [
'/%s/foo' % MOCK_SITE_ID,
'/%s/bar' % MOCK_SITE_ID], 'depth': 2}})


class TestQueryGenerators(TestQueryParserBase):

Expand Down

0 comments on commit cf4326f

Please sign in to comment.