Skip to content

Commit 2dc84db

Browse files
committed
IQSS#9317 - Allowing to delete saved search
1 parent 5cbb895 commit 2dc84db

File tree

2 files changed

+61
-15
lines changed

2 files changed

+61
-15
lines changed

src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -173,16 +173,18 @@ public Response add(JsonObject body) {
173173

174174
@DELETE
175175
@Path("{id}")
176-
public Response delete(@PathParam("id") long doomedId) {
177-
boolean disabled = true;
178-
if (disabled) {
179-
return error(BAD_REQUEST, "Saved Searches can not safely be deleted because links can not safely be deleted. See https://github.com/IQSS/dataverse/issues/1364 for details.");
180-
}
176+
public Response delete(@PathParam("id") long doomedId, @QueryParam("unlink") boolean unlink) {
181177
SavedSearch doomed = savedSearchSvc.find(doomedId);
182178
if (doomed == null) {
183179
return error(NOT_FOUND, "Could not find saved search id " + doomedId);
184180
}
185-
boolean wasDeleted = savedSearchSvc.delete(doomedId);
181+
boolean wasDeleted;
182+
try {
183+
wasDeleted = savedSearchSvc.delete(doomedId, unlink);
184+
} catch (Exception e) {
185+
return error(INTERNAL_SERVER_ERROR, "Problem while trying to unlink links of saved search id " + doomedId);
186+
}
187+
186188
if (wasDeleted) {
187189
return ok(Json.createObjectBuilder().add("Deleted", doomedId));
188190
} else {

src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java

+53-9
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
22

33
import edu.harvard.iq.dataverse.Dataset;
44
import edu.harvard.iq.dataverse.DatasetLinkingDataverse;
5+
import edu.harvard.iq.dataverse.DatasetLinkingServiceBean;
56
import edu.harvard.iq.dataverse.Dataverse;
67
import edu.harvard.iq.dataverse.DataverseLinkingDataverse;
8+
import edu.harvard.iq.dataverse.DataverseLinkingServiceBean;
79
import edu.harvard.iq.dataverse.DvObject;
810
import edu.harvard.iq.dataverse.DvObjectServiceBean;
911
import edu.harvard.iq.dataverse.EjbDataverseEngine;
1012
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
1113
import edu.harvard.iq.dataverse.authorization.users.GuestUser;
1214
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
13-
import edu.harvard.iq.dataverse.search.SearchServiceBean;
14-
import edu.harvard.iq.dataverse.search.SolrQueryResponse;
15-
import edu.harvard.iq.dataverse.search.SolrSearchResult;
1615
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
16+
import edu.harvard.iq.dataverse.engine.command.impl.DeleteDatasetLinkingDataverseCommand;
17+
import edu.harvard.iq.dataverse.engine.command.impl.DeleteDataverseLinkingDataverseCommand;
1718
import edu.harvard.iq.dataverse.engine.command.impl.LinkDatasetCommand;
1819
import edu.harvard.iq.dataverse.engine.command.impl.LinkDataverseCommand;
1920
import edu.harvard.iq.dataverse.search.SearchException;
2021
import edu.harvard.iq.dataverse.search.SearchFields;
22+
import edu.harvard.iq.dataverse.search.SearchServiceBean;
23+
import edu.harvard.iq.dataverse.search.SolrQueryResponse;
24+
import edu.harvard.iq.dataverse.search.SolrSearchResult;
2125
import edu.harvard.iq.dataverse.search.SortBy;
2226
import edu.harvard.iq.dataverse.util.SystemConfig;
23-
import java.util.ArrayList;
24-
import java.util.Date;
25-
import java.util.List;
26-
import java.util.logging.Level;
27-
import java.util.logging.Logger;
2827
import jakarta.ejb.EJB;
2928
import jakarta.ejb.Schedule;
3029
import jakarta.ejb.Stateless;
@@ -39,6 +38,12 @@
3938
import jakarta.persistence.TypedQuery;
4039
import jakarta.servlet.http.HttpServletRequest;
4140

41+
import java.util.ArrayList;
42+
import java.util.Date;
43+
import java.util.List;
44+
import java.util.logging.Level;
45+
import java.util.logging.Logger;
46+
4247
@Stateless
4348
@Named
4449
public class SavedSearchServiceBean {
@@ -50,6 +55,10 @@ public class SavedSearchServiceBean {
5055
@EJB
5156
DvObjectServiceBean dvObjectService;
5257
@EJB
58+
protected DatasetLinkingServiceBean dsLinkingService;
59+
@EJB
60+
protected DataverseLinkingServiceBean dvLinkingService;
61+
@EJB
5362
EjbDataverseEngine commandEngine;
5463
@EJB
5564
SystemConfig systemConfig;
@@ -101,11 +110,15 @@ public SavedSearch add(SavedSearch toPersist) {
101110
return persisted;
102111
}
103112

104-
public boolean delete(long id) {
113+
public boolean delete(long id, boolean unlink) throws SearchException, CommandException {
105114
SavedSearch doomed = find(id);
106115
boolean wasDeleted = false;
107116
if (doomed != null) {
108117
System.out.println("deleting saved search id " + doomed.getId());
118+
if(unlink) {
119+
DataverseRequest dataverseRequest = new DataverseRequest(doomed.getCreator(), getHttpServletRequest());
120+
unLinksForSingleSavedSearch(dataverseRequest, doomed);
121+
}
109122
em.remove(doomed);
110123
em.flush();
111124
wasDeleted = true;
@@ -240,6 +253,37 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S
240253
return response;
241254
}
242255

256+
public void unLinksForSingleSavedSearch(DataverseRequest dvReq, SavedSearch savedSearch) throws SearchException, CommandException {
257+
logger.info("UNLINK SAVED SEARCH (" + savedSearch.getId() + ") START search and unlink process");
258+
Date start = new Date();
259+
Dataverse linkingDataverse = savedSearch.getDefinitionPoint();
260+
261+
SolrQueryResponse queryResponse = findHits(savedSearch);
262+
for (SolrSearchResult solrSearchResult : queryResponse.getSolrSearchResults()) {
263+
264+
DvObject dvObjectThatDefinitionPointWillLinkTo = dvObjectService.findDvObject(solrSearchResult.getEntityId());
265+
if (dvObjectThatDefinitionPointWillLinkTo == null) {
266+
continue;
267+
}
268+
269+
if (dvObjectThatDefinitionPointWillLinkTo.isInstanceofDataverse()) {
270+
Dataverse linkedDataverse = (Dataverse) dvObjectThatDefinitionPointWillLinkTo;
271+
DataverseLinkingDataverse dvld = dvLinkingService.findDataverseLinkingDataverse(linkedDataverse.getId(), linkingDataverse.getId());
272+
if(dvld != null) {
273+
Dataverse dv = commandEngine.submitInNewTransaction(new DeleteDataverseLinkingDataverseCommand(dvReq, linkingDataverse, dvld, true));
274+
}
275+
} else if (dvObjectThatDefinitionPointWillLinkTo.isInstanceofDataset()) {
276+
Dataset linkedDataset = (Dataset) dvObjectThatDefinitionPointWillLinkTo;
277+
DatasetLinkingDataverse dsld = dsLinkingService.findDatasetLinkingDataverse(linkedDataset.getId(), linkingDataverse.getId());
278+
if(dsld != null) {
279+
Dataset ds = commandEngine.submitInNewTransaction(new DeleteDatasetLinkingDataverseCommand(dvReq, linkedDataset, dsld, true));
280+
}
281+
}
282+
}
283+
284+
logger.info("UNLINK SAVED SEARCH (" + savedSearch.getId() + ") total time in ms: " + (new Date().getTime() - start.getTime()));
285+
}
286+
243287
private SolrQueryResponse findHits(SavedSearch savedSearch) throws SearchException {
244288
String sortField = SearchFields.TYPE; // first return dataverses, then datasets
245289
String sortOrder = SortBy.DESCENDING;

0 commit comments

Comments
 (0)