• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

yuu-nkjm / sorm4j / #521

13 Mar 2025 07:21AM UTC coverage: 93.761% (+0.1%) from 93.617%
#521

push

yuu-nkjm
Add H2Server functions

816 of 947 branches covered (86.17%)

Branch coverage included in aggregate %.

147 of 168 new or added lines in 4 files covered. (87.5%)

11 existing lines in 6 files now uncovered.

4444 of 4663 relevant lines covered (95.3%)

0.95 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.14
/sorm4j/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessorBase.java
1
package org.nkjmlab.sorm4j.internal.mapping.multirow;
1✔
2

3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.SQLException;
6
import java.util.Arrays;
7
import java.util.Optional;
8
import java.util.function.Function;
9

10
import org.nkjmlab.sorm4j.context.logging.LogContext;
11
import org.nkjmlab.sorm4j.internal.OrmConnectionImpl;
12
import org.nkjmlab.sorm4j.internal.context.PreparedStatementSupplier;
13
import org.nkjmlab.sorm4j.internal.context.SqlParametersSetter;
14
import org.nkjmlab.sorm4j.internal.context.logging.LogPoint;
15
import org.nkjmlab.sorm4j.internal.mapping.ContainerToTableMapper;
16
import org.nkjmlab.sorm4j.internal.util.Try;
17
import org.nkjmlab.sorm4j.sql.TableSql;
18

19
public abstract class MultiRowProcessorBase<T> implements MultiRowProcessor<T> {
20

21
  private final int batchSize;
22
  private final PreparedStatementSupplier statementSupplier;
23
  private final SqlParametersSetter sqlParametersSetter;
24
  private final ContainerToTableMapper<T> tableMapping;
25
  private final LogContext loggerContext;
26

27
  MultiRowProcessorBase(
1✔
28
      LogContext loggerContext,
29
      SqlParametersSetter sqlParametersSetter,
30
      PreparedStatementSupplier statementSupplier,
31
      ContainerToTableMapper<T> tableMapping,
32
      int batchSize) {
33
    this.loggerContext = loggerContext;
1✔
34
    this.statementSupplier = statementSupplier;
1✔
35
    this.sqlParametersSetter = sqlParametersSetter;
1✔
36
    this.tableMapping = tableMapping;
1✔
37
    this.batchSize = batchSize;
1✔
38
  }
1✔
39

40
  @Override
41
  public abstract int[] multiRowInsert(Connection con, T[] objects);
42

43
  @Override
44
  public abstract int[] multiRowMerge(Connection con, T[] objects);
45

46
  protected final TableSql getSql() {
47
    return tableMapping.getSql();
1✔
48
  }
49

50
  protected Object[] getInsertParameters(T obj) {
51
    return tableMapping.getInsertParameters(obj);
1✔
52
  }
53

54
  protected Object[] getMergeParameters(T obj) {
55
    return tableMapping.getMergeParameters(obj);
1✔
56
  }
57

58
  @Override
59
  public final void setPrametersOfMultiRow(PreparedStatement stmt, T[] objects)
60
      throws SQLException {
61
    Object[] parameters =
1✔
62
        Arrays.stream(objects)
1✔
63
            .flatMap(
1✔
64
                obj -> Arrays.stream(tableMapping.getParametersWithoutAutoGeneratedColumns(obj)))
1✔
65
            .toArray(Object[]::new);
1✔
66
    sqlParametersSetter.setParameters(stmt, parameters);
1✔
67
  }
1✔
68

69
  @Override
70
  public final int[] batch(
71
      Connection con, String sql, Function<T, Object[]> parameterCreator, T[] objects) {
72
    return execMultiRowProcIfValidObjects(
1✔
73
        con,
1✔
74
        objects,
1✔
75
        nonNullObjects -> {
1✔
76
          int[] result = new int[0];
1✔
77
          boolean origAutoCommit = OrmConnectionImpl.getAutoCommit(con);
1✔
78

79
          try (PreparedStatement stmt = statementSupplier.prepareStatement(con, sql)) {
1✔
80
            OrmConnectionImpl.setAutoCommit(con, false);
1✔
81
            final BatchHelper batchHelper = new BatchHelper(batchSize, stmt);
1✔
82
            for (int i = 0; i < objects.length; i++) {
1✔
83
              T obj = objects[i];
1✔
84
              this.sqlParametersSetter.setParameters(stmt, parameterCreator.apply(obj));
1✔
85
              batchHelper.addBatchAndExecuteIfReachedThreshold();
1✔
86
            }
87
            result = batchHelper.finish();
1✔
88
            return result;
1✔
89
          } catch (SQLException e) {
1✔
90
            throw Try.rethrow(e);
×
91
          } finally {
92
            OrmConnectionImpl.commitOrRollback(con, origAutoCommit);
1✔
93
            OrmConnectionImpl.setAutoCommit(con, origAutoCommit);
1✔
94
          }
95
        });
96
  }
97

98
  /**
99
   * Execute multirow sql function. objects when objects[0] is null, {@code NullPointerException}
100
   * are throw.
101
   */
102
  final int[] execMultiRowProcIfValidObjects(
103
      Connection con, T[] objects, Function<T[], int[]> exec) {
104
    if (objects == null || objects.length == 0) {
1!
105
      return new int[0];
1✔
106
    }
107
    Optional<LogPoint> lp =
1✔
108
        loggerContext.createLogPoint(
1✔
109
            LogContext.Category.EXECUTE_MULTI_ROW_UPDATE, MultiRowProcessorBase.class);
1✔
110
    lp.ifPresent(
1✔
111
        _lp ->
1✔
112
            _lp.logBeforeMultiRow(
×
UNCOV
113
                con,
×
114
                objects[0].getClass(),
×
UNCOV
115
                objects.length,
×
116
                tableMapping.getTableMetaData().getTableName()));
×
117

118
    final int[] result = exec.apply(objects);
1✔
119

120
    lp.ifPresent(_lp -> _lp.logAfterMultiRow(result));
1✔
121
    return result;
1✔
122
  }
123

124
  protected PreparedStatement prepareStatement(Connection con, String sql) throws SQLException {
125
    return statementSupplier.prepareStatement(con, sql);
1✔
126
  }
127
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc