package com.codepoetics.octarine.joins; import com.codepoetics.octarine.records.Key; import com.codepoetics.octarine.records.ListKey; import com.codepoetics.octarine.records.Record; import org.hamcrest.CoreMatchers; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import static com.codepoetics.octarine.Octarine.*; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.MatcherAssert.assertThat; public class RecordJoinerTest { public static final Key<String> authorName = $("authorName"); public static final Key<String> id = $("id"); public static final Key<String> authorId = $("authorId"); public static final Key<String> bookName = $("bookName"); public static final Key<String> publisherName = $("publisherName"); public static final Key<String> publisherId = $("publisherId"); public static final Record billsAndMoon = $$( publisherName.of("Bills And Moon"), id.of("BM") ); public static final Record servo = $$( publisherName.of("Servo"), id.of("SV") ); public static final List<Record> publishers = Arrays.asList(billsAndMoon, servo); public static final Record alanGoodyear = $$( authorName.of("Alan Goodyear"), id.of("AG") ); public static final Record barbaraMoat = $$( authorName.of("Barbara Moat"), id.of("BM") ); public static final Record leavisLacanian = $$( authorName.of("Leavis Lacanian"), id.of("LL") ); public static final List<Record> authors = Arrays.asList(alanGoodyear, barbaraMoat, leavisLacanian); public static final Record cromulenceOfTruths = $$( authorId.of("AG"), publisherId.of("SV"), bookName.of("The Cromulence Of Truths") ); public static final Record oligarchsSecret = $$( authorId.of("BM"), publisherId.of("BM"), bookName.of("Oligarch's Secret") ); public static final Record butIsThisNot = $$( authorId.of("LL"), publisherId.of("SV"), bookName.of("But Is This Not: Dialectics for the Distracted") ); public static final Record amorousEncounters = $$( authorId.of("AG"), publisherId.of("BM"), bookName.of("Amorous Encounters") ); public static final List<Record> books = Arrays.asList( cromulenceOfTruths, oligarchsSecret, butIsThisNot, amorousEncounters ); final ListKey<Record> authored = $L("authored"); @Test public void three_way_join() { List<Record> joined = RecordJoins.join( RecordJoins.join(books) .on(authorId) .to(id) .manyToOne(authors)) .on(publisherId) .to(id) .manyToOne(publishers) .map(r -> r.select(publisherName, authorName, bookName)) .filter(authorName.is("Alan Goodyear")) .collect(Collectors.toList()); assertThat(joined, CoreMatchers.hasItems( $$(bookName.of("Amorous Encounters"), authorName.of("Alan Goodyear"), publisherName.of("Bills And Moon")), $$(bookName.of("The Cromulence Of Truths"), authorName.of("Alan Goodyear"), publisherName.of("Servo")) ) ); } @Test public void one_to_many_join() { Record joined = RecordJoins.join(authors).on(id) .to(authorId).oneToMany(books, authored) .filter(authorName.is("Alan Goodyear")) .findFirst().get(); assertThat(authored.extract(joined), hasItems( cromulenceOfTruths, amorousEncounters) ); } }