package org.simpleflatmapper.csv.test; import org.junit.Test; import org.simpleflatmapper.csv.CsvMapper; import org.simpleflatmapper.csv.CsvMapperBuilder; import org.simpleflatmapper.csv.CsvMapperFactory; import org.simpleflatmapper.csv.CsvParser; import org.simpleflatmapper.map.property.KeyProperty; import org.simpleflatmapper.test.beans.Person; import org.simpleflatmapper.test.jdbc.JoinTest; import org.simpleflatmapper.test.beans.ProfessorC; import org.simpleflatmapper.test.beans.ProfessorField; import org.simpleflatmapper.test.beans.ProfessorGS; import org.simpleflatmapper.util.ListCollector; import java.io.IOException; import java.io.StringReader; import java.util.Iterator; import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; public class CsvMapperJoinTest { private static final String DATA = "1,professor1,3,student3,phone31\n" + "1,professor1,3,student3,phone32\n" + "1,professor1,4,student4,phone41\n" + "2,professor2,4,student4,phone51\n" + "2,professor2,4,student4,phone52\n" + "3,professor3,,,,"; private static final String HEADER_DATA = "id,name,students_id,students_name,students_phones_str\n" + DATA; @Test public void testStaticProfessorGS() throws IOException { final CsvMapper<ProfessorGS> mapper = geStaticCsvMapper(getCsvMapperFactory(), ProfessorGS.class); final List<ProfessorGS> professors = mapper.forEach(new StringReader(DATA), new ListCollector<ProfessorGS>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testStaticProfessorGSSharding() throws IOException { final CsvMapper<ProfessorGS> mapper = geStaticCsvMapper(getCsvShardingMapperFactory(), ProfessorGS.class); final List<ProfessorGS> professors = mapper.forEach(new StringReader(DATA), new ListCollector<ProfessorGS>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testStaticCsvParserDSL() throws IOException { final CsvParser.StaticMapToDSL<ProfessorGS> professorGSStaticMapToDSL = CsvParser.mapTo(ProfessorGS.class) .addKey("id") .addMapping("name") .addKey("students_id") .addMapping("students_name"); List<ProfessorGS> professors = professorGSStaticMapToDSL .addMapping("students_phones_value") .forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorGS>()) .getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicProfessorGS() throws IOException { final CsvMapperFactory mapperFactory = getCsvMapperFactory(); final List<ProfessorGS> professors = mapperFactory.newMapper(ProfessorGS.class).forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorGS>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicProfessorGSSharding() throws IOException { final CsvMapperFactory mapperFactory = getCsvShardingMapperFactory(); final List<ProfessorGS> professors = mapperFactory.newMapper(ProfessorGS.class).forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorGS>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicCsvParserDSL() throws IOException { List<ProfessorGS> professors = CsvParser.mapTo(ProfessorGS.class) .addKeys("id", "students_id") .forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorGS>()) .getList(); JoinTest.validateProfessors(professors); } @Test public void testStaticProfessorC() throws IOException { final CsvMapper<ProfessorC> mapper = geStaticCsvMapper(getCsvMapperFactory(), ProfessorC.class); final List<ProfessorC> professors = mapper.forEach(new StringReader(DATA), new ListCollector<ProfessorC>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testStaticProfessorCSharding() throws IOException { final CsvMapper<ProfessorC> mapper = geStaticCsvMapper(getCsvShardingMapperFactory(), ProfessorC.class); final List<ProfessorC> professors = mapper.forEach(new StringReader(DATA), new ListCollector<ProfessorC>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicProfessorC() throws IOException { final CsvMapperFactory mapperFactory = getCsvMapperFactory(); final List<ProfessorC> professors = mapperFactory.newMapper(ProfessorC.class).forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorC>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicProfessorCSharding() throws IOException { final CsvMapperFactory mapperFactory = getCsvShardingMapperFactory(); final List<ProfessorC> professors = mapperFactory.newMapper(ProfessorC.class).forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorC>()).getList(); JoinTest.validateProfessors(professors); } @Test public void testDynamicProfessorField() throws IOException { final CsvMapperFactory mapperFactory = getCsvMapperFactory(); final List<ProfessorField> professors = mapperFactory.newMapper(ProfessorField.class).forEach(new StringReader(HEADER_DATA), new ListCollector<ProfessorField>()).getList(); JoinTest.validateProfessors(professors); } private <T extends Person> CsvMapper<T> geStaticCsvMapper(CsvMapperFactory mapperFactory, Class<T> target) { final CsvMapperBuilder<T> builder = mapperFactory .newBuilder(target); return builder .addMapping("id") .addMapping("name") .addMapping("students_id") .addMapping("students_name") .addMapping("students_phones_value") .mapper(); } private CsvMapperFactory getCsvMapperFactory() { return CsvMapperFactory .newInstance().useAsm(false) .failOnAsm(true) .addKeys("id", "students_id"); } private CsvMapperFactory getCsvShardingMapperFactory() { return getCsvMapperFactory().maxMethodSize(2); } @Test public void testUser() throws IOException { CsvMapper<User> mapper = CsvMapperFactory .newInstance() .useAsm(false) .newBuilder(User.class).addMapping("id", KeyProperty.DEFAULT).addMapping("name").addMapping("roles_name").mapper(); Iterator<User> iterator = mapper.iterator(new StringReader("1,n1,r1\n1,n1,r2")); User u = iterator.next(); assertEquals(1, u.id); assertEquals("n1", u.name); assertEquals(2, u.roles.size()); } public static class User { public int id; public String name; public Set<Role> roles; } public static class Role { public String name; } }