package org.quaere.objects; import org.junit.Assert; import org.junit.Test; import static org.quaere.DSL.*; import org.quaere.Variant; import org.quaere.model.Product; import java.util.Arrays; import java.util.List; public class JoinOperatorsScenarioTest { @Test public void canEfficentlyJoinElementsOfTwoSequencesBasedOnEqualityBetweenKeyExpresionsOverTheTwo_linq102() { // NOTE: This is a test for inner joins. String[] categories = { "Beverages", "Condiments", "Vegetables", "Dairy Products", "Seafood" }; Product[] products = Product.getAllProducts(); Iterable<Variant> innerJoinQuery = from("category").in(categories). join("prod").in(products).on("category").equals("prod.getCategory()"). select( create( property("category"), property("prod.getProductName()") ) ); List<String> expectedCombinations = Arrays.asList("Seafood: Ikura", "Seafood: Konbu", "Seafood: Carnarvon Tigers", "Seafood: Nord-Ost Matjeshering", "Seafood: Inlagd Sill", "Seafood: Gravad lax", "Seafood: Boston Crab Meat", "Seafood: Jack's New England Clam Chowder", "Seafood: Rogede sild", "Seafood: Spegesild", "Seafood: Escargots de Bourgogne", "Seafood: R�d Kaviar", "Dairy Products: Queso Cabrales", "Dairy Products: Queso Manchego La Pastora", "Dairy Products: Gorgonzola Telino", "Dairy Products: Mascarpone Fabioli", "Dairy Products: Geitost", "Dairy Products: Raclette Courdavault", "Dairy Products: Camembert Pierrot", "Dairy Products: Gudbrandsdalsost", "Dairy Products: Flotemysost", "Dairy Products: Mozzarella di Giovanni", "Condiments: Aniseed Syrup", "Condiments: Chef Anton's Cajun Seasoning", "Condiments: Chef Anton's Gumbo Mix", "Condiments: Grandma's Boysenberry Spread", "Condiments: Northwoods Cranberry Sauce", "Condiments: Genen Shouyu", "Condiments: Gula Malacca", "Condiments: Sirop d'�rable", "Condiments: Vegie-spread", "Condiments: Louisiana Fiery Hot Pepper Sauce", "Condiments: Louisiana Hot Spiced Okra", "Condiments: Original Frankfurter gr�ne So�e", "Beverages: Chai", "Beverages: Chang", "Beverages: Guaran� Fant�stica", "Beverages: Sasquatch Ale", "Beverages: Steeleye Stout", "Beverages: C�te de Blaye", "Beverages: Chartreuse verte", "Beverages: Ipoh Coffee", "Beverages: Laughing Lumberjack Lager", "Beverages: Outback Lager", "Beverages: Rh�nbr�u Klosterbier", "Beverages: Lakkalik��ri"); int itemCount = 0; for (Variant item : innerJoinQuery) { Assert.assertTrue(expectedCombinations.contains(String.format("%s: %s", item.get("category"), item.get("productName")))); itemCount++; } Assert.assertEquals(expectedCombinations.size(), itemCount); } @Test public void canUseGroupJoinToGetAllTheProductsThatMatchAGivenCategoryBundledAsASequence_linq103() { String[] categories = { "Beverages", "Condiments", "Vegetables", "Dairy Products", "Seafood" }; Product[] products = Product.getAllProducts(); Iterable<Variant> q = from("c").in(categories). join("p").in(products).on("c").equals("p.getCategory()").into("ps"). select( create( property("category", "c"), property("products", "ps") ) ); int rowCount = 0; for (Variant v : q) { rowCount++; System.out.println(v.get("category")); for (Product p : (Iterable<Product>) v.get("products")) { System.out.println(" " + p.getProductName() + " (" + p.getCategory() + ")"); Assert.assertEquals(v.get("category"), p.getCategory()); } } Assert.assertEquals(categories.length - 1, rowCount); // There is no "Vegtable" category, hence this is empty. } // TODO: Write a test case for linq104 }