@Override public T map(ResultSet r, StatementContext ctx) throws SQLException { return delegate.map(r, ctx); } }
@Override public RowMapper<JoinRow> specialize(ResultSet r, StatementContext ctx) throws SQLException { RowMapper<?>[] mappers = new RowMapper[types.length]; for (int i = 0; i < types.length; i++) { Type type = types[i]; mappers[i] = ctx.findRowMapperFor(type) .orElseThrow(() -> new IllegalArgumentException("No row mapper registered for " + type)) .specialize(r, ctx); } return (rs, context) -> { final Map<Type, Object> entries = new HashMap<>(types.length); for (int i = 0; i < types.length; i++) { Type type = types[i]; RowMapper<?> mapper = mappers[i]; entries.put(type, mapper.map(r, ctx)); } return new JoinRow(entries); }; }
@Override public RowMapper<Map.Entry<K, V>> specialize(ResultSet rs, StatementContext ctx) throws SQLException { return new MapEntryMapper<>(keyMapper.specialize(rs, ctx), valueMapper.specialize(rs, ctx)); }
ResultSetResultIterator(ResultSet results, RowMapper<T> mapper, StatementContext context) throws SQLException { this.results = requireNonNull(results); this.mapper = mapper.specialize(results, context); this.context = context; this.context.addCleanable(results::close); }
@Override public RowMapper<JoinRow> specialize(ResultSet r, StatementContext ctx) throws SQLException { RowMapper<?>[] mappers = new RowMapper[types.length]; for (int i = 0; i < types.length; i++) { Type type = types[i]; mappers[i] = ctx.findRowMapperFor(type) .orElseThrow(() -> new IllegalArgumentException("No row mapper registered for " + type)) .specialize(r, ctx); } return (rs, context) -> { final Map<Type, Object> entries = new HashMap<>(types.length); for (int i = 0; i < types.length; i++) { Type type = types[i]; RowMapper<?> mapper = mappers[i]; entries.put(type, mapper.map(r, ctx)); } return new JoinRow(entries); }; }
private RowMapper<?> rowMapperFor(Type type) throws SQLException { if (rowMappers.containsKey(type)) { return rowMappers.get(type); } RowMapper<?> mapper = ctx.findRowMapperFor(type) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for " + type)) .specialize(rs, ctx); rowMappers.put(type, mapper); return mapper; }
@Override public JoinRow map(ResultSet r, StatementContext ctx) throws SQLException { return specialize(r, ctx).map(r, ctx); }
@Override public RowMapper<Map.Entry<K, V>> specialize(ResultSet rs, StatementContext ctx) throws SQLException { return new MapEntryMapper<>(keyMapper.specialize(rs, ctx), valueMapper.specialize(rs, ctx)); }
@Override public T map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
ResultSetResultIterator(ResultSet results, RowMapper<T> mapper, StatementContext context) throws SQLException { this.results = requireNonNull(results); this.mapper = mapper.specialize(results, context); this.context = context; this.context.addCleanable(results::close); }
@Override public C map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
private RowMapper<?> rowMapperFor(Type type) throws SQLException { if (rowMappers.containsKey(type)) { return rowMappers.get(type); } RowMapper<?> mapper = ctx.findRowMapperFor(type) .orElseThrow(() -> new NoSuchMapperException("No row mapper registered for " + type)) .specialize(rs, ctx); rowMappers.put(type, mapper); return mapper; }
@Override public T map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
@Override public T map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
@Override public Map<String, Object> map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
@Override public Map<String, T> map(ResultSet rs, StatementContext ctx) throws SQLException { return specialize(rs, ctx).map(rs, ctx); }
/** * Use a row mapper to extract a type from the current ResultSet row. * @param type the type to map * @return the materialized object */ public Object getRow(Type type) { try { return rowMapperFor(type).map(rs, ctx); } catch (SQLException e) { throw new MappingException(e); } }
private Optional<RowMapper<?>> buildMapper(Class<? extends Tuple> tupleClass, Array<Optional<RowMapper<?>>> colMappers) { Array<? extends RowMapper<?>> cms = colMappers.map(Optional::get); return Optional.of((rs, ctx) -> buildTuple(tupleClass, i -> cms.get(i).map(rs, ctx))); }
private void assertMapper(Optional<RowMapper<?>> mapper, Tuple expected) throws SQLException { assertThat(mapper.isPresent()); assertThat(mapper.get()).isInstanceOf(RowMapper.class); assertThat(mapper.get().map(null, null)).isEqualTo(expected); }