Skip to content

Commit 530afe0

Browse files
authored
Merge pull request #17 from AdvancedPhotonSource/search-improvement
Search improvement
2 parents ae1c4c1 + f27409a commit 530afe0

13 files changed

Lines changed: 571 additions & 198 deletions

File tree

src/java/LogrPortal/src/java/gov/anl/aps/logr/common/mqtt/model/SearchEvent.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.fasterxml.jackson.annotation.JsonIgnore;
88
import gov.anl.aps.logr.common.mqtt.constants.CallSource;
99
import gov.anl.aps.logr.common.mqtt.constants.MqttTopic;
10-
import gov.anl.aps.logr.common.mqtt.model.entities.SearchOptions;
10+
import gov.anl.aps.logr.common.mqtt.model.entities.LogbookSearchOptions;
1111

1212
/**
1313
* MQTT event for search operations.
@@ -17,10 +17,10 @@
1717
public class SearchEvent extends MqttEvent {
1818

1919
private String searchText;
20-
private SearchOptions searchOptions;
20+
private LogbookSearchOptions searchOptions;
2121
private CallSource source; // "API" or "Portal"
2222

23-
public SearchEvent(String searchText, SearchOptions searchOptions, CallSource searchSource) {
23+
public SearchEvent(String searchText, LogbookSearchOptions searchOptions, CallSource searchSource) {
2424
super();
2525
this.searchText = searchText;
2626
this.searchOptions = searchOptions;
@@ -38,7 +38,7 @@ public String getSearchText() {
3838
return searchText;
3939
}
4040

41-
public SearchOptions getSearchOptions() {
41+
public LogbookSearchOptions getSearchOptions() {
4242
return searchOptions;
4343
}
4444

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* Copyright (c) UChicago Argonne, LLC. All rights reserved.
3+
* See LICENSE file.
4+
*/
5+
package gov.anl.aps.logr.common.mqtt.model.entities;
6+
7+
import com.fasterxml.jackson.annotation.JsonFormat;
8+
import gov.anl.aps.logr.portal.model.db.entities.EntityType;
9+
import gov.anl.aps.logr.portal.model.db.entities.ItemType;
10+
import gov.anl.aps.logr.portal.model.db.entities.UserInfo;
11+
import java.util.Date;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
15+
/**
16+
* Search options for logbook search MQTT events.
17+
*
18+
* @author djarosz
19+
*/
20+
public class LogbookSearchOptions {
21+
22+
private final List<FilterItem> logbookTypes;
23+
private final List<FilterItem> systems;
24+
private final List<FilterItem> users;
25+
private final Date startModifiedDate;
26+
private final Date endModifiedDate;
27+
private final Date startCreatedDate;
28+
private final Date endCreatedDate;
29+
private final boolean caseInsensitive;
30+
31+
public LogbookSearchOptions(
32+
List<EntityType> logbookTypes,
33+
List<ItemType> systems,
34+
List<UserInfo> users,
35+
Date startModifiedDate,
36+
Date endModifiedDate,
37+
Date startCreatedDate,
38+
Date endCreatedDate,
39+
boolean caseInsensitive) {
40+
41+
this.logbookTypes = toFilterItems(logbookTypes, e -> new FilterItem(e.getId(), e.getName()));
42+
this.systems = toFilterItems(systems, s -> new FilterItem(s.getId(), s.getName()));
43+
this.users = toFilterItems(users, u -> new FilterItem(u.getId(), u.getUsername()));
44+
this.startModifiedDate = startModifiedDate;
45+
this.endModifiedDate = endModifiedDate;
46+
this.startCreatedDate = startCreatedDate;
47+
this.endCreatedDate = endCreatedDate;
48+
this.caseInsensitive = caseInsensitive;
49+
}
50+
51+
private <T> List<FilterItem> toFilterItems(List<T> list, java.util.function.Function<T, FilterItem> mapper) {
52+
if (list == null) {
53+
return null;
54+
}
55+
return list.stream().map(mapper).collect(Collectors.toList());
56+
}
57+
58+
public List<FilterItem> getLogbookTypes() {
59+
return logbookTypes;
60+
}
61+
62+
public List<FilterItem> getSystems() {
63+
return systems;
64+
}
65+
66+
public List<FilterItem> getUsers() {
67+
return users;
68+
}
69+
70+
@JsonFormat(shape = JsonFormat.Shape.STRING)
71+
public Date getStartModifiedDate() {
72+
return startModifiedDate;
73+
}
74+
75+
@JsonFormat(shape = JsonFormat.Shape.STRING)
76+
public Date getEndModifiedDate() {
77+
return endModifiedDate;
78+
}
79+
80+
@JsonFormat(shape = JsonFormat.Shape.STRING)
81+
public Date getStartCreatedDate() {
82+
return startCreatedDate;
83+
}
84+
85+
@JsonFormat(shape = JsonFormat.Shape.STRING)
86+
public Date getEndCreatedDate() {
87+
return endCreatedDate;
88+
}
89+
90+
public boolean isCaseInsensitive() {
91+
return caseInsensitive;
92+
}
93+
94+
public static class FilterItem {
95+
96+
private int id;
97+
private String name;
98+
99+
public FilterItem(int id, String name) {
100+
this.id = id;
101+
this.name = name;
102+
}
103+
104+
public int getId() {
105+
return id;
106+
}
107+
108+
public String getName() {
109+
return name;
110+
}
111+
}
112+
}

src/java/LogrPortal/src/java/gov/anl/aps/logr/common/mqtt/model/entities/SearchOptions.java

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/java/LogrPortal/src/java/gov/anl/aps/logr/portal/controllers/ItemDomainLogbookController.java

Lines changed: 15 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import gov.anl.aps.logr.common.exceptions.CdbException;
88
import gov.anl.aps.logr.common.exceptions.InvalidObjectState;
9+
import gov.anl.aps.logr.common.mqtt.constants.CallSource;
10+
import gov.anl.aps.logr.common.mqtt.model.entities.LogbookSearchOptions;
911
import gov.anl.aps.logr.common.utilities.CollectionUtility;
1012
import gov.anl.aps.logr.portal.constants.EntityTypeName;
1113
import gov.anl.aps.logr.portal.constants.LogDocumentSettings;
@@ -16,6 +18,7 @@
1618
import gov.anl.aps.logr.portal.controllers.utilities.EntityInfoControllerUtility;
1719
import gov.anl.aps.logr.portal.controllers.utilities.EntityTypeControllerUtility;
1820
import gov.anl.aps.logr.portal.controllers.utilities.ItemDomainLogbookControllerUtility;
21+
import gov.anl.aps.logr.portal.controllers.utilities.SearchControllerUtility;
1922
import gov.anl.aps.logr.portal.controllers.utilities.LogReactionControllerUtility;
2023
import gov.anl.aps.logr.portal.controllers.utilities.PropertyTypeControllerUtility;
2124
import gov.anl.aps.logr.portal.controllers.utilities.SettingTypeControllerUtility;
@@ -52,13 +55,13 @@
5255
import java.time.format.DateTimeFormatter;
5356
import java.time.temporal.ChronoUnit;
5457
import java.util.ArrayList;
55-
import java.util.Calendar;
58+
5659
import java.util.Date;
5760
import java.util.List;
5861
import java.util.Map;
5962
import java.util.Objects;
6063
import java.util.logging.Level;
61-
import java.util.regex.Pattern;
64+
6265
import javax.ejb.EJB;
6366
import javax.enterprise.context.SessionScoped;
6467
import javax.faces.component.UIComponent;
@@ -1049,26 +1052,19 @@ public void performEntitySearch(String searchString, boolean caseInsensitive) {
10491052
SearchSettings searchSettings = searchCtrl.getSearchSettings();
10501053
Boolean advancedSearch = searchSettings.getAdvancedSearch();
10511054

1052-
String entityTypeIdList = null;
1053-
String itemTypeIdList = null;
1054-
String userIdList = null;
10551055
Date startModifiedTime = null;
10561056
Date endModifiedTime = null;
10571057
Date startCreatedTime = null;
10581058
Date endCreatedTime = null;
10591059

10601060
if (advancedSearch) {
1061-
entityTypeIdList = CollectionUtility.generateIdListString(searchLogbookTypeList);
1062-
itemTypeIdList = CollectionUtility.generateIdListString(searchSystemList);
1063-
userIdList = CollectionUtility.generateIdListString(searchUserList);
1064-
10651061
startModifiedTime = searchModifiedStartDate;
10661062
endModifiedTime = searchModifiedEndDate;
10671063
startCreatedTime = searchCreatedStartDate;
10681064
endCreatedTime = searchCreatedEndDate;
10691065

1070-
endModifiedTime = adjustEndTime(endModifiedTime);
1071-
endCreatedTime = adjustEndTime(endCreatedTime);
1066+
endModifiedTime = ItemDomainLogbookControllerUtility.adjustEndTimeForSearch(endModifiedTime);
1067+
endCreatedTime = ItemDomainLogbookControllerUtility.adjustEndTimeForSearch(endCreatedTime);
10721068
}
10731069

10741070
resetSearchVariables();
@@ -1079,67 +1075,15 @@ public void performEntitySearch(String searchString, boolean caseInsensitive) {
10791075

10801076
super.performEntitySearch(searchString, searchArgs, caseInsensitive);
10811077

1082-
// Search log entries.
1083-
List<Object[]> results = itemDomainLogbookFacade.searchEntityLogs(searchString, itemTypeIdList, entityTypeIdList, userIdList,
1084-
startModifiedTime, endModifiedTime, startCreatedTime, endCreatedTime);
1085-
1086-
ItemDomainLogbookControllerUtility controllerUtility1 = getControllerUtility();
1087-
String patternString = controllerUtility1.generatePatternString(searchString);
1088-
Pattern searchPattern = controllerUtility1.getSearchPattern(patternString, caseInsensitive);
1089-
1090-
logResults = new ArrayList<>();
1091-
1092-
for (Object[] result : results) {
1093-
ItemDomainLogbook logbook = (ItemDomainLogbook) result[0];
1094-
Log log = (Log) result[1];
1095-
Long logId = (Long) result[2];
1096-
1097-
SearchResult searchResult = new SearchResult(logbook, logbook.getId(), logbook.getName(), log);
1098-
searchResult.setAdditionalAttribute("" + logId);
1099-
1100-
String text = log.getText();
1101-
String[] logLines = text.split("\n");
1102-
String matching_lines = "";
1103-
1104-
for (int i = 0; i < logLines.length; i++) {
1105-
String lineText = logLines[i];
1106-
1107-
if (searchPattern.matcher(lineText).find()) {
1108-
matching_lines += lineText + "\n";
1109-
}
1110-
}
1111-
searchResult.addAttributeMatch("log entry", matching_lines);
1112-
1113-
controllerUtility1.addCommonLogEntryDocumentMatches(searchResult, searchLogbookTypeList, searchSystemList);
1114-
1115-
if (searchUserList != null && !searchUserList.isEmpty()) {
1116-
for (UserInfo ui : searchUserList) {
1117-
Integer searchUserId = ui.getId();
1078+
// Search log entries using shared utility method.
1079+
logResults = utility.searchLogEntries(searchString, caseInsensitive, searchArgs);
11181080

1119-
UserInfo enteredByUser = log.getEnteredByUser();
1120-
UserInfo lastModifiedByUser = log.getLastModifiedByUser();
1121-
1122-
if (Objects.equals(enteredByUser.getId(), searchUserId)) {
1123-
searchResult.addAttributeMatch("Create User", enteredByUser.toString());
1124-
}
1125-
if (Objects.equals(lastModifiedByUser.getId(), searchUserId)) {
1126-
searchResult.addAttributeMatch("Last Modify User", lastModifiedByUser.toString());
1127-
}
1128-
}
1129-
}
1130-
1131-
if (startCreatedTime != null || endCreatedTime != null) {
1132-
Date enteredOnDateTime = log.getEnteredOnDateTime();
1133-
searchResult.addAttributeMatch("Created on", enteredOnDateTime.toString());
1134-
}
1135-
1136-
if (startModifiedTime != null || endModifiedTime != null) {
1137-
Date modifiedOnDateTime = log.getLastModifiedOnDateTime();
1138-
searchResult.addAttributeMatch("Modified on", modifiedOnDateTime.toString());
1139-
}
1140-
1141-
logResults.add(searchResult);
1142-
}
1081+
// Publish MQTT search event with logbook-specific options
1082+
LogbookSearchOptions options = new LogbookSearchOptions(
1083+
searchLogbookTypeList, searchSystemList, searchUserList,
1084+
startModifiedTime, endModifiedTime,
1085+
startCreatedTime, endCreatedTime, caseInsensitive);
1086+
SearchControllerUtility.publishSearchMqttEvent(searchString, options, CallSource.Portal);
11431087
}
11441088

11451089
public String getSearchOpts() {
@@ -1250,20 +1194,6 @@ public void processSearchRequestParams() {
12501194
}
12511195
}
12521196

1253-
private Date adjustEndTime(Date endTime) {
1254-
if (endTime != null) {
1255-
// Add offset to the end of the selected date.
1256-
Calendar endDateCal = Calendar.getInstance();
1257-
endDateCal.setTime(endTime);
1258-
endDateCal.set(Calendar.HOUR, 23);
1259-
endDateCal.set(Calendar.MINUTE, 59);
1260-
endDateCal.set(Calendar.SECOND, 59);
1261-
endTime = endDateCal.getTime();
1262-
}
1263-
1264-
return endTime;
1265-
}
1266-
12671197
public List<SearchResult> getLogResults() {
12681198
return logResults;
12691199
}

src/java/LogrPortal/src/java/gov/anl/aps/logr/portal/controllers/SearchController.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
package gov.anl.aps.logr.portal.controllers;
66

77
import gov.anl.aps.logr.common.constants.CdbProperty;
8-
import gov.anl.aps.logr.common.mqtt.constants.CallSource;
9-
import gov.anl.aps.logr.common.mqtt.model.entities.SearchOptions;
108
import gov.anl.aps.logr.portal.controllers.settings.SearchSettings;
11-
import gov.anl.aps.logr.portal.controllers.utilities.SearchControllerUtility;
129
import gov.anl.aps.logr.portal.utilities.ConfigurationUtility;
1310
import gov.anl.aps.logr.portal.utilities.SessionUtility;
1411
import java.io.IOException;
@@ -117,19 +114,6 @@ public void prepareSearch() {
117114

118115
public void search() {
119116
if (performSearch) {
120-
// Publish anonymous MQTT event for search
121-
SearchOptions searchOptions = new SearchOptions(
122-
searchSettings.getDisplayItemElements(),
123-
searchSettings.getDisplayItemTypes(),
124-
searchSettings.getDisplayItemCategories(),
125-
searchSettings.getDisplayPropertyTypes(),
126-
searchSettings.getDisplayPropertyTypeCategories(),
127-
searchSettings.getDisplaySources(),
128-
searchSettings.getDisplayUsers(),
129-
searchSettings.getDisplayUserGroups()
130-
);
131-
SearchControllerUtility.publishSearchMqttEvent(searchString, searchOptions, CallSource.Portal);
132-
133117
for (CdbEntityController controller : searchableControllers) {
134118
// Check if controller needs to be skipped.
135119
if (controller instanceof ItemTypeController) {

0 commit comments

Comments
 (0)