Skip to content
Snippets Groups Projects

Iss #30 - Update DAO to use safer deletion call, add DAO tests

Merged Martin Lowe requested to merge malowe/eclipsefdn-api-common:malowe/master/30 into master
9 files
+ 363
63
Compare changes
  • Side-by-side
  • Inline
Files
9
@@ -44,6 +44,8 @@ import org.slf4j.LoggerFactory;
@@ -44,6 +44,8 @@ import org.slf4j.LoggerFactory;
public abstract class BaseHibernateDao implements PersistenceDao {
public abstract class BaseHibernateDao implements PersistenceDao {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseHibernateDao.class);
private static final Logger LOGGER = LoggerFactory.getLogger(BaseHibernateDao.class);
 
private static final int DEFAULT_MAX_LIMIT = 1000;
 
@Inject
@Inject
EntityManager primaryConnectionManager;
EntityManager primaryConnectionManager;
@@ -73,20 +75,12 @@ public abstract class BaseHibernateDao implements PersistenceDao {
@@ -73,20 +75,12 @@ public abstract class BaseHibernateDao implements PersistenceDao {
query = query.setFirstResult(getOffset(q)).setMaxResults(getLimit(q));
query = query.setFirstResult(getOffset(q)).setMaxResults(getLimit(q));
}
}
}
}
// update ordinals for the request
// add ordinal parameters
handleOrdinals(q, query);
int ord = 1;
// run the query and detach the results (stability w/ hibernate contexts)
for (Clause c : q.getFilter().getClauses()) {
List<T> results = castResultsToType(query.getResultList(), q.getDocType());
for (Object param : c.getParams()) {
results.forEach(r -> getSecondaryEntityManager().detach(r));
// for each of params, if processing call statement, add params as registered params
return results;
if (q.getFilter() instanceof ParameterizedCallStatement) {
((StoredProcedureQuery) query).registerStoredProcedureParameter(ord, param.getClass(), ParameterMode.IN);
}
query.setParameter(ord++, param);
}
}
// run the query
return castResultsToType(query.getResultList(), q.getDocType());
}
}
@Transactional
@Transactional
@@ -136,8 +130,8 @@ public abstract class BaseHibernateDao implements PersistenceDao {
@@ -136,8 +130,8 @@ public abstract class BaseHibernateDao implements PersistenceDao {
EntityManager em = getPrimaryEntityManager();
EntityManager em = getPrimaryEntityManager();
List<T> results = get(q);
List<T> results = get(q);
if (results != null) {
if (results != null) {
// remove all matched documents
// remove all matched documents, merging to ensure we have attached versions (transaction barriers sometimes break)
results.forEach(em::remove);
results.forEach(r -> em.remove(em.merge(r)));
}
}
}
}
@@ -154,13 +148,7 @@ public abstract class BaseHibernateDao implements PersistenceDao {
@@ -154,13 +148,7 @@ public abstract class BaseHibernateDao implements PersistenceDao {
// build base query
// build base query
TypedQuery<Long> query = em.createQuery(q.getFilter().getCountSql(), Long.class);
TypedQuery<Long> query = em.createQuery(q.getFilter().getCountSql(), Long.class);
// add ordinal parameters
handleOrdinals(q, query);
int ord = 1;
for (Clause c : q.getFilter().getClauses()) {
for (Object param : c.getParams()) {
query.setParameter(ord++, param);
}
}
return query.getSingleResult();
return query.getSingleResult();
}
}
@@ -182,13 +170,53 @@ public abstract class BaseHibernateDao implements PersistenceDao {
@@ -182,13 +170,53 @@ public abstract class BaseHibernateDao implements PersistenceDao {
q.getWrapper().setHeader(PaginatedResultsFilter.MAX_PAGE_SIZE_HEADER, Integer.toString(getLimit(q)));
q.getWrapper().setHeader(PaginatedResultsFilter.MAX_PAGE_SIZE_HEADER, Integer.toString(getLimit(q)));
}
}
 
/**
 
* Handle adding ordinals from the wrapped query param object into the base query to be sent to db.
 
*
 
* @param q the wrapped query params for the current request
 
* @param actualQuery the actual DB query to be passed to the entity manager
 
*/
 
private void handleOrdinals(RDBMSQuery<?> q, Query actualQuery) {
 
// add ordinal parameters
 
int ord = 1;
 
for (Clause c : q.getFilter().getClauses()) {
 
for (Object param : c.getParams()) {
 
// for each of params, if processing call statement, add params as registered params
 
if (q.getFilter() instanceof ParameterizedCallStatement) {
 
((StoredProcedureQuery) actualQuery).registerStoredProcedureParameter(ord, param.getClass(), ParameterMode.IN);
 
}
 
actualQuery.setParameter(ord++, param);
 
}
 
}
 
}
 
 
/**
 
* Get the limit for entities returned in a single bound request.
 
*
 
* @param q the query params for the current request to check for set limit in params
 
* @return the number of entities allowed
 
*/
private int getLimit(RDBMSQuery<?> q) {
private int getLimit(RDBMSQuery<?> q) {
return q.getLimit() > 0 ? Math
return q.getLimit() > 0
.min(q.getLimit(),
? Math
ConfigProvider.getConfig().getOptionalValue("eclipse.db.default.limit", Integer.class).orElseGet(() -> 1000))
.min(q.getLimit(),
: ConfigProvider.getConfig().getOptionalValue("eclipse.db.default.limit.max", Integer.class).orElseGet(() -> 1000);
ConfigProvider
 
.getConfig()
 
.getOptionalValue("eclipse.db.default.limit", Integer.class)
 
.orElseGet(() -> DEFAULT_MAX_LIMIT))
 
: ConfigProvider
 
.getConfig()
 
.getOptionalValue("eclipse.db.default.limit.max", Integer.class)
 
.orElseGet(() -> DEFAULT_MAX_LIMIT);
}
}
 
/**
 
* Get offset cursor for the current request. Uses paging to enable batch requests that match the current max number of
 
* results by URL params.
 
*
 
* @param q the current requests query parameters, used to check for offset params
 
* @return the offset of the current request, reactive to paging.
 
*/
private int getOffset(RDBMSQuery<?> q) {
private int getOffset(RDBMSQuery<?> q) {
// allow for manual offsetting
// allow for manual offsetting
int manualOffset = q.getManualOffset();
int manualOffset = q.getManualOffset();
Loading