package cn.jimmyshi.beanquery.example; import static cn.jimmyshi.beanquery.BeanQuery.*; import static org.junit.Assert.assertThat; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import cn.jimmyshi.beanquery.DataLoader; import cn.jimmyshi.beanquery.selectors.DefaultSelector; public class BeanQueryExample { private DataLoader dataLoader = new DataLoader(); private List<Book> mainData; @Before public void setup() { mainData = dataLoader.loadMainSourcetData(); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Test public void shouldReturnAllFields() { List<Map<String, Object>> result = select(allOf(Book.class)).from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnAllFields.json", result); assertThat(result, hasSize(3)); assertThat(result.get(0).keySet(), hasSize(5)); assertThat(result.get(1).keySet(), hasSize(5)); assertThat(result.get(2).keySet(), hasSize(5)); assertThat((String) result.get(0).get("name"), allOf(notNullValue(), isA(String.class))); assertThat((Double) result.get(0).get("price"), allOf(notNullValue(), isA(Double.class))); assertThat((Author) result.get(0).get("mainAuthor"), allOf(notNullValue(), isA(Author.class))); assertThat((List<Author>) result.get(0).get("authorList"), allOf(notNullValue(), isA((Class<List<Author>>) (Class) List.class))); assertThat((Map<String, Author>) result.get(0).get("authorMap"), allOf(notNullValue(), isA(Map.class))); } @Test public void shouldBooksShortedByNameDesc(){ List<Book> sortedBooks = select(Book.class).from(mainData).orderBy("name").desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldBooksShortedByName.json", sortedBooks); } @Test public void shouldExecuteFromMethodsWorking(){ List<Book> sortedBooks = select(Book.class).orderBy("name").desc().executeFrom(mainData); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldBooksShortedByName.json", sortedBooks); } @Test public void shouldExcecuteFromBeanMethodWorksWithWhereCondition(){ Book book=new Book(); book.setName("abc123"); Map<String,Object> result=select("name,price").where(value("name",startsWith("abc"))).executeFrom(book); assertThat((String)result.get("name"),is("abc123")); } @Test public void shouldExecuteFromBeanMethodWorking(){ Map<String,Object> executeFromResult=select("name,price").where(notNullValue()).executeFrom(new Object()); assertThat(executeFromResult.keySet(),hasSize(2)); assertThat(executeFromResult.keySet(),containsInAnyOrder("name","price")); } @Test public void shouldFromBeanMethodWorking(){ List<Map<String,Object>> executeFromResult=select("name,price").where(notNullValue()).from(new Object()).execute(); assertThat(executeFromResult, hasSize(1)); assertThat(executeFromResult.get(0).keySet(),containsInAnyOrder("name","price")); } @Test public void shouldExecuteFromBeanMethodGetNullWhenNotFilteredResult(){ Map<String,Object> executeFromResult=select("name,price").where(startsWith("abc")).executeFrom(new Object()); assertThat(executeFromResult, nullValue()); } @Test public void shouldOnlyBook1InResult(){ List<Book> result=select(Book.class).from(mainData).where(value("name", is("Book1"))).execute(); assertThat(result,hasSize(1)); assertThat(result.get(0).getName(),is("Book1")); } @Test public void shouldReturnFieldsOnly() { List<Map<String, Object>> result = select("name,price,price as p, mainAuthor").from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnFieldsOnly.json", result); } @Test public void shouldWorkWithMixedSelectors(){ List<Map<String, Object>> result = select(allOf(Book.class).except("authorList","authorMap","mainAuthor"),property("price").as("p"),property("mainAuthor")).from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnFieldsOnly.json", result); } @Test public void shouldReturnEmptyListWhenQueryFromEmptyList(){ List<Map<String,Object>> result=select("abc").from(Collections.emptyList()).execute(); assertThat(result, empty()); } @Test public void shouldReturnFieldsOnlyWithAllOfAndExcept() { List<Map<String, Object>> result = select(allOf(Book.class).except("authorList","authorMap")).from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnFieldsOnlyWithAllOfAndExcept.json", result); } @Test public void shouldReturnFieldsOnlyWithMultiplePropertyStrings() { List<Map<String, Object>> result = select("name","price","price as p", "mainAuthor").from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnFieldsOnly.json", result); } @Test public void shouldReturnFieldsOnlyWithPropertys() { List<Map<String, Object>> result = select(property("name"), property("price"), property("price").as("p"), property("mainAuthor")).from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldReturnFieldsOnly.json", result); } @Test public void shouldNotChangeOrder() { List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldNotChangeOrder.json", result); } @Test public void shouldInPriceAscOrder() { List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).orderBy("price").asc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldInPriceAscOrder.json", result); } @Test public void shouldIncludeNullValueWhenSortingDesc(){ List<Map<String,Object>> result=select("name").from(dataLoader.loadSourceData("forOrdersWithNullValue.json")).orderBy("name").desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldIncludeNullValueWhenSortingDesc.json", result); } @Test public void shouldIncludeNullValueWhenSortingAsc(){ List<Map<String,Object>> result=select("name").from(dataLoader.loadSourceData("forOrdersWithNullValue.json")).orderBy("name").asc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldIncludeNullValueWhenSortingAsc.json", result); } @Test public void testSortingWithNotExistProperty(){ List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).orderBy("notExistingProperty").execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldNotChangeOrder.json", result); } @Test public void shouldInPriceDescOrder() { List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).orderBy("price").desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldInPriceDescOrder.json", result); } @Test public void testOrderByBeanComparator(){ Comparator<Book> priceBeanComparator = new Comparator<Book>() { @Override public int compare(Book o1, Book o2) { return Double.compare(o1.getPrice(), o2.getPrice()); } }; List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).orderBy(priceBeanComparator).desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldInPriceDescOrder.json", result); } @Test public void testOrderByProvidedPropertyComparator(){ Comparator<Double> doubleComparator=new Comparator<Double>() { @Override public int compare(Double o1, Double o2) { return o1.compareTo(o2); } }; List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forOrders.json")).orderBy("price",doubleComparator).desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("shouldInPriceDescOrder.json", result); } @Test public void testChainedOrderByProperties(){ List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forChainedOrder.json")).orderBy(orderByProperty("price"),orderByProperty("name").desc()).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testChainedOrderByProperties.json", result); } @Test public void testChainedOrderByPropertiesDesc(){ List<Map<String, Object>> result = select("name,price,mainAuthor") .from(dataLoader.loadSourceData("forChainedOrder.json")).orderBy(orderByProperty("price"),orderByProperty("name").desc()).desc().execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testChainedOrderByPropertiesDesc.json", result); } @Test public void testSelectNullProperties() { List<Map<String, Object>> result = select("name,price,mainAuthor,authorList").from( dataLoader.loadSourceData("withoutAuthorMapAndList.json")).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testSelectNullProperties.json", result); } @Test public void testNotExistingProperties() { List<Map<String, Object>> result = select("a,b,mainAuthor").from( dataLoader.loadSourceData("withoutAuthorMapAndList.json")).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testNotExistingProperties.json", result); } @Test public void testSelectNestedProperties() { List<Map<String, Object>> result = select("name,price,mainAuthor.name as authorName").from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testSelectNestedProperties.json", result); } @Test public void testSelectListNestedProperties() { List<Map<String, Object>> result = select("name,price,authorList[0].name as firstAuthorName").from(mainData) .execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testSelectListNestedProperties.json", result); } @Test public void testSelectMapNestedProperties() { List<Map<String, Object>> result = select("name,price,authorMap(Book1-Author-1).address as book1AuthorAddress") .from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testSelectMapNestedProperties.json", result); } @Test public void testCustomizedSelector(){ List<String> bookNames=select(new DefaultSelector<String>() { @Override public String select(Object item) { return ((Book)item).getName(); } }).executeFrom(mainData); assertThat(bookNames,containsInAnyOrder("Book1","Book2","Book3")); } @Test public void testUsingMapHamcrestMatchers() { List<Map<String, Object>> result = select(allOf(Book.class)).from(mainData) .where(value("authorMap", hasKey("Book1-Author-1"))).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testUsingMapHamcrestMatchers.json", result); } @Test public void testUsingCollectionHamcestMatchers() { Author firstAuthorOfBook1AuthorList = mainData.get(0).getAuthorList().get(0); List<Map<String, Object>> result = select(allOf(Book.class)).from(mainData) .where(value("authorList", hasItem(firstAuthorOfBook1AuthorList))).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testUsingCollectionHamcestMatchers.json", result); } @SuppressWarnings("unchecked") @Test public void testUsingMultipleWhereConditions() { List<Map<String, Object>> result = select("price,name,mainAuthor.name as mainAuthorName") .from(dataLoader.loadSourceData("forMultipleWhereConditions.json")) .where( //for books name is Book2 or starts with Book1 anyOf(value("name", startsWith("Book1")), value("name", is("Book2"))), //for books price between (53,65) allOf(value("price", greaterThan(53d)),value("price",lessThan(65d))) ).orderBy("name").desc() .execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testUsingMultipleWhereConditions.json", result); } @SuppressWarnings("unchecked") @Test public void testUsingMapMatchersOnNormalProperty() { List<Map<String, Object>> result = select("price,name,mainAuthor.name as mainAuthorName") .from(dataLoader.loadSourceData("forMultipleWhereConditions.json")) .where( //for books name is Book2 or starts with Book1 anyOf(value("name", startsWith("Book1")), value("name", is("Book2")),value("name",hasEntry("abc", "edf"))), //for books price between (53,65) allOf(value("price", greaterThan(53d)),value("price",lessThan(65d))) ).orderBy("name").desc() .execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testUsingMultipleWhereConditions.json", result); } @Test public void testNestedResultFeature() { List<Map<String, Object>> result = select( "name,price,authorMap(Book1-Author-1).address.address as author.address, authorMap(Book1-Author-1).address.postCode as author.postCode") .nested().from(mainData).execute(); dataLoader.assertDataToJsonEqualsExpectedFileContent("testNestedResultFeature.json", result); } }