@Override public final long getNextJoinPosition(long currentJoinPosition, int probePosition, Page allProbeChannelsPage) { if (positionLinks == null) { return -1; } return positionLinks.next(toIntExact(currentJoinPosition), probePosition, allProbeChannelsPage); }
@Override public int next(int position, int probePosition, Page allProbeChannelsPage) { int nextPosition = positionLinks.next(position, probePosition, allProbeChannelsPage); if (nextPosition < 0) { return -1; } if (!applyAllSearchFunctions(nextPosition, probePosition, allProbeChannelsPage)) { // break a position links chain if next position should be filtered out return -1; } return nextPosition; }
@Test public void testReverseSortedPositionLinks() { JoinFilterFunction filterFunction = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(TEST_PAGE.getBlock(0), leftAddress) < 4; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunction)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 0); assertEquals(positionLinks.next(0, 0, TEST_PAGE), 1); assertEquals(positionLinks.next(1, 0, TEST_PAGE), 2); assertEquals(positionLinks.next(2, 0, TEST_PAGE), 3); assertEquals(positionLinks.next(3, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), -1); }
@Test public void testReverseSortedPositionLinksAllMatch() { JoinFilterFunction filterFunction = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) < 13; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunction)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 0); assertEquals(positionLinks.next(0, 0, TEST_PAGE), 1); assertEquals(positionLinks.next(1, 0, TEST_PAGE), 2); assertEquals(positionLinks.next(2, 0, TEST_PAGE), 3); assertEquals(positionLinks.next(3, 0, TEST_PAGE), 4); assertEquals(positionLinks.next(4, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), 12); assertEquals(positionLinks.next(12, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), -1); }
@Test public void testSortedPositionLinksAllMatch() { JoinFilterFunction filterFunction = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) >= 0; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunction)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 0); assertEquals(positionLinks.next(0, 0, TEST_PAGE), 1); assertEquals(positionLinks.next(1, 0, TEST_PAGE), 2); assertEquals(positionLinks.next(2, 0, TEST_PAGE), 3); assertEquals(positionLinks.next(3, 0, TEST_PAGE), 4); assertEquals(positionLinks.next(4, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), 12); assertEquals(positionLinks.next(12, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), 13); assertEquals(positionLinks.next(13, 0, TEST_PAGE), -1); }
@Test public void testSortedPositionLinksForRangePredicatesSuffixMatch() { JoinFilterFunction filterFunctionOne = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) > 4; JoinFilterFunction filterFunctionTwo = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) < 100; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunctionOne, filterFunctionTwo)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(4, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), 12); assertEquals(positionLinks.next(12, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), 13); assertEquals(positionLinks.next(13, 0, TEST_PAGE), -1); }
@Test public void testSortedPositionLinksForRangePredicatesPrefixMatch() { JoinFilterFunction filterFunctionOne = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) >= 0; JoinFilterFunction filterFunctionTwo = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(rightPage.getBlock(0), leftAddress) <= 11; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunctionOne, filterFunctionTwo)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 0); assertEquals(positionLinks.next(0, 0, TEST_PAGE), 1); assertEquals(positionLinks.next(1, 0, TEST_PAGE), 2); assertEquals(positionLinks.next(2, 0, TEST_PAGE), 3); assertEquals(positionLinks.next(3, 0, TEST_PAGE), 4); assertEquals(positionLinks.next(4, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), -1); }
@Test public void testSortedPositionLinks() { JoinFilterFunction filterFunction = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(TEST_PAGE.getBlock(0), leftAddress) > 4; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunction)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), 12); assertEquals(positionLinks.next(12, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), 13); assertEquals(positionLinks.next(13, 0, TEST_PAGE), -1); }
@Test public void testArrayPositionLinks() { PositionLinks.FactoryBuilder factoryBuilder = ArrayPositionLinks.builder(1000); assertEquals(factoryBuilder.link(1, 0), 1); assertEquals(factoryBuilder.link(2, 1), 2); assertEquals(factoryBuilder.link(3, 2), 3); assertEquals(factoryBuilder.link(11, 10), 11); assertEquals(factoryBuilder.link(12, 11), 12); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of()); assertEquals(positionLinks.start(3, 0, TEST_PAGE), 3); assertEquals(positionLinks.next(3, 0, TEST_PAGE), 2); assertEquals(positionLinks.next(2, 0, TEST_PAGE), 1); assertEquals(positionLinks.next(1, 0, TEST_PAGE), 0); assertEquals(positionLinks.start(4, 0, TEST_PAGE), 4); assertEquals(positionLinks.next(4, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(12, 0, TEST_PAGE), 12); assertEquals(positionLinks.next(12, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), 10); }
@Test public void testSortedPositionLinksForRangePredicates() { JoinFilterFunction filterFunctionOne = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(TEST_PAGE.getBlock(0), leftAddress) > 4; JoinFilterFunction filterFunctionTwo = (leftAddress, rightPosition, rightPage) -> BIGINT.getLong(TEST_PAGE.getBlock(0), leftAddress) <= 11; PositionLinks.FactoryBuilder factoryBuilder = buildSortedPositionLinks(); PositionLinks positionLinks = factoryBuilder.build().create(ImmutableList.of(filterFunctionOne, filterFunctionTwo)); assertEquals(positionLinks.start(0, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(4, 0, TEST_PAGE), 5); assertEquals(positionLinks.next(5, 0, TEST_PAGE), 6); assertEquals(positionLinks.next(6, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(7, 0, TEST_PAGE), 7); assertEquals(positionLinks.next(7, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(8, 0, TEST_PAGE), 8); assertEquals(positionLinks.next(8, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(9, 0, TEST_PAGE), 9); assertEquals(positionLinks.next(9, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(10, 0, TEST_PAGE), 10); assertEquals(positionLinks.next(10, 0, TEST_PAGE), 11); assertEquals(positionLinks.next(11, 0, TEST_PAGE), -1); assertEquals(positionLinks.start(13, 0, TEST_PAGE), -1); }