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));
}
}