Skip to content

Commit 798a3c6

Browse files
committed
ip
1 parent 90eb911 commit 798a3c6

File tree

2 files changed

+35
-5
lines changed
  • fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades
  • yaml-tests/src/test/resources

2 files changed

+35
-5
lines changed

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/Ordering.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import java.util.function.BiPredicate;
6060
import java.util.function.Function;
6161
import 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()));

yaml-tests/src/test/resources/orderby.yamsql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ schema_template:
2727
create table t2(p bigint, q st_1, primary key(p))
2828
create function t2_func() as select q as "nesting", q.a as "ordered" from t2
2929
create function t2_func_2() as select q as "nesting", q.a as "ordered", q.b as "ordered" from t2
30+
create function t2_func_3() as select q as "nesting", q.a as "ordered1", q.b as "ordered2" from t2
3031
create index i4 as select q.b, q.a from t2 order by q.a
3132
create index i5 as select q.b, q.a from t2 order by q.b, q.a
3233
create table t3(a bigint, b bigint, c bigint, d bigint, p bigint, primary key(p))
@@ -296,4 +297,8 @@ test_block:
296297
- query: select (q as "nested", q.a as "ordered") as "st" from t2 order by "st"."ordered"
297298
- supported_version: !current_version
298299
- error: "42703"
300+
-
301+
# Ordering by a column in table function that has been projected in multiple ways
302+
- query: select (*) from t2_func_3() order by "ordered2", "ordered1"
303+
- result: [ {{{2, 1}, 2, 1}}, {{{4, 1}, 4, 1}}, {{{6, 1}, 6, 1}}, {{{8, 1}, 8, 1}}, {{{1, 2}, 1, 2}}, {{{3, 2}, 3, 2}}, {{{5, 2}, 5, 2}}, {{{7, 2}, 7, 2}} ]
299304
...

0 commit comments

Comments
 (0)