Skip to content

Commit

Permalink
Took similar code between filter_has_valid_entities and filter_has_in…
Browse files Browse the repository at this point in the history
…valid_entities and created a utils function filter_validate_entities

on filter_validate_entities, changed translations__entities__entity__in=F('entities__entity') into a new query as when it returns None or one instance the in lookup will break as it is not an iterable
  • Loading branch information
helllllllder committed Mar 31, 2022
1 parent 4a95c8d commit 2851b51
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 113 deletions.
62 changes: 6 additions & 56 deletions bothub/api/v2/examples/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from bothub.common.models import Repository
from bothub.common.models import RepositoryExample

from bothub.utils import filter_validate_entities


class ExamplesFilter(filters.FilterSet):
class Meta:
Expand Down Expand Up @@ -187,63 +189,11 @@ def filter_intent_id(self, queryset, name, value):
return queryset.filter(intent__pk=value)

def filter_has_valid_entities(self, queryset, name, value):
result_queryset = queryset.annotate(
original_entities_count=Count(
"entities",
filter=Q(
translations__original_example__entities__repository_example=F("pk")
)
& Q(translations__language=value),
distinct=True,
)
).annotate(
entities_count=Count(
"translations__entities",
filter=Q(
Q(
translations__entities__repository_translated_example__language=value
)
| Q(
translations__entities__repository_translated_example__language=F(
"repository_version_language__repository_version__repository__language"
)
),
translations__entities__entity__in=F(
"translations__original_example__entities__entity"
),
),
distinct=True,
)
return filter_validate_entities(queryset, name, value).filter(
original_entities_count=F("entities_count")
)
return result_queryset.filter(original_entities_count=F("entities_count"))

def filter_has_invalid_entities(self, queryset, name, value):
result_queryset = queryset.annotate(
original_entities_count=Count(
"entities",
filter=Q(
translations__original_example__entities__repository_example=F("pk")
)
& Q(translations__language=value),
distinct=True,
)
).annotate(
entities_count=Count(
"translations__entities",
filter=Q(
Q(
translations__entities__repository_translated_example__language=value
)
| Q(
translations__entities__repository_translated_example__language=F(
"repository_version_language__repository_version__repository__language"
)
),
translations__entities__entity__in=F(
"translations__original_example__entities__entity"
),
),
distinct=True,
)
return filter_validate_entities(queryset, name, value).exclude(
original_entities_count=F("entities_count")
)
return result_queryset.exclude(original_entities_count=F("entities_count"))
62 changes: 6 additions & 56 deletions bothub/api/v2/translator/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
RepositoryTranslatedExample,
)

from bothub.utils import filter_validate_entities


class RepositoryTranslatorFilter(filters.FilterSet):
class Meta:
Expand Down Expand Up @@ -156,66 +158,14 @@ def filter_intent_id(self, queryset, name, value):
return queryset.filter(intent__pk=value)

def filter_has_valid_entities(self, queryset, name, value):
result_queryset = queryset.annotate(
original_entities_count=Count(
"entities",
filter=Q(
translations__original_example__entities__repository_example=F("pk")
)
& Q(translations__language=value),
distinct=True,
)
).annotate(
entities_count=Count(
"translations__entities",
filter=Q(
Q(
translations__entities__repository_translated_example__language=value
)
| Q(
translations__entities__repository_translated_example__language=F(
"repository_version_language__repository_version__repository__language"
)
),
translations__entities__entity__in=F(
"translations__original_example__entities__entity"
),
),
distinct=True,
)
return filter_validate_entities(queryset, name, value).filter(
original_entities_count=F("entities_count")
)
return result_queryset.filter(original_entities_count=F("entities_count"))

def filter_has_invalid_entities(self, queryset, name, value):
result_queryset = queryset.annotate(
original_entities_count=Count(
"entities",
filter=Q(
translations__original_example__entities__repository_example=F("pk")
)
& Q(translations__language=value),
distinct=True,
)
).annotate(
entities_count=Count(
"translations__entities",
filter=Q(
Q(
translations__entities__repository_translated_example__language=value
)
| Q(
translations__entities__repository_translated_example__language=F(
"repository_version_language__repository_version__repository__language"
)
),
translations__entities__entity__in=F(
"translations__original_example__entities__entity"
),
),
distinct=True,
)
return filter_validate_entities(queryset, name, value).exclude(
original_entities_count=F("entities_count")
)
return result_queryset.exclude(original_entities_count=F("entities_count"))


class TranslationsTranslatorFilter(filters.FilterSet):
Expand Down
31 changes: 30 additions & 1 deletion bothub/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from collections import OrderedDict
from botocore.exceptions import ClientError
from django.conf import settings
from django.db.models import IntegerField, Subquery
from django.db.models import IntegerField, Subquery, Q, F, Count
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from django_elasticsearch_dsl import Document
Expand Down Expand Up @@ -380,3 +380,32 @@ def save(self, action="create", **kwargs):

def update(self, instance, action="create", **kwargs):
return super().update(instance, action=action, **kwargs)


def filter_validate_entities(queryset, name, value):
entities = list(
queryset.values_list("entities__entity", flat=True).order_by().distinct()
)

result_queryset = queryset.annotate(
original_entities_count=Count(
"entities",
filter=Q(translations__language=value),
distinct=True,
)
).annotate(
entities_count=Count(
"translations__entities",
filter=Q(
Q(translations__entities__repository_translated_example__language=value)
| Q(
translations__entities__repository_translated_example__language=F(
"repository_version_language__repository_version__repository__language"
)
),
translations__entities__entity__in=entities,
),
distinct=True,
)
)
return result_queryset

0 comments on commit 2851b51

Please sign in to comment.