package com.codepoetics.octarine.joins; import com.codepoetics.octarine.functional.tuples.T2; import org.junit.Test; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.MatcherAssert.assertThat; public class IndexTest { private final Function<String, Character> indexOnFirstChar = s -> s.charAt(0); @Test public void oneToManyJoin() { Index<Character, String> left = Index.on(Stream.of("banana", "apple", "carrot"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); assertThat(left.oneToMany(right).collect(Collectors.toList()), hasItems( T2.of("apple", setOf("apex", "aardvaark")), T2.of("banana", setOf("butane", "banter")), T2.of("carrot", setOf("capybara", "catamite")))); } @Test public void strictOneToManyJoin() { Index<Character, String> left = Index.on(Stream.of("banana", "apple", "carrot"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); assertThat(left.strictOneToMany(right).collect(Collectors.toList()), hasItems( T2.of("apple", setOf("apex", "aardvaark")), T2.of("banana", setOf("butane", "banter")), T2.of("carrot", setOf("capybara", "catamite")))); } @Test(expected = IllegalArgumentException.class) public void strictOneToManyJoinWithMissingLeft() { Index<Character, String> left = Index.on(Stream.of("banana", "carrot"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); left.strictOneToMany(right).collect(Collectors.toList()); } @Test(expected = IllegalArgumentException.class) public void strictOneToManyJoinWithDuplicateLeft() { Index<Character, String> left = Index.on(Stream.of("banana", "apple", "antelope", "carrot"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); left.strictOneToMany(right).collect(Collectors.toList()); } @Test public void manyToOneJoin() { Index<Character, String> left = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("banana", "apple", "carrot"), indexOnFirstChar); assertThat(left.manyToOne(right).collect(Collectors.toList()), hasItems( T2.of("aardvaark", "apple"), T2.of("apex", "apple"), T2.of("butane", "banana"), T2.of("banter", "banana"), T2.of("capybara", "carrot"), T2.of("catamite", "carrot"))); } @Test public void strictManyToOneJoin() { Index<Character, String> left = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("banana", "apple", "carrot"), indexOnFirstChar); assertThat(left.strictManyToOne(right).collect(Collectors.toList()), hasItems( T2.of("aardvaark", "apple"), T2.of("apex", "apple"), T2.of("butane", "banana"), T2.of("banter", "banana"), T2.of("capybara", "carrot"), T2.of("catamite", "carrot"))); } @Test(expected = IllegalArgumentException.class) public void strictManyToOneJoinWithMissingRight() { Index<Character, String> left = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("banana", "carrot"), indexOnFirstChar); left.strictManyToOne(right).collect(Collectors.toList()); } @Test(expected = IllegalArgumentException.class) public void strictManyToOneJoinWithDuplicateRight() { Index<Character, String> left = Index.on(Stream.of("capybara", "aardvaark", "catamite", "banter", "apex", "butane"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("banana", "aphoristic", "anomie", "carrot"), indexOnFirstChar); left.strictManyToOne(right).collect(Collectors.toList()); } @Test public void oneToOneJoin() { Index<Character, String> left = Index.on(Stream.of("carrot", "apple", "banana"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("artifice", "catamorphism", "banausic"), indexOnFirstChar); assertThat(left.strictOneToOne(right).collect(Collectors.toList()), hasItems( T2.of("apple", "artifice"), T2.of("banana", "banausic"), T2.of("carrot", "catamorphism"))); } @Test(expected = IllegalArgumentException.class) public void oneToOneJoinWithMissingLeft() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("artifice", "catamorphism", "banausic"), indexOnFirstChar); left.strictOneToOne(right).collect(Collectors.toList()); } @Test(expected = IllegalArgumentException.class) public void oneToOneJoinWithDuplicateLeft() { Index<Character, String> left = Index.on(Stream.of("carrot", "apple", "banana", "aardvaark"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("artifice", "catamorphism", "banausic"), indexOnFirstChar); left.strictOneToOne(right).collect(Collectors.toList()); } @Test(expected = IllegalArgumentException.class) public void oneToOneJoinWithMissingRight() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana", "apple"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("catamorphism", "banausic"), indexOnFirstChar); left.strictOneToOne(right).collect(Collectors.toList()); } @Test(expected = IllegalArgumentException.class) public void oneToOneJoinWithDuplicateRight() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana", "apple"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("catamorphism", "bilious", "artifice", "banausic"), indexOnFirstChar); left.strictOneToOne(right).collect(Collectors.toList()); } @Test public void leftOuterJoin() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana", "apple"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("catamorphism", "banausic", "ballistic", "diagonally"), indexOnFirstChar); assertThat(left.leftOuterJoin(right).collect(Collectors.toList()), hasItems( T2.of("apple", Optional.empty()), T2.of("banana", Optional.of("banausic")), T2.of("banana", Optional.of("ballistic")), T2.of("carrot", Optional.of("catamorphism")))); } @Test public void rightOuterJoin() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana", "apple"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("catamorphism", "banausic", "ballistic", "dirigible"), indexOnFirstChar); assertThat(left.rightOuterJoin(right).collect(Collectors.toList()), hasItems( T2.of(Optional.of("banana"), "banausic"), T2.of(Optional.of("banana"), "ballistic"), T2.of(Optional.of("carrot"), "catamorphism"), T2.of(Optional.empty(), "dirigible"))); } @Test public void outerJoin() { Index<Character, String> left = Index.on(Stream.of("carrot", "banana", "apple"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("catamorphism", "banausic", "ballistic", "dirigible"), indexOnFirstChar); assertThat(left.outerJoin(right).collect(Collectors.toList()), hasItems( T2.of(Optional.of("apple"), Optional.empty()), T2.of(Optional.of("banana"), Optional.of("banausic")), T2.of(Optional.of("banana"), Optional.of("ballistic")), T2.of(Optional.of("carrot"), Optional.of("catamorphism")), T2.of(Optional.empty(), Optional.of("dirigible")))); } @Test public void innerJoin() { Index<Character, String> left = Index.on(Stream.of("apple", "banana", "bazooka", "carrot", "catalepsy"), indexOnFirstChar); Index<Character, String> right = Index.on(Stream.of("atrophy", "anomie", "ballistic", "banausic", "copious"), indexOnFirstChar); assertThat(left.innerJoin(right).collect(Collectors.toList()), hasItems( T2.of("apple", "atrophy"), T2.of("apple", "anomie"), T2.of("banana", "ballistic"), T2.of("banana", "banausic"), T2.of("bazooka", "ballistic"), T2.of("bazooka", "banausic"), T2.of("carrot", "copious"), T2.of("catalepsy", "copious"))); } private <T> Set<T> setOf(T...items) { return Stream.of(items).collect(Collectors.toSet()); } }