Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1850 | accepting expression in new format w…
Browse files Browse the repository at this point in the history
…ithout system/valueset | reference can accept extras filters
  • Loading branch information
snyaggarwal committed Jun 14, 2024
1 parent d128b07 commit 625201f
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 25 deletions.
13 changes: 10 additions & 3 deletions core/collections/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from core.common.constants import (
ACCESS_TYPE_VIEW, ACCESS_TYPE_EDIT,
ES_REQUEST_TIMEOUT, ES_REQUEST_TIMEOUT_ASYNC, HEAD, ALL, EXCLUDE_WILDCARD_SEARCH_PARAM, EXCLUDE_FUZZY_SEARCH_PARAM,
SEARCH_MAP_CODES_PARAM, INCLUDE_SEARCH_META_PARAM)
SEARCH_MAP_CODES_PARAM, INCLUDE_SEARCH_META_PARAM, VERBOSE_PARAM)
from core.common.models import ConceptContainerModel, BaseResourceModel
from core.common.search import CustomESSearch
from core.common.tasks import seed_children_to_expansion, batch_index_resources, index_expansion_concepts, \
Expand Down Expand Up @@ -819,12 +819,19 @@ def apply_filters(self, queryset, resource_klass):
for filter_def in self.filter: # pylint: disable=not-an-iterable
if to_snake_case(filter_def['property']) == 'exact_match' or filter_def['property'] in [
EXCLUDE_WILDCARD_SEARCH_PARAM, EXCLUDE_FUZZY_SEARCH_PARAM, SEARCH_MAP_CODES_PARAM,
INCLUDE_SEARCH_META_PARAM
] or filter_def['property'] not in self.get_allowed_filter_properties():
INCLUDE_SEARCH_META_PARAM, VERBOSE_PARAM
] or (
not filter_def['property'] or (
not filter_def['property'].startswith('extras.') and \
filter_def['property'] not in self.get_allowed_filter_properties()
)
):
continue
val = filter_def['value']
if filter_def['property'] == 'q':
self._apply_search(search, val, document)
if filter_def['property'].startswith('extras.'):
search = search.filter("match", **{filter_def["property"]: filter_def["value"]})
else:
search = search.filter("match", **{to_snake_case(filter_def["property"]): filter_def["value"]})
for _queryset in batch_qs(queryset.order_by('id'), 500):
Expand Down
54 changes: 32 additions & 22 deletions core/collections/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ def _to_reference_structure(self, expression=None): # pylint: disable=arguments
return self.references
concept = expression.get('concept', None)
mapping = expression.get('mapping', None)
system = get(expression, 'system') or get(expression, 'url')
system_version = get(expression, 'version')
valueset = get(expression, 'valueset') or get(expression, 'valueSet')
if concept:
if not isinstance(concept, list):
concept = [concept]
Expand All @@ -130,10 +133,10 @@ def _to_reference_structure(self, expression=None): # pylint: disable=arguments
{
'expression': None,
'namespace': get(expression, 'namespace'),
'system': get(expression, 'system') or get(expression, 'url'),
'version': get(expression, 'version'),
'system': system,
'version': system_version,
'reference_type': 'concepts',
'valueset': get(expression, 'valueset') or get(expression, 'valueSet'),
'valueset': valueset,
'cascade': get(expression, 'cascade') or self.cascade,
'filter': get(expression, 'filter'),
'code': code,
Expand All @@ -154,10 +157,10 @@ def _to_reference_structure(self, expression=None): # pylint: disable=arguments
{
'expression': None,
'namespace': get(expression, 'namespace'),
'system': get(expression, 'system') or get(expression, 'url'),
'version': get(expression, 'version'),
'system': system,
'version': system_version,
'reference_type': 'mappings',
'valueset': get(expression, 'valueset') or get(expression, 'valueSet'),
'valueset': valueset,
'cascade': get(expression, 'cascade') or self.cascade,
'filter': get(expression, 'filter'),
'code': code,
Expand All @@ -168,23 +171,30 @@ def _to_reference_structure(self, expression=None): # pylint: disable=arguments
'include': self.get_include_value(expression)
}
)
code = get(expression, 'code')
if not concept and not mapping:
self.references.append({
'expression': get(expression, 'expression', None),
'namespace': get(expression, 'namespace'),
'system': get(expression, 'system') or get(expression, 'url'),
'version': get(expression, 'version'),
'reference_type': get(expression, 'reference_type', 'concepts'),
'valueset': get(expression, 'valueset') or get(expression, 'valueSet'),
'cascade': get(expression, 'cascade') or self.cascade,
'filter': get(expression, 'filter'),
'code': get(expression, 'code'),
'resource_version': get(expression, 'resource_version'),
'transform': get(expression, 'transform'),
'created_by': self.user,
'display': get(expression, 'display'),
'include': self.get_include_value(expression)
})
if not code and not system and not system_version and not valueset and 'expression' in expression:
parser = CollectionReferenceExpressionStringParser(expression['expression'], self.transform, self.cascade, self.user)
parser.parse()
parser.to_reference_structure()
self.references += parser.references
else:
self.references.append({
'expression': get(expression, 'expression', None),
'namespace': get(expression, 'namespace'),
'system': system,
'version': system_version,
'reference_type': get(expression, 'reference_type', 'concepts'),
'valueset': valueset,
'cascade': get(expression, 'cascade') or self.cascade,
'filter': get(expression, 'filter'),
'code': code,
'resource_version': get(expression, 'resource_version'),
'transform': get(expression, 'transform'),
'created_by': self.user,
'display': get(expression, 'display'),
'include': self.get_include_value(expression)
})
return self.references


Expand Down

0 comments on commit 625201f

Please sign in to comment.