UploadStore.java
/*
* Copyright © 2024-2025 The CTAN Team and individual authors
*
* This file is distributed under the 3-clause BSD license.
* See file LICENSE for details.
*/
package org.ctan.site.stores;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.ctan.site.domain.catalogue.Upload;
import org.ctan.site.services.DateUtils;
import org.ctan.site.stores.base.AbstractStore;
import org.hibernate.SessionFactory;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
/**
* The class <code>UploadStore</code> contains the repository for votes.
*
* @author <a href="mailto:gene@ctan.org">Gerd Neugebauer</a>
*/
public class UploadStore extends AbstractStore<Upload> {
/**
* The class <code>StringsMap</code> contains a class for a mapping of
* String to Object.
*/
public static class StringsMap extends HashMap<String, Object> {
/**
* The field <code>serialVersionUID</code> contains the the version
* number.
*/
private static final long serialVersionUID = 1L;
/**
* The method <code>add</code> provides means to add a key/value pair.
*
* @param key the key
* @param value the value
* @return this
*/
public StringsMap add(String key, Object value) {
put(key, value);
return this;
}
}
/**
* This is the constructor for the <code>UploadStore</code>.
*
* @param sessionFactory the session factory
*/
public UploadStore(SessionFactory sessionFactory) {
super(sessionFactory);
}
/**
* The method <code>getStatistics</code> provides means to retrieve
* statistics for the upload.
*
* @return the statistics
*/
public Map<String, Integer> getStatistics() {
currentSession().getCriteriaBuilder();
var query = criteriaQuery();
query.from(Upload.class);
Map<String, Integer> map = new HashMap<String, Integer>();
for (var it : list(query)) {
var date = it.getDateCreated();
if (date != null) {
var f = DateUtils.LOCAL_DATE_FORMATTER_YYYY_MM.format(date);
var val = map.get(f);
if (val == null) {
map.put(f, 1);
} else {
map.put(f, val + 1);
}
}
}
return map;
}
/**
* {@inheritDoc}
*
* @see org.ctan.site.stores.base.AbstractStore#listQuery(java.lang.String,
* jakarta.persistence.criteria.CriteriaBuilder,
* jakarta.persistence.criteria.CriteriaQuery)
*/
@Override
protected Root<Upload> listQuery(String term, CriteriaBuilder cb,
CriteriaQuery<Upload> query) {
Root<Upload> root = query.from(Upload.class);
if (term != null && !term.isBlank()) {
var t = "%" + term.toLowerCase() + "%";
query.where(cb.or(
cb.like(cb.lower(root.get("pkg")), t),
cb.like(cb.lower(root.get("uploader")), t)));
}
return root;
}
/**
* {@inheritDoc}
*
* @see org.ctan.site.stores.base.AbstractStore#map(java.util.List)
*/
@Override
protected List<Map<String, Object>> map(List<Upload> list) {
return list.stream()
.map(it -> it.toMap())
.collect(Collectors.toList());
}
}