@Test public void testMultiFieldKey() { List<Page> input = rowPagesBuilder(VARCHAR, BIGINT) .row("a", 1L) .row("b", 2L) .pageBreak() .row("f", 3L) .row("a", 4L) .pageBreak() .row("d", 5L) .row("d", 7L) .row("e", 6L) .build(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(VARCHAR, BIGINT), 3, ImmutableList.of(0, 1), ImmutableList.of(DESC_NULLS_LAST, DESC_NULLS_LAST)); MaterializedResult expected = MaterializedResult.resultBuilder(driverContext.getSession(), VARCHAR, BIGINT) .row("f", 3L) .row("e", 6L) .row("d", 7L) .build(); assertOperatorEquals(operatorFactory, driverContext, input, expected); }
@Test public void testExceedMemoryLimit() throws Exception { List<Page> input = rowPagesBuilder(BIGINT) .row(1L) .build(); DriverContext smallDiverContext = createTaskContext(executor, scheduledExecutor, TEST_SESSION, new DataSize(1, BYTE)) .addPipelineContext(0, true, true, false) .addDriverContext(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(BIGINT), 100, ImmutableList.of(0), ImmutableList.of(ASC_NULLS_LAST)); try (Operator operator = operatorFactory.createOperator(smallDiverContext)) { operator.addInput(input.get(0)); fail("must fail because of exceeding local memory limit"); } catch (ExceededMemoryLimitException ignore) { } } }
.build(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), false); Operator operator = operatorFactory.createOperator(driverContext);
.build(); TopNOperatorFactory factory = new TopNOperatorFactory( 0, new PlanNodeId("test"), false); Operator operator = factory.createOperator(driverContext);
.build(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), false); Operator operator = operatorFactory.createOperator(driverContext);
.addDriverContext(); TopNOperatorFactory factory = new TopNOperatorFactory( 0, new PlanNodeId("test"), true); Operator operator = factory.createOperator(smallDiverContext);
@Test public void testLimitZero() throws Exception { List<Page> input = rowPagesBuilder(BIGINT).row(1).build(); TopNOperatorFactory factory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(BIGINT), 0, ImmutableList.of(0), ImmutableList.of(DESC_NULLS_LAST), false); Operator operator = factory.createOperator(driverContext); MaterializedResult expected = resultBuilder(driverContext.getSession(), BIGINT).build(); // assertOperatorEquals assumes operators do not start in finished state assertEquals(operator.isFinished(), true); assertEquals(operator.needsInput(), false); assertEquals(operator.getOutput(), null); List<Page> pages = OperatorAssertion.toPages(operator, input.iterator()); MaterializedResult actual = OperatorAssertion.toMaterializedResult(operator.getOperatorContext().getSession(), operator.getTypes(), pages); assertEquals(actual, expected); }
@Override public PhysicalOperation visitTopN(TopNNode node, LocalExecutionPlanContext context) { PhysicalOperation source = node.getSource().accept(this, context); List<Symbol> orderBySymbols = node.getOrderBy(); List<Integer> sortChannels = new ArrayList<>(); List<SortOrder> sortOrders = new ArrayList<>(); for (Symbol symbol : orderBySymbols) { sortChannels.add(source.getLayout().get(symbol)); sortOrders.add(node.getOrderings().get(symbol)); } OperatorFactory operator = new TopNOperatorFactory( context.getNextOperatorId(), node.getId(), source.getTypes(), (int) node.getCount(), sortChannels, sortOrders, node.isPartial()); return new PhysicalOperation(operator, source.getLayout(), source); }
@Override protected List<? extends OperatorFactory> createOperatorFactories() { List<Type> tableScanTypes = getColumnTypes("orders", "totalprice"); OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "orders", "totalprice"); TopNOperatorFactory topNOperator = new TopNOperatorFactory( 1, new PlanNodeId("test"), tableScanTypes, 100, ImmutableList.of(0), ImmutableList.of(ASC_NULLS_LAST)); return ImmutableList.of(tableScanOperator, topNOperator); }
@Override protected List<? extends OperatorFactory> createOperatorFactories() { OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "orders", "totalprice"); TopNOperatorFactory topNOperator = new TopNOperatorFactory( 1, new PlanNodeId("test"), tableScanOperator.getTypes(), 100, ImmutableList.of(0), ImmutableList.of(ASC_NULLS_LAST), false); return ImmutableList.of(tableScanOperator, topNOperator); }
@Override public OperatorFactory duplicate() { return new TopNOperatorFactory(operatorId, planNodeId, sourceTypes, n, sortChannels, sortOrders, partial); } }
@Test public void testReverseOrder() { List<Page> input = rowPagesBuilder(BIGINT, DOUBLE) .row(1L, 0.1) .row(2L, 0.2) .pageBreak() .row(-1L, -0.1) .row(4L, 0.4) .pageBreak() .row(5L, 0.5) .row(4L, 0.41) .row(6L, 0.6) .pageBreak() .build(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(BIGINT, DOUBLE), 2, ImmutableList.of(0), ImmutableList.of(ASC_NULLS_LAST)); MaterializedResult expected = resultBuilder(driverContext.getSession(), BIGINT, DOUBLE) .row(-1L, -0.1) .row(1L, 0.1) .build(); assertOperatorEquals(operatorFactory, driverContext, input, expected); }
@Test public void testSingleFieldKey() { List<Page> input = rowPagesBuilder(BIGINT, DOUBLE) .row(1L, 0.1) .row(2L, 0.2) .pageBreak() .row(-1L, -0.1) .row(4L, 0.4) .pageBreak() .row(5L, 0.5) .row(4L, 0.41) .row(6L, 0.6) .pageBreak() .build(); TopNOperatorFactory operatorFactory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(BIGINT, DOUBLE), 2, ImmutableList.of(0), ImmutableList.of(DESC_NULLS_LAST)); MaterializedResult expected = resultBuilder(driverContext.getSession(), BIGINT, DOUBLE) .row(6L, 0.6) .row(5L, 0.5) .build(); assertOperatorEquals(operatorFactory, driverContext, input, expected); }
@Override public PhysicalOperation visitTopN(TopNNode node, LocalExecutionPlanContext context) { PhysicalOperation source = node.getSource().accept(this, context); List<Symbol> orderBySymbols = node.getOrderingScheme().getOrderBy(); List<Integer> sortChannels = new ArrayList<>(); List<SortOrder> sortOrders = new ArrayList<>(); for (Symbol symbol : orderBySymbols) { sortChannels.add(source.getLayout().get(symbol)); sortOrders.add(node.getOrderingScheme().getOrdering(symbol)); } OperatorFactory operator = new TopNOperatorFactory( context.getNextOperatorId(), node.getId(), source.getTypes(), (int) node.getCount(), sortChannels, sortOrders); return new PhysicalOperation(operator, source.getLayout(), context, source); }
@Test public void testLimitZero() throws Exception { List<Page> input = rowPagesBuilder(BIGINT).row(1L).build(); TopNOperatorFactory factory = new TopNOperatorFactory( 0, new PlanNodeId("test"), ImmutableList.of(BIGINT), 0, ImmutableList.of(0), ImmutableList.of(DESC_NULLS_LAST)); try (Operator operator = factory.createOperator(driverContext)) { assertEquals(operator.isFinished(), true); assertEquals(operator.needsInput(), false); assertEquals(operator.getOutput(), null); } }
@Override protected List<? extends OperatorFactory> createOperatorFactories() { List<Type> tableScanTypes = getColumnTypes("orders", "totalprice"); OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "orders", "totalprice"); TopNOperatorFactory topNOperator = new TopNOperatorFactory( 1, new PlanNodeId("test"), tableScanTypes, 100, ImmutableList.of(0), ImmutableList.of(ASC_NULLS_LAST)); return ImmutableList.of(tableScanOperator, topNOperator); }
@Override public OperatorFactory duplicate() { return new TopNOperatorFactory(operatorId, planNodeId, sourceTypes, n, sortChannels, sortOrders); } }