Skip to content

Commit

Permalink
Merge branch 'develop' into 7406-access-requested-refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
sekmiller committed Dec 4, 2020
2 parents a7e17a1 + b5b96fc commit e607cf7
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
Expand All @@ -23,6 +25,16 @@
@Index(columnList = "dataset_id"),
@Index(columnList = "linkingDataverse_id")
})
@NamedQueries({
@NamedQuery(name = "DatasetLinkingDataverse.findByDatasetId",
query = "select object(o) from DatasetLinkingDataverse as o where o.dataset.id =:datasetId order by o.id"),
@NamedQuery(name = "DatasetLinkingDataverse.findByLinkingDataverseId",
query = "SELECT OBJECT(o) FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId order by o.id"),
@NamedQuery(name = "DatasetLinkingDataverse.findByDatasetIdAndLinkingDataverseId",
query = "SELECT OBJECT(o) FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId AND o.dataset.id = :datasetId"),
@NamedQuery(name = "DatasetLinkingDataverse.findIdsByLinkingDataverseId",
query = "SELECT o.dataset.id FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId")
})
public class DatasetLinkingDataverse implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,64 +27,28 @@ public class DatasetLinkingServiceBean implements java.io.Serializable {
@PersistenceContext(unitName = "VDCNet-ejbPU")
private EntityManager em;

/**
* @param linkingDataverseId
* @return
* @todo Should this method simply be deleted? It isn't used anywhere and is
* throwing exceptions: Syntax error parsing [select object(o.dataverse.id)
* from DatasetLinkingDataverse as o where o.linkingDataverse.id
* =:linkingDataverseId order by o.id]
*/
@Deprecated
public List<Dataset> findLinkedDataverses(Long linkingDataverseId) {
List<Dataset> retList = new ArrayList<>();
Query query = em.createQuery("select object(o.dataverse.id) from DatasetLinkingDataverse as o where o.linkingDataverse.id =:linkingDataverseId order by o.id");
query.setParameter("linkingDataverseId", linkingDataverseId);
for (Object o : query.getResultList()) {
DatasetLinkingDataverse convterted = (DatasetLinkingDataverse) o;
retList.add(convterted.getDataset());
}
return retList;
}

public List<Dataset> findDatasetsThisDataverseIdHasLinkedTo(Long dataverseId) {

public List<Dataset> findLinkedDatasets(Long dataverseId) {
List<Dataset> datasets = new ArrayList<>();
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createQuery("SELECT OBJECT(o) FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :dataverseId", DatasetLinkingDataverse.class);
typedQuery.setParameter("dataverseId", dataverseId);
List<DatasetLinkingDataverse> datasetLinkingDataverses = typedQuery.getResultList();
for (DatasetLinkingDataverse datasetLinkingDataverse : datasetLinkingDataverses) {
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createNamedQuery("DatasetLinkingDataverse.findByLinkingDataverseId", DatasetLinkingDataverse.class)
.setParameter("linkingDataverseId", dataverseId);
for (DatasetLinkingDataverse datasetLinkingDataverse : typedQuery.getResultList()) {
datasets.add(datasetLinkingDataverse.getDataset());
}
return datasets;
}

public List<Dataverse> findLinkingDataverses(Long datasetId) {
List<Dataverse> retList = new ArrayList<>();
for (DatasetLinkingDataverse dld : findDatasetLinkingDataverses(datasetId)) {
retList.add(dld.getLinkingDataverse());
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createNamedQuery("DatasetLinkingDataverse.findByDatasetId", DatasetLinkingDataverse.class)
.setParameter("datasetId", datasetId);
for (DatasetLinkingDataverse datasetLinkingDataverse : typedQuery.getResultList()) {
retList.add(datasetLinkingDataverse.getLinkingDataverse());
}
return retList;
}

public DatasetLinkingDataverse findDatasetLinkingDataverse(Long datasetId, Long linkingDataverseId) {
DatasetLinkingDataverse foundDatasetLinkingDataverse = null;
try {
foundDatasetLinkingDataverse = em.createQuery("SELECT OBJECT(o) FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :dataverseId AND o.dataset.id = :datasetId", DatasetLinkingDataverse.class)
.setParameter("datasetId", datasetId)
.setParameter("dataverseId", linkingDataverseId)
.getSingleResult();
} catch (javax.persistence.NoResultException e) {
logger.fine("no datasetLinkingDataverse found for datasetId " + datasetId + " and linkingDataverseId " + linkingDataverseId);
}
return foundDatasetLinkingDataverse;
}

public List<DatasetLinkingDataverse> findDatasetLinkingDataverses(Long datasetId) {
return em.createQuery("select object(o) from DatasetLinkingDataverse as o where o.dataset.id =:datasetId order by o.id", DatasetLinkingDataverse.class)
.setParameter("datasetId", datasetId)
.getResultList();
}

public void save(DatasetLinkingDataverse datasetLinkingDataverse) {
if (datasetLinkingDataverse.getId() == null) {
em.persist(datasetLinkingDataverse);
Expand All @@ -93,11 +57,21 @@ public void save(DatasetLinkingDataverse datasetLinkingDataverse) {
}
}

public DatasetLinkingDataverse findDatasetLinkingDataverse(Long datasetId, Long linkingDataverseId) {
try {
return em.createNamedQuery("DatasetLinkingDataverse.findByDatasetIdAndLinkingDataverseId",DatasetLinkingDataverse.class)
.setParameter("datasetId", datasetId)
.setParameter("linkingDataverseId", linkingDataverseId)
.getSingleResult();
} catch (javax.persistence.NoResultException e) {
logger.fine("no datasetLinkingDataverse found for datasetId " + datasetId + " and linkingDataverseId " + linkingDataverseId);
return null;
}
}


public boolean alreadyLinked(Dataverse dataverse, Dataset dataset) {
TypedQuery<DatasetLinkingDataverse> typedQuery = em.createQuery("SELECT OBJECT(o) FROM DatasetLinkingDataverse AS o WHERE o.linkingDataverse.id = :dataverseId AND o.dataset.id = :datasetId", DatasetLinkingDataverse.class);
typedQuery.setParameter("dataverseId", dataverse.getId());
typedQuery.setParameter("datasetId", dataset.getId());
return !typedQuery.getResultList().isEmpty();
return findDatasetLinkingDataverse(dataset.getId(), dataverse.getId()) != null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
Expand All @@ -27,6 +29,16 @@
@Index(columnList = "dataverse_id"),
@Index(columnList = "linkingDataverse_id")
})
@NamedQueries({
@NamedQuery(name = "DataverseLinkingDataverse.findByDataverseId",
query = "select object(o) from DataverseLinkingDataverse as o where o.dataverse.id =:dataverseId order by o.id"),
@NamedQuery(name = "DataverseLinkingDataverse.findByLinkingDataverseId",
query = "select object(o) from DataverseLinkingDataverse as o where o.linkingDataverse.id =:linkingDataverseId order by o.id"),
@NamedQuery(name = "DataverseLinkingDataverse.findByDataverseIdAndLinkingDataverseId",
query = "SELECT OBJECT(o) FROM DataverseLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId AND o.dataverse.id = :dataverseId"),
@NamedQuery(name = "DataverseLinkingDataverse.findIdsByLinkingDataverseId",
query = "SELECT o.dataverse.id FROM DataverseLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId")
})
public class DataverseLinkingDataverse implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,20 @@ public class DataverseLinkingServiceBean implements java.io.Serializable {

public List<Dataverse> findLinkedDataverses(Long linkingDataverseId) {
List<Dataverse> retList = new ArrayList<>();
Query query = em.createQuery("select object(o) from DataverseLinkingDataverse as o where o.linkingDataverse.id =:linkingDataverseId order by o.id");
query.setParameter("linkingDataverseId", linkingDataverseId);
for (Object o : query.getResultList()) {
DataverseLinkingDataverse convterted = (DataverseLinkingDataverse) o;
retList.add(convterted.getDataverse());
TypedQuery<DataverseLinkingDataverse> typedQuery = em.createNamedQuery("DataverseLinkingDataverse.findByLinkingDataverseId", DataverseLinkingDataverse.class)
.setParameter("linkingDataverseId", linkingDataverseId);
for (DataverseLinkingDataverse dataverseLinkingDataverse : typedQuery.getResultList()) {
retList.add(dataverseLinkingDataverse.getDataverse());
}
return retList;
}

public List<Dataverse> findLinkingDataverses(Long dataverseId) {
List<Dataverse> retList = new ArrayList<>();
Query query = em.createQuery("select object(o) from DataverseLinkingDataverse as o where o.dataverse.id =:dataverseId order by o.id");
query.setParameter("dataverseId", dataverseId);
for (Object o : query.getResultList()) {
DataverseLinkingDataverse convterted = (DataverseLinkingDataverse) o;
retList.add(convterted.getLinkingDataverse());
TypedQuery<DataverseLinkingDataverse> typedQuery = em.createNamedQuery("DataverseLinkingDataverse.findByDataverseId", DataverseLinkingDataverse.class)
.setParameter("dataverseId", dataverseId);
for (DataverseLinkingDataverse dataverseLinkingDataverse : typedQuery.getResultList()) {
retList.add(dataverseLinkingDataverse.getLinkingDataverse());
}
return retList;
}
Expand All @@ -63,22 +61,18 @@ public void save(DataverseLinkingDataverse dataverseLinkingDataverse) {
}

public DataverseLinkingDataverse findDataverseLinkingDataverse(Long dataverseId, Long linkingDataverseId) {
DataverseLinkingDataverse foundDataverseLinkingDataverse = null;
try {
foundDataverseLinkingDataverse = em.createQuery("SELECT OBJECT(o) FROM DataverseLinkingDataverse AS o WHERE o.linkingDataverse.id = :linkingDataverseId AND o.dataverse.id = :dataverseId", DataverseLinkingDataverse.class)
.setParameter("dataverseId", dataverseId)
.setParameter("linkingDataverseId", linkingDataverseId)
.getSingleResult();
return em.createNamedQuery("DataverseLinkingDataverse.findByDataverseIdAndLinkingDataverseId", DataverseLinkingDataverse.class)
.setParameter("dataverseId", dataverseId)
.setParameter("linkingDataverseId", linkingDataverseId)
.getSingleResult();
} catch (javax.persistence.NoResultException e) {
logger.fine("No DataverseLinkingDataverse found for dataverseId " + dataverseId + " and linkedDataverseId " + linkingDataverseId);
return null;
}
return foundDataverseLinkingDataverse;
}

public boolean alreadyLinked(Dataverse definitionPoint, Dataverse dataverseToLinkTo) {
TypedQuery<DataverseLinkingDataverse> typedQuery = em.createQuery("SELECT OBJECT(o) FROM DataverseLinkingDataverse AS o WHERE o.linkingDataverse.id = :dataverseId AND o.dataverse.id = :dataverseToLinkTo", DataverseLinkingDataverse.class);
typedQuery.setParameter("dataverseId", definitionPoint.getId());
typedQuery.setParameter("dataverseToLinkTo", dataverseToLinkTo.getId());
return !typedQuery.getResultList().isEmpty();
return findDataverseLinkingDataverse(dataverseToLinkTo.getId(), definitionPoint.getId()) != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ public List<Dataverse> findDataversesThatLinkToThisDvId(long dataverseId) {
}

public List<Dataset> findDatasetsThisIdHasLinkedTo(long dataverseId) {
return datasetLinkingService.findDatasetsThisDataverseIdHasLinkedTo(dataverseId);
return datasetLinkingService.findLinkedDatasets(dataverseId);
}

public List<Dataverse> findDataversesThatLinkToThisDatasetId(long datasetId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetLinkingDataverse;
import edu.harvard.iq.dataverse.DatasetLinkingServiceBean;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.DataverseLinkingDataverse;
import edu.harvard.iq.dataverse.DataverseLinkingServiceBean;
import edu.harvard.iq.dataverse.DvObject;
import edu.harvard.iq.dataverse.DvObjectServiceBean;
import edu.harvard.iq.dataverse.EjbDataverseEngine;
Expand All @@ -22,6 +20,7 @@
import edu.harvard.iq.dataverse.search.SortBy;
import edu.harvard.iq.dataverse.util.SystemConfig;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand Down Expand Up @@ -50,10 +49,6 @@ public class SavedSearchServiceBean {
@EJB
DvObjectServiceBean dvObjectService;
@EJB
DatasetLinkingServiceBean datasetLinkingService;
@EJB
DataverseLinkingServiceBean dataverseLinkingService;
@EJB
EjbDataverseEngine commandEngine;
@EJB
SystemConfig systemConfig;
Expand Down Expand Up @@ -137,7 +132,7 @@ public void makeLinksForAllSavedSearchesTimer() {
JsonObjectBuilder makeLinksForAllSavedSearches = makeLinksForAllSavedSearches(false);
} catch (SearchException | CommandException ex) {
Logger.getLogger(SavedSearchServiceBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}

Expand Down Expand Up @@ -170,10 +165,22 @@ public JsonObjectBuilder makeLinksForAllSavedSearches(boolean debugFlag) throws
* more structured that a simple String.
*/
public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, SavedSearch savedSearch, boolean debugFlag) throws SearchException, CommandException {
logger.info("SAVED SEARCH (" + savedSearch.getId() + ") START search and link process");
Date start = new Date();
JsonObjectBuilder response = Json.createObjectBuilder();
JsonArrayBuilder savedSearchArrayBuilder = Json.createArrayBuilder();
JsonArrayBuilder infoPerHit = Json.createArrayBuilder();
SolrQueryResponse queryResponse = findHits(savedSearch);

// get linked objects and add to a list
TypedQuery<Long> typedQuery = em.createNamedQuery("DataverseLinkingDataverse.findIdsByLinkingDataverseId", Long.class)
.setParameter("linkingDataverseId", savedSearch.getDefinitionPoint().getId());
List alreadyLinkedObjectIds = typedQuery.getResultList();

typedQuery = em.createNamedQuery("DatasetLinkingDataverse.findIdsByLinkingDataverseId", Long.class)
.setParameter("linkingDataverseId", savedSearch.getDefinitionPoint().getId());
alreadyLinkedObjectIds.addAll(typedQuery.getResultList());

for (SolrSearchResult solrSearchResult : queryResponse.getSolrSearchResults()) {

JsonObjectBuilder hitInfo = Json.createObjectBuilder();
Expand All @@ -190,7 +197,7 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S
Dataverse dataverseToLinkTo = (Dataverse) dvObjectThatDefinitionPointWillLinkTo;
if (wouldResultInLinkingToItself(savedSearch.getDefinitionPoint(), dataverseToLinkTo)) {
hitInfo.add(resultString, "Skipping because dataverse id " + dataverseToLinkTo.getId() + " would link to itself.");
} else if (alreadyLinkedToTheDataverse(savedSearch.getDefinitionPoint(), dataverseToLinkTo)) {
} else if (alreadyLinkedToTheDataverse(alreadyLinkedObjectIds, dataverseToLinkTo)) {
hitInfo.add(resultString, "Skipping because dataverse " + savedSearch.getDefinitionPoint().getId() + " already links to dataverse " + dataverseToLinkTo.getId() + ".");
} else if (dataverseToLinkToIsAlreadyPartOfTheSubtree(savedSearch.getDefinitionPoint(), dataverseToLinkTo)) {
hitInfo.add(resultString, "Skipping because " + dataverseToLinkTo + " is already part of the subtree for " + savedSearch.getDefinitionPoint());
Expand All @@ -200,7 +207,7 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S
}
} else if (dvObjectThatDefinitionPointWillLinkTo.isInstanceofDataset()) {
Dataset datasetToLinkTo = (Dataset) dvObjectThatDefinitionPointWillLinkTo;
if (alreadyLinkedToTheDataset(savedSearch.getDefinitionPoint(), datasetToLinkTo)) {
if (alreadyLinkedToTheDataset(alreadyLinkedObjectIds, datasetToLinkTo)) {
hitInfo.add(resultString, "Skipping because dataverse " + savedSearch.getDefinitionPoint() + " already links to dataset " + datasetToLinkTo + ".");
} else if (datasetToLinkToIsAlreadyPartOfTheSubtree(savedSearch.getDefinitionPoint(), datasetToLinkTo)) {
// already there from normal search/browse
Expand All @@ -212,6 +219,7 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S
}
else {
DatasetLinkingDataverse link = commandEngine.submitInNewTransaction(new LinkDatasetCommand(dvReq, savedSearch.getDefinitionPoint(), datasetToLinkTo));
alreadyLinkedObjectIds.add(datasetToLinkTo.getId()); // because search results could produce two hits (published and draft)
hitInfo.add(resultString, "Persisted DatasetLinkingDataverse id " + link.getId() + " link of " + link.getDataset() + " to " + link.getLinkingDataverse());
}
} else if (dvObjectThatDefinitionPointWillLinkTo.isInstanceofDataFile()) {
Expand All @@ -228,6 +236,9 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S
}
savedSearchArrayBuilder.add(info);
response.add("hits for saved search id " + savedSearch.getId(), savedSearchArrayBuilder);

Date end = new Date();
logger.info("SAVED SEARCH (" + savedSearch.getId() + ") total time in ms: " + (end.getTime() - start.getTime()));
return response;
}

Expand Down Expand Up @@ -278,12 +289,12 @@ private JsonArrayBuilder getFilterQueries(SavedSearch savedSearch) {
return filterQueriesArrayBuilder;
}

private boolean alreadyLinkedToTheDataverse(Dataverse definitionPoint, Dataverse dataverseToLinkTo) {
return dataverseLinkingService.alreadyLinked(definitionPoint, dataverseToLinkTo);
private boolean alreadyLinkedToTheDataverse(List<Long> alreadyLinkedObjectIds, Dataverse dataverseToLinkTo) {
return alreadyLinkedObjectIds.contains(dataverseToLinkTo.getId());
}

private boolean alreadyLinkedToTheDataset(Dataverse definitionPoint, Dataset linkToThisDataset) {
return datasetLinkingService.alreadyLinked(definitionPoint, linkToThisDataset);
private boolean alreadyLinkedToTheDataset(List<Long> alreadyLinkedObjectIds, Dataset linkToThisDataset) {
return alreadyLinkedObjectIds.contains(linkToThisDataset.getId());
}

private static boolean wouldResultInLinkingToItself(Dataverse savedSearchDefinitionPoint, Dataverse dataverseToLinkTo) {
Expand Down

0 comments on commit e607cf7

Please sign in to comment.