private HierarchicalQuery<T, F> mixInSortOrders( HierarchicalQuery<T, F> query) { if (sortOrders.isEmpty()) { return query; } Set<String> sortedPropertyNames = query.getSortOrders().stream() .map(SortOrder::getSorted).collect(Collectors.toSet()); List<QuerySortOrder> combinedSortOrders = Stream .concat(query.getSortOrders().stream(), sortOrders.stream() .filter(order -> !sortedPropertyNames .contains(order.getSorted()))) .collect(Collectors.toList()); return new HierarchicalQuery<>(query.getOffset(), query.getLimit(), combinedSortOrders, query.getInMemorySorting(), query.getFilter().orElse(null), query.getParent()); }
@Override public Stream<T> fetchChildren( HierarchicalQuery<T, SerializablePredicate<T>> query) { if (!treeData.contains(query.getParent())) { throw new IllegalArgumentException("The queried item " + query.getParent() + " could not be found in the backing TreeData. " + "Did you forget to refresh this data provider after item removal?"); } Stream<T> childStream = getFilteredStream( treeData.getChildren(query.getParent()).stream(), query.getFilter()); Optional<Comparator<T>> comparing = Stream .of(query.getInMemorySorting(), sortOrder) .filter(c -> c != null) .reduce((c1, c2) -> c1.thenComparing(c2)); if (comparing.isPresent()) { childStream = childStream.sorted(comparing.get()); } return childStream.skip(query.getOffset()).limit(query.getLimit()); }
@Override public Stream<T> fetchChildren(HierarchicalQuery<T, F> query) { return dataProvider.fetch(new HierarchicalQuery<>( query.getOffset(), query.getLimit(), query.getSortOrders(), query.getInMemorySorting(), getFilter(query), query.getParent())); }
@Override public int getChildCount(HierarchicalQuery<T, F> query) { return dataProvider().getChildCount(new HierarchicalQuery<>( query.getOffset(), query.getLimit(), query.getSortOrders(), query.getInMemorySorting(), getFilter(query), query.getParent())); }