Skip to content

Commit 84a8f36

Browse files
committed
refactor to remove duplicate code
1 parent 35ed975 commit 84a8f36

2 files changed

Lines changed: 26 additions & 70 deletions

File tree

PgBulkInsert/pgbulkinsert-core/src/main/java/de/bytefish/pgbulkinsert/PgBulkInsert.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,7 @@ public void saveAll(PGConnection connection, Stream<TEntity> entities) throws SQ
4343
}
4444

4545
public void saveAll(PGConnection connection, Collection<TEntity> entities) throws SQLException {
46-
// Wrap the CopyOutputStream in our own Writer:
47-
try (PgBinaryWriter bw = new PgBinaryWriter(new PGCopyOutputStream(connection, mapping.getCopyCommand(), 1), configuration.getBufferSize())) {
48-
// Insert Each Column:
49-
entities.forEach(entity -> saveEntity(bw, entity));
50-
}
46+
saveAll(connection, entities.stream());
5147
}
5248

5349
private void saveEntity(PgBinaryWriter bw, TEntity entity) throws SaveEntityFailedException {

PgBulkInsert/pgbulkinsert-core/src/main/java/de/bytefish/pgbulkinsert/pgsql/handlers/BigDecimalValueHandler.java

Lines changed: 25 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -12,119 +12,79 @@
1212

1313
/**
1414
* The Algorithm for turning a BigDecimal into a Postgres Numeric is heavily inspired by the Intermine Implementation:
15-
*
15+
* <p>
1616
* https://github.com/intermine/intermine/blob/master/intermine/objectstore/main/src/org/intermine/sql/writebatch/BatchWriterPostgresCopyImpl.java
17-
*
1817
*/
1918
public class BigDecimalValueHandler<T extends Number> extends BaseValueHandler<T> {
2019

2120
private static final int DECIMAL_DIGITS = 4;
22-
23-
protected static final BigInteger TEN = new BigInteger("10");
24-
protected static final BigInteger TEN_THOUSAND = new BigInteger("10000");
21+
private static final BigInteger TEN_THOUSAND = new BigInteger("10000");
2522

2623
@Override
27-
protected void internalHandle(DataOutputStream buffer, final T value) throws Exception {
28-
29-
BigDecimal tmpValue = getNumericAsBigDecimal(value);
30-
31-
BigInteger unscaledValue = tmpValue.unscaledValue();
32-
33-
int sign = tmpValue.signum();
34-
35-
if (sign == -1) {
36-
unscaledValue = unscaledValue.negate();
37-
}
24+
protected void internalHandle(final DataOutputStream buffer, final T value) throws Exception {
25+
final BigDecimal tmpValue = getNumericAsBigDecimal(value);
3826

3927
// Number of fractional digits:
40-
int fractionDigits = tmpValue.scale();
28+
final int fractionDigits = tmpValue.scale();
4129

4230
// Number of Fraction Groups:
43-
int fractionGroups = (fractionDigits + 3) / 4;
44-
45-
List<Integer> digits = new ArrayList<>();
46-
47-
// The scale needs to be a multiple of 4:
48-
int scaleRemainder = fractionDigits % 4;
49-
50-
// Scale the first value:
51-
if(scaleRemainder != 0)
52-
{
53-
BigInteger[] result = unscaledValue.divideAndRemainder(TEN.pow(scaleRemainder));
54-
55-
int digit = result[1].intValue() * (int) Math.pow(10, DECIMAL_DIGITS - scaleRemainder);
56-
57-
digits.add(digit);
58-
59-
unscaledValue = result[0];
60-
}
31+
final int fractionGroups = (fractionDigits + 3) / 4;
6132

62-
while (!unscaledValue.equals(BigInteger.ZERO)) {
63-
BigInteger[] result = unscaledValue.divideAndRemainder(TEN_THOUSAND);
64-
digits.add(result[1].intValue());
65-
unscaledValue = result[0];
66-
}
33+
final List<Integer> digits = digits(tmpValue);
6734

6835
buffer.writeInt(8 + (2 * digits.size()));
6936
buffer.writeShort(digits.size());
7037
buffer.writeShort(digits.size() - fractionGroups - 1);
71-
buffer.writeShort(sign == 1 ? 0x0000 : 0x4000);
38+
buffer.writeShort(tmpValue.signum() == 1 ? 0x0000 : 0x4000);
7239
buffer.writeShort(fractionDigits);
7340

7441
// Now write each digit:
7542
for (int pos = digits.size() - 1; pos >= 0; pos--) {
76-
int valueToWrite = digits.get(pos);
43+
final int valueToWrite = digits.get(pos);
7744
buffer.writeShort(valueToWrite);
7845
}
7946
}
8047

81-
private static BigDecimal getNumericAsBigDecimal(Number source) {
48+
@Override
49+
public int getLength(final T value) {
50+
final List<Integer> digits = digits(getNumericAsBigDecimal(value));
51+
return (8 + (2 * digits.size()));
52+
}
8253

54+
private static BigDecimal getNumericAsBigDecimal(final Number source) {
8355
if (!(source instanceof BigDecimal)) {
8456
return BigDecimalUtils.toBigDecimal(source.doubleValue());
8557
}
8658

8759
return (BigDecimal) source;
8860
}
8961

90-
@Override
91-
public int getLength(T value) {
92-
BigDecimal tmpValue = getNumericAsBigDecimal(value);
62+
private List<Integer> digits(final BigDecimal value) {
63+
BigInteger unscaledValue = value.unscaledValue();
9364

94-
BigInteger unscaledValue = tmpValue.unscaledValue();
95-
96-
int sign = tmpValue.signum();
97-
98-
if (sign == -1) {
65+
if (value.signum() == -1) {
9966
unscaledValue = unscaledValue.negate();
10067
}
10168

102-
// Number of fractional digits:
103-
int fractionDigits = tmpValue.scale();
104-
105-
List<Integer> digits = new ArrayList<>();
69+
final List<Integer> digits = new ArrayList<>();
10670

10771
// The scale needs to be a multiple of 4:
108-
int scaleRemainder = fractionDigits % 4;
72+
int scaleRemainder = value.scale() % 4;
10973

11074
// Scale the first value:
111-
if(scaleRemainder != 0)
112-
{
113-
BigInteger[] result = unscaledValue.divideAndRemainder(TEN.pow(scaleRemainder));
114-
115-
int digit = result[1].intValue() * (int) Math.pow(10, DECIMAL_DIGITS - scaleRemainder);
116-
75+
if (scaleRemainder != 0) {
76+
final BigInteger[] result = unscaledValue.divideAndRemainder(BigInteger.TEN.pow(scaleRemainder));
77+
final int digit = result[1].intValue() * (int) Math.pow(10, DECIMAL_DIGITS - scaleRemainder);
11778
digits.add(digit);
118-
11979
unscaledValue = result[0];
12080
}
12181

12282
while (!unscaledValue.equals(BigInteger.ZERO)) {
123-
BigInteger[] result = unscaledValue.divideAndRemainder(TEN_THOUSAND);
83+
final BigInteger[] result = unscaledValue.divideAndRemainder(TEN_THOUSAND);
12484
digits.add(result[1].intValue());
12585
unscaledValue = result[0];
12686
}
12787

128-
return (8 + (2 * digits.size()));
88+
return digits;
12989
}
13090
}

0 commit comments

Comments
 (0)