forked from javers/javers
/
SnapshotFilter.java
68 lines (56 loc) · 2.31 KB
/
SnapshotFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package org.javers.repository.sql.finders;
import org.javers.common.collections.Optional;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDateTime;
import org.polyjdbc.core.query.SelectQuery;
import org.polyjdbc.core.type.Timestamp;
import java.util.Date;
import static org.javers.repository.sql.schema.FixedSchemaFactory.*;
/**
* yes, assembling SQL using SnapshotFilters classes is tricky,
* any better ideas how to deal with it without code repetition?
*/
abstract class SnapshotFilter {
static final String COMMIT_WITH_SNAPSHOT
= SNAPSHOT_TABLE_NAME + " INNER JOIN " + COMMIT_TABLE_NAME + " ON " + COMMIT_PK + " = " + SNAPSHOT_COMMIT_FK;
static final String BASE_FIELDS =
SNAPSHOT_STATE + ", " +
SNAPSHOT_TYPE + ", " +
VERSION + ", " +
SNAPSHOT_CHANGED + ", " +
COMMIT_AUTHOR + ", " +
COMMIT_COMMIT_DATE + ", " +
COMMIT_COMMIT_ID;
final long primaryKey;
final String pkFieldName;
final Optional<String> propertyName;
public SnapshotFilter(long primaryKey, String pkFieldName, Optional<String> propertyName) {
this.primaryKey = primaryKey;
this.pkFieldName = pkFieldName;
this.propertyName = propertyName;
}
void addWhere(SelectQuery query) {
if (propertyName.isPresent()) {
query.where(pkFieldName + " = :pk " +
" AND " + SNAPSHOT_CHANGED + " like '%\"" + propertyName.get() + "\"%'")
.withArgument("pk", primaryKey);
} else {
query.where(pkFieldName + " = :pk")
.withArgument("pk", primaryKey);
}
}
void addFromDateCondition(SelectQuery query, LocalDateTime from) {
query.append(" AND " + COMMIT_COMMIT_DATE + " >= :commitFromDate")
.withArgument("commitFromDate", new Timestamp(new Date(from.toDateTime(DateTimeZone.UTC).getMillis())));
}
void addToDateCondition(SelectQuery query, LocalDateTime to) {
query.append(" AND " + COMMIT_COMMIT_DATE + " <= :commitToDate")
.withArgument("commitToDate", new Timestamp(new Date(to.toDateTime(DateTimeZone.UTC).getMillis())));
}
void addFrom(SelectQuery query) {
query.from(COMMIT_WITH_SNAPSHOT);
}
String select(){
return BASE_FIELDS;
}
}