|
20 | 20 | import com.facebook.presto.execution.Lifespan; |
21 | 21 | import com.facebook.presto.operator.InterpretedHashGenerator; |
22 | 22 | import com.facebook.presto.operator.PageAssertions; |
| 23 | +import com.facebook.presto.operator.PartitionFunction; |
23 | 24 | import com.facebook.presto.operator.PipelineExecutionStrategy; |
24 | 25 | import com.facebook.presto.operator.exchange.LocalExchange.LocalExchangeFactory; |
25 | 26 | import com.facebook.presto.operator.exchange.LocalExchange.LocalExchangeSinkFactory; |
26 | 27 | import com.facebook.presto.operator.exchange.LocalExchange.LocalExchangeSinkFactoryId; |
| 28 | +import com.facebook.presto.spi.BucketFunction; |
| 29 | +import com.facebook.presto.spi.ConnectorId; |
| 30 | +import com.facebook.presto.spi.ConnectorSession; |
| 31 | +import com.facebook.presto.spi.ConnectorSplit; |
| 32 | +import com.facebook.presto.spi.Node; |
| 33 | +import com.facebook.presto.spi.connector.ConnectorBucketNodeMap; |
| 34 | +import com.facebook.presto.spi.connector.ConnectorNodePartitioningProvider; |
| 35 | +import com.facebook.presto.spi.connector.ConnectorPartitioningHandle; |
| 36 | +import com.facebook.presto.spi.connector.ConnectorTransactionHandle; |
| 37 | +import com.facebook.presto.sql.planner.PartitioningHandle; |
27 | 38 | import com.facebook.presto.sql.planner.PartitioningProviderManager; |
28 | 39 | import com.google.common.collect.ImmutableList; |
29 | 40 | import com.google.common.util.concurrent.ListenableFuture; |
|
36 | 47 | import java.util.List; |
37 | 48 | import java.util.Optional; |
38 | 49 | import java.util.function.Consumer; |
| 50 | +import java.util.function.ToIntFunction; |
| 51 | +import java.util.stream.Stream; |
39 | 52 |
|
40 | 53 | import static com.facebook.airlift.testing.Assertions.assertContains; |
41 | 54 | import static com.facebook.presto.common.type.BigintType.BIGINT; |
42 | 55 | import static com.facebook.presto.operator.PipelineExecutionStrategy.GROUPED_EXECUTION; |
43 | 56 | import static com.facebook.presto.operator.PipelineExecutionStrategy.UNGROUPED_EXECUTION; |
| 57 | +import static com.facebook.presto.operator.exchange.LocalExchange.createPartitionFunction; |
| 58 | +import static com.facebook.presto.spi.connector.ConnectorBucketNodeMap.createBucketNodeMap; |
| 59 | +import static com.facebook.presto.spi.schedule.NodeSelectionStrategy.SOFT_AFFINITY; |
44 | 60 | import static com.facebook.presto.sql.planner.SystemPartitioningHandle.FIXED_ARBITRARY_DISTRIBUTION; |
45 | 61 | import static com.facebook.presto.sql.planner.SystemPartitioningHandle.FIXED_BROADCAST_DISTRIBUTION; |
46 | 62 | import static com.facebook.presto.sql.planner.SystemPartitioningHandle.FIXED_HASH_DISTRIBUTION; |
47 | 63 | import static com.facebook.presto.sql.planner.SystemPartitioningHandle.FIXED_PASSTHROUGH_DISTRIBUTION; |
48 | 64 | import static com.facebook.presto.sql.planner.SystemPartitioningHandle.SINGLE_DISTRIBUTION; |
49 | 65 | import static com.facebook.presto.testing.TestingSession.testSessionBuilder; |
| 66 | +import static com.google.common.collect.ImmutableList.toImmutableList; |
50 | 67 | import static io.airlift.units.DataSize.Unit.BYTE; |
51 | 68 | import static org.testng.Assert.assertEquals; |
52 | 69 | import static org.testng.Assert.assertFalse; |
@@ -434,6 +451,71 @@ public void testPartition(PipelineExecutionStrategy executionStrategy) |
434 | 451 | }); |
435 | 452 | } |
436 | 453 |
|
| 454 | + @Test |
| 455 | + public void testCreatePartitionFunction() |
| 456 | + { |
| 457 | + int partitionCount = 10; |
| 458 | + PartitioningProviderManager partitioningProviderManager = new PartitioningProviderManager(); |
| 459 | + partitioningProviderManager.addPartitioningProvider( |
| 460 | + new ConnectorId("prism"), |
| 461 | + new ConnectorNodePartitioningProvider() { |
| 462 | + @Override |
| 463 | + public ConnectorBucketNodeMap getBucketNodeMap(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorPartitioningHandle partitioningHandle, List<Node> sortedNodes) |
| 464 | + { |
| 465 | + return createBucketNodeMap(Stream.generate(() -> sortedNodes).flatMap(List::stream).limit(10).collect(toImmutableList()), SOFT_AFFINITY); |
| 466 | + } |
| 467 | + |
| 468 | + @Override |
| 469 | + public ToIntFunction<ConnectorSplit> getSplitBucketFunction(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorPartitioningHandle partitioningHandle) |
| 470 | + { |
| 471 | + return null; |
| 472 | + } |
| 473 | + |
| 474 | + @Override |
| 475 | + public BucketFunction getBucketFunction(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorPartitioningHandle partitioningHandle, List<Type> partitionChannelTypes, int bucketCount) |
| 476 | + { |
| 477 | + return (Page page, int position) -> partitionCount; |
| 478 | + } |
| 479 | + |
| 480 | + @Override |
| 481 | + public int getBucketCount(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorPartitioningHandle partitioningHandle) |
| 482 | + { |
| 483 | + return 10; |
| 484 | + } |
| 485 | + }); |
| 486 | + PartitioningHandle partitioningHandle = new PartitioningHandle( |
| 487 | + Optional.of(new ConnectorId("prism")), |
| 488 | + Optional.of(new ConnectorTransactionHandle() { |
| 489 | + @Override |
| 490 | + public int hashCode() |
| 491 | + { |
| 492 | + return super.hashCode(); |
| 493 | + } |
| 494 | + |
| 495 | + @Override |
| 496 | + public boolean equals(Object obj) |
| 497 | + { |
| 498 | + return super.equals(obj); |
| 499 | + } |
| 500 | + }), |
| 501 | + new ConnectorPartitioningHandle() { |
| 502 | + @Override |
| 503 | + public boolean isSingleNode() |
| 504 | + { |
| 505 | + return false; |
| 506 | + } |
| 507 | + |
| 508 | + @Override |
| 509 | + public boolean isCoordinatorOnly() |
| 510 | + { |
| 511 | + return false; |
| 512 | + } |
| 513 | + }); |
| 514 | + PartitionFunction partitionFunction = createPartitionFunction(partitioningProviderManager, session, partitioningHandle, 600, ImmutableList.of(), false); |
| 515 | + |
| 516 | + assertEquals(partitionFunction.getPartitionCount(), partitionCount); |
| 517 | + } |
| 518 | + |
437 | 519 | @Test(dataProvider = "executionStrategy") |
438 | 520 | public void writeUnblockWhenAllReadersFinish(PipelineExecutionStrategy executionStrategy) |
439 | 521 | { |
|
0 commit comments