@Test public void joinsLeftAndRightSides() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), entry("key1", RIGHT, Either.right("w2")), entry("key2", LEFT, Either.left("v1")), entry("key2", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList(entry("key1", "v1", "w1"), entry("key1", "v1", "w2"), entry("key2", "v1", "w1")), results); }
@Test public void emitsARightLonerWhenARightSideWithADifferentKeyComes() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), // ~ a right side with a different key entry("key3", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals(asList(entry("key1", "v1", "w1"), entry("key3", Optional.empty(), "w1")), results); }
@Test public void emitCartesianProduct() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", LEFT, Either.left("v2")), entry("key1", RIGHT, Either.right("w1")), entry("key1", RIGHT, Either.right("w2")), entry("key1", RIGHT, Either.right("w3"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key1", "v2", "w1"), entry("key1", "v1", "w2"), entry("key1", "v2", "w2"), entry("key1", "v1", "w3"), entry("key1", "v2", "w3")), results); }
@Test public void lonerLeftSideInTheEnd() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), entry("key1", RIGHT, Either.right("w2")), entry("key2", LEFT, Either.left("v1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key1", "v1", "w2"), entry("key2", "v1", Optional.empty())), results); }
@Test public void lonerRightSideInTheEnd() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), entry("key1", RIGHT, Either.right("w2")), entry("key2", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key1", "v1", "w2"), entry("key2", Optional.empty(), "w1")), results); }
@Test public void emitsALeftLonerAndARightLonerWhenARightSideWithADifferentKeyComes() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), // ~ a left side with no right sides entry("key2", LEFT, Either.left("v1")), // ~ a right side with a different key entry("key3", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key3", Optional.empty(), "w1"), entry("key2", "v1", Optional.empty())), results); }
@Test public void emitsALeftLonerWhenAConsecutiveSecondLeftSideComes() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), // ~ a left side with no right sides entry("key2", LEFT, Either.left("v1")), // ~ a consecutive second left side entry("key3", LEFT, Either.left("v1")), entry("key3", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key2", "v1", Optional.empty()), entry("key3", "v1", "w1")), results); }
@Test public void emitsARightLonerWhenAConsecutiveSecondLeftSideComes() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", RIGHT, Either.right("w1")), // ~ a left side with no right sides entry("key2", RIGHT, Either.right("w1")), // ~ a consecutive second left side entry("key3", LEFT, Either.left("v1")), entry("key3", RIGHT, Either.right("w1"))) .iterator(); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(new BatchJoinIterator<>(inner)); assertEquals( asList( entry("key1", "v1", "w1"), entry("key2", Optional.empty(), "w1"), entry("key3", "v1", "w1")), results); }
@Test public void testStatistics() { final Iterator<Tuple2<BatchJoinKey<String>, Either<String, String>>> inner = asList( entry("key1", LEFT, Either.left("v1")), entry("key1", LEFT, Either.left("v2")), entry("key1", RIGHT, Either.right("w1")), entry("key1", RIGHT, Either.right("w2")), entry("key1", RIGHT, Either.right("w3"))) .iterator(); BatchJoinIterator<String, String, String> iteratorUnderTest = new BatchJoinIterator<>(inner); final List<Tuple2<String, Tuple2<Optional<String>, Optional<String>>>> results = Lists.newArrayList(iteratorUnderTest); assertEquals( asList( entry("key1", "v1", "w1"), entry("key1", "v2", "w1"), entry("key1", "v1", "w2"), entry("key1", "v2", "w2"), entry("key1", "v1", "w3"), entry("key1", "v2", "w3")), results); PriorityQueue<StatsItem<String>> topKeys = iteratorUnderTest.topKeys; Assert.assertEquals(1, topKeys.size()); StatsItem<String> item = topKeys.peek(); Assert.assertNotNull(item); Assert.assertEquals(2L, item.leftSideElements); Assert.assertEquals(3L, item.rightSideElements); }
.mapToObj(i -> entry("key" + i, LEFT, Either.left("vl"))) .collect(Collectors.toList()); inputs.add(entry("key24", RIGHT, Either.right("vr1"))); inputs.add(entry("key24", RIGHT, Either.right("vr2"))); inputs.add(entry("key25", LEFT, Either.left("vl"))); inputs.add(entry("key25", RIGHT, Either.right("vr1"))); inputs.add(entry("key25", RIGHT, Either.right("vr2"))); inputs.add(entry("key25", RIGHT, Either.right("vr3")));