killbill-memoizeit

Revert "analytics: store subscription_id in bst" This reverts

6/29/2012 7:29:38 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 1d00cf0..b5a1b68 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -17,7 +17,6 @@
 package com.ning.billing.analytics;
 
 import java.util.List;
-import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
@@ -135,41 +134,40 @@ public class BusinessSubscriptionTransitionRecorder {
             nextSubscription = new BusinessSubscription(transition.getNextPriceList(), transition.getNextPlan(), transition.getNextPhase(), currency, transition.getEffectiveTransitionTime(), transition.getNextState(), transition.getSubscriptionId(), transition.getBundleId(), catalogService.getFullCatalog());
         }
 
-        catchUpIfNeededAndRecord(transition.getSubscriptionId(), transition.getTotalOrdering(), externalKey, accountKey, transition.getRequestedTransitionTime(), event, prevSubscription, nextSubscription);
+        catchUpIfNeededAndRecord(transition.getTotalOrdering(), externalKey, accountKey, transition.getRequestedTransitionTime(), event, prevSubscription, nextSubscription);
     }
 
-    public void catchUpIfNeededAndRecord(final UUID subscriptionId, final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedDateTime,
+    public void catchUpIfNeededAndRecord(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedDateTime,
                                          final BusinessSubscriptionEvent event, final BusinessSubscription prevSubscription, final BusinessSubscription nextSubscription) {
         // There is no ordering guaranteed with events on the bus. This can be problematic on e.g. subscription creation:
         // the requested future change from trial to evergreen could be received before the actual creation event.
         // In this case, we would have two subscriptions in BST, with both null for the previous transition.
         // To work around this, we need to update bst as we go
         if (BusinessSubscriptionEvent.EventType.ADD.equals(event.getEventType())) {
-            final List<BusinessSubscriptionTransition> transitions = sqlDao.getTransitionForSubscription(subscriptionId.toString());
-            final BusinessSubscriptionTransition firstTransition = transitions.get(0);
-            if (firstTransition.getPreviousSubscription() == null) {
-                final BusinessSubscriptionTransition updatedFirstTransition = new BusinessSubscriptionTransition(
-                        firstTransition.getSubscriptionId(),
-                        firstTransition.getTotalOrdering(),
-                        firstTransition.getExternalKey(),
-                        firstTransition.getAccountKey(),
-                        firstTransition.getRequestedTimestamp(),
-                        firstTransition.getEvent(),
-                        nextSubscription,
-                        firstTransition.getNextSubscription()
-                );
-                sqlDao.updateTransition(updatedFirstTransition.getTotalOrdering(), updatedFirstTransition);
+            final List<BusinessSubscriptionTransition> transitions = sqlDao.getTransitionForSubscription(nextSubscription.getSubscriptionId().toString());
+            if (transitions != null && transitions.size() > 0) {
+                final BusinessSubscriptionTransition firstTransition = transitions.get(0);
+                if (firstTransition.getPreviousSubscription() == null) {
+                    final BusinessSubscriptionTransition updatedFirstTransition = new BusinessSubscriptionTransition(
+                            firstTransition.getTotalOrdering(),
+                            firstTransition.getExternalKey(),
+                            firstTransition.getAccountKey(),
+                            firstTransition.getRequestedTimestamp(),
+                            firstTransition.getEvent(),
+                            nextSubscription,
+                            firstTransition.getNextSubscription()
+                    );
+                    sqlDao.updateTransition(updatedFirstTransition.getTotalOrdering(), updatedFirstTransition);
+                }
             }
         }
 
-        record(subscriptionId, totalOrdering, externalKey, accountKey, requestedDateTime, event, prevSubscription, nextSubscription);
+        record(totalOrdering, externalKey, accountKey, requestedDateTime, event, prevSubscription, nextSubscription);
     }
 
     // Public for internal reasons
-    public void record(final UUID subscriptionId, final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedDateTime,
-                       final BusinessSubscriptionEvent event, final BusinessSubscription prevSubscription, final BusinessSubscription nextSubscription) {
+    public void record(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedDateTime, final BusinessSubscriptionEvent event, final BusinessSubscription prevSubscription, final BusinessSubscription nextSubscription) {
         final BusinessSubscriptionTransition transition = new BusinessSubscriptionTransition(
-                subscriptionId,
                 totalOrdering,
                 externalKey,
                 accountKey,
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
index e533661..9e5b507 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java
@@ -39,7 +39,6 @@ public @interface BusinessSubscriptionTransitionBinder {
         public Binder build(final Annotation annotation) {
             return new Binder<BusinessSubscriptionTransitionBinder, BusinessSubscriptionTransition>() {
                 public void bind(final SQLStatement q, final BusinessSubscriptionTransitionBinder bind, final BusinessSubscriptionTransition arg) {
-                    q.bind("subscription_id", arg.getSubscriptionId().toString());
                     q.bind("total_ordering", arg.getTotalOrdering());
                     q.bind("external_key", arg.getExternalKey());
                     q.bind("account_key", arg.getAccountKey());
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
index e5c442b..c5bdf96 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java
@@ -37,20 +37,20 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
     @Override
     public BusinessSubscriptionTransition map(final int index, final ResultSet r, final StatementContext ctx) throws SQLException {
         BusinessSubscription prev = new BusinessSubscription(
-                r.getString(7), // productName
-                r.getString(8), // productType
-                r.getString(9) == null ? null : ProductCategory.valueOf(r.getString(9)), // productCategory
-                r.getString(10), // slug
-                r.getString(11),  // phase
-                r.getString(12),  // billing period
-                BigDecimal.valueOf(r.getDouble(13)), // price
-                r.getString(14), // priceList
-                BigDecimal.valueOf(r.getDouble(15)), // mrr
-                r.getString(16), // currency
-                r.getLong(17) == 0 ? null : new DateTime(r.getLong(17), DateTimeZone.UTC), // startDate
-                r.getString(18) == null ? null : SubscriptionState.valueOf(r.getString(18)), // state
-                r.getString(19) == null ? null : UUID.fromString(r.getString(19)), // subscriptionId
-                r.getString(20) == null ? null : UUID.fromString(r.getString(20)) //bundleId
+                r.getString(6), // productName
+                r.getString(7), // productType
+                r.getString(8) == null ? null : ProductCategory.valueOf(r.getString(8)), // productCategory
+                r.getString(9), // slug
+                r.getString(10),  // phase
+                r.getString(11),  // billing period
+                BigDecimal.valueOf(r.getDouble(12)), // price
+                r.getString(13), // priceList
+                BigDecimal.valueOf(r.getDouble(14)), // mrr
+                r.getString(15), // currency
+                r.getLong(16) == 0 ? null : new DateTime(r.getLong(16), DateTimeZone.UTC), // startDate
+                r.getString(17) == null ? null : SubscriptionState.valueOf(r.getString(17)), // state
+                r.getString(18) == null ? null : UUID.fromString(r.getString(18)), // subscriptionId
+                r.getString(19) == null ? null : UUID.fromString(r.getString(19)) //bundleId
         );
 
         // Avoid creating a dummy subscriptions with all null fields
@@ -59,20 +59,20 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
         }
 
         BusinessSubscription next = new BusinessSubscription(
-                r.getString(21), // productName
-                r.getString(22), // productType
-                r.getString(23) == null ? null : ProductCategory.valueOf(r.getString(23)), // productCategory
-                r.getString(24), // slug8
-                r.getString(25),  // phase
-                r.getString(26),  // billing period
-                BigDecimal.valueOf(r.getDouble(27)), // price
-                r.getString(28), // priceList
-                BigDecimal.valueOf(r.getDouble(29)), // mrr
-                r.getString(30), // currency
-                r.getLong(31) == 0 ? null : new DateTime(r.getLong(31), DateTimeZone.UTC), // startDate
-                r.getString(32) == null ? null : SubscriptionState.valueOf(r.getString(32)), // state
-                r.getString(33) == null ? null : UUID.fromString(r.getString(33)), // subscriptionId
-                r.getString(34) == null ? null : UUID.fromString(r.getString(34)) //bundleId
+                r.getString(20), // productName
+                r.getString(21), // productType
+                r.getString(22) == null ? null : ProductCategory.valueOf(r.getString(22)), // productCategory
+                r.getString(23), // slug8
+                r.getString(24),  // phase
+                r.getString(25),  // billing period
+                BigDecimal.valueOf(r.getDouble(26)), // price
+                r.getString(27), // priceList
+                BigDecimal.valueOf(r.getDouble(28)), // mrr
+                r.getString(29), // currency
+                r.getLong(30) == 0 ? null : new DateTime(r.getLong(30), DateTimeZone.UTC), // startDate
+                r.getString(31) == null ? null : SubscriptionState.valueOf(r.getString(31)), // state
+                r.getString(32) == null ? null : UUID.fromString(r.getString(32)), // subscriptionId
+                r.getString(33) == null ? null : UUID.fromString(r.getString(33)) //bundleId
         );
 
         // Avoid creating a dummy subscriptions with all null fields
@@ -80,14 +80,13 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
             next = null;
         }
 
-        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(6));
+        final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(5));
 
         return new BusinessSubscriptionTransition(
-                UUID.fromString(r.getString(1)),
-                r.getLong(2),
+                r.getLong(1),
+                r.getString(2),
                 r.getString(3),
-                r.getString(4),
-                new DateTime(r.getLong(5), DateTimeZone.UTC),
+                new DateTime(r.getLong(4), DateTimeZone.UTC),
                 event,
                 prev,
                 next
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
index 2102416..3618b7d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.analytics.model;
 
-import java.util.UUID;
-
 import org.joda.time.DateTime;
 
 /**
@@ -26,7 +24,6 @@ import org.joda.time.DateTime;
  * The key is unique identifier that ties sets of subscriptions together.
  */
 public class BusinessSubscriptionTransition {
-    private final UUID subscriptionId;
     private final long totalOrdering;
     private final String externalKey;
     private final String accountKey;
@@ -35,11 +32,7 @@ public class BusinessSubscriptionTransition {
     private final BusinessSubscription previousSubscription;
     private final BusinessSubscription nextSubscription;
 
-    public BusinessSubscriptionTransition(final UUID subscriptionId, final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedTimestamp,
-                                          final BusinessSubscriptionEvent event, final BusinessSubscription previousSubscription, final BusinessSubscription nextSubscription) {
-        if (subscriptionId == null) {
-            throw new IllegalArgumentException("An event must have a subscription id");
-        }
+    public BusinessSubscriptionTransition(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedTimestamp, final BusinessSubscriptionEvent event, final BusinessSubscription previousSubscription, final BusinessSubscription nextSubscription) {
         if (totalOrdering == null) {
             throw new IllegalArgumentException("An event must have a total ordering");
         }
@@ -56,7 +49,6 @@ public class BusinessSubscriptionTransition {
             throw new IllegalArgumentException("No event specified");
         }
 
-        this.subscriptionId = subscriptionId;
         this.totalOrdering = totalOrdering;
         this.externalKey = externalKey;
         this.accountKey = accountKey;
@@ -66,10 +58,6 @@ public class BusinessSubscriptionTransition {
         this.nextSubscription = nextSubscription;
     }
 
-    public UUID getSubscriptionId() {
-        return subscriptionId;
-    }
-
     public long getTotalOrdering() {
         return totalOrdering;
     }
@@ -103,7 +91,6 @@ public class BusinessSubscriptionTransition {
         final StringBuilder sb = new StringBuilder();
         sb.append("BusinessSubscriptionTransition");
         sb.append("{accountKey='").append(accountKey).append('\'');
-        sb.append(", subscriptionId=").append(subscriptionId);
         sb.append(", totalOrdering=").append(totalOrdering);
         sb.append(", key='").append(externalKey).append('\'');
         sb.append(", requestedTimestamp=").append(requestedTimestamp);
@@ -128,9 +115,6 @@ public class BusinessSubscriptionTransition {
         if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
             return false;
         }
-        if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
-            return false;
-        }
         if (event != null ? !event.equals(that.event) : that.event != null) {
             return false;
         }
@@ -158,7 +142,6 @@ public class BusinessSubscriptionTransition {
         int result = (int) (totalOrdering ^ (totalOrdering >>> 32));
         result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
         result = 31 * result + (accountKey != null ? accountKey.hashCode() : 0);
-        result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0);
         result = 31 * result + (requestedTimestamp != null ? requestedTimestamp.hashCode() : 0);
         result = 31 * result + (event != null ? event.hashCode() : 0);
         result = 31 * result + (previousSubscription != null ? previousSubscription.hashCode() : 0);
diff --git a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
index c22bde9..017de66 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
+++ b/analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg
@@ -2,8 +2,7 @@ group BusinessSubscriptionTransition;
 
 getTransitions(external_key) ::= <<
   select
-    subscription_id
-  , total_ordering
+    total_ordering
   , external_key
   , account_key
   , requested_timestamp
@@ -44,8 +43,7 @@ getTransitions(external_key) ::= <<
 
 getTransitionForSubscription(subscription_id) ::= <<
   select
-    subscription_id
-  , total_ordering
+    total_ordering
   , external_key
   , account_key
   , requested_timestamp
@@ -79,15 +77,14 @@ getTransitionForSubscription(subscription_id) ::= <<
   , next_subscription_id
   , next_bundle_id
   from bst
-  where subscription_id =: subscription_id
+  where prev_subscription_id =: subscription_id or next_subscription_id = :subscription_id
   order by requested_timestamp asc
   ;
 >>
 
 createTransition() ::= <<
   insert ignore into bst(
-    subscription_id
-  , total_ordering
+    total_ordering
   , external_key
   , account_key
   , requested_timestamp
@@ -121,8 +118,7 @@ createTransition() ::= <<
   , next_subscription_id
   , next_bundle_id
   ) values (
-    :subscription_id
-  , :total_ordering
+    :total_ordering
   , :external_key
   , :account_key
   , :requested_timestamp
@@ -160,8 +156,7 @@ createTransition() ::= <<
 
 updateTransition() ::= <<
   update bst set
-    subscription_id = :subscription_id
-  , total_ordering = :total_ordering
+    total_ordering = :total_ordering
   , external_key = :external_key
   , account_key = :account_key
   , requested_timestamp = :requested_timestamp
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 19261bc..43aaad8 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -1,7 +1,6 @@
 drop table if exists bst;
 create table bst (
-  subscription_id char(36) not null
-, total_ordering bigint default 0
+  total_ordering bigint default 0
 , external_key varchar(50) not null comment 'Bundle external key'
 , account_key varchar(50) not null comment 'Account external key'
 , requested_timestamp 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 da023c9..ad54c53 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
@@ -201,7 +201,6 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
                 null,
                 true), null);
         expectedTransition = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 TOTAL_ORDERING,
                 EXTERNAL_KEY,
                 ACCOUNT_KEY,
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 6089dd2..5d6b3a6 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
@@ -52,7 +52,6 @@ import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
 
 public class TestAnalyticsDao extends TestWithEmbeddedDB {
-    private static final UUID SUBSCRIPTION_ID = UUID.randomUUID();
     private static final Long TOTAL_ORDERING = 1L;
     private static final String EXTERNAL_KEY = "23456";
     private static final String ACCOUNT_KEY = "pierre-143343-vcc";
@@ -86,7 +85,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
         final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, UUID.randomUUID(), UUID.randomUUID(), catalog);
         final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan.getName(), catalog, requestedTimestamp, requestedTimestamp);
 
-        transition = new BusinessSubscriptionTransition(SUBSCRIPTION_ID, TOTAL_ORDERING, EXTERNAL_KEY, ACCOUNT_KEY, requestedTimestamp, event, prevSubscription, nextSubscription);
+        transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, EXTERNAL_KEY, ACCOUNT_KEY, requestedTimestamp, event, prevSubscription, nextSubscription);
 
         final IDBI dbi = helper.getDBI();
         businessSubscriptionTransitionSqlDao = dbi.onDemand(BusinessSubscriptionTransitionSqlDao.class);
@@ -116,7 +115,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     @Test(groups = "slow")
     public void testHandleDuplicatedEvents() {
         final BusinessSubscriptionTransition transitionWithNullPrev = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -138,7 +136,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
 
         // Try now to store a look-alike transition (same fields except UUID) - we should store it this time
         final BusinessSubscriptionTransition secondTransitionWithNullPrev = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 12L,
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -157,7 +154,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     @Test(groups = "slow")
     public void testTransitionsWithNullPrevSubscription() {
         final BusinessSubscriptionTransition transitionWithNullPrev = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -176,7 +172,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     @Test(groups = "slow")
     public void testTransitionsWithNullNextSubscription() {
         final BusinessSubscriptionTransition transitionWithNullNext = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -196,7 +191,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     public void testTransitionsWithNullFieldsInSubscription() {
         final BusinessSubscription subscriptionWithNullFields = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, null, null, null, null, catalog);
         final BusinessSubscriptionTransition transitionWithNullFields = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -216,7 +210,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     public void testTransitionsWithNullPlanAndPhase() throws Exception {
         final BusinessSubscription subscriptionWithNullPlanAndPhase = new BusinessSubscription(null, null, null, Currency.USD, null, null, null, null, catalog);
         final BusinessSubscriptionTransition transitionWithNullPlanAndPhase = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -229,7 +222,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
 
         final List<BusinessSubscriptionTransition> transitions = businessSubscriptionTransitionSqlDao.getTransitions(EXTERNAL_KEY);
         Assert.assertEquals(transitions.size(), 1);
-        Assert.assertEquals(transitions.get(0).getSubscriptionId(), transition.getSubscriptionId());
         Assert.assertEquals(transitions.get(0).getExternalKey(), transition.getExternalKey());
         Assert.assertEquals(transitions.get(0).getRequestedTimestamp(), transition.getRequestedTimestamp());
         Assert.assertEquals(transitions.get(0).getEvent(), transition.getEvent());
@@ -241,7 +233,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     public void testTransitionsWithNullPlan() throws Exception {
         final BusinessSubscription subscriptionWithNullPlan = new BusinessSubscription(null, null, phase.getName(), Currency.USD, null, null, null, null, catalog);
         final BusinessSubscriptionTransition transitionWithNullPlan = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -262,7 +253,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
     public void testTransitionsWithNullPhase() throws Exception {
         final BusinessSubscription subscriptionWithNullPhase = new BusinessSubscription(null, plan.getName(), null, Currency.USD, null, null, null, null, catalog);
         final BusinessSubscriptionTransition transitionWithNullPhase = new BusinessSubscriptionTransition(
-                transition.getSubscriptionId(),
                 transition.getTotalOrdering(),
                 transition.getExternalKey(),
                 transition.getAccountKey(),
@@ -275,7 +265,6 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
 
         final List<BusinessSubscriptionTransition> transitions = businessSubscriptionTransitionSqlDao.getTransitions(EXTERNAL_KEY);
         Assert.assertEquals(transitions.size(), 1);
-        Assert.assertEquals(transitions.get(0).getSubscriptionId(), transition.getSubscriptionId());
         Assert.assertEquals(transitions.get(0).getExternalKey(), transition.getExternalKey());
         Assert.assertEquals(transitions.get(0).getRequestedTimestamp(), transition.getRequestedTimestamp());
         Assert.assertEquals(transitions.get(0).getEvent(), transition.getEvent());
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
index 5f3a16d..056d28f 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.skife.jdbi.v2.sqlobject.Bind;
 
+import com.google.common.collect.ImmutableList;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionBinder;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionSqlDao;
 import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
@@ -37,7 +38,7 @@ public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscri
 
     @Override
     public List<BusinessSubscriptionTransition> getTransitionForSubscription(@Bind("subscription_id") final String subscriptionId) {
-        throw new UnsupportedOperationException();
+        return ImmutableList.<BusinessSubscriptionTransition>of();
     }
 
     @Override
diff --git a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
index 55bcc53..4c401a6 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.analytics.model;
 
-import java.util.UUID;
-
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.mockito.Mockito;
@@ -31,6 +29,9 @@ import com.ning.billing.analytics.MockPhase;
 import com.ning.billing.analytics.MockPlan;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.analytics.MockSubscription;
+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.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.PhaseType;
@@ -47,7 +48,6 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
     private BusinessSubscription nextSubscription;
     private BusinessSubscriptionEvent event;
     private DateTime requestedTimestamp;
-    private UUID subscriptionId;
     private Long totalOrdering;
     private String externalKey;
     private String accountKey;
@@ -74,11 +74,10 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
         nextSubscription = new BusinessSubscription(nextISubscription, USD, catalog);
         event = BusinessSubscriptionEvent.subscriptionCancelled(prevISubscription.getCurrentPlan().getName(), catalog, now, now);
         requestedTimestamp = new DateTime(DateTimeZone.UTC);
-        subscriptionId = UUID.randomUUID();
         totalOrdering = 12L;
         externalKey = "1234";
         accountKey = "pierre-1234";
-        transition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+        transition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
     }
 
     @Test(groups = "fast")
@@ -97,54 +96,47 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
 
         BusinessSubscriptionTransition otherTransition;
 
-        otherTransition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, new DateTime(), event, prevSubscription, nextSubscription);
+        otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, new DateTime(), event, prevSubscription, nextSubscription);
         Assert.assertTrue(!transition.equals(otherTransition));
 
-        otherTransition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, "12345", accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+        otherTransition = new BusinessSubscriptionTransition(totalOrdering, "12345", accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
         Assert.assertTrue(!transition.equals(otherTransition));
 
-        otherTransition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, prevSubscription);
+        otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, prevSubscription);
         Assert.assertTrue(!transition.equals(otherTransition));
 
-        otherTransition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, nextSubscription);
+        otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, nextSubscription);
         Assert.assertTrue(!transition.equals(otherTransition));
 
-        otherTransition = new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, prevSubscription);
+        otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, prevSubscription);
         Assert.assertTrue(!transition.equals(otherTransition));
     }
 
     @Test(groups = "fast")
     public void testRejectInvalidTransitions() throws Exception {
         try {
-            new BusinessSubscriptionTransition(null, totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
-            Assert.fail();
-        } catch (IllegalArgumentException e) {
-            Assert.assertTrue(true);
-        }
-
-        try {
-            new BusinessSubscriptionTransition(subscriptionId, null, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+            new BusinessSubscriptionTransition(null, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
             Assert.fail();
         } catch (IllegalArgumentException e) {
             Assert.assertTrue(true);
         }
 
         try {
-            new BusinessSubscriptionTransition(subscriptionId, totalOrdering, null, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+            new BusinessSubscriptionTransition(totalOrdering, null, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
             Assert.fail();
         } catch (IllegalArgumentException e) {
             Assert.assertTrue(true);
         }
 
         try {
-            new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, null, event, prevSubscription, nextSubscription);
+            new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, null, event, prevSubscription, nextSubscription);
             Assert.fail();
         } catch (IllegalArgumentException e) {
             Assert.assertTrue(true);
         }
 
         try {
-            new BusinessSubscriptionTransition(subscriptionId, totalOrdering, externalKey, accountKey, requestedTimestamp, null, prevSubscription, nextSubscription);
+            new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, null, prevSubscription, nextSubscription);
             Assert.fail();
         } catch (IllegalArgumentException e) {
             Assert.assertTrue(true);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index 9547957..d43e0dc 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -148,7 +148,6 @@ public class TestAnalyticsListener extends AnalyticsTestSuite {
             @Nullable final BusinessSubscription previousSubscription,
             @Nullable final Subscription.SubscriptionState nextState) {
         return new BusinessSubscriptionTransition(
-                subscriptionId,
                 totalOrdering,
                 EXTERNAL_KEY,
                 ACCOUNT_KEY,
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
index b74d4f1..9dbc209 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -59,14 +59,13 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
                                                                                    UUID.randomUUID(),
                                                                                    UUID.randomUUID(),
                                                                                    catalogService.getFullCatalog());
-        sqlDao.createTransition(new BusinessSubscriptionTransition(UUID.randomUUID(),
-                                                                   10L,
-                                                                   externalKey.toString(),
-                                                                   UUID.randomUUID().toString(),
-                                                                   new DateTime(DateTimeZone.UTC),
-                                                                   BusinessSubscriptionEvent.valueOf("ADD_MISC"),
-                                                                   null,
-                                                                   nextPrevSubscription));
+        sqlDao.createTransition(new BusinessSubscriptionTransition(10L,
+                                                                externalKey.toString(),
+                                                                UUID.randomUUID().toString(),
+                                                                new DateTime(DateTimeZone.UTC),
+                                                                BusinessSubscriptionEvent.valueOf("ADD_MISC"),
+                                                                null,
+                                                                nextPrevSubscription));
 
         // Setup the entitlement API
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);