Skip to content

Commit

Permalink
Fix the GroupingQuerySetMixin.less_common logic #526
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Druez <[email protected]>
  • Loading branch information
tdruez committed Sep 26, 2022
1 parent b47cda2 commit 4ed25ad
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 13 deletions.
2 changes: 1 addition & 1 deletion scanpipe/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def filter_queryset(self, queryset):
if value == self.empty_value:
queryset = queryset.filter(**{f"{field_name}__in": EMPTY_VALUES})
elif value == self.other_value:
return queryset.less_common(field_name)
return queryset.less_common(name)
else:
queryset = self.filters[name].filter(queryset, value)

Expand Down
22 changes: 10 additions & 12 deletions scanpipe/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -938,24 +938,22 @@ def less_common(self, field_name, limit=most_common_limit):
Return a QuerySet filtered by the less common values for the provided
`field_name` starting at the `limit`.
"""
field = self.model._meta.get_field(field_name)

if not isinstance(field, models.JSONField):
less_common_values = self.less_common_values(field_name, limit)
return self.filter(**{f"{field_name}__in": less_common_values})

field_name, data_field = {
json_fields_mapping = {
"license_key": ("licenses", "key"),
"license_category": ("licenses", "category"),
"copyrights": ("copyrights", "copyright"),
"holders": ("holders", "holder"),
}.get(field_name)
}

values_list = self.values_from_json_field(field_name, data_field)
sorted_by_occurrence = list(dict(Counter(values_list).most_common()).keys())
less_common_values = sorted_by_occurrence[limit:]
if field_name in json_fields_mapping:
field_name, data_field = json_fields_mapping.get(field_name)
values_list = self.values_from_json_field(field_name, data_field)
sorted_by_occurrence = list(dict(Counter(values_list).most_common()).keys())
less_common_values = sorted_by_occurrence[limit:]
return self.json_list_contains(field_name, data_field, less_common_values)

return self.json_list_contains(field_name, data_field, less_common_values)
less_common_values = self.less_common_values(field_name, limit)
return self.filter(**{f"{field_name}__in": less_common_values})


class JSONFieldQuerySetMixin:
Expand Down

0 comments on commit 4ed25ad

Please sign in to comment.