killbill-memoizeit

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
index 82b590b..619c255 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
@@ -156,12 +156,12 @@ public class AuditChecker {
     public void checkInvoiceCreated(final Invoice invoice, final CallContext context) {
         final List<AuditLog> invoiceLogs = getAuditLogForInvoice(invoice, context);
         //Assert.assertEquals(invoiceLogs.size(), 1);
-        checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), invoice.getId(), InvoiceSqlDao.class, false, false);
+        checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), invoice.getId(), InvoiceSqlDao.class, true, false);
 
         for (InvoiceItem cur : invoice.getInvoiceItems()) {
             final List<AuditLog> auditLogs = getAuditLogForInvoiceItem(cur, context);
             Assert.assertTrue(auditLogs.size() >= 1);
-            checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), InvoiceItemSqlDao.class, false, false);
+            checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), InvoiceItemSqlDao.class, true, false);
         }
     }
 
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
index c036a76..07c5bc8 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
@@ -398,6 +398,6 @@ public class InvoiceItemModelDao extends EntityModelDaoBase implements EntityMod
 
     @Override
     public TableName getHistoryTableName() {
-        return null;
+        return TableName.INVOICE_ITEM_HISTORY;
     }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
index b3f5602..ad021c5 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
@@ -183,6 +183,11 @@ public class InvoiceModelDao extends EntityModelDaoBase implements EntityModelDa
         return isWrittenOff;
     }
 
+    // Make BeanInspector happy when invoked from EntityHistoryBinder
+    public boolean getIsWrittenOff() {
+        return isWrittenOff;
+    }
+
     public void setIsWrittenOff(final boolean isWrittenOff) {
         this.isWrittenOff = isWrittenOff;
     }
@@ -303,7 +308,7 @@ public class InvoiceModelDao extends EntityModelDaoBase implements EntityModelDa
 
     @Override
     public TableName getHistoryTableName() {
-        return null;
+        return TableName.INVOICE_HISTORY;
     }
 
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
index 53cbf16..2b76d19 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
@@ -228,6 +228,6 @@ public class InvoicePaymentModelDao extends EntityModelDaoBase implements Entity
 
     @Override
     public TableName getHistoryTableName() {
-        return null;
+        return TableName.INVOICE_PAYMENT_HISTORY;
     }
 }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
index 178b464..59ac342 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
@@ -156,7 +156,7 @@ public class InvoiceTrackingModelDao extends EntityModelDaoBase implements Entit
 
     @Override
     public TableName getHistoryTableName() {
-        return null;
+        return TableName.INVOICE_TRACKING_ID_HISTORY;
     }
 
 }
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
index 1a25b85..0aa5427 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
@@ -1,6 +1,7 @@
 import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
 
 tableName() ::= "invoice_items"
+historyTableName() ::= "invoice_item_history"
 
 tableFields(prefix) ::= <<
   <prefix>type
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 23776fa..728c847 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -1,6 +1,7 @@
 import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
 
 tableName() ::= "invoice_payments"
+historyTableName() ::= "invoice_payment_history"
 
 tableFields(prefix) ::= <<
   <prefix>type
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 304ef0e..12e578a 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -1,6 +1,7 @@
 import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
 
 tableName() ::= "invoices"
+historyTableName() ::= "invoice_history"
 
 tableFields(prefix) ::= <<
   <prefix>account_id
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
index b20293a..b67b442 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
@@ -1,6 +1,7 @@
 import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
 
 tableName() ::= "invoice_tracking_ids"
+historyTableName() ::= "invoice_tracking_id_history"
 
 tableFields(prefix) ::= <<
   <prefix>tracking_id
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql b/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
index a9f6763..68ab207 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
@@ -22,6 +22,29 @@ CREATE INDEX invoice_tracking_tenant_account_date_idx ON invoice_tracking_ids(te
 CREATE INDEX invoice_tracking_invoice_id_idx ON invoice_tracking_ids(invoice_id);
 
 
+DROP TABLE IF EXISTS invoice_tracking_id_history;
+CREATE TABLE invoice_tracking_id_history (
+    record_id serial unique,
+    id varchar(36) NOT NULL,
+    target_record_id bigint /*! unsigned */ not null,
+    tracking_id varchar(128) NOT NULL,
+    invoice_id varchar(36) NOT NULL,
+    subscription_id varchar(36),
+    unit_type varchar(255) NOT NULL,
+    record_date date NOT NULL,
+    is_active boolean default true,
+    change_type varchar(6) NOT NULL,
+    created_by varchar(50) NOT NULL,
+    created_date datetime NOT NULL,
+    updated_by varchar(50) NOT NULL,
+    updated_date datetime NOT NULL,
+    account_record_id bigint /*! unsigned */ not null,
+    tenant_record_id bigint /*! unsigned */ not null default 0,
+    PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_tracking_id_history_target_record_id ON invoice_tracking_id_history(target_record_id);
+CREATE INDEX invoice_tracking_id_history_tenant_record_id ON invoice_tracking_id_history(tenant_record_id);
+
 DROP TABLE IF EXISTS invoice_items;
 CREATE TABLE invoice_items (
     record_id serial unique,
@@ -58,6 +81,43 @@ CREATE INDEX invoice_items_account_id ON invoice_items(account_id ASC);
 CREATE INDEX invoice_items_linked_item_id ON invoice_items(linked_item_id ASC);
 CREATE INDEX invoice_items_tenant_account_record_id ON invoice_items(tenant_record_id, account_record_id);
 
+
+DROP TABLE IF EXISTS invoice_item_history;
+CREATE TABLE invoice_item_history (
+    record_id serial unique,
+    id varchar(36) NOT NULL,
+    target_record_id bigint /*! unsigned */ not null,
+    type varchar(24) NOT NULL,
+    invoice_id varchar(36) NOT NULL,
+    account_id varchar(36) NOT NULL,
+    child_account_id varchar(36),
+    bundle_id varchar(36),
+    subscription_id varchar(36),
+    description varchar(255),
+    product_name varchar(255),
+    plan_name varchar(255),
+    phase_name varchar(255),
+    usage_name varchar(255),
+    start_date date,
+    end_date date,
+    amount numeric(15,9) NOT NULL,
+    rate numeric(15,9) NULL,
+    currency varchar(3) NOT NULL,
+    linked_item_id varchar(36),
+    quantity int,
+    item_details text,
+    change_type varchar(6) NOT NULL,
+    created_by varchar(50) NOT NULL,
+    created_date datetime NOT NULL,
+    account_record_id bigint /*! unsigned */ not null,
+    tenant_record_id bigint /*! unsigned */ not null default 0,
+    PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_item_history_target_record_id ON invoice_item_history(target_record_id);
+CREATE INDEX invoice_item_history_tenant_record_id ON invoice_item_history(tenant_record_id);
+
+
+
 DROP TABLE IF EXISTS invoices;
 CREATE TABLE invoices (
     record_id serial unique,
@@ -79,6 +139,30 @@ CREATE UNIQUE INDEX invoices_id ON invoices(id);
 CREATE INDEX invoices_account ON invoices(account_id ASC);
 CREATE INDEX invoices_tenant_account_record_id ON invoices(tenant_record_id, account_record_id);
 
+
+DROP TABLE IF EXISTS invoice_history;
+CREATE TABLE invoice_history (
+    record_id serial unique,
+    id varchar(36) NOT NULL,
+    target_record_id bigint /*! unsigned */ not null,
+    account_id varchar(36) NOT NULL,
+    invoice_date date NOT NULL,
+    target_date date,
+    currency varchar(3) NOT NULL,
+    status varchar(15) NOT NULL DEFAULT 'COMMITTED',
+    migrated bool NOT NULL,
+    parent_invoice bool NOT NULL DEFAULT FALSE,
+    change_type varchar(6) NOT NULL,
+    created_by varchar(50) NOT NULL,
+    created_date datetime NOT NULL,
+    account_record_id bigint /*! unsigned */ not null,
+    tenant_record_id bigint /*! unsigned */ not null default 0,
+    PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_history_target_record_id ON invoice_history(target_record_id);
+CREATE INDEX invoice_history_tenant_record_id ON invoice_history(tenant_record_id);
+
+
 DROP TABLE IF EXISTS invoice_payments;
 CREATE TABLE invoice_payments (
     record_id serial unique,
@@ -106,6 +190,32 @@ CREATE INDEX invoice_payments_payment_id ON invoice_payments(payment_id);
 CREATE INDEX invoice_payments_payment_cookie_id ON invoice_payments(payment_cookie_id);
 CREATE INDEX invoice_payments_tenant_account_record_id ON invoice_payments(tenant_record_id, account_record_id);
 
+DROP TABLE IF EXISTS invoice_payment_history;
+CREATE TABLE invoice_payment_history (
+    record_id serial unique,
+    id varchar(36) NOT NULL,
+    target_record_id bigint /*! unsigned */ not null,
+    type varchar(24) NOT NULL,
+    invoice_id varchar(36) NOT NULL,
+    payment_id varchar(36),
+    payment_date datetime NOT NULL,
+    amount numeric(15,9) NOT NULL,
+    currency varchar(3) NOT NULL,
+    processed_currency varchar(3) NOT NULL,
+    payment_cookie_id varchar(255) DEFAULT NULL,
+    linked_invoice_payment_id varchar(36) DEFAULT NULL,
+    success bool DEFAULT true,
+    change_type varchar(6) NOT NULL,
+    created_by varchar(50) NOT NULL,
+    created_date datetime NOT NULL,
+    account_record_id bigint /*! unsigned */ not null,
+    tenant_record_id bigint /*! unsigned */ not null default 0,
+    PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_payment_history_target_record_id ON invoice_payment_history(target_record_id);
+CREATE INDEX invoice_payment_history_tenant_record_id ON invoice_payment_history(tenant_record_id);
+
+
 DROP TABLE IF EXISTS invoice_parent_children;
 CREATE TABLE invoice_parent_children (
     record_id serial unique,
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
index 8c42ce5..bef1051 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
@@ -140,7 +140,11 @@ public class TestInvoiceTrackingSqlDao extends InvoiceTestSuiteWithEmbeddedDB {
                                             final List<InvoiceTrackingModelDao> result = dao.getTrackingsByDateRange(startRange.toDate(), endRange.toDate(), internalCallContext);
                                             Assert.assertEquals(result.size(), 4);
 
-                                            final List<AuditLogModelDao> auditLogsPostCreate = ImmutableList.<AuditLogModelDao>copyOf(dao.getAuditLogsForTableNameAndAccountRecordId(TableName.INVOICE_TRACKING_IDS.toString(), internalCallContext));
+                                            final List<AuditLogModelDao> auditLogsPostCreate = new ArrayList<>();
+                                            for (int i = 0; i < 4; i++) {
+                                                List<AuditLogModelDao> tmp = dao.getAuditLogsViaHistoryForTargetRecordId(TableName.INVOICE_TRACKING_ID_HISTORY.name(), TableName.INVOICE_TRACKING_ID_HISTORY.getTableName().toLowerCase(), result.get(i).getRecordId(), internalCallContext);
+                                                auditLogsPostCreate.addAll(tmp);
+                                            }
                                             Assert.assertEquals(auditLogsPostCreate.size(), 4);
                                             for (int i = 0; i < 4; i++) {
                                                 Assert.assertEquals(auditLogsPostCreate.get(i).getChangeType(), ChangeType.INSERT);
@@ -166,16 +170,20 @@ public class TestInvoiceTrackingSqlDao extends InvoiceTestSuiteWithEmbeddedDB {
                                             final List<InvoiceTrackingModelDao> result2 = dao.getTrackingsByDateRange(startRange.toDate(), endRange.toDate(), internalCallContext);
                                             Assert.assertEquals(result2.size(), 1);
 
-                                            final List<AuditLogModelDao> auditLogsPostDelete = ImmutableList.<AuditLogModelDao>copyOf(dao.getAuditLogsForTableNameAndAccountRecordId(TableName.INVOICE_TRACKING_IDS.toString(), internalCallContext));
-                                            Assert.assertEquals(auditLogsPostDelete.size(), 7);
+                                            final List<AuditLogModelDao> auditLogsPostDelete = new ArrayList<>();
                                             for (int i = 0; i < 4; i++) {
-                                                Assert.assertEquals(auditLogsPostDelete.get(i).getChangeType(), ChangeType.INSERT);
-                                                Assert.assertEquals(auditLogsPostDelete.get(i).getTargetRecordId(), result.get(i).getRecordId());
+                                                List<AuditLogModelDao> tmp = dao.getAuditLogsViaHistoryForTargetRecordId(TableName.INVOICE_TRACKING_ID_HISTORY.name(), TableName.INVOICE_TRACKING_ID_HISTORY.getTableName().toLowerCase(), result.get(i).getRecordId(), internalCallContext);
+                                                auditLogsPostDelete.addAll(tmp);
                                             }
-                                            for (int i = 4; i < 7; i++) {
-                                                Assert.assertEquals(auditLogsPostDelete.get(i).getChangeType(), ChangeType.DELETE);
-                                                Assert.assertEquals(auditLogsPostDelete.get(i).getTargetRecordId(), result.get(i - 4).getRecordId());
+
+                                            Assert.assertEquals(auditLogsPostDelete.size(), 7);
+                                            // First 3 records will show an INSERT & DELETE
+                                            for (int i = 0; i < 3; i++) {
+                                                Assert.assertEquals(auditLogsPostDelete.get(2*i).getChangeType(), ChangeType.INSERT);
+                                                Assert.assertEquals(auditLogsPostDelete.get(2*i + 1).getChangeType(), ChangeType.DELETE);
                                             }
+                                            // Last record will only show an INSERT
+                                            Assert.assertEquals(auditLogsPostDelete.get(6).getChangeType(), ChangeType.INSERT);
 
                                             return null;
                                         }
diff --git a/util/src/main/java/org/killbill/billing/util/dao/TableName.java b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
index f4158c9..54d7810 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/TableName.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
@@ -34,10 +34,14 @@ public enum TableName {
     BLOCKING_STATES("blocking_states", ObjectType.BLOCKING_STATES, BLOCKING_STATE_HISTORY),
     CUSTOM_FIELD_HISTORY("custom_field_history"),
     CUSTOM_FIELD("custom_fields", ObjectType.CUSTOM_FIELD, CUSTOM_FIELD_HISTORY),
-    INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM),
-    INVOICE_PAYMENTS("invoice_payments", ObjectType.INVOICE_PAYMENT),
-    INVOICES("invoices", ObjectType.INVOICE),
-    INVOICE_TRACKING_IDS("invoice_tracking_ids"),
+    INVOICE_ITEM_HISTORY("invoice_item_history"),
+    INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM, INVOICE_ITEM_HISTORY),
+    INVOICE_PAYMENT_HISTORY("invoice_payment_history"),
+    INVOICE_PAYMENTS("invoice_payments", ObjectType.INVOICE_PAYMENT, INVOICE_PAYMENT_HISTORY),
+    INVOICE_HISTORY("invoice_history"),
+    INVOICES("invoices", ObjectType.INVOICE, INVOICE_HISTORY),
+    INVOICE_TRACKING_ID_HISTORY("invoice_tracking_id_history"),
+    INVOICE_TRACKING_IDS("invoice_tracking_ids", null, INVOICE_TRACKING_ID_HISTORY),
     INVOICE_PARENT_CHILDREN("invoice_parent_children"),
     NODE_INFOS("node_infos"),
     PAYMENT_ATTEMPT_HISTORY("payment_attempt_history"),
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
index d9aa68f..e63c68a 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
@@ -61,14 +61,18 @@ public interface EntitySqlDao<M extends EntityModelDao<E>, E extends Entity> ext
                              @SmartBindBean final InternalCallContext context);
 
     @SqlQuery
-    public M getById(@Bind("id") final String id,
-                     @SmartBindBean final InternalTenantContext context);
-
-    @SqlQuery
     public M getByRecordId(@Bind("recordId") final Long recordId,
                            @SmartBindBean final InternalTenantContext context);
 
     @SqlQuery
+    public List<M> getByRecordIds(@BindIn("recordIds") final Collection<Long> recordId,
+                                  @SmartBindBean final InternalTenantContext context);
+
+    @SqlQuery
+    public M getById(@Bind("id") final String id,
+                     @SmartBindBean final InternalTenantContext context);
+
+    @SqlQuery
     List<M> getByIds(@BindIn("ids") final Collection<String> ids,
                      @SmartBindBean final InternalTenantContext context);
 
diff --git a/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg b/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
index 0a9d423..e3c59da 100644
--- a/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
+++ b/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
@@ -189,6 +189,17 @@ where <recordIdField("t.")> = :recordId
 ;
 >>
 
+getByRecordIds(recordIds) ::= <<
+select
+<allTableFields("t.")>
+from <tableName()> t
+where <recordIdField("t.")> in (<recordIds>)
+<andCheckSoftDeletionWithComma("t.")>
+<AND_CHECK_TENANT("t.")>
+;
+>>
+
+
 getByIds(ids) ::= <<
 select
   <allTableFields("t.")>