Changed how first filter with CompleteSetException works

Now if the first filter instead says (skip) and returns 0 players.
I considered that all players could be returned, but it is better if
users get to choose their filter again in this case.

Affects issues:
- Fixed #1742
This commit is contained in:
Risto Lahtela 2021-02-07 23:04:51 +02:00
parent 2ab789f3d8
commit 66eb192735
2 changed files with 13 additions and 9 deletions

View File

@ -39,12 +39,15 @@ public interface Filter {
* @param query Query for the filter * @param query Query for the filter
* @return Set of UUIDs this filter applies to * @return Set of UUIDs this filter applies to
* @throws IllegalArgumentException If the arguments are not valid. * @throws IllegalArgumentException If the arguments are not valid.
* @throws CompleteSetException If the arguments produce a complete set.
*/ */
Set<UUID> getMatchingUUIDs(SpecifiedFilterInformation query); Set<UUID> getMatchingUUIDs(SpecifiedFilterInformation query);
default Result apply(SpecifiedFilterInformation query) { default Result apply(SpecifiedFilterInformation query) {
return new Result(null, getKind(), getMatchingUUIDs(query)); try {
return new Result(null, getKind(), getMatchingUUIDs(query));
} catch (CompleteSetException allMatch) {
return new Result(null, getKind() + " (skip)", new HashSet<>());
}
} }
class Result { class Result {
@ -62,9 +65,13 @@ public interface Filter {
} }
public Result apply(Filter filter, SpecifiedFilterInformation query) { public Result apply(Filter filter, SpecifiedFilterInformation query) {
Set<UUID> got = filter.getMatchingUUIDs(query); try {
currentUUIDs.retainAll(got); Set<UUID> got = filter.getMatchingUUIDs(query);
return new Result(this, filter.getKind(), currentUUIDs); currentUUIDs.retainAll(got);
return new Result(this, filter.getKind(), currentUUIDs);
} catch (CompleteSetException allMatch) {
return notApplied(filter);
}
} }
public Result notApplied(Filter filter) { public Result notApplied(Filter filter) {

View File

@ -96,8 +96,7 @@ public class QueryFilters {
String kind = specifiedFilterInformation.getKind(); String kind = specifiedFilterInformation.getKind();
Filter filter = getFilter(kind).orElseThrow(() -> new BadRequestException("Filter kind not supported: '" + kind + "'")); Filter filter = getFilter(kind).orElseThrow(() -> new BadRequestException("Filter kind not supported: '" + kind + "'"));
current = getResult(current, filter, specifiedFilterInformation); return getResult(current, filter, specifiedFilterInformation);
return current;
} }
private Filter.Result getResult(Filter.Result current, Filter filter, SpecifiedFilterInformation query) { private Filter.Result getResult(Filter.Result current, Filter filter, SpecifiedFilterInformation query) {
@ -107,8 +106,6 @@ public class QueryFilters {
throw new BadRequestException("Bad parameters for filter '" + filter.getKind() + throw new BadRequestException("Bad parameters for filter '" + filter.getKind() +
"': expecting " + Arrays.asList(filter.getExpectedParameters()) + "': expecting " + Arrays.asList(filter.getExpectedParameters()) +
", but was given " + query.getSetParameters()); ", but was given " + query.getSetParameters());
} catch (CompleteSetException complete) {
return current == null ? null : current.notApplied(filter);
} }
} }