5959import java .util .function .BiPredicate ;
6060import java .util .function .Function ;
6161import java .util .function .Supplier ;
62+ import java .util .stream .Collectors ;
6263
6364/**
6465 * This class captures an ordering property.
@@ -292,7 +293,29 @@ public Set<RequestedOrdering> deriveRequestedOrderings(@Nonnull final RequestedO
292293 }
293294
294295 public boolean satisfies (@ Nonnull RequestedOrdering requestedOrdering ) {
295- return !Iterables .isEmpty (enumerateCompatibleRequestedOrderings (requestedOrdering ));
296+ if (requestedOrdering .isDistinct () && !isDistinct ()) {
297+ return false ;
298+ }
299+
300+ final var eligibleElements = orderingSet .eligibleSet ().eligibleElements ();
301+ var isFirst = true ;
302+ for (final var requestedOrderingPart : requestedOrdering .getOrderingParts ()) {
303+ if (!bindingMap .containsKey (requestedOrderingPart .getValue ())) {
304+ return false ;
305+ }
306+ if (isFirst ) {
307+ if (!eligibleElements .contains (requestedOrderingPart .getValue ())) {
308+ return false ;
309+ }
310+ isFirst = false ;
311+ }
312+ final var bindings = bindingMap .get (requestedOrderingPart .getValue ());
313+ final var sortOrder = sortOrder (bindings );
314+ if (!sortOrder .isCompatibleWithRequestedSortOrder (requestedOrderingPart .getSortOrder ())) {
315+ return false ;
316+ }
317+ }
318+ return satisfiesGroupingValues (requestedOrdering .getOrderingParts ().stream ().map (OrderingPart ::getValue ).collect (Collectors .toSet ()));
296319 }
297320
298321 /**
@@ -326,7 +349,6 @@ public Iterable<List<RequestedOrderingPart>> enumerateCompatibleRequestedOrderin
326349 return ImmutableList .of ();
327350 }
328351
329- final var requestedOrderingValuesBuilder = ImmutableList .<Value >builder ();
330352 final var requestedOrderingValuesMapBuilder = ImmutableMap .<Value , RequestedOrderingPart >builder ();
331353 for (final var requestedOrderingPart : requestedOrdering .getOrderingParts ()) {
332354 if (!bindingMap .containsKey (requestedOrderingPart .getValue ())) {
@@ -337,8 +359,6 @@ public Iterable<List<RequestedOrderingPart>> enumerateCompatibleRequestedOrderin
337359 if (!sortOrder .isCompatibleWithRequestedSortOrder (requestedOrderingPart .getSortOrder ())) {
338360 return ImmutableList .of ();
339361 }
340-
341- requestedOrderingValuesBuilder .add (requestedOrderingPart .getValue ());
342362 requestedOrderingValuesMapBuilder .put (requestedOrderingPart .getValue (), requestedOrderingPart );
343363 }
344364 final var requestedOrderingValuesMap = requestedOrderingValuesMapBuilder .build ();
@@ -371,6 +391,11 @@ public boolean satisfiesGroupingValues(@Nonnull final Set<Value> requestedGroupi
371391 return false ;
372392 }
373393
394+ final var eligibleElements = orderingSet .eligibleSet ().eligibleElements ();
395+ if (requestedGroupingValues .stream ().noneMatch (eligibleElements ::contains )) {
396+ return false ;
397+ }
398+
374399 if (requestedGroupingValues
375400 .stream ()
376401 .anyMatch (requestedGroupingValue -> {
@@ -383,7 +408,7 @@ public boolean satisfiesGroupingValues(@Nonnull final Set<Value> requestedGroupi
383408 return false ;
384409 }
385410
386- final var permutations = TopologicalSort .topologicalOrderPermutations (orderingSet );
411+ final var permutations = TopologicalSort .topologicalOrderPermutations (requestedGroupingValues , orderingSet . getTransitiveClosure () );
387412 for (final var permutation : permutations ) {
388413 final var containsAll =
389414 requestedGroupingValues .containsAll (permutation .subList (0 , requestedGroupingValues .size ()));
0 commit comments