Skip to content

Commit f37ddec

Browse files
makseqJalal Tabatabaee
authored andcommitted
fix: DEV-3865: Filter with the specific annotator works extremely slow (HumanSignal#3454)
* fix: DEV-3865: Filter with the specific annotator works extremely slow * fix: DEV-4060: Filter with the specific annotator works extremely slow * Add FF
1 parent dbdca4f commit f37ddec

File tree

1 file changed

+25
-36
lines changed

1 file changed

+25
-36
lines changed

label_studio/data_manager/managers.py

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -164,49 +164,38 @@ def add_result_filter(field_name, _filter, filter_expressions, project):
164164
from django.db.models.expressions import RawSQL
165165
from tasks.models import Annotation, Prediction
166166

167-
# new approach with contain instead of icontains
168-
if flag_set('ff_back_2214_annotation_result_12052022_short', project.organization.created_by):
167+
flag = flag_set('ff_back_dev_3865_filters_anno_171222_short', project.organization.created_by)
168+
if field_name == 'annotations_results' and flag:
169+
subquery = Q(id__in=
170+
Annotation.objects
171+
.annotate(json_str=RawSQL('cast(result as text)', ''))
172+
.filter(Q(project=project) & Q(json_str__contains=_filter.value))
173+
.values_list('task', flat=True)
174+
)
175+
else:
169176
_class = Annotation if field_name == 'annotations_results' else Prediction
170177
subquery = Exists(
171178
_class.objects
172179
.annotate(json_str=RawSQL('cast(result as text)', ''))
173180
.filter(Q(task=OuterRef('pk')) & Q(json_str__contains=_filter.value))
174181
)
175182

176-
if _filter.operator in [Operator.EQUAL, Operator.NOT_EQUAL]:
177-
try:
178-
value = json.loads(_filter.value)
179-
except:
180-
return 'exit'
181-
182-
q = Exists(_class.objects.filter(Q(task=OuterRef('pk')) & Q(result=value)))
183-
filter_expressions.append(q if _filter.operator == Operator.EQUAL else ~q)
184-
return 'continue'
185-
elif _filter.operator == Operator.CONTAINS:
186-
filter_expressions.append(Q(subquery))
187-
return 'continue'
188-
elif _filter.operator == Operator.NOT_CONTAINS:
189-
filter_expressions.append(~Q(subquery))
190-
return 'continue'
191-
192-
# old approach
193-
else:
194-
name = 'annotations__result' if field_name == 'annotations_results' else 'predictions__result'
195-
if _filter.operator in [Operator.EQUAL, Operator.NOT_EQUAL]:
196-
try:
197-
value = json.loads(_filter.value)
198-
except:
199-
return 'exit'
200-
201-
q = Q(**{name: value})
202-
filter_expressions.append(q if _filter.operator == Operator.EQUAL else ~q)
203-
return 'continue'
204-
elif _filter.operator == Operator.CONTAINS:
205-
filter_expressions.append(Q(**{name + '__icontains': _filter.value}))
206-
return 'continue'
207-
elif _filter.operator == Operator.NOT_CONTAINS:
208-
filter_expressions.append(~Q(**{name + '__icontains': _filter.value}))
209-
return 'continue'
183+
if _filter.operator in [Operator.EQUAL, Operator.NOT_EQUAL]:
184+
try:
185+
value = json.loads(_filter.value)
186+
except:
187+
return 'exit'
188+
189+
q = Exists(_class.objects.filter(Q(task=OuterRef('pk')) & Q(result=value)))
190+
filter_expressions.append(q if _filter.operator == Operator.EQUAL else ~q)
191+
return 'continue'
192+
elif _filter.operator == Operator.CONTAINS:
193+
filter_expressions.append(Q(subquery))
194+
return 'continue'
195+
elif _filter.operator == Operator.NOT_CONTAINS:
196+
filter_expressions.append(~Q(subquery))
197+
return 'continue'
198+
210199

211200

212201
def add_user_filter(enabled, key, _filter, filter_expressions):

0 commit comments

Comments
 (0)