killbill-aplcache

util: rewrite updateHistoryAndAudit to make it clear when

2/8/2019 7:00:43 AM

Details

diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
index a95b56d..feb9231 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
@@ -370,7 +370,7 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
 
     // Update history and audit tables.
     // PERF: if the latest entities had to be fetched from the database, return them. Otherwise, return null.
-    private Collection<M> updateHistoryAndAudit(final Collection<Long> entityRecordIds,
+    private Collection<M> updateHistoryAndAudit(final List<Long> entityRecordIds,
                                                 final Map<Long, M> deletedAndUpdatedEntities,
                                                 final TableName tableName,
                                                 final ChangeType changeType,
@@ -382,22 +382,22 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>, 
                     insertAudits(entityRecordIds, tableName, changeType, context);
                     return deletedAndUpdatedEntities.values();
                 } else {
-                    // We'll keep the ordering
-                    final Collection<Long> auditTargetRecordIds = new ArrayList<>(entityRecordIds.size());
+                    // Make sure to re-hydrate the objects first (especially needed for create calls)
                     final Collection<M> reHydratedEntities = new ArrayList<>(entityRecordIds.size());
-                    for (final Long entityRecordId : entityRecordIds) {
-                        // Make sure to re-hydrate the objects first (especially needed for create calls)
+                    if (deletedAndUpdatedEntities.isEmpty()) {
+                        Preconditions.checkState(entityRecordIds.size() == 1 && changeType == ChangeType.INSERT, "Unexpected number of entityRecordIds=%s and changeType=%s", entityRecordIds, changeType);
+                        reHydratedEntities.add(sqlDao.getByRecordId(entityRecordIds.get(0), context));
+                        printSQLWarnings();
+                    } else {
+                        reHydratedEntities.addAll(deletedAndUpdatedEntities.values());
+                    }
+                    Preconditions.checkState(reHydratedEntities.size() == entityRecordIds.size(), "Wrong number of reHydratedEntities=%s (entityRecordIds=%s)", reHydratedEntities, entityRecordIds);
+
+                    final Collection<Long> auditTargetRecordIds = new ArrayList<>(entityRecordIds.size());
+                    for (final M reHydratedEntityModelDao : reHydratedEntities) {
                         // TODO Could we do this in bulk too?
-                        final M reHydratedEntityModelDao;
-                        if (deletedAndUpdatedEntities.keySet().contains(entityRecordId)) {
-                            reHydratedEntityModelDao = deletedAndUpdatedEntities.get(entityRecordId);
-                        } else {
-                            reHydratedEntityModelDao = sqlDao.getByRecordId(entityRecordId, context);
-                            printSQLWarnings();
-                        }
                         final Long auditTargetRecordId = insertHistory(reHydratedEntityModelDao, changeType, context);
                         auditTargetRecordIds.add(auditTargetRecordId);
-                        reHydratedEntities.add(reHydratedEntityModelDao);
                     }
                     // Note: audit entries point to the history record id
                     insertAudits(auditTargetRecordIds, tableName, changeType, context);