killbill-aplcache

Tweak DefaultInvoiceDao#createInvoices to avoid extra queries

6/28/2017 9:05:38 PM

Details

diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
index bd35813..e1d1df0 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/DefaultInvoiceDao.java
@@ -292,13 +292,13 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                                                      final FutureAccountNotifications callbackDateTimePerSubscriptions,
                                                      final InternalCallContext context) {
         final Collection<UUID> createdInvoiceIds = new HashSet<UUID>();
-        final Collection<UUID> adjustedInvoiceIds = new HashSet<UUID>();
+        final Collection<UUID> modifiedInvoiceIds = new HashSet<UUID>();
         final Collection<UUID> committedInvoiceIds = new HashSet<UUID>();
 
-        final Collection<UUID> uniqueInvoiceIds = new HashSet<UUID>();
+        final Collection<UUID> invoiceIdsReferencedFromItems = new HashSet<UUID>();
         for (final InvoiceModelDao invoiceModelDao : invoices) {
             for (final InvoiceItemModelDao invoiceItemModelDao : invoiceModelDao.getInvoiceItems()) {
-                uniqueInvoiceIds.add(invoiceItemModelDao.getInvoiceId());
+                invoiceIdsReferencedFromItems.add(invoiceItemModelDao.getInvoiceId());
             }
         }
 
@@ -319,24 +319,19 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                 final List<InvoiceItemModelDao> createdInvoiceItems = new LinkedList<InvoiceItemModelDao>();
                 for (final InvoiceModelDao invoiceModelDao : invoices) {
                     invoiceByInvoiceId.put(invoiceModelDao.getId(), invoiceModelDao);
-                    final boolean isRealInvoice = uniqueInvoiceIds.remove(invoiceModelDao.getId());
-
-                    // Create the invoice if needed
-                    if (invoiceSqlDao.getById(invoiceModelDao.getId().toString(), context) == null) {
-                        // We only want to insert that invoice if there are real invoiceItems associated to it -- if not, this is just
-                        // a shell invoice and we only need to insert the invoiceItems -- for the already existing invoices
-                        if (isRealInvoice) {
-                            createAndRefresh(invoiceSqlDao, invoiceModelDao, context);
-                            createdInvoiceIds.add(invoiceModelDao.getId());
-                        }
+                    final boolean isNotShellInvoice = invoiceIdsReferencedFromItems.remove(invoiceModelDao.getId());
+
+                    // Create the invoice if this is not a shell invoice and it does not already exist
+                    if (isNotShellInvoice && invoiceSqlDao.getById(invoiceModelDao.getId().toString(), context) == null) {
+                        createAndRefresh(invoiceSqlDao, invoiceModelDao, context);
+                        createdInvoiceIds.add(invoiceModelDao.getId());
                     }
 
                     // Create the invoice items if needed (note: they may not necessarily belong to that invoice)
                     for (final InvoiceItemModelDao invoiceItemModelDao : invoiceModelDao.getInvoiceItems()) {
                         if (transInvoiceItemSqlDao.getById(invoiceItemModelDao.getId().toString(), context) == null) {
                             createdInvoiceItems.add(createInvoiceItemFromTransaction(transInvoiceItemSqlDao, invoiceItemModelDao, context));
-
-                            adjustedInvoiceIds.add(invoiceItemModelDao.getInvoiceId());
+                            modifiedInvoiceIds.add(invoiceItemModelDao.getInvoiceId());
                         }
                     }
 
@@ -355,7 +350,7 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                     }
                 }
 
-                for (final UUID adjustedInvoiceId : adjustedInvoiceIds) {
+                for (final UUID adjustedInvoiceId : modifiedInvoiceIds) {
                     final boolean newInvoice = createdInvoiceIds.contains(adjustedInvoiceId);
                     if (newInvoice) {
                         // New invoice, so no associated payment yet: no need to refresh the invoice state
@@ -371,7 +366,6 @@ public class DefaultInvoiceDao extends EntityDaoBase<InvoiceModelDao, Invoice, I
                         notifyBusOfInvoiceAdjustment(entitySqlDaoWrapperFactory, adjustedInvoiceId, accountId, context.getUserToken(), context);
                     }
                 }
-
                 return createdInvoiceItems;
             }
         });