Skip to content

Commit fe2f966

Browse files
committed
Issue 255 (PR Comments/Issues)
- Remove AbstractJDBCQueryBuilder and JDBCQueryBuilder getPrefix from Interface and Impl - Refactor NumberParmBehaviorUtil per JDBCOperator removal - Refactor DateParmBehaviorUtil per JDBCOperator removal - Refactor DateParmBehaviorUtilTest to remove UTC/Z formatting issues in the tests - Refactor DateTimeHandlerTest to remove UTC/Z formatting issues in tests - Refactor DateTimeHandler to remove unused unit and simplify code - Add test for LastUpdatedParmBehaviorUtilTest - Refactor LastUpdatedParmBehaviorUtil to remove references to JDBCOperator - Refactor SortedQuerySegmentAggregator to simplify Constants and JDBCOperators - Refactor UriModifierUtil / UriModifierUtilTest to simplify constants and JDBCConstants and JDBCOperators - Refactor JDBCConstants remove JDBCOperators and the prefix map - Refactor QuantityParmBehaviorUtil and LocationParmBehaviorUtil to simplify SQL operators. - Refactor out JDBCOperator from AbstractQueryBuilder / JDBCQueryBuilder - Refactor InclusionQuerySegmentAggregator / QuerySegmentAggregator query segments - Refactor CacheUtilTest to keep from printing useless output (added assertNotNull) - Tune down logging to FINE only (and reset minimum level to FINE) - Update JDBCParameterBuildingVisitor to reflect UTC - Update AbstractSearchDateTest to reflect UTC changes and more accurate precision - Resolve DateTimeHandler with Z test issues Signed-off-by: Paul Bastide <pbastide@us.ibm.com>
1 parent 63b3c09 commit fe2f966

26 files changed

Lines changed: 1050 additions & 751 deletions

File tree

fhir-core/src/main/java/com/ibm/fhir/core/FHIRUtilities.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.sql.Timestamp;
1010
import java.text.SimpleDateFormat;
11+
import java.time.ZoneId;
1112
import java.util.Base64;
1213
import java.util.Date;
1314
import java.util.TimeZone;
@@ -117,8 +118,7 @@ public static boolean isEncoded(String s) {
117118
* @return
118119
*/
119120
public static Timestamp convertToTimestamp(java.time.ZonedDateTime zdt) {
120-
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
121-
return Timestamp.from(zdt.toInstant());
121+
return Timestamp.from(zdt.withZoneSameInstant(ZoneId.of("UTC")).toInstant());
122122
}
123123

124124

fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/JDBCConstants.java

Lines changed: 27 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.Map;
1212

1313
import com.ibm.fhir.search.SearchConstants.Modifier;
14-
import com.ibm.fhir.search.SearchConstants.Prefix;
1514
import com.ibm.fhir.search.SearchConstants.Type;
1615

1716
public class JDBCConstants {
@@ -39,12 +38,11 @@ public class JDBCConstants {
3938

4039
// Generic SQL query string constants
4140
public static final String DOT = ".";
41+
public static final char DOT_CHAR = '.';
4242
public static final String WHERE = " WHERE ";
4343
public static final String PARAMETER_TABLE_ALIAS = "pX";
4444
public static final String LEFT_PAREN = "(";
4545
public static final String RIGHT_PAREN = ")";
46-
public static final String AND = " AND ";
47-
public static final String OR = " OR ";
4846
public static final String BIND_VAR = "?";
4947
public static final String PERCENT_WILDCARD = "%";
5048
public static final String UNDERSCORE_WILDCARD = "_";
@@ -65,6 +63,19 @@ public class JDBCConstants {
6563
public static final String COMMA = " , ";
6664
public static final char COMMA_CHAR = ',';
6765
public static final char QUOTE = '\'';
66+
public static final char PATH_CHAR = '/';
67+
68+
// JDBC Operators
69+
public static final String EQ = " = ";
70+
public static final String LIKE = " LIKE ";
71+
public static final String IN =" IN ";
72+
public static final String LT = " < ";
73+
public static final String LTE = " <= ";
74+
public static final String GT = " > ";
75+
public static final String GTE = " >= ";
76+
public static final String NE = " <> ";
77+
public static final String OR = " OR ";
78+
public static final String AND = " AND ";
6879

6980
// ASC/DESC
7081
public static final String ORDER_BY = " ORDER BY ";
@@ -73,25 +84,24 @@ public class JDBCConstants {
7384

7485
public static final String DEFAULT_ORDERING = " ORDER BY RESOURCE_ID ASC ";
7586
public static final String DEFAULT_ORDERING_WITH_TABLE = " ORDER BY R.RESOURCE_ID ASC ";
87+
88+
// MIN / MAX
89+
public static final String MAX = "MAX";
90+
public static final String MIN = "MIN";
7691

7792
/**
7893
* Maps search parameter types to the currently supported list of modifiers for
7994
* that type.
8095
*/
81-
public static Map<Type, List<Modifier>> supportedModifiersMap;
96+
public static final Map<Type, List<Modifier>> supportedModifiersMap;
8297

8398
/**
8499
* Maps Parameter modifiers to SQL operators.
85100
*/
86-
public static Map<Modifier, JDBCOperator> modifierOperatorMap;
87-
88-
/**
89-
* Maps Parameter value prefix operators to SQL operators.
90-
*/
91-
public static Map<Prefix, JDBCOperator> prefixOperatorMap;
101+
public static final Map<Modifier, String> modifierOperatorMap;
92102

93103
static {
94-
supportedModifiersMap = new HashMap<Type, List<Modifier>>();
104+
supportedModifiersMap = new HashMap<>();
95105
supportedModifiersMap.put(Type.STRING, Arrays.asList(Modifier.EXACT, Modifier.CONTAINS, Modifier.MISSING));
96106
supportedModifiersMap.put(Type.REFERENCE, Arrays.asList(Modifier.TYPE, Modifier.MISSING));
97107
supportedModifiersMap.put(Type.URI, Arrays.asList(Modifier.BELOW, Modifier.ABOVE, Modifier.MISSING));
@@ -103,60 +113,14 @@ public class JDBCConstants {
103113
supportedModifiersMap.put(Type.SPECIAL, Arrays.asList(Modifier.MISSING));
104114

105115
modifierOperatorMap = new HashMap<>();
106-
modifierOperatorMap.put(Modifier.ABOVE, JDBCOperator.GT);
107-
modifierOperatorMap.put(Modifier.BELOW, JDBCOperator.LT);
108-
modifierOperatorMap.put(Modifier.CONTAINS, JDBCOperator.LIKE);
109-
modifierOperatorMap.put(Modifier.EXACT, JDBCOperator.EQ);
110-
modifierOperatorMap.put(Modifier.NOT, JDBCOperator.NE);
111-
112-
prefixOperatorMap = new HashMap<>();
113-
prefixOperatorMap.put(Prefix.EQ, JDBCOperator.EQ);
114-
prefixOperatorMap.put(Prefix.GE, JDBCOperator.GTE);
115-
prefixOperatorMap.put(Prefix.GT, JDBCOperator.GT);
116-
prefixOperatorMap.put(Prefix.LE, JDBCOperator.LTE);
117-
prefixOperatorMap.put(Prefix.LT, JDBCOperator.LT);
118-
prefixOperatorMap.put(Prefix.NE, JDBCOperator.NE);
119-
prefixOperatorMap.put(Prefix.SA, JDBCOperator.GT);
120-
prefixOperatorMap.put(Prefix.EB, JDBCOperator.LT);
121-
prefixOperatorMap.put(Prefix.AP, JDBCOperator.EQ);
122-
}
123-
124-
/**
125-
* An enumeration of SQL query operators.
126-
*/
127-
public enum JDBCOperator {
128-
EQ(" = "),
129-
LIKE(" LIKE "),
130-
IN(" IN "),
131-
LT(" < "),
132-
LTE(" <= "),
133-
GT(" > "),
134-
GTE(" >= "),
135-
NE(" <> "),
136-
OR(" OR "),
137-
AND(" AND ");
138-
139-
private String value = null;
140-
141-
JDBCOperator(String value) {
142-
this.value = value;
143-
}
144-
145-
public String value() {
146-
return value;
147-
}
148-
149-
public static JDBCOperator fromValue(String value) {
150-
for (JDBCOperator operator : JDBCOperator.values()) {
151-
if (operator.value.equalsIgnoreCase(value)) {
152-
return operator;
153-
}
154-
}
155-
throw new IllegalArgumentException("No constant with value " + value + " found.");
156-
}
116+
modifierOperatorMap.put(Modifier.ABOVE, GT);
117+
modifierOperatorMap.put(Modifier.BELOW, LT);
118+
modifierOperatorMap.put(Modifier.CONTAINS, LIKE);
119+
modifierOperatorMap.put(Modifier.EXACT, EQ);
120+
modifierOperatorMap.put(Modifier.NOT, NE);
157121
}
158122

159123
private JDBCConstants() {
160124
// Hide the constructor
161125
}
162-
}
126+
}

fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/dao/impl/FHIRDbDAOImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.sql.SQLException;
1414
import java.util.ArrayList;
1515
import java.util.Arrays;
16+
import java.util.Calendar;
1617
import java.util.List;
1718
import java.util.Properties;
1819
import java.util.logging.Level;
@@ -361,7 +362,7 @@ protected List<Resource> runQuery(String sql, Object... searchArgs) throws FHIRP
361362
connection = this.getConnection();
362363
stmt = connection.prepareStatement(sql);
363364
// Inject arguments into the prepared stmt.
364-
for (int i = 0; i <searchArgs.length; i++) {
365+
for (int i = 0; i <searchArgs.length; i++) {
365366
stmt.setObject(i+1, searchArgs[i]);
366367
}
367368
dbCallStartTime = System.nanoTime();
@@ -417,7 +418,7 @@ protected int runCountQuery(String sql, Object... searchArgs) throws FHIRPersist
417418
connection = this.getConnection();
418419
stmt = connection.prepareStatement(sql);
419420
// Inject arguments into the prepared stmt.
420-
for (int i = 0; i <searchArgs.length; i++) {
421+
for (int i = 0; i <searchArgs.length; i++) {
421422
stmt.setObject(i+1, searchArgs[i]);
422423
}
423424
dbCallStartTime = System.nanoTime();

fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/util/InclusionQuerySegmentAggregator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66

77
package com.ibm.fhir.persistence.jdbc.util;
88

9+
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.AND;
910
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.COMBINED_RESULTS;
11+
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.COMMA;
1012
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.LEFT_PAREN;
11-
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.RIGHT_PAREN;
1213
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.QUOTE;
13-
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.COMMA;
14+
import static com.ibm.fhir.persistence.jdbc.JDBCConstants.RIGHT_PAREN;
1415

1516
import java.util.ArrayList;
1617
import java.util.List;
1718
import java.util.logging.Logger;
1819

1920
import com.ibm.fhir.persistence.exception.FHIRPersistenceException;
20-
import com.ibm.fhir.persistence.jdbc.JDBCConstants.JDBCOperator;
2121
import com.ibm.fhir.persistence.jdbc.dao.api.ParameterDAO;
2222
import com.ibm.fhir.persistence.jdbc.dao.api.ResourceDAO;
2323
import com.ibm.fhir.search.parameters.InclusionParameter;
@@ -211,7 +211,7 @@ private void executeIncludeSubQuery(StringBuilder queryString, InclusionParamete
211211
// P1.PARAMETER_NAME_ID=xx AND
212212
subQueryString.append("P1.PARAMETER_NAME_ID=")
213213
.append(this.getParameterNameId(includeParm.getSearchParameter()))
214-
.append(JDBCOperator.AND.value());
214+
.append(AND);
215215

216216
// P1.LOGICAL_RESOURCE_ID IN
217217
subQueryString.append("P1.LOGICAL_RESOURCE_ID IN ");

fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/util/JDBCParameterBuildingVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ public class JDBCParameterBuildingVisitor extends DefaultVisitor {
7777
// Derby: https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj271.html
7878
private static final Timestamp SMALLEST_TIMESTAMP =
7979
Timestamp.from(
80-
((ZonedDateTime) DateTimeHandler.parseQuiet("0001-01-01T00:00:00.000000Z+00:00")).toInstant());
80+
((ZonedDateTime) DateTimeHandler.parseQuiet("0001-01-01T00:00:00.000000+00:00")).toInstant());
8181

8282
// 23:59:59.999999 used instead of 24:00:00.000000 to ensure it could be represented in FHIR if needed
8383
private static final Timestamp LARGEST_TIMESTAMP =
8484
Timestamp.from(
85-
((ZonedDateTime) DateTimeHandler.parseQuiet("9999-12-31T23:59:59.999999Z+00:00")).toInstant());
85+
((ZonedDateTime) DateTimeHandler.parseQuiet("9999-12-31T23:59:59.999999+00:00")).toInstant());
8686

8787
// We only need the SearchParameter type and code, so just store those directly as members
8888
private final String searchParamCode;

0 commit comments

Comments
 (0)