killbill-memoizeit

analytics: add account_id in bac account_key and bundle_key

7/3/2012 9:57:23 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
index 998fd7e..0919746 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -59,7 +59,7 @@ public class BusinessAccountRecorder {
         final Account account;
         try {
             account = accountApi.getAccountByKey(data.getExternalKey());
-            final BusinessAccount bac = new BusinessAccount();
+            final BusinessAccount bac = new BusinessAccount(account.getId());
             updateBusinessAccountFromAccount(account, bac);
 
             log.info("ACCOUNT CREATION " + bac);
@@ -92,9 +92,9 @@ public class BusinessAccountRecorder {
         try {
             final Account account = accountApi.getAccountById(accountId);
 
-            BusinessAccount bac = sqlDao.getAccount(account.getExternalKey());
+            BusinessAccount bac = sqlDao.getAccount(accountId.toString());
             if (bac == null) {
-                bac = new BusinessAccount();
+                bac = new BusinessAccount(accountId);
                 updateBusinessAccountFromAccount(account, bac);
                 log.info("ACCOUNT CREATION " + bac);
                 sqlDao.createAccount(bac);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
index 59912a3..599e049 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessInvoiceRecorder.java
@@ -123,10 +123,10 @@ public class BusinessInvoiceRecorder {
             }
         }
 
-        createInvoiceInTransaction(transactional, accountKey, businessInvoice, businessInvoiceItems);
+        createInvoiceInTransaction(transactional, invoice.getAccountId(), businessInvoice, businessInvoiceItems);
     }
 
-    private void createInvoiceInTransaction(final BusinessInvoiceSqlDao transactional, final String accountKey,
+    private void createInvoiceInTransaction(final BusinessInvoiceSqlDao transactional, final UUID accountId,
                                             final BusinessInvoice invoice, final Iterable<BusinessInvoiceItem> invoiceItems) {
         // Create the invoice
         log.info("Adding invoice {}", invoice);
@@ -141,9 +141,9 @@ public class BusinessInvoiceRecorder {
 
         // Update BAC
         final BusinessAccountSqlDao accountSqlDao = transactional.become(BusinessAccountSqlDao.class);
-        final BusinessAccount account = accountSqlDao.getAccount(accountKey);
+        final BusinessAccount account = accountSqlDao.getAccount(accountId.toString());
         if (account == null) {
-            throw new IllegalStateException("Account does not exist for key " + accountKey);
+            throw new IllegalStateException("Account does not exist for id " + accountId);
         }
         account.setBalance(account.getBalance().add(invoice.getBalance()));
         account.setLastInvoiceDate(invoice.getInvoiceDate());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
index 223068e..3ba6ea5 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountBinder.java
@@ -49,6 +49,7 @@ public @interface BusinessAccountBinder {
                     }
                     q.bind("updated_date", dateTimeNow.getMillis());
 
+                    q.bind("account_id", account.getAccountId().toString());
                     q.bind("account_key", account.getKey());
                     q.bind("balance", account.getRoundedBalance());
                     q.bind("name", account.getName());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
index bf4da3d..7bced4f 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountMapper.java
@@ -19,6 +19,7 @@ package com.ning.billing.analytics.dao;
 import java.math.BigDecimal;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
@@ -31,18 +32,19 @@ public class BusinessAccountMapper implements ResultSetMapper<BusinessAccount> {
     @Override
     public BusinessAccount map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
         final BusinessAccount account = new BusinessAccount(
-                r.getString(1),
-                r.getString(5),
-                BigDecimal.valueOf(r.getDouble(4)),
-                r.getLong(6) == 0 ? null : new DateTime(r.getLong(6), DateTimeZone.UTC),
-                BigDecimal.valueOf(r.getDouble(7)),
-                r.getString(8),
+                UUID.fromString(r.getString(1)),
+                r.getString(2),
+                r.getString(6),
+                BigDecimal.valueOf(r.getDouble(5)),
+                r.getLong(7) == 0 ? null : new DateTime(r.getLong(7), DateTimeZone.UTC),
+                BigDecimal.valueOf(r.getDouble(8)),
                 r.getString(9),
                 r.getString(10),
-                r.getString(11)
+                r.getString(11),
+                r.getString(12)
         );
-        account.setCreatedDt(new DateTime(r.getLong(2), DateTimeZone.UTC));
-        account.setUpdatedDt(new DateTime(r.getLong(3), DateTimeZone.UTC));
+        account.setCreatedDt(new DateTime(r.getLong(3), DateTimeZone.UTC));
+        account.setUpdatedDt(new DateTime(r.getLong(4), DateTimeZone.UTC));
 
         return account;
     }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
index 605e604..8ceb0ad 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessAccountSqlDao.java
@@ -30,7 +30,10 @@ import com.ning.billing.analytics.model.BusinessAccount;
 @RegisterMapper(BusinessAccountMapper.class)
 public interface BusinessAccountSqlDao extends Transactional<BusinessAccountSqlDao>, Transmogrifier {
     @SqlQuery
-    BusinessAccount getAccount(@Bind("account_key") final String key);
+    BusinessAccount getAccount(@Bind("account_id") final String accountId);
+
+    @SqlQuery
+    BusinessAccount getAccountByKey(@Bind("account_key") String accountKey);
 
     @SqlUpdate
     int createAccount(@BusinessAccountBinder final BusinessAccount account);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
index 410ee6e..daac60d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/DefaultAnalyticsDao.java
@@ -19,11 +19,6 @@ package com.ning.billing.analytics.dao;
 import javax.inject.Inject;
 import java.util.List;
 
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.skife.jdbi.v2.Transaction;
-import org.skife.jdbi.v2.TransactionStatus;
-
 import com.ning.billing.analytics.model.BusinessAccount;
 import com.ning.billing.analytics.model.BusinessAccountTag;
 import com.ning.billing.analytics.model.BusinessInvoice;
@@ -52,7 +47,7 @@ public class DefaultAnalyticsDao implements AnalyticsDao {
 
     @Override
     public BusinessAccount getAccountByKey(final String accountKey) {
-        return accountSqlDao.getAccount(accountKey);
+        return accountSqlDao.getAccountByKey(accountKey);
     }
 
     @Override
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
index b8b056c..642a765 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessAccount.java
@@ -17,6 +17,7 @@
 package com.ning.billing.analytics.model;
 
 import java.math.BigDecimal;
+import java.util.UUID;
 
 import org.joda.time.DateTime;
 
@@ -27,6 +28,7 @@ public class BusinessAccount {
     private DateTime createdDt = null;
     private DateTime updatedDt = null;
 
+    private final UUID accountId;
     private String key;
     private String name;
     private BigDecimal balance;
@@ -37,10 +39,14 @@ public class BusinessAccount {
     private String creditCardType;
     private String billingAddressCountry;
 
-    public BusinessAccount() {
+    public BusinessAccount(final UUID accountId) {
+        this.accountId = accountId;
     }
 
-    public BusinessAccount(final String key, final String name, final BigDecimal balance, final DateTime lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus, final String paymentMethod, final String creditCardType, final String billingAddressCountry) {
+    public BusinessAccount(final UUID accountId, final String key, final String name, final BigDecimal balance,
+                           final DateTime lastInvoiceDate, final BigDecimal totalInvoiceBalance, final String lastPaymentStatus,
+                           final String paymentMethod, final String creditCardType, final String billingAddressCountry) {
+        this.accountId = accountId;
         this.key = key;
         this.balance = balance;
         this.billingAddressCountry = billingAddressCountry;
@@ -52,6 +58,10 @@ public class BusinessAccount {
         this.totalInvoiceBalance = totalInvoiceBalance;
     }
 
+    public UUID getAccountId() {
+        return accountId;
+    }
+
     public String getKey() {
         return key;
     }
@@ -155,6 +165,7 @@ public class BusinessAccount {
         sb.append("{balance=").append(balance);
         sb.append(", createdDt=").append(createdDt);
         sb.append(", updatedDt=").append(updatedDt);
+        sb.append(", accountId='").append(accountId).append('\'');
         sb.append(", key='").append(key).append('\'');
         sb.append(", name='").append(name).append('\'');
         sb.append(", lastInvoiceDate=").append(lastInvoiceDate);
@@ -190,6 +201,9 @@ public class BusinessAccount {
         if (creditCardType != null ? !creditCardType.equals(that.creditCardType) : that.creditCardType != null) {
             return false;
         }
+        if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+            return false;
+        }
         if (key != null ? !key.equals(that.key) : that.key != null) {
             return false;
         }
@@ -219,6 +233,7 @@ public class BusinessAccount {
     public int hashCode() {
         int result = createdDt != null ? createdDt.hashCode() : 0;
         result = 31 * result + (updatedDt != null ? updatedDt.hashCode() : 0);
+        result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
         result = 31 * result + (key != null ? key.hashCode() : 0);
         result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (balance != null ? balance.hashCode() : 0);
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
index e4cfa8d..66052ec 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessAccountSqlDao.sql.stg
@@ -1,8 +1,29 @@
 group BusinessAccount;
 
-getAccount(account_key) ::= <<
+getAccount(account_id) ::= <<
   select
-    account_key
+    account_id
+  , account_key
+  , created_date
+  , updated_date
+  , balance
+  , name
+  , last_invoice_date
+  , total_invoice_balance
+  , last_payment_status
+  , payment_method
+  , credit_card_type
+  , billing_address_country
+  from bac
+  where account_id=:account_id
+  limit 1
+  ;
+>>
+
+getAccountByKey(account_key) ::= <<
+  select
+    account_id
+  , account_key
   , created_date
   , updated_date
   , balance
@@ -21,7 +42,8 @@ getAccount(account_key) ::= <<
 
 createAccount() ::= <<
   insert into bac(
-    account_key
+    account_id
+  , account_key
   , created_date
   , updated_date
   , balance
@@ -33,7 +55,8 @@ createAccount() ::= <<
   , credit_card_type
   , billing_address_country
   ) values (
-    :account_key
+    :account_id
+  , :account_key
   , :created_date
   , :updated_date
   , :balance
@@ -58,7 +81,7 @@ saveAccount() ::= <<
   , payment_method=:payment_method
   , credit_card_type=:credit_card_type
   , billing_address_country=:billing_address_country
-  where account_key=:account_key
+  where account_id=:account_id
   ;
 >>
 
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
index 897ee8e..70ad890 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -41,6 +41,7 @@ create index bst_key_index on bst (external_key, requested_timestamp asc);
 drop table if exists bac;
 create table bac (
   record_id int(11) unsigned not null auto_increment
+, account_id char(36) not null
 , account_key varchar(50) not null
 , name varchar(100) not null
 , created_date bigint not null
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index e82b61c..95bf621 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -256,7 +256,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
             Assert.fail("Unable to start the bus or service! " + t);
         }
 
-        Assert.assertNull(accountSqlDao.getAccount(ACCOUNT_KEY));
+        Assert.assertNull(accountSqlDao.getAccountByKey(ACCOUNT_KEY));
 
         // Send events and wait for the async part...
         bus.post(transition);
@@ -267,12 +267,12 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
         Assert.assertEquals(subscriptionSqlDao.getTransitions(EXTERNAL_KEY).get(0), expectedTransition);
 
         // Test invoice integration - the account creation notification has triggered a BAC update
-        Assert.assertTrue(accountSqlDao.getAccount(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
+        Assert.assertTrue(accountSqlDao.getAccountByKey(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
 
         // Post the same invoice event again - the invoice balance shouldn't change
         bus.post(invoiceCreationNotification);
         Thread.sleep(5000);
-        Assert.assertTrue(accountSqlDao.getAccount(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
+        Assert.assertTrue(accountSqlDao.getAccountByKey(ACCOUNT_KEY).getTotalInvoiceBalance().compareTo(INVOICE_AMOUNT) == 0);
 
         // Test payment integration - the fields have already been populated, just make sure the code is exercised
         bus.post(paymentInfoNotification);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
index a953ed2..1ac5508 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/dao/TestAnalyticsDao.java
@@ -30,14 +30,14 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.ning.billing.analytics.model.BusinessAccount;
-import com.ning.billing.analytics.model.BusinessSubscription;
-import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
-import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
 import com.ning.billing.analytics.MockDuration;
 import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.analytics.TestWithEmbeddedDB;
+import com.ning.billing.analytics.model.BusinessAccount;
+import com.ning.billing.analytics.model.BusinessSubscription;
+import com.ning.billing.analytics.model.BusinessSubscriptionEvent;
+import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
 import com.ning.billing.analytics.utils.Rounder;
 import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogApiException;
@@ -99,7 +99,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     }
 
     private void setupBusinessAccount() {
-        account = new BusinessAccount(ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(DateTimeZone.UTC), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
+        account = new BusinessAccount(UUID.randomUUID(), ACCOUNT_KEY, UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(DateTimeZone.UTC), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "FRANCE");
 
         final IDBI dbi = helper.getDBI();
         businessAccountSqlDao = dbi.onDemand(BusinessAccountSqlDao.class);
@@ -251,7 +251,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     public void testCreateSaveAndRetrieveAccounts() {
         // Create and retrieve an account
         businessAccountSqlDao.createAccount(account);
-        final BusinessAccount foundAccount = businessAccountSqlDao.getAccount(ACCOUNT_KEY);
+        final BusinessAccount foundAccount = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY);
         Assert.assertNotNull(foundAccount.getCreatedDt());
         Assert.assertEquals(foundAccount.getCreatedDt(), foundAccount.getUpdatedDt());
         // Verify the dates by backfilling them
@@ -265,12 +265,12 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
         account.setPaymentMethod("PayPal");
         businessAccountSqlDao.saveAccount(account);
         // Verify the save worked as expected
-        account = businessAccountSqlDao.getAccount(ACCOUNT_KEY);
+        account = businessAccountSqlDao.getAccountByKey(ACCOUNT_KEY);
         Assert.assertEquals(Rounder.round(BigDecimal.TEN), account.getRoundedBalance());
         Assert.assertEquals("PayPal", account.getPaymentMethod());
         Assert.assertTrue(account.getUpdatedDt().compareTo(previousUpdatedDt) > 0);
 
         // ACCOUNT not found
-        Assert.assertNull(businessAccountSqlDao.getAccount("Doesn't exist"));
+        Assert.assertNull(businessAccountSqlDao.getAccountByKey("Doesn't exist"));
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
index 1a37ea8..88329f7 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessAccount.java
@@ -25,14 +25,14 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.analytics.AnalyticsTestSuite;
-import com.ning.billing.analytics.model.BusinessAccount;
 
 public class TestBusinessAccount extends AnalyticsTestSuite {
     private BusinessAccount account;
 
     @BeforeMethod(groups = "fast")
     public void setUp() throws Exception {
-        account = new BusinessAccount("pierre", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
+        account = new BusinessAccount(UUID.randomUUID(), "pierre", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+                                      BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
     }
 
     @Test(groups = "fast")
@@ -41,7 +41,8 @@ public class TestBusinessAccount extends AnalyticsTestSuite {
         Assert.assertEquals(account, account);
         Assert.assertTrue(account.equals(account));
 
-        final BusinessAccount otherAccount = new BusinessAccount("pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(), BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
+        final BusinessAccount otherAccount = new BusinessAccount(UUID.randomUUID(), "pierre cardin", UUID.randomUUID().toString(), BigDecimal.ONE, new DateTime(),
+                                                                 BigDecimal.TEN, "ERROR_NOT_ENOUGH_FUNDS", "CreditCard", "Visa", "");
         Assert.assertFalse(account.equals(otherAccount));
     }
 }