Skip to content

Commit 12ad8c6

Browse files
Adding court coverage to code search endpoints (#309)
Would allow a new param to let you either get all of the search results for a string, or would let you get courts that a particular search query would be sufficient for partial matches with. Turns a custom python script that takes 150 seconds to run into a single query that can be added to the codes interview to give detailed information about a particular search string. That query will be added once this is in stage.
1 parent be1992b commit 12ad8c6

12 files changed

Lines changed: 386 additions & 96 deletions

File tree

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CaseCategory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ public static String searchCaseCategories() {
105105
""";
106106
}
107107

108+
public static String courtCoverageCaseCategories() {
109+
return """
110+
SELECT DISTINCT location
111+
FROM casecategory
112+
WHERE domain=? AND name ILIKE ?
113+
ORDER BY location
114+
""";
115+
}
116+
108117
public static String retrieveCaseCategoryForName() {
109118
return """
110119
SELECT DISTINCT code, location

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CaseType.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,21 @@ public static PreparedStatement prepSearchQuery(Connection conn, String domain,
162162
return st;
163163
}
164164

165+
public static PreparedStatement prepCourtCoverage(
166+
Connection conn, String domain, String searchTerm) throws SQLException {
167+
String search =
168+
"""
169+
SELECT DISTINCT location
170+
FROM casetype
171+
WHERE domain=? AND name ILIKE ?
172+
ORDER BY location
173+
""";
174+
PreparedStatement st = conn.prepareStatement(search);
175+
st.setString(1, domain);
176+
st.setString(2, searchTerm);
177+
return st;
178+
}
179+
165180
public static PreparedStatement prepRetrieveQuery(
166181
Connection conn, String domain, String caseTypeName) throws SQLException {
167182
String retrieve =

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/CodeDatabase.java

Lines changed: 71 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import edu.suffolk.litlab.efsp.ecfcodes.CodeDatabaseAPI;
44
import edu.suffolk.litlab.efsp.ecfcodes.tyler.CodeTableConstants.UnsupportedTableException;
55
import edu.suffolk.litlab.efsp.stdlib.SQLFunction;
6+
import edu.suffolk.litlab.efsp.stdlib.SQLGetter;
67
import edu.suffolk.litlab.efsp.tyler.TylerEnv;
78
import jakarta.xml.bind.JAXBException;
89
import java.io.InputStream;
@@ -271,20 +272,26 @@ private static String likeWildcard(String searchTerm) {
271272
* @return
272273
*/
273274
public List<String> searchCaseCategory(String searchTerm) {
274-
String finalSearchTerm = likeWildcard(searchTerm);
275-
return safetyWrap(
276-
() -> {
275+
return genericSearch(
276+
searchTerm,
277+
(term) -> {
277278
String query = CaseCategory.searchCaseCategories();
278-
List<String> cats = new ArrayList<>();
279-
try (PreparedStatement st = conn.prepareStatement(query)) {
280-
st.setString(1, tylerDomain);
281-
st.setString(2, finalSearchTerm);
282-
ResultSet rs = st.executeQuery();
283-
while (rs.next()) {
284-
cats.add(rs.getString(1));
285-
}
286-
}
287-
return cats;
279+
PreparedStatement st = conn.prepareStatement(query);
280+
st.setString(1, tylerDomain);
281+
st.setString(2, term);
282+
return st;
283+
});
284+
}
285+
286+
public List<String> courtCoverageCaseCategory(String searchTerm) {
287+
return genericSearch(
288+
searchTerm,
289+
(term) -> {
290+
String query = CaseCategory.courtCoverageCaseCategories();
291+
PreparedStatement st = conn.prepareStatement(query);
292+
st.setString(1, tylerDomain);
293+
st.setString(2, term);
294+
return st;
288295
});
289296
}
290297

@@ -378,19 +385,11 @@ public Optional<CaseCategory> getCaseCategoryWithCode(
378385
* @return
379386
*/
380387
public List<String> searchCaseType(String searchTerm) {
381-
String finalSearchTerm = likeWildcard(searchTerm);
382-
return safetyWrap(
383-
() -> {
384-
try (PreparedStatement st =
385-
CaseType.prepSearchQuery(conn, tylerDomain, finalSearchTerm)) {
386-
List<String> types = new ArrayList<>();
387-
ResultSet rs = st.executeQuery();
388-
while (rs.next()) {
389-
types.add(rs.getString(1));
390-
}
391-
return types;
392-
}
393-
});
388+
return genericSearch(searchTerm, (term) -> CaseType.prepSearchQuery(conn, tylerDomain, term));
389+
}
390+
391+
public List<String> courtCoverageCaseType(String searchTerm) {
392+
return genericSearch(searchTerm, (term) -> CaseType.prepCourtCoverage(conn, tylerDomain, term));
394393
}
395394

396395
/**
@@ -616,11 +615,27 @@ public List<NameAndCode> getProcedureOrRemedy(String courtLocationId, String cas
616615
* @return
617616
*/
618617
public List<String> searchFilingType(String searchTerm) {
618+
return genericSearch(searchTerm, (term) -> FilingCode.prepSearchQuery(conn, tylerDomain, term));
619+
}
620+
621+
/**
622+
* Gets the courts that have a filing type that is matched by this search term.
623+
*
624+
* @param searchTerm
625+
* @return
626+
*/
627+
public List<String> courtCoverageFilingType(String searchTerm) {
628+
return genericSearch(
629+
searchTerm, (term) -> FilingCode.prepCourtCoverageQuery(conn, tylerDomain, term));
630+
}
631+
632+
/** Runs all of the logic for search queries (both name searches and court coverage searches). */
633+
private List<String> genericSearch(
634+
String searchTerm, SQLFunction<String, PreparedStatement> queryMaker) {
619635
String finalSearchTerm = likeWildcard(searchTerm);
620636
return safetyWrap(
621637
() -> {
622-
try (PreparedStatement st =
623-
FilingCode.prepSearchQuery(conn, tylerDomain, finalSearchTerm)) {
638+
try (PreparedStatement st = queryMaker.apply(finalSearchTerm)) {
624639
List<String> types = new ArrayList<>();
625640
ResultSet rs = st.executeQuery();
626641
while (rs.next()) {
@@ -733,20 +748,26 @@ public List<NameAndCode> getDamageAmount(String courtLocationId, String caseCate
733748
* @return
734749
*/
735750
public List<String> searchPartyType(String searchTerm) {
736-
String finalSearchTerm = likeWildcard(searchTerm);
737-
return safetyWrap(
738-
() -> {
751+
return genericSearch(
752+
searchTerm,
753+
(term) -> {
739754
String query = PartyType.searchPartyType();
740-
List<String> types = new ArrayList<>();
741-
try (PreparedStatement st = conn.prepareStatement(query)) {
742-
st.setString(1, tylerDomain);
743-
st.setString(2, finalSearchTerm);
744-
ResultSet rs = st.executeQuery();
745-
while (rs.next()) {
746-
types.add(rs.getString(1));
747-
}
748-
return types;
749-
}
755+
PreparedStatement st = conn.prepareStatement(query);
756+
st.setString(1, tylerDomain);
757+
st.setString(2, term);
758+
return st;
759+
});
760+
}
761+
762+
public List<String> courtCoveragePartyType(String searchTerm) {
763+
return genericSearch(
764+
searchTerm,
765+
(term) -> {
766+
String query = PartyType.courtCoveragePartyType();
767+
PreparedStatement st = conn.prepareStatement(query);
768+
st.setString(1, tylerDomain);
769+
st.setString(2, term);
770+
return st;
750771
});
751772
}
752773

@@ -1053,19 +1074,13 @@ public List<NameAndCode> getFilingStatuses(String courtId) {
10531074
}
10541075

10551076
public List<String> searchOptionalServices(String searchTerm) {
1056-
final String finalSearchTerm = likeWildcard(searchTerm);
1057-
return safetyWrap(
1058-
() -> {
1059-
try (PreparedStatement st =
1060-
OptionalServiceCode.prepSearch(conn, tylerDomain, finalSearchTerm)) {
1061-
List<String> optServs = new ArrayList<>();
1062-
ResultSet rs = st.executeQuery();
1063-
while (rs.next()) {
1064-
optServs.add(rs.getString(1));
1065-
}
1066-
return optServs;
1067-
}
1068-
});
1077+
return genericSearch(
1078+
searchTerm, (term) -> OptionalServiceCode.prepSearch(conn, tylerDomain, term));
1079+
}
1080+
1081+
public List<String> courtCoverageOptionalServices(String searchTerm) {
1082+
return genericSearch(
1083+
searchTerm, (term) -> OptionalServiceCode.prepCourtCoverage(conn, tylerDomain, term));
10691084
}
10701085

10711086
public List<CodeAndLocation> retrieveOptionalServices(String optServName) {
@@ -1361,7 +1376,7 @@ public List<Disclaimer> getDisclaimerRequirements(String courtLocation) {
13611376
});
13621377
}
13631378

1364-
private <T> List<T> safetyWrap(SQLFunction<List<T>> sup) {
1379+
private <T> List<T> safetyWrap(SQLGetter<List<T>> sup) {
13651380
if (conn == null) {
13661381
log.error("SQL connection not created yet!");
13671382
return List.of();
@@ -1374,7 +1389,7 @@ private <T> List<T> safetyWrap(SQLFunction<List<T>> sup) {
13741389
}
13751390
}
13761391

1377-
private <T> Optional<T> safetyWrapOpt(SQLFunction<Optional<T>> sup) {
1392+
private <T> Optional<T> safetyWrapOpt(SQLGetter<Optional<T>> sup) {
13781393
if (conn == null) {
13791394
log.error("SQL connection not created yet!");
13801395
return Optional.empty();

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/FilingCode.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,19 @@ public static PreparedStatement prepSearchQuery(Connection conn, String domain,
9191
st.setString(2, searchTerm);
9292
return st;
9393
}
94+
95+
public static PreparedStatement prepCourtCoverageQuery(Connection conn, String domain, String searchTerm) throws SQLException {
96+
final String search = """
97+
SELECT DISTINCT location
98+
FROM filing
99+
WHERE domain=? AND casecategory='' AND casetypeid='' AND name ILIKE ?
100+
ORDER BY location
101+
""";
102+
PreparedStatement st = conn.prepareStatement(search);
103+
st.setString(1, domain);
104+
st.setString(2, searchTerm);
105+
return st;
106+
}
94107

95108
public static PreparedStatement prepRetrieveQuery(Connection conn, String domain, String filingName) throws SQLException {
96109
String retrieve = """

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/OptionalServiceCode.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,21 @@ public static PreparedStatement prepSearch(Connection conn, String domain, Strin
109109
return st;
110110
}
111111

112+
public static PreparedStatement prepCourtCoverage(
113+
Connection conn, String domain, String searchTerm) throws SQLException {
114+
final String search =
115+
"""
116+
SELECT DISTINCT location
117+
FROM optionalservices as os
118+
WHERE os.domain=? AND os.name ILIKE ?
119+
ORDER BY location
120+
""";
121+
PreparedStatement st = conn.prepareStatement(search);
122+
st.setString(1, domain);
123+
st.setString(2, searchTerm);
124+
return st;
125+
}
126+
112127
public static PreparedStatement prepRetrieve(Connection conn, String domain, String optServName)
113128
throws SQLException {
114129
final String retrieve =

proxyserver/src/main/java/edu/suffolk/litlab/efsp/ecfcodes/tyler/PartyType.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ public static String searchPartyType() {
8080
""";
8181
}
8282

83+
public static String courtCoveragePartyType() {
84+
return """
85+
SELECT DISTINCT location
86+
FROM partytype
87+
WHERE domain=? and name ILIKE ?
88+
ORDER BY location
89+
""";
90+
}
91+
8392
public static String retrievePartyTypeFromName() {
8493
return """
8594
SELECT DISTINCT code, location

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/EfspServer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import edu.suffolk.litlab.efsp.server.setup.EfmRestCallbackInterface;
2222
import edu.suffolk.litlab.efsp.server.setup.jeffnet.JeffNetModuleSetup;
2323
import edu.suffolk.litlab.efsp.server.setup.tyler.TylerModuleSetup;
24+
import edu.suffolk.litlab.efsp.server.utils.EnumExceptionMapper;
2425
import edu.suffolk.litlab.efsp.server.utils.JsonExceptionMapper;
2526
import edu.suffolk.litlab.efsp.server.utils.ObservabilityHeadersInterceptor;
2627
import edu.suffolk.litlab.efsp.server.utils.ObservabilityResetInterceptor;
@@ -174,6 +175,7 @@ public static List<?> providers() {
174175
new JacksonJsonProvider(), // TODO(brycew): JAXBJSon?
175176
new SoapExceptionMapper(),
176177
new JsonExceptionMapper(),
178+
new EnumExceptionMapper(),
177179
new ObservabilityHeadersInterceptor(),
178180
new ObservabilityResetInterceptor());
179181
}

0 commit comments

Comments
 (0)