Skip to content

Commit 32d8392

Browse files
authored
Merge pull request #10 from JavaWebStack/use-is-dirty-before-update
Use is dirty before update
2 parents daa7d6d + 5180ea6 commit 32d8392

File tree

8 files changed

+108
-11
lines changed

8 files changed

+108
-11
lines changed

src/main/java/org/javawebstack/orm/Model.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public <T> T getOriginalValue(String field) {
7373

7474
public boolean isDirty(String... fields) {
7575
List<String> dirty = getDirtyFields();
76+
if(fields.length == 0 && dirty.size() > 0)
77+
return true;
7678
for (String f : fields) {
7779
if (dirty.contains(f))
7880
return true;

src/main/java/org/javawebstack/orm/ORMConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class ORMConfig {
1616
private boolean idAutoIncrement = true;
1717
private final List<TypeMapper> typeMappers = new ArrayList<>();
1818
private Injector injector;
19+
private boolean preventUnnecessaryUpdates = true;
1920

2021
public ORMConfig() {
2122
typeMappers.add(new DefaultMapper());
@@ -113,4 +114,13 @@ public String getTypeParameters(Class<?> type, int size) {
113114
}
114115
return null;
115116
}
117+
118+
public boolean shouldPreventUnnecessaryUpdates() {
119+
return preventUnnecessaryUpdates;
120+
}
121+
122+
public ORMConfig setPreventUnnecessaryUpdates(boolean preventUnnecessaryUpdates) {
123+
this.preventUnnecessaryUpdates = preventUnnecessaryUpdates;
124+
return this;
125+
}
116126
}

src/main/java/org/javawebstack/orm/Repo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ private void executeCreate(T entry) {
155155
}
156156

157157
public void update(T entry) {
158+
if(info.getConfig().shouldPreventUnnecessaryUpdates() && !entry.isDirty())
159+
return;
158160
observers.forEach(o -> o.saving(entry));
159161
observers.forEach(o -> o.updating(entry));
160162
where(info.getIdField(), getId(entry)).update(entry);

src/main/java/org/javawebstack/orm/wrapper/BaseSQL.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,21 @@
11
package org.javawebstack.orm.wrapper;
22

3-
import org.javawebstack.orm.ORM;
43
import org.javawebstack.orm.exception.ORMQueryException;
54

65
import java.sql.*;
7-
import java.util.Arrays;
8-
import java.util.HashMap;
9-
import java.util.Locale;
10-
import java.util.Map;
11-
import java.util.logging.Level;
12-
import java.util.stream.Collectors;
6+
import java.sql.Date;
7+
import java.util.*;
138

149
public abstract class BaseSQL implements SQL {
1510

1611
private final Map<ResultSet, Statement> statementMap = new HashMap<>();
12+
private final List<QueryLogger> loggers = new LinkedList<>();
1713

1814
public abstract Connection getConnection();
1915

2016
public int write(String queryString, Object... parameters) throws SQLException {
17+
loggers.forEach(l -> l.log(queryString, parameters));
2118
Connection connection = getConnection();
22-
ORM.LOGGER.log(Level.ALL, queryString);
23-
ORM.LOGGER.log(Level.ALL, Arrays.stream(parameters).map(o -> o == null ? "null" : o.toString()).collect(Collectors.joining(",")));
2419
if (queryString.toLowerCase(Locale.ROOT).startsWith("insert")) {
2520
PreparedStatement ps = setParams(connection.prepareStatement(queryString, Statement.RETURN_GENERATED_KEYS), parameters);
2621
ps.executeUpdate();
@@ -41,9 +36,8 @@ public int write(String queryString, Object... parameters) throws SQLException {
4136
}
4237

4338
public ResultSet read(String queryString, Object... parameters) throws SQLException {
39+
loggers.forEach(l -> l.log(queryString, parameters));
4440
Connection connection = getConnection();
45-
ORM.LOGGER.log(Level.ALL, queryString);
46-
ORM.LOGGER.log(Level.ALL, Arrays.stream(parameters).map(o -> o == null ? "null" : o.toString()).collect(Collectors.joining(",")));
4741
PreparedStatement ps = setParams(connection.prepareStatement(queryString), parameters);
4842
ResultSet rs = ps.executeQuery();
4943
statementMap.put(rs, ps);
@@ -109,4 +103,12 @@ public void cleanUp() {
109103
close(rs);
110104
}
111105

106+
public void addQueryLogger(QueryLogger logger) {
107+
loggers.add(logger);
108+
}
109+
110+
public void removeQueryLogger(QueryLogger logger) {
111+
loggers.remove(logger);
112+
}
113+
112114
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.javawebstack.orm.wrapper;
2+
3+
public interface QueryLogger {
4+
5+
void log(String query, Object[] parameters);
6+
7+
}

src/main/java/org/javawebstack/orm/wrapper/SQL.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ public interface SQL {
1414

1515
void close(ResultSet resultSet);
1616

17+
void addQueryLogger(QueryLogger logger);
18+
19+
void removeQueryLogger(QueryLogger logger);
20+
1721
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.javawebstack.orm.test;
2+
3+
import org.javawebstack.orm.ORM;
4+
import org.javawebstack.orm.ORMConfig;
5+
import org.javawebstack.orm.exception.ORMConfigurationException;
6+
import org.javawebstack.orm.test.shared.models.JustString;
7+
import org.javawebstack.orm.wrapper.QueryLogger;
8+
import org.junit.jupiter.api.Test;
9+
10+
import static org.junit.jupiter.api.Assertions.*;
11+
12+
public class UpdateOnlyIfIsDirtyTest extends ORMTestCase {
13+
14+
@Test
15+
public void testOnlyUpdateIfIsDirty() throws ORMConfigurationException {
16+
// Using an array to make force mutability inside lamda expression
17+
boolean[] updated = new boolean[1];
18+
QueryLogger logger = (query, parameters) -> {
19+
if(query.startsWith("UPDATE"))
20+
updated[0] = true;
21+
};
22+
sql().addQueryLogger(logger);
23+
ORM.register(JustString.class, sql(), new ORMConfig());
24+
ORM.autoMigrate();
25+
JustString model = new JustString();
26+
model.setString("Test");
27+
model.save();
28+
model.save();
29+
assertFalse(updated[0]);
30+
model.setString("TestB");
31+
model.save();
32+
assertTrue(updated[0]);
33+
sql().removeQueryLogger(logger);
34+
}
35+
36+
@Test
37+
public void testPreventUnnecessaryUpdatesOption() throws ORMConfigurationException {
38+
boolean[] updated = new boolean[1];
39+
QueryLogger logger = (query, parameters) -> {
40+
if(query.startsWith("UPDATE"))
41+
updated[0] = true;
42+
};
43+
sql().addQueryLogger(logger);
44+
ORM.register(JustString.class, sql(), new ORMConfig().setPreventUnnecessaryUpdates(false));
45+
ORM.autoMigrate();
46+
JustString model = new JustString();
47+
model.setString("Test");
48+
model.save();
49+
model.save();
50+
assertTrue(updated[0]);
51+
sql().removeQueryLogger(logger);
52+
}
53+
54+
}

src/test/java/org/javawebstack/orm/test/shared/models/JustString.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,26 @@
44
import org.javawebstack.orm.annotation.Column;
55

66
public class JustString extends Model {
7+
78
@Column
89
int id;
910

1011
@Column
1112
String string;
1213

14+
public int getId() {
15+
return id;
16+
}
17+
18+
public void setId(int id) {
19+
this.id = id;
20+
}
21+
22+
public String getString() {
23+
return string;
24+
}
25+
26+
public void setString(String string) {
27+
this.string = string;
28+
}
1329
}

0 commit comments

Comments
 (0)