Skip to content

Commit 76dda23

Browse files
AdamF42vins01-4science
authored andcommitted
Merged in task/dspace-cris-2025_02_x/DSC-2333 (pull request DSpace#5634)
Task/dspace cris 2025 02 x/DSC-2333 Approved-by: Vincenzo Mecca
2 parents 11054cb + 5cdfcad commit 76dda23

29 files changed

Lines changed: 334 additions & 188 deletions

dspace-api/src/main/java/org/dspace/app/metrics/CrisMetrics.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
* http://www.dspace.org/license/
77
*/
88
package org.dspace.app.metrics;
9+
910
import java.util.Date;
11+
import java.util.UUID;
1012

1113
import jakarta.persistence.Column;
1214
import jakarta.persistence.Entity;
1315
import jakarta.persistence.GeneratedValue;
1416
import jakarta.persistence.GenerationType;
1517
import jakarta.persistence.Id;
16-
import jakarta.persistence.JoinColumn;
17-
import jakarta.persistence.ManyToOne;
1818
import jakarta.persistence.SequenceGenerator;
1919
import jakarta.persistence.Table;
20-
import org.dspace.content.DSpaceObject;
20+
import org.dspace.core.Constants;
2121
import org.dspace.core.ReloadableEntity;
2222
import org.hibernate.Length;
2323

@@ -44,9 +44,15 @@ public class CrisMetrics implements ReloadableEntity<Integer> {
4444

4545
private Date endDate;
4646

47-
@ManyToOne
48-
@JoinColumn(name = "resource_id")
49-
protected DSpaceObject resource;
47+
/**
48+
* The type of DSpace resource this metric belongs to.
49+
* @see Constants#COMMUNITY
50+
* @see Constants#COLLECTION
51+
* @see Constants#ITEM
52+
* etc.
53+
*/
54+
@Column(name = "resource_id")
55+
protected UUID resource;
5056

5157
private boolean last;
5258

@@ -59,6 +65,10 @@ public class CrisMetrics implements ReloadableEntity<Integer> {
5965

6066
private Double rank;
6167

68+
/** @see Constants **/
69+
@Column(name = "resource_type")
70+
private int resourceType;
71+
6272
public Integer getId() {
6373
return id;
6474
}
@@ -115,12 +125,12 @@ public void setAcquisitionDate(Date acquisitionDate) {
115125
this.acquisitionDate = acquisitionDate;
116126
}
117127

118-
public DSpaceObject getResource() {
128+
public UUID getResource() {
119129
return resource;
120130
}
121131

122-
public void setResource(DSpaceObject dSpaceObject) {
123-
this.resource = dSpaceObject;
132+
public void setResource(UUID uuid) {
133+
this.resource = uuid;
124134
}
125135

126136
public String getRemark() {
@@ -160,4 +170,12 @@ public void setRank(Double rank) {
160170
this.rank = rank;
161171
}
162172

173+
public int getResourceType() {
174+
return resourceType;
175+
}
176+
177+
public void setResourceType(int type) {
178+
this.resourceType = type;
179+
}
180+
163181
}

dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAO.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ public interface CrisMetricsDAO extends GenericDAO<CrisMetrics> {
2828

2929
public List<CrisMetrics> findAll(Context context, Integer limit, Integer offset) throws SQLException;
3030

31-
public List<CrisMetrics> findAllByDSO(Context context, DSpaceObject dSpaceObject) throws SQLException;
32-
3331
public List<CrisMetrics> findAllLast(Context context, Integer limit, Integer offset) throws SQLException;
3432

3533
public int countAllLast(Context context) throws SQLException;

dspace-api/src/main/java/org/dspace/app/metrics/dao/CrisMetricsDAOImpl.java

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616
import jakarta.persistence.Query;
1717
import jakarta.persistence.criteria.CriteriaBuilder;
1818
import jakarta.persistence.criteria.CriteriaQuery;
19-
import jakarta.persistence.criteria.Join;
2019
import jakarta.persistence.criteria.Root;
2120
import org.dspace.app.metrics.CrisMetrics;
2221
import org.dspace.app.metrics.CrisMetrics_;
2322
import org.dspace.content.DSpaceObject;
24-
import org.dspace.content.DSpaceObject_;
25-
import org.dspace.content.Item_;
2623
import org.dspace.core.AbstractHibernateDAO;
2724
import org.dspace.core.Context;
2825

@@ -52,18 +49,6 @@ public List<CrisMetrics> findAll(Context context, Integer limit, Integer offset)
5249
return list(context, criteriaQuery, false, CrisMetrics.class, limit, offset);
5350
}
5451

55-
@Override
56-
public List<CrisMetrics> findAllByDSO(Context context, DSpaceObject dSpaceObject) throws SQLException {
57-
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
58-
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CrisMetrics.class);
59-
Root<CrisMetrics> crisMetricsRoot = criteriaQuery.from(CrisMetrics.class);
60-
Join<CrisMetrics, DSpaceObject> join = crisMetricsRoot.join(CrisMetrics_.resource);
61-
criteriaQuery.where(
62-
criteriaBuilder.and(criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.last), true),
63-
criteriaBuilder.equal(join.get(Item_.id), dSpaceObject.getID())));
64-
return list(context, criteriaQuery, false, CrisMetrics.class, -1, -1);
65-
}
66-
6752
public List<CrisMetrics> findAllLast(Context context, Integer limit, Integer offset) throws SQLException {
6853
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
6954
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CrisMetrics.class);
@@ -87,10 +72,13 @@ public int countRows(Context context) throws SQLException {
8772

8873
@Override
8974
public void deleteByDSO(Context context, DSpaceObject dSpaceObject) throws SQLException {
90-
String hqlQuery = "delete from " + CrisMetrics.class.getSimpleName() + " where resource=:resource";
91-
Query query = createQuery(context, hqlQuery);
92-
query.setParameter("resource", dSpaceObject);
93-
query.executeUpdate();
75+
if (dSpaceObject != null) {
76+
UUID uuid = dSpaceObject.getID();
77+
String hqlQuery = "delete from " + CrisMetrics.class.getSimpleName() + " where resource=:resource";
78+
Query query = createQuery(context, hqlQuery);
79+
query.setParameter("resource", uuid);
80+
query.executeUpdate();
81+
}
9482
}
9583

9684
@Override
@@ -99,11 +87,10 @@ public CrisMetrics findLastMetricByResourceIdAndMetricsTypes(Context context, St
9987
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
10088
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CrisMetrics.class);
10189
Root<CrisMetrics> crisMetricsRoot = criteriaQuery.from(CrisMetrics.class);
102-
Join<CrisMetrics, DSpaceObject> join = crisMetricsRoot.join(CrisMetrics_.resource);
10390
criteriaQuery.where(
10491
criteriaBuilder.and(criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.metricType), metricType),
10592
criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.last), true),
106-
criteriaBuilder.equal(join.get(DSpaceObject_.id), resourceUuid)));
93+
criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.resource), resourceUuid)));
10794
return singleResult(context, criteriaQuery);
10895
}
10996

@@ -113,10 +100,9 @@ public List<CrisMetrics> findLastMetricsByResourceId(Context context, UUID resou
113100
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
114101
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CrisMetrics.class);
115102
Root<CrisMetrics> crisMetricsRoot = criteriaQuery.from(CrisMetrics.class);
116-
Join<CrisMetrics, DSpaceObject> join = crisMetricsRoot.join(CrisMetrics_.resource);
117103
criteriaQuery.where(
118104
criteriaBuilder.and(criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.last), true),
119-
criteriaBuilder.equal(join.get(DSpaceObject_.id), resourceId)));
105+
criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.resource), resourceId)));
120106
return list(context, criteriaQuery, false, CrisMetrics.class, limit, offset);
121107
}
122108

@@ -140,12 +126,11 @@ public List<CrisMetrics> findMetricByResourceIdMetricTypeAndBetweenSomeDate(Cont
140126
CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context);
141127
CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CrisMetrics.class);
142128
Root<CrisMetrics> crisMetricsRoot = criteriaQuery.from(CrisMetrics.class);
143-
Join<CrisMetrics, DSpaceObject> join = crisMetricsRoot.join(CrisMetrics_.resource);
144129
criteriaQuery.where(criteriaBuilder.and(
145130
criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.metricType), metricType),
146131
criteriaBuilder.greaterThanOrEqualTo(crisMetricsRoot.get(CrisMetrics_.acquisitionDate), before),
147132
criteriaBuilder.lessThan(crisMetricsRoot.get(CrisMetrics_.acquisitionDate), after),
148-
criteriaBuilder.equal(join.get(DSpaceObject_.id), resourceUuid)));
133+
criteriaBuilder.equal(crisMetricsRoot.get(CrisMetrics_.resource), resourceUuid)));
149134
return list(context, criteriaQuery, false, CrisMetrics.class, -1, -1);
150135
}
151136

dspace-api/src/main/java/org/dspace/app/metrics/service/CrisMetricsService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public interface CrisMetricsService {
3030

3131
public List<CrisMetrics> findAll(Context context, Integer limit, Integer offset) throws SQLException;
3232

33-
public List<CrisMetrics> findAllByDSO(Context context, DSpaceObject dSpaceObject) throws SQLException;
34-
3533
public List<CrisMetrics> findAllLast(Context context, Integer limit, Integer offset) throws SQLException;
3634

3735
public int countAllLast(Context context) throws SQLException;
@@ -40,6 +38,9 @@ public interface CrisMetricsService {
4038

4139
public CrisMetrics create(Context context, DSpaceObject dSpaceObject) throws SQLException, AuthorizeException;
4240

41+
public CrisMetrics create(Context context, int resourceType, UUID resourceId)
42+
throws SQLException, AuthorizeException;
43+
4344
public void delete(Context context, CrisMetrics crisMetrics) throws SQLException, AuthorizeException;
4445

4546
public void deleteByResourceID(Context context, DSpaceObject dSpaceObject) throws SQLException, AuthorizeException;

dspace-api/src/main/java/org/dspace/app/metrics/service/CrisMetricsServiceImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,6 @@ public List<CrisMetrics> findAll(Context context, Integer limit, Integer offset)
5353
return crisMetricsDAO.findAll(context, limit, offset);
5454
}
5555

56-
@Override
57-
public List<CrisMetrics> findAllByDSO(Context context, DSpaceObject dSpaceObject) throws SQLException {
58-
return crisMetricsDAO.findAllByDSO(context, dSpaceObject);
59-
}
60-
6156
@Override
6257
public List<CrisMetrics> findAllLast(Context context, Integer limit, Integer offset) throws SQLException {
6358
return crisMetricsDAO.findAllLast(context, limit, offset);
@@ -74,8 +69,13 @@ public int count(Context context) throws SQLException {
7469
}
7570

7671
public CrisMetrics create(Context context, DSpaceObject dSpaceObject) throws SQLException, AuthorizeException {
72+
return create(context, dSpaceObject.getType(), dSpaceObject.getID());
73+
}
74+
75+
public CrisMetrics create(Context context, int resourceType, UUID uuid) throws SQLException, AuthorizeException {
7776
CrisMetrics cm = new CrisMetrics();
78-
cm.setResource(dSpaceObject);
77+
cm.setResource(uuid);
78+
cm.setResourceType(resourceType);
7979
cm.setAcquisitionDate(new Date());
8080
CrisMetrics metric = crisMetricsDAO.create(context, cm);
8181
log.info(LogHelper.getHeader(context, "create_cris_metrics", "cris_metrics_id=" + metric.getId()));

dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ public void removeLicenses(Context context, Item item) throws SQLException, Auth
815815
}
816816

817817
@Override
818-
public void update(Context context, Item item) throws SQLException, AuthorizeException {
818+
public void update(Context context, Item item, boolean updateLastModified) throws SQLException, AuthorizeException {
819819
// Check authorisation
820820
// only do write authorization if user is not an editor
821821
if (!canEdit(context, item)) {
@@ -859,8 +859,11 @@ public void update(Context context, Item item) throws SQLException, AuthorizeExc
859859
}
860860

861861
if (item.isMetadataModified() || item.isModified()) {
862-
// Set the last modified date
863-
item.setLastModified(Instant.now());
862+
if (updateLastModified) {
863+
// Set the last modified date
864+
item.setLastModified(Instant.now());
865+
}
866+
864867

865868
itemDAO.save(context, item);
866869

@@ -876,6 +879,11 @@ public void update(Context context, Item item) throws SQLException, AuthorizeExc
876879
}
877880
}
878881

882+
@Override
883+
public void update(Context context, Item item) throws SQLException, AuthorizeException {
884+
update(context, item, true);
885+
}
886+
879887

880888
@Override
881889
public void withdraw(Context context, Item item) throws SQLException, AuthorizeException {

dspace-api/src/main/java/org/dspace/content/service/DSpaceObjectService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,9 @@ default void updateLastModifiedDate(Context context, T dso, Instant lastModified
524524

525525
void update(Context context, T dso) throws SQLException, AuthorizeException;
526526

527+
default void update(Context context, T dso, boolean updateLastModified) throws SQLException, AuthorizeException {
528+
update(context, dso);
529+
}
527530

528531
void delete(Context context, T dso) throws SQLException, AuthorizeException, IOException;
529532

dspace-api/src/main/java/org/dspace/discovery/IndexingService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.apache.solr.client.solrj.SolrServerException;
1616
import org.apache.solr.client.solrj.response.QueryResponse;
1717
import org.dspace.app.metrics.CrisMetrics;
18+
import org.dspace.content.Item;
1819
import org.dspace.core.Context;
1920

2021
/**
@@ -95,4 +96,6 @@ void reIndexContent(Context context, IndexableObject dso)
9596
*/
9697
void atomicUpdate(Context context, String uniqueIndexId, String field, Map<String,Object> fieldModifier)
9798
throws SolrServerException, IOException;
99+
100+
void updateLastPublicationImport(Context context, Item item, String serviceName, String lastImport);
98101
}

dspace-api/src/main/java/org/dspace/discovery/SearchUtils.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Map;
1717
import java.util.Set;
1818

19+
import org.apache.commons.lang3.StringUtils;
1920
import org.apache.solr.common.SolrInputDocument;
2021
import org.dspace.app.metrics.CrisMetrics;
2122
import org.dspace.content.Collection;
@@ -257,7 +258,8 @@ private static void addConfigurationIfExists(Set<DiscoveryConfiguration> result,
257258
result.add(configurationExtra);
258259
}
259260

260-
public static SolrInputDocument addMetricFieldsInSolrDoc(CrisMetrics metric, SolrInputDocument solrInDoc) {
261+
public static SolrInputDocument addMetricFieldsInSolrDoc(
262+
CrisMetrics metric, SolrInputDocument solrInDoc, String lastImport) {
261263
String type = "metric." + metric.getMetricType();
262264
String typeSort = type + "_sort";
263265
String typeId = "metric.id." + metric.getMetricType();
@@ -266,14 +268,16 @@ public static SolrInputDocument addMetricFieldsInSolrDoc(CrisMetrics metric, Sol
266268
String typeDeltaPeriod1 = "metric.deltaPeriod1." + metric.getMetricType();
267269
String typeDeltaPeriod2 = "metric.deltaPeriod2." + metric.getMetricType();
268270
String typeRank = "metric.rank." + metric.getMetricType();
269-
271+
String lastField = "cris.lastimport." + metric.getMetricType();
272+
String lastFieldDt = "cris.lastimport." + metric.getMetricType() + "_dt";
270273
Map<String, Object> metricCountMap = Collections.singletonMap("set", metric.getMetricCount());
271274
Map<String, Object> acquisitionDateMap = Collections.singletonMap("set", metric.getAcquisitionDate());
272275
Map<String, Object> idMap = Collections.singletonMap("set", metric.getId());
273276
Map<String, Object> remarkMap = Collections.singletonMap("set", metric.getRemark());
274277
Map<String, Object> deltaPeriod1Map = Collections.singletonMap("set", metric.getDeltaPeriod1());
275278
Map<String, Object> deltaPeriod2Map = Collections.singletonMap("set", metric.getDeltaPeriod2());
276279
Map<String, Object> rankMap = Collections.singletonMap("set", metric.getRank());
280+
277281
solrInDoc.addField(type, metricCountMap);
278282
solrInDoc.addField(typeSort, metricCountMap);
279283
solrInDoc.addField(typeId, idMap);
@@ -282,6 +286,12 @@ public static SolrInputDocument addMetricFieldsInSolrDoc(CrisMetrics metric, Sol
282286
solrInDoc.addField(typeDeltaPeriod1, deltaPeriod1Map);
283287
solrInDoc.addField(typeDeltaPeriod2, deltaPeriod2Map);
284288
solrInDoc.addField(typeRank, rankMap);
289+
290+
if (StringUtils.isNotBlank(lastImport)) {
291+
Map<String, Object> lastFieldMap = Collections.singletonMap("set", lastImport);
292+
solrInDoc.addField(lastField, lastFieldMap);
293+
solrInDoc.addField(lastFieldDt, lastFieldMap);
294+
}
285295
return solrInDoc;
286296
}
287297

0 commit comments

Comments
 (0)