package org.simpleflatmapper.test.map.mapper; import org.junit.Test; import org.simpleflatmapper.map.Mapper; import org.simpleflatmapper.map.MappingContext; import org.simpleflatmapper.map.MappingException; import org.simpleflatmapper.test.map.SampleFieldKey; import org.simpleflatmapper.map.context.KeySourceGetter; import org.simpleflatmapper.map.context.KeyDefinition; import org.simpleflatmapper.map.context.impl.BreakDetectorMappingContextFactory; import org.simpleflatmapper.map.error.RethrowConsumerErrorHandler; import org.simpleflatmapper.map.mapper.JoinMapper; import org.simpleflatmapper.test.beans.DbListObject; import org.simpleflatmapper.test.beans.DbObject; import org.simpleflatmapper.util.ErrorHelper; import org.simpleflatmapper.util.ListCollector; import java.util.ArrayList; import java.util.Iterator; import java.util.List; //IFJAVA8_START import java.util.stream.Collectors; //IFJAVA8_END import static org.junit.Assert.*; public class JoinMapperTest { private final Mapper<Object[], DbListObject> dbListObjectMapper = new Mapper<Object[], DbListObject>() { @Override public DbListObject map(Object[] source) throws MappingException { return map(source, null); } @Override public DbListObject map(Object[] source, MappingContext<? super Object[]> context) throws MappingException { DbListObject dbListObject = new DbListObject(); try { mapTo(source, dbListObject, context); } catch (Exception e) { ErrorHelper.rethrow(e); } return dbListObject; } @Override public void mapTo(Object[] source, DbListObject target, MappingContext<? super Object[]> context) throws Exception { target.setId((Integer) source[0]); List<DbObject> objects = target.getObjects(); if (objects == null) { objects = new ArrayList<DbObject>(); target.setObjects(objects); } DbObject o = new DbObject(); o.setId((Long) source[1]); o.setName((String) source[2]); objects.add(o); } }; private final KeyDefinition<Object[], SampleFieldKey> keyDefinition = new KeyDefinition<Object[], SampleFieldKey>(new SampleFieldKey[] {new SampleFieldKey("id", 0) }, new KeySourceGetter<SampleFieldKey, Object[]>() { @Override public Object getValue(SampleFieldKey key, Object[] source) throws Exception { return source[key.getIndex()]; } }, 0); @SuppressWarnings("unchecked") @Test public void testJoinWithKey() { JoinMapper<Object[], Object[][], DbListObject, RuntimeException> joinMapper = new JoinMapper<Object[], Object[][], DbListObject, RuntimeException>( dbListObjectMapper, RethrowConsumerErrorHandler.INSTANCE, new BreakDetectorMappingContextFactory<Object[]>(keyDefinition, new KeyDefinition[] {keyDefinition}, MappingContext.EMPTY_FACTORY), SetRowMapperTest.ENUMARABLE_UNARY_FACTORY ); checkJoins(joinMapper); } private void checkJoins(JoinMapper<Object[], Object[][], DbListObject, RuntimeException> joinMapper) { Object[][] data = new Object[][] { {1, 1l, "name1"}, {1, 2l, "name2"}, {2, 3l, "name3"} }; checkList(joinMapper.forEach(data, new ListCollector<DbListObject>()).getList()); //IFJAVA8_START checkList(joinMapper.stream(data).collect(Collectors.<DbListObject>toList())); //IFJAVA8_END List<DbListObject> list = new ArrayList<DbListObject>(); Iterator<DbListObject> iterator = joinMapper.iterator(data); while(iterator.hasNext()) { list.add(iterator.next()); } checkList(list); } private void checkList(List<DbListObject> list) { assertEquals(2, list.size()); assertEquals(1, list.get(0).getId()); assertEquals(1l, list.get(0).getObjects().get(0).getId()); assertEquals("name1", list.get(0).getObjects().get(0).getName()); assertEquals(2l, list.get(0).getObjects().get(1).getId()); assertEquals("name2", list.get(0).getObjects().get(1).getName()); assertEquals(2, list.get(1).getId()); assertEquals(3l, list.get(1).getObjects().get(0).getId()); assertEquals("name3", list.get(1).getObjects().get(0).getName()); } }