Skip to content

Commit 9cea289

Browse files
AetherUnboundlabkey-alan
authored andcommitted
Allow multiple QueryFilters with the same prefix to be added to the post body (#21)
* Add IntelliJ project artifact to gitignore * Always add QueryFilters as a list to post body This prevents potentially conflicting keys from overriding each other
1 parent 3c8d393 commit 9cea289

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ build/
44
dist/
55

66
# Project Artifacts
7-
.idea/
7+
.idea/
8+
*.iml

labkey/query.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,11 @@ def select_rows(server_context, schema_name, query_name, view_name=None,
220220
if filter_array is not None:
221221
for query_filter in filter_array:
222222
prefix = query_filter.get_url_parameter_name()
223-
payload[prefix] = query_filter.get_url_parameter_value()
223+
# Use a list for each prefix, as a prefix may have multiple different
224+
# filter values associated for it.
225+
filters = payload.get(prefix, [])
226+
filters.append(query_filter.get_url_parameter_value())
227+
payload[prefix] = filters
224228

225229
if columns is not None:
226230
payload['query.columns'] = columns

test/test_query_api.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import unittest.mock as mock
2323

2424
from labkey import utils
25-
from labkey.query import delete_rows, update_rows, insert_rows, select_rows, execute_sql
25+
from labkey.query import delete_rows, update_rows, insert_rows, select_rows, execute_sql, QueryFilter
2626
from labkey.exceptions import RequestError, QueryNotFoundError, ServerNotFoundError, RequestAuthorizationError
2727

2828
from utilities import MockLabKey, mock_server_context, success_test, throws_error_test
@@ -245,6 +245,30 @@ def test_success(self):
245245
test = self
246246
success_test(test, self.service.get_successful_response(), select_rows, True, *self.args, **self.expected_kwargs)
247247

248+
def test_query_filter(self):
249+
test = self
250+
# Construct a set of arguments that
251+
args = [
252+
*self.args,
253+
# view_name
254+
None,
255+
# filter_array
256+
[
257+
QueryFilter('Field1', 'value', 'eq'),
258+
QueryFilter('Field2', 'value1', 'contains'),
259+
QueryFilter('Field2', 'value2', 'contains'),
260+
]
261+
]
262+
# Expected query field values in post request body
263+
query_field = {
264+
'query.Field1~eq': ['value'],
265+
'query.Field2~contains': ['value1', 'value2'],
266+
}
267+
# Update post request body with expected query field values
268+
self.expected_kwargs['data'].update(query_field)
269+
270+
success_test(test, self.service.get_successful_response(), select_rows, True, *args, **self.expected_kwargs)
271+
248272
def test_unauthorized(self):
249273
test = self
250274
throws_error_test(test, RequestAuthorizationError, self.service.get_unauthorized_response(),

0 commit comments

Comments
 (0)