hasMatch method
Returns whether or not source
matches according to the contents of filter
.
Returns true
if it matches, false
if it does not.
Returns Null if comparison is not possible due to type difference, etc.
filter
の内容に応じて、source
がマッチするかどうかを返します。
マッチする場合はtrue
、しない場合はfalse
を返します。
型が違う等で比較不可能の場合はNullを返します。
Implementation
@override
bool? hasMatch(ModelQueryFilter filter, dynamic source) {
final target = filter.value;
switch (filter.type) {
case ModelQueryFilterType.equalTo:
return _hasMatch(source, target, (source, target) => source == target);
case ModelQueryFilterType.notEqualTo:
return _hasMatch(source, target, (source, target) => source != target);
case ModelQueryFilterType.arrayContains:
if (source is List) {
if (source.any((s) =>
_hasMatch(s, target, (source, target) => source == target) ??
false)) {
return true;
}
}
break;
case ModelQueryFilterType.arrayContainsAny:
if (source is List && target is List && target.isNotEmpty) {
if (source.any((s) => target.any((t) =>
_hasMatch(s, t, (source, target) => source == target) ??
false))) {
return true;
}
}
break;
case ModelQueryFilterType.whereIn:
if (target is List && target.isNotEmpty) {
final matches = target.mapAndRemoveEmpty((t) =>
_hasMatch(source, t, (source, target) => source == target));
if (matches.isNotEmpty) {
return matches.any((element) => element);
}
}
break;
case ModelQueryFilterType.whereNotIn:
if (target is List && target.isNotEmpty) {
final matches = target.mapAndRemoveEmpty((t) =>
_hasMatch(source, t, (source, target) => source == target));
if (matches.isNotEmpty) {
return !matches.any((element) => element);
}
}
break;
default:
return null;
}
return null;
}