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

jhannes / fluent-jdbc / #172

01 Aug 2024 07:53PM UTC coverage: 94.146% (-1.3%) from 95.478%
#172

push

jhannes
DatabaseUpdatable.setField with expression allows to insert and update rows with calculated column values

41 of 45 new or added lines in 7 files covered. (91.11%)

32 existing lines in 12 files now uncovered.

1174 of 1247 relevant lines covered (94.15%)

0.94 hits per line

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

88.0
/src/main/java/org/fluentjdbc/DatabaseInsertOrUpdateBuilder.java
1
package org.fluentjdbc;
2

3
import javax.annotation.CheckReturnValue;
4
import javax.annotation.Nullable;
5
import java.sql.Connection;
6
import java.util.Collection;
7
import java.util.Collections;
8
import java.util.List;
9
import java.util.Map;
10

11
/**
12
 * Generate a statement that will result in either an <code>UPDATE ...</code> or <code>INSERT ...</code> depending
13
 * on whether the row exists already by collecting field names and parameters. Example:
14
 *
15
 * <pre>
16
 * int count = table
17
 *      .where("id", id)
18
 *      .insertOrUpdate()
19
 *      .setField("name", "Something")
20
 *      .setField("code", 102)
21
 *      .execute(connection);
22
 * </pre>
23
 */
24
public class DatabaseInsertOrUpdateBuilder implements DatabaseUpdatable<DatabaseInsertOrUpdateBuilder> {
25

26
    private DatabaseUpdateBuilder updateBuilder;
27
    private DatabaseInsertBuilder insertBuilder;
28

29
    public DatabaseInsertOrUpdateBuilder(DatabaseTable table) {
1✔
30
        updateBuilder = new DatabaseUpdateBuilder(table);
1✔
31
        insertBuilder = new DatabaseInsertBuilder(table);
1✔
32
    }
1✔
33

34
    /**
35
     * Calls {@link #setField(String, Object)} for each fieldName and parameter
36
     */
37
    @Override
38
    public DatabaseInsertOrUpdateBuilder setFields(List<String> fields, List<?> values) {
NEW
39
        updateBuilder = updateBuilder.setFields(fields, values);
×
NEW
40
        insertBuilder = insertBuilder.setFields(fields, values);
×
41
        return this;
×
42
    }
43

44
    /**
45
     * Calls {@link #setField(String, Object)} for each key and value in the parameter map
46
     */
47
    @Override
48
    public DatabaseInsertOrUpdateBuilder setFields(Map<String, ?> fields) {
49
        updateBuilder = updateBuilder.setFields(fields);
1✔
50
        insertBuilder = insertBuilder.setFields(fields);
1✔
51
        return this;
1✔
52
    }
53

54
    /**
55
     * Adds fieldName to <code>UPDATE ... SET fieldName = ?</code> and parameter to the list of parameters
56
     */
57
    @Override
58
    public DatabaseInsertOrUpdateBuilder setField(String field, @Nullable Object value) {
59
        return setField(field, "?", Collections.singleton(value));
1✔
60
    }
61

62
    /**
63
     * Adds fieldName to <code>UPDATE ... SET fieldName = expression</code> and values to the list of parameters
64
     */
65
    @Override
66
    public DatabaseInsertOrUpdateBuilder setField(String field, String expression, Collection<?> values) {
67
        updateBuilder = updateBuilder.setField(field, expression, values);
1✔
68
        insertBuilder = insertBuilder.setField(field, expression, values);
1✔
69
        return this;
1✔
70
    }
71

72
    @CheckReturnValue
73
    public DatabaseInsertOrUpdateBuilder where(DatabaseWhereBuilder whereClause) {
74
        updateBuilder = updateBuilder.where(whereClause);
1✔
75
        List<String> columns = whereClause.getColumns();
1✔
76
        for (int i = 0; i < columns.size(); i++) {
1✔
77
            String column = columns.get(i);
1✔
78
            insertBuilder = insertBuilder.setField(column, whereClause.getColumnExpressions().get(i), whereClause.getParameterAsCollection(i));
1✔
79
        }
80

81
        return this;
1✔
82
    }
83

84
    /**
85
     * Will generate <code>UPDATE</code> statements, set parameters and execute to database
86
     * @return returns the number of rows updated or -1 if a row was inserted
87
     */
88
    public int execute(Connection connection) {
89
        int rowCount = updateBuilder.execute(connection);
1✔
90
        if (rowCount != 0) {
1✔
91
            return rowCount;
1✔
92
        }
93
        insertBuilder.execute(connection);
1✔
94
        return -1;
1✔
95
    }
96

97
}
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