killbill-memoizeit
Changes
analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java 43(+16 -27)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionBinder.java 27(+3 -24)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionMapper.java 61(+30 -31)
analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java 5(+1 -4)
analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscriptionTransition.java 63(+54 -9)
analytics/src/main/resources/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.sql.stg 74(+16 -58)
analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java 11(+4 -7)
analytics/src/test/java/com/ning/billing/analytics/model/TestBusinessSubscriptionTransition.java 38(+28 -10)
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 a4c9ff3..83f701d 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import org.joda.time.DateTime;
import org.skife.jdbi.v2.Transaction;
import org.skife.jdbi.v2.TransactionStatus;
import org.slf4j.Logger;
@@ -86,15 +85,13 @@ public class BusinessSubscriptionTransitionRecorder {
final List<Subscription> subscriptions = entitlementApi.getSubscriptionsForBundle(bundleId);
- final String externalKey = bundle.getKey();
- final String accountKey = account.getExternalKey();
final Currency currency = account.getCurrency();
sqlDao.inTransaction(new Transaction<Void, BusinessSubscriptionTransitionSqlDao>() {
@Override
public Void inTransaction(final BusinessSubscriptionTransitionSqlDao transactional, final TransactionStatus status) throws Exception {
- log.info("Started rebuilding transitions for bundle {}", externalKey);
- transactional.deleteTransitionsForBundle(externalKey);
+ log.info("Started rebuilding transitions for bundle id {}", bundleId);
+ transactional.deleteTransitionsForBundle(bundleId.toString());
final ArrayList<BusinessSubscriptionTransition> transitions = new ArrayList<BusinessSubscriptionTransition>();
for (final Subscription subscription : subscriptions) {
@@ -108,8 +105,11 @@ public class BusinessSubscriptionTransitionRecorder {
final BusinessSubscription nextSubscription = createNextBusinessSubscription(event, businessEvent, currency);
final BusinessSubscriptionTransition transition = new BusinessSubscriptionTransition(
event.getTotalOrdering(),
- externalKey,
- accountKey,
+ bundleId,
+ bundle.getKey(),
+ bundle.getAccountId(),
+ account.getExternalKey(),
+ subscription.getId(),
event.getRequestedTransitionTime(),
businessEvent,
prevSubscription,
@@ -125,8 +125,11 @@ public class BusinessSubscriptionTransitionRecorder {
clock.getUTCNow().isAfter(event.getEffectiveTransitionTime())) {
final BusinessSubscriptionTransition systemCancelTransition = new BusinessSubscriptionTransition(
event.getTotalOrdering(),
- externalKey,
- accountKey,
+ bundleId,
+ bundle.getKey(),
+ bundle.getAccountId(),
+ account.getExternalKey(),
+ subscription.getId(),
event.getRequestedTransitionTime(),
new BusinessSubscriptionEvent(BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL, businessEvent.getCategory()),
prevSubscription,
@@ -139,7 +142,7 @@ public class BusinessSubscriptionTransitionRecorder {
}
}
- log.info("Finished rebuilding transitions for bundle {}", externalKey);
+ log.info("Finished rebuilding transitions for bundle id {}", bundleId);
return null;
}
});
@@ -198,7 +201,7 @@ public class BusinessSubscriptionTransitionRecorder {
} else {
nextSubscription = new BusinessSubscription(event.getNextPriceList(), event.getNextPlan(), event.getNextPhase(),
currency, event.getEffectiveTransitionTime(), event.getNextState(),
- event.getSubscriptionId(), event.getBundleId(), catalogService.getFullCatalog());
+ catalogService.getFullCatalog());
}
return nextSubscription;
@@ -216,7 +219,7 @@ public class BusinessSubscriptionTransitionRecorder {
final BusinessSubscriptionTransition prevTransition = getPreviousBusinessSubscriptionTransitionForEvent(event, transitions);
return new BusinessSubscription(event.getPreviousPriceList(), event.getPreviousPlan(), event.getPreviousPhase(),
currency, prevTransition.getNextSubscription().getStartDate(), event.getPreviousState(),
- event.getSubscriptionId(), event.getBundleId(), catalogService.getFullCatalog());
+ catalogService.getFullCatalog());
}
private BusinessSubscriptionTransition getPreviousBusinessSubscriptionTransitionForEvent(final EffectiveSubscriptionEvent event,
@@ -228,7 +231,7 @@ public class BusinessSubscriptionTransitionRecorder {
continue;
}
- if (nextSubscription.getSubscriptionId().equals(event.getSubscriptionId())) {
+ if (candidate.getSubscriptionId().equals(event.getSubscriptionId())) {
transition = candidate;
}
}
@@ -241,18 +244,4 @@ public class BusinessSubscriptionTransitionRecorder {
return transition;
}
-
- // Public for internal reasons
- 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(
- totalOrdering,
- externalKey,
- accountKey,
- requestedDateTime,
- event,
- prevSubscription,
- nextSubscription
- );
- sqlDao.createTransition(transition);
- }
}
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 9e5b507..73804a3 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
@@ -40,8 +40,11 @@ public @interface BusinessSubscriptionTransitionBinder {
return new Binder<BusinessSubscriptionTransitionBinder, BusinessSubscriptionTransition>() {
public void bind(final SQLStatement q, final BusinessSubscriptionTransitionBinder bind, final BusinessSubscriptionTransition arg) {
q.bind("total_ordering", arg.getTotalOrdering());
+ q.bind("bundle_id", arg.getBundleId().toString());
q.bind("external_key", arg.getExternalKey());
+ q.bind("account_id", arg.getAccountId().toString());
q.bind("account_key", arg.getAccountKey());
+ q.bind("subscription_id", arg.getSubscriptionId().toString());
q.bind("requested_timestamp", arg.getRequestedTimestamp().getMillis());
q.bind("event", arg.getEvent().toString());
@@ -59,8 +62,6 @@ public @interface BusinessSubscriptionTransitionBinder {
q.bindNull("prev_currency", Types.VARCHAR);
q.bindNull("prev_start_date", Types.BIGINT);
q.bindNull("prev_state", Types.VARCHAR);
- q.bindNull("prev_subscription_id", Types.VARCHAR);
- q.bindNull("prev_bundle_id", Types.VARCHAR);
} else {
q.bind("prev_product_name", previousSubscription.getProductName());
q.bind("prev_product_type", previousSubscription.getProductType());
@@ -86,16 +87,6 @@ public @interface BusinessSubscriptionTransitionBinder {
} else {
q.bind("prev_state", previousSubscription.getState().toString());
}
- if (previousSubscription.getSubscriptionId() == null) {
- q.bindNull("prev_subscription_id", Types.VARCHAR);
- } else {
- q.bind("prev_subscription_id", previousSubscription.getSubscriptionId().toString());
- }
- if (previousSubscription.getBundleId() == null) {
- q.bindNull("prev_bundle_id", Types.VARCHAR);
- } else {
- q.bind("prev_bundle_id", previousSubscription.getBundleId().toString());
- }
}
final BusinessSubscription nextSubscription = arg.getNextSubscription();
@@ -112,8 +103,6 @@ public @interface BusinessSubscriptionTransitionBinder {
q.bindNull("next_currency", Types.VARCHAR);
q.bindNull("next_start_date", Types.BIGINT);
q.bindNull("next_state", Types.VARCHAR);
- q.bindNull("next_subscription_id", Types.VARCHAR);
- q.bindNull("next_bundle_id", Types.VARCHAR);
} else {
q.bind("next_product_name", nextSubscription.getProductName());
q.bind("next_product_type", nextSubscription.getProductType());
@@ -139,16 +128,6 @@ public @interface BusinessSubscriptionTransitionBinder {
} else {
q.bind("next_state", nextSubscription.getState().toString());
}
- if (nextSubscription.getSubscriptionId() == null) {
- q.bindNull("next_subscription_id", Types.VARCHAR);
- } else {
- q.bind("next_subscription_id", nextSubscription.getSubscriptionId().toString());
- }
- if (nextSubscription.getBundleId() == null) {
- q.bindNull("next_bundle_id", Types.VARCHAR);
- } else {
- q.bind("next_bundle_id", nextSubscription.getBundleId().toString());
- }
}
}
};
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 c5bdf96..97ecc5b 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,18 @@ 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(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
+ r.getString(9), // productName
+ r.getString(10), // productType
+ r.getString(11) == null ? null : ProductCategory.valueOf(r.getString(11)), // productCategory
+ r.getString(12), // slug
+ r.getString(13), // phase
+ r.getString(14), // billing period
+ BigDecimal.valueOf(r.getDouble(15)), // price
+ r.getString(16), // priceList
+ BigDecimal.valueOf(r.getDouble(17)), // mrr
+ r.getString(18), // currency
+ r.getLong(19) == 0 ? null : new DateTime(r.getLong(19), DateTimeZone.UTC), // startDate
+ r.getString(20) == null ? null : SubscriptionState.valueOf(r.getString(20)) // state
);
// Avoid creating a dummy subscriptions with all null fields
@@ -59,20 +57,18 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
}
BusinessSubscription next = new BusinessSubscription(
- 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
+ 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
);
// Avoid creating a dummy subscriptions with all null fields
@@ -80,13 +76,16 @@ public class BusinessSubscriptionTransitionMapper implements ResultSetMapper<Bus
next = null;
}
- final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(5));
+ final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.valueOf(r.getString(8));
return new BusinessSubscriptionTransition(
r.getLong(1),
- r.getString(2),
+ UUID.fromString(r.getString(2)),
r.getString(3),
- new DateTime(r.getLong(4), DateTimeZone.UTC),
+ UUID.fromString(r.getString(4)),
+ r.getString(5),
+ UUID.fromString(r.getString(6)),
+ new DateTime(r.getLong(7), DateTimeZone.UTC),
event,
prev,
next
diff --git a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
index 2092d47..254e59e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/dao/BusinessSubscriptionTransitionSqlDao.java
@@ -40,10 +40,7 @@ public interface BusinessSubscriptionTransitionSqlDao extends Transactional<Busi
int createTransition(@BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition transition);
@SqlUpdate
- void updateTransition(@Bind("total_ordering") long totalOrdering, @BusinessSubscriptionTransitionBinder BusinessSubscriptionTransition updatedFirstTransition);
-
- @SqlUpdate
- void deleteTransitionsForBundle(@Bind("external_key") final String externalKey);
+ void deleteTransitionsForBundle(@Bind("bundle_id") final String bundleId);
@SqlUpdate
void test();
diff --git a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
index 35d5ea1..86b6244 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/model/BusinessSubscription.java
@@ -18,7 +18,6 @@ package com.ning.billing.analytics.model;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.util.UUID;
import org.joda.time.DateTime;
import org.slf4j.Logger;
@@ -60,10 +59,10 @@ public class BusinessSubscription {
private final String currency;
private final DateTime startDate;
private final SubscriptionState state;
- private final UUID subscriptionId;
- private final UUID bundleId;
- public BusinessSubscription(final String productName, final String productType, final ProductCategory productCategory, final String slug, final String phase, final String billingPeriod, final BigDecimal price, final String priceList, final BigDecimal mrr, final String currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId) {
+ public BusinessSubscription(final String productName, final String productType, final ProductCategory productCategory,
+ final String slug, final String phase, final String billingPeriod, final BigDecimal price,
+ final String priceList, final BigDecimal mrr, final String currency, final DateTime startDate, final SubscriptionState state) {
this.productName = productName;
this.productType = productType;
this.productCategory = productCategory;
@@ -76,8 +75,6 @@ public class BusinessSubscription {
this.currency = currency;
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
/**
@@ -91,10 +88,13 @@ public class BusinessSubscription {
* @param catalog Catalog to use
*/
BusinessSubscription(final Subscription subscription, final Currency currency, final Catalog catalog) {
- this(subscription.getCurrentPriceList() == null ? null : subscription.getCurrentPriceList().getName(), subscription.getCurrentPlan().getName(), subscription.getCurrentPhase().getName(), currency, subscription.getStartDate(), subscription.getState(), subscription.getId(), subscription.getBundleId(), catalog);
+ this(subscription.getCurrentPriceList() == null ? null : subscription.getCurrentPriceList().getName(),
+ subscription.getCurrentPlan().getName(), subscription.getCurrentPhase().getName(), currency,
+ subscription.getStartDate(), subscription.getState(), catalog);
}
- public BusinessSubscription(final String priceList, final String currentPlan, final String currentPhase, final Currency currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId, final Catalog catalog) {
+ public BusinessSubscription(final String priceList, final String currentPlan, final String currentPhase, final Currency currency,
+ final DateTime startDate, final SubscriptionState state, final Catalog catalog) {
Plan thePlan = null;
PlanPhase thePhase = null;
try {
@@ -165,11 +165,10 @@ public class BusinessSubscription {
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
- public BusinessSubscription(final String priceList, final Plan currentPlan, final PlanPhase currentPhase, final Currency currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId) {
+ public BusinessSubscription(final String priceList, final Plan currentPlan, final PlanPhase currentPhase, final Currency currency,
+ final DateTime startDate, final SubscriptionState state) {
this.priceList = priceList;
// Record plan information
@@ -231,18 +230,12 @@ public class BusinessSubscription {
this.startDate = startDate;
this.state = state;
- this.subscriptionId = subscriptionId;
- this.bundleId = bundleId;
}
public String getBillingPeriod() {
return billingPeriod;
}
- public UUID getBundleId() {
- return bundleId;
- }
-
public String getCurrency() {
return currency;
}
@@ -295,10 +288,6 @@ public class BusinessSubscription {
return state;
}
- public UUID getSubscriptionId() {
- return subscriptionId;
- }
-
static BigDecimal getMrrFromISubscription(final Duration duration, final BigDecimal price) {
if (duration == null || duration.getUnit() == null || duration.getNumber() == 0) {
return BigDecimal.ZERO;
@@ -334,8 +323,6 @@ public class BusinessSubscription {
sb.append(", currency='").append(currency).append('\'');
sb.append(", startDate=").append(startDate);
sb.append(", state=").append(state);
- sb.append(", subscriptionId=").append(subscriptionId);
- sb.append(", bundleId=").append(bundleId);
sb.append('}');
return sb.toString();
}
@@ -354,9 +341,6 @@ public class BusinessSubscription {
if (billingPeriod != null ? !billingPeriod.equals(that.billingPeriod) : that.billingPeriod != null) {
return false;
}
- if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
- return false;
- }
if (currency != null ? !currency.equals(that.currency) : that.currency != null) {
return false;
}
@@ -390,9 +374,6 @@ public class BusinessSubscription {
if (state != that.state) {
return false;
}
- if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
- return false;
- }
return true;
}
@@ -410,8 +391,6 @@ public class BusinessSubscription {
result = 31 * result + (currency != null ? currency.hashCode() : 0);
result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
result = 31 * result + (state != null ? state.hashCode() : 0);
- result = 31 * result + (subscriptionId != null ? subscriptionId.hashCode() : 0);
- result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
result = 31 * result + (billingPeriod != null ? billingPeriod.hashCode() : 0);
return result;
}
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 2e2a6ce..806b226 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,42 +16,60 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
import org.joda.time.DateTime;
/**
* Describe a state change between two BusinessSubscription
- * <p/>
- * The key is unique identifier that ties sets of subscriptions together.
*/
public class BusinessSubscriptionTransition {
private final long totalOrdering;
+ private final UUID bundleId;
private final String externalKey;
+ private final UUID accountId;
private final String accountKey;
+ private final UUID subscriptionId;
private final DateTime requestedTimestamp;
private final BusinessSubscriptionEvent event;
private final BusinessSubscription previousSubscription;
private final BusinessSubscription nextSubscription;
- public BusinessSubscriptionTransition(final Long totalOrdering, final String externalKey, final String accountKey, final DateTime requestedTimestamp, final BusinessSubscriptionEvent event, final BusinessSubscription previousSubscription, final BusinessSubscription nextSubscription) {
+ public BusinessSubscriptionTransition(final Long totalOrdering, final UUID bundleId, final String externalKey,
+ final UUID accountId, final String accountKey, final UUID subscriptionId,
+ 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");
+ throw new IllegalArgumentException("A transition must have a total ordering");
+ }
+ if (bundleId == null) {
+ throw new IllegalArgumentException("A transition must have a bundle id");
}
if (externalKey == null) {
- throw new IllegalArgumentException("An event must have an external key");
+ throw new IllegalArgumentException("A transition must have an external key");
+ }
+ if (accountId == null) {
+ throw new IllegalArgumentException("A transition must have an account key");
+ }
+ if (subscriptionId == null) {
+ throw new IllegalArgumentException("A transition must have a subscription id");
}
if (accountKey == null) {
- throw new IllegalArgumentException("An event must have an account key");
+ throw new IllegalArgumentException("A transition must have an account key");
}
if (requestedTimestamp == null) {
- throw new IllegalArgumentException("An event must have a requestedTimestamp");
+ throw new IllegalArgumentException("A transition must have a requested timestamp");
}
if (event == null) {
throw new IllegalArgumentException("No event specified");
}
this.totalOrdering = totalOrdering;
+ this.bundleId = bundleId;
this.externalKey = externalKey;
+ this.accountId = accountId;
this.accountKey = accountKey;
+ this.subscriptionId = subscriptionId;
this.requestedTimestamp = requestedTimestamp;
this.event = event;
this.previousSubscription = previousSubscription;
@@ -66,10 +84,18 @@ public class BusinessSubscriptionTransition {
return event;
}
+ public UUID getBundleId() {
+ return bundleId;
+ }
+
public String getExternalKey() {
return externalKey;
}
+ public UUID getAccountId() {
+ return accountId;
+ }
+
public String getAccountKey() {
return accountKey;
}
@@ -82,6 +108,10 @@ public class BusinessSubscriptionTransition {
return previousSubscription;
}
+ public UUID getSubscriptionId() {
+ return subscriptionId;
+ }
+
public DateTime getRequestedTimestamp() {
return requestedTimestamp;
}
@@ -90,9 +120,12 @@ public class BusinessSubscriptionTransition {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("BusinessSubscriptionTransition");
- sb.append("{accountKey='").append(accountKey).append('\'');
+ sb.append("{accountId='").append(accountId).append('\'');
+ sb.append(", accountKey=").append(accountKey);
sb.append(", totalOrdering=").append(totalOrdering);
- sb.append(", key='").append(externalKey).append('\'');
+ sb.append(", bundleId='").append(bundleId).append('\'');
+ sb.append(", externalKey='").append(externalKey).append('\'');
+ sb.append(", subscriptionId='").append(subscriptionId).append('\'');
sb.append(", requestedTimestamp=").append(requestedTimestamp);
sb.append(", event=").append(event);
sb.append(", previousSubscription=").append(previousSubscription);
@@ -118,8 +151,11 @@ public class BusinessSubscriptionTransition {
@Override
public int hashCode() {
int result = (int) (totalOrdering ^ (totalOrdering >>> 32));
+ result = 31 * result + (bundleId != null ? bundleId.hashCode() : 0);
result = 31 * result + (externalKey != null ? externalKey.hashCode() : 0);
+ result = 31 * result + (accountId != null ? accountId.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);
@@ -128,12 +164,18 @@ public class BusinessSubscriptionTransition {
}
public boolean isDuplicateOf(final BusinessSubscriptionTransition that) {
+ if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+ return false;
+ }
if (accountKey != null ? !accountKey.equals(that.accountKey) : that.accountKey != null) {
return false;
}
if (event != null ? !event.equals(that.event) : that.event != null) {
return false;
}
+ if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+ return false;
+ }
if (externalKey != null ? !externalKey.equals(that.externalKey) : that.externalKey != null) {
return false;
}
@@ -143,6 +185,9 @@ public class BusinessSubscriptionTransition {
if (previousSubscription != null ? !previousSubscription.equals(that.previousSubscription) : that.previousSubscription != null) {
return false;
}
+ if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
+ return false;
+ }
if (requestedTimestamp != null ? !requestedTimestamp.equals(that.requestedTimestamp) : that.requestedTimestamp != null) {
return false;
}
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 7192e5f..58d04f4 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
@@ -3,8 +3,11 @@ group BusinessSubscriptionTransition;
getTransitions(external_key) ::= <<
select
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -19,8 +22,6 @@ getTransitions(external_key) ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -33,8 +34,6 @@ getTransitions(external_key) ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
from bst
where external_key=:external_key
order by requested_timestamp asc
@@ -44,8 +43,11 @@ getTransitions(external_key) ::= <<
getTransitionForSubscription(subscription_id) ::= <<
select
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -60,8 +62,6 @@ getTransitionForSubscription(subscription_id) ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -74,19 +74,20 @@ getTransitionForSubscription(subscription_id) ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
from bst
- where prev_subscription_id = :subscription_id or next_subscription_id = :subscription_id
+ where subscription_id = :subscription_id
order by requested_timestamp asc
;
>>
createTransition() ::= <<
- insert ignore into bst(
+ insert into bst(
total_ordering
+ , bundle_id
, external_key
+ , account_id
, account_key
+ , subscription_id
, requested_timestamp
, event
, prev_product_name
@@ -101,8 +102,6 @@ createTransition() ::= <<
, prev_currency
, prev_start_date
, prev_state
- , prev_subscription_id
- , prev_bundle_id
, next_product_name
, next_product_type
, next_product_category
@@ -115,12 +114,13 @@ createTransition() ::= <<
, next_currency
, next_start_date
, next_state
- , next_subscription_id
- , next_bundle_id
) values (
:total_ordering
+ , :bundle_id
, :external_key
+ , :account_id
, :account_key
+ , :subscription_id
, :requested_timestamp
, :event
, :prev_product_name
@@ -135,8 +135,6 @@ createTransition() ::= <<
, :prev_currency
, :prev_start_date
, :prev_state
- , :prev_subscription_id
- , :prev_bundle_id
, :next_product_name
, :next_product_type
, :next_product_category
@@ -149,52 +147,12 @@ createTransition() ::= <<
, :next_currency
, :next_start_date
, :next_state
- , :next_subscription_id
- , :next_bundle_id
);
>>
-updateTransition() ::= <<
- update bst set
- total_ordering = :total_ordering
- , external_key = :external_key
- , account_key = :account_key
- , requested_timestamp = :requested_timestamp
- , event = :event
- , prev_product_name = :prev_product_name
- , prev_product_type = :prev_product_type
- , prev_product_category = :prev_product_category
- , prev_slug = :prev_slug
- , prev_phase = :prev_phase
- , prev_billing_period = :prev_billing_period
- , prev_price = :prev_price
- , prev_price_list = :prev_price_list
- , prev_mrr = :prev_mrr
- , prev_currency = :prev_currency
- , prev_start_date = :prev_start_date
- , prev_state = :prev_state
- , prev_subscription_id = :prev_subscription_id
- , prev_bundle_id = :prev_bundle_id
- , next_product_name = :next_product_name
- , next_product_type = :next_product_type
- , next_product_category = :next_product_category
- , next_slug = :next_slug
- , next_phase = :next_phase
- , next_billing_period = :next_billing_period
- , next_price = :next_price
- , next_price_list = :next_price_list
- , next_mrr = :next_mrr
- , next_currency = :next_currency
- , next_start_date = :next_start_date
- , next_state = :next_state
- , next_subscription_id = :next_subscription_id
- , next_bundle_id = :next_bundle_id
- where total_ordering = :total_ordering
->>
-
-deleteTransitionsForBundle(external_key) ::= <<
+deleteTransitionsForBundle(bundle_id) ::= <<
delete from bst
- where external_key=:external_key
+ where bundle_id=:bundle_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 70ad890..dfa45c4 100644
--- a/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
+++ b/analytics/src/main/resources/com/ning/billing/analytics/ddl.sql
@@ -2,8 +2,11 @@ drop table if exists bst;
create table bst (
record_id int(11) unsigned not null auto_increment
, total_ordering bigint default 0
+, bundle_id char(36) not null
+, account_id char(36) not null
, external_key varchar(50) not null comment 'Bundle external key'
, account_key varchar(50) not null comment 'Account external key'
+, subscription_id char(36) not null
, requested_timestamp bigint not null
, event varchar(50) not null
, prev_product_name varchar(32) default null
@@ -18,8 +21,6 @@ create table bst (
, prev_currency varchar(32) default null
, prev_start_date bigint default null
, prev_state varchar(32) default null
-, prev_subscription_id varchar(100) default null
-, prev_bundle_id varchar(100) default null
, next_product_name varchar(32) default null
, next_product_type varchar(32) default null
, next_product_category varchar(32) default null
@@ -32,8 +33,6 @@ create table bst (
, next_currency varchar(32) default null
, next_start_date bigint default null
, next_state varchar(32) default null
-, next_subscription_id varchar(100) default null
-, next_bundle_id varchar(100) default null
, primary key(record_id)
) engine=innodb comment 'Business Subscription Transitions, track bundles lifecycle';
create index bst_key_index on bst (external_key, requested_timestamp asc);
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 95bf621..8cdc703 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
@@ -95,6 +95,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
private static final Long TOTAL_ORDERING = 11L;
private static final String EXTERNAL_KEY = "12345";
+ private static final UUID ACCOUNT_ID = UUID.randomUUID();
private static final String ACCOUNT_KEY = "pierre-12345";
private static final Currency ACCOUNT_CURRENCY = Currency.EUR;
private static final BigDecimal INVOICE_AMOUNT = BigDecimal.valueOf(1243.11);
@@ -201,12 +202,15 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
true), null);
expectedTransition = new BusinessSubscriptionTransition(
TOTAL_ORDERING,
+ transition.getBundleId(),
EXTERNAL_KEY,
+ ACCOUNT_ID,
ACCOUNT_KEY,
+ transition.getSubscriptionId(),
requestedTransitionTime,
BusinessSubscriptionEvent.subscriptionCreated(plan.getName(), catalog, new DateTime(), new DateTime()),
null,
- new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId(), catalog)
+ new BusinessSubscription(priceList.getName(), plan.getName(), phase.getName(), ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, catalog)
);
}
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 1ac5508..c03f999 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
@@ -53,7 +53,9 @@ import com.ning.billing.mock.MockPlan;
public class TestAnalyticsDao extends TestWithEmbeddedDB {
private static final Long TOTAL_ORDERING = 1L;
+ private static final UUID BUNDLE_ID = UUID.randomUUID();
private static final String EXTERNAL_KEY = "23456";
+ private static final UUID ACCOUNT_ID = UUID.randomUUID();
private static final String ACCOUNT_KEY = "pierre-143343-vcc";
private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
@@ -81,11 +83,12 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
private void setupBusinessSubscriptionTransition() {
final DateTime requestedTimestamp = new DateTime(DateTimeZone.UTC);
- final BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, UUID.randomUUID(), UUID.randomUUID(), catalog);
- 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 BusinessSubscription prevSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.ACTIVE, catalog);
+ final BusinessSubscription nextSubscription = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, new DateTime(DateTimeZone.UTC), Subscription.SubscriptionState.CANCELLED, catalog);
final BusinessSubscriptionEvent event = BusinessSubscriptionEvent.subscriptionCancelled(plan.getName(), catalog, requestedTimestamp, requestedTimestamp);
- transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, EXTERNAL_KEY, ACCOUNT_KEY, requestedTimestamp, event, prevSubscription, nextSubscription);
+ transition = new BusinessSubscriptionTransition(TOTAL_ORDERING, BUNDLE_ID, EXTERNAL_KEY, ACCOUNT_ID, ACCOUNT_KEY,
+ UUID.randomUUID(), requestedTimestamp, event, prevSubscription, nextSubscription);
final IDBI dbi = helper.getDBI();
businessSubscriptionTransitionSqlDao = dbi.onDemand(BusinessSubscriptionTransitionSqlDao.class);
@@ -116,8 +119,11 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
public void testTransitionsWithNullPrevSubscription() {
final BusinessSubscriptionTransition transitionWithNullPrev = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
null,
@@ -134,8 +140,11 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
public void testTransitionsWithNullNextSubscription() {
final BusinessSubscriptionTransition transitionWithNullNext = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
transition.getPreviousSubscription(),
@@ -150,11 +159,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullFieldsInSubscription() {
- final BusinessSubscription subscriptionWithNullFields = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullFields = new BusinessSubscription(null, plan.getName(), phase.getName(), Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullFields = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullFields,
@@ -169,11 +181,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPlanAndPhase() throws Exception {
- final BusinessSubscription subscriptionWithNullPlanAndPhase = new BusinessSubscription(null, null, null, Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPlanAndPhase = new BusinessSubscription(null, null, null, Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPlanAndPhase = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPlanAndPhase,
@@ -192,11 +207,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPlan() throws Exception {
- final BusinessSubscription subscriptionWithNullPlan = new BusinessSubscription(null, null, phase.getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPlan = new BusinessSubscription(null, null, phase.getName(), Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPlan = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPlan,
@@ -212,11 +230,14 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
@Test(groups = "slow")
public void testTransitionsWithNullPhase() throws Exception {
- final BusinessSubscription subscriptionWithNullPhase = new BusinessSubscription(null, plan.getName(), null, Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription subscriptionWithNullPhase = new BusinessSubscription(null, plan.getName(), null, Currency.USD, null, null, catalog);
final BusinessSubscriptionTransition transitionWithNullPhase = new BusinessSubscriptionTransition(
transition.getTotalOrdering(),
+ transition.getBundleId(),
transition.getExternalKey(),
+ transition.getAccountId(),
transition.getAccountKey(),
+ transition.getSubscriptionId(),
transition.getRequestedTimestamp(),
transition.getEvent(),
subscriptionWithNullPhase,
@@ -231,7 +252,7 @@ public class TestAnalyticsDao extends TestWithEmbeddedDB {
Assert.assertEquals(transitions.get(0).getEvent(), transition.getEvent());
// Null Phase but Plan - we don't turn the subscription into a null, however price and mrr are both set to 0 (not null)
- final BusinessSubscription blankSubscription = new BusinessSubscription(null, plan.getName(), new MockPhase(null, null, null, 0.0).getName(), Currency.USD, null, null, null, null, catalog);
+ final BusinessSubscription blankSubscription = new BusinessSubscription(null, plan.getName(), new MockPhase(null, null, null, 0.0).getName(), Currency.USD, null, null, catalog);
Assert.assertEquals(transitions.get(0).getPreviousSubscription(), blankSubscription);
Assert.assertEquals(transitions.get(0).getNextSubscription(), blankSubscription);
}
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 b54d7ce..d9691f4 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockBusinessSubscriptionTransitionSqlDao.java
@@ -32,6 +32,7 @@ import com.ning.billing.analytics.model.BusinessSubscriptionTransition;
public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscriptionTransitionSqlDao {
private final Map<String, List<BusinessSubscriptionTransition>> content = new HashMap<String, List<BusinessSubscriptionTransition>>();
+ private final Map<String, String> keyForBundleId = new HashMap<String, String>();
@Override
public List<BusinessSubscriptionTransition> getTransitions(@Bind("event_key") final String key) {
@@ -49,17 +50,13 @@ public class MockBusinessSubscriptionTransitionSqlDao implements BusinessSubscri
content.put(transition.getExternalKey(), new ArrayList<BusinessSubscriptionTransition>());
}
content.get(transition.getExternalKey()).add(transition);
+ keyForBundleId.put(transition.getBundleId().toString(), transition.getExternalKey());
return 1;
}
@Override
- public void updateTransition(@Bind("total_ordering") final long totalOrdering, @BusinessSubscriptionTransitionBinder final BusinessSubscriptionTransition updatedFirstTransition) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void deleteTransitionsForBundle(@Bind("external_key") final String externalKey) {
- content.put(externalKey, new ArrayList<BusinessSubscriptionTransition>());
+ public void deleteTransitionsForBundle(@Bind("bundle_id") final String bundleId) {
+ content.put(keyForBundleId.get(bundleId), new ArrayList<BusinessSubscriptionTransition>());
}
@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 1e10acf..3e237bc 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,6 +16,8 @@
package com.ning.billing.analytics.model;
+import java.util.UUID;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.mockito.Mockito;
@@ -46,8 +48,11 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
private BusinessSubscriptionEvent event;
private DateTime requestedTimestamp;
private Long totalOrdering;
+ private UUID bundleId;
private String externalKey;
+ private UUID accountId;
private String accountKey;
+ private UUID subscriptionId;
private BusinessSubscriptionTransition transition;
private final CatalogService catalogService = Mockito.mock(CatalogService.class);
@@ -72,9 +77,13 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
event = BusinessSubscriptionEvent.subscriptionCancelled(prevISubscription.getCurrentPlan().getName(), catalog, now, now);
requestedTimestamp = new DateTime(DateTimeZone.UTC);
totalOrdering = 12L;
+ bundleId = UUID.randomUUID();
externalKey = "1234";
+ accountId = UUID.randomUUID();
accountKey = "pierre-1234";
- transition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ subscriptionId = UUID.randomUUID();
+ transition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
}
@Test(groups = "fast")
@@ -93,47 +102,56 @@ public class TestBusinessSubscriptionTransition extends AnalyticsTestSuite {
BusinessSubscriptionTransition otherTransition;
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, new DateTime(), event, prevSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, new DateTime(), event, prevSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, "12345", accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, "12345", accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, prevSubscription, prevSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, prevSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, nextSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, nextSubscription, nextSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
- otherTransition = new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, event, nextSubscription, prevSubscription);
+ otherTransition = new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, nextSubscription, prevSubscription);
Assert.assertTrue(!transition.equals(otherTransition));
}
@Test(groups = "fast")
public void testRejectInvalidTransitions() throws Exception {
try {
- new BusinessSubscriptionTransition(null, externalKey, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(null, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, null, accountKey, requestedTimestamp, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, null, accountId, accountKey,
+ subscriptionId, requestedTimestamp, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, null, event, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, null, event, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
}
try {
- new BusinessSubscriptionTransition(totalOrdering, externalKey, accountKey, requestedTimestamp, null, prevSubscription, nextSubscription);
+ new BusinessSubscriptionTransition(totalOrdering, bundleId, externalKey, accountId, accountKey,
+ subscriptionId, requestedTimestamp, null, prevSubscription, nextSubscription);
Assert.fail();
} catch (IllegalArgumentException e) {
Assert.assertTrue(true);
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 48cefb4..abc7559 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -43,6 +43,8 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
public void testCreateAddOn() throws Exception {
final UUID bundleId = UUID.randomUUID();
final UUID externalKey = UUID.randomUUID();
+ final UUID accountId = UUID.randomUUID();
+ final UUID subscriptionId = UUID.randomUUID();
// Setup the catalog
final CatalogService catalogService = Mockito.mock(CatalogService.class);
@@ -54,6 +56,7 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
// Setup the entitlement API
final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
Mockito.when(bundle.getId()).thenReturn(bundleId);
+ Mockito.when(bundle.getAccountId()).thenReturn(accountId);
Mockito.when(bundle.getKey()).thenReturn(externalKey.toString());
final EntitlementUserApi entitlementApi = Mockito.mock(EntitlementUserApi.class);
Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any())).thenReturn(bundle);
@@ -68,13 +71,14 @@ public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSui
final EffectiveSubscriptionEvent eventEffective = Mockito.mock(EffectiveSubscriptionEvent.class);
Mockito.when(eventEffective.getId()).thenReturn(UUID.randomUUID());
Mockito.when(eventEffective.getTransitionType()).thenReturn(SubscriptionTransitionType.CREATE);
- Mockito.when(eventEffective.getSubscriptionId()).thenReturn(UUID.randomUUID());
+ Mockito.when(eventEffective.getSubscriptionId()).thenReturn(subscriptionId);
Mockito.when(eventEffective.getRequestedTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(eventEffective.getNextPlan()).thenReturn(UUID.randomUUID().toString());
Mockito.when(eventEffective.getEffectiveTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
Mockito.when(eventEffective.getSubscriptionStartDate()).thenReturn(new DateTime(DateTimeZone.UTC));
final Subscription subscription = Mockito.mock(Subscription.class);
+ Mockito.when(subscription.getId()).thenReturn(subscriptionId);
Mockito.when(subscription.getAllTransitions()).thenReturn(ImmutableList.<EffectiveSubscriptionEvent>of(eventEffective));
Mockito.when(entitlementApi.getSubscriptionsForBundle(Mockito.<UUID>any())).thenReturn(ImmutableList.<Subscription>of(subscription));
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
index 0c7eeec..9d4b29a 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
@@ -316,8 +316,11 @@ public class TestAnalytics extends TestIntegrationBase {
// Check the first transition (into trial phase)
final BusinessSubscriptionTransition initialTransition = transitions.get(0);
+ Assert.assertEquals(initialTransition.getBundleId(), bundle.getId());
Assert.assertEquals(initialTransition.getExternalKey(), bundle.getKey());
+ Assert.assertEquals(initialTransition.getAccountId(), account.getId());
Assert.assertEquals(initialTransition.getAccountKey(), account.getExternalKey());
+ Assert.assertEquals(initialTransition.getSubscriptionId(), subscription.getId());
Assert.assertEquals(initialTransition.getEvent().getCategory(), currentProduct.getCategory());
Assert.assertEquals(initialTransition.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.ADD);
@@ -325,7 +328,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertNull(initialTransition.getPreviousSubscription());
Assert.assertEquals(initialTransition.getNextSubscription().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD.toString());
- Assert.assertEquals(initialTransition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(initialTransition.getNextSubscription().getCurrency(), account.getCurrency().toString());
Assert.assertEquals(initialTransition.getNextSubscription().getPhase(), PhaseType.TRIAL.toString());
// Trial: fixed price of zero
@@ -337,7 +339,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(initialTransition.getNextSubscription().getSlug(), currentProduct.getName().toLowerCase() + "-monthly-trial");
Assert.assertEquals(initialTransition.getNextSubscription().getStartDate(), subscription.getStartDate());
Assert.assertEquals(initialTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- Assert.assertEquals(initialTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
// Check the second transition (from trial to evergreen)
final BusinessSubscriptionTransition futureTransition = transitions.get(1);
@@ -350,7 +351,6 @@ public class TestAnalytics extends TestIntegrationBase {
// The billing period should have changed (NO_BILLING_PERIOD for the trial period)
Assert.assertEquals(futureTransition.getNextSubscription().getBillingPeriod(), BillingPeriod.MONTHLY.toString());
- Assert.assertEquals(futureTransition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(initialTransition.getNextSubscription().getCurrency(), account.getCurrency().toString());
// From trial to evergreen
Assert.assertEquals(futureTransition.getNextSubscription().getPhase(), PhaseType.EVERGREEN.toString());
@@ -363,7 +363,6 @@ public class TestAnalytics extends TestIntegrationBase {
// 30 days trial
Assert.assertEquals(futureTransition.getNextSubscription().getStartDate(), subscription.getStartDate().plusDays(30));
Assert.assertEquals(futureTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- Assert.assertEquals(futureTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
}
private void verifyCancellationTransition(final Account account, final SubscriptionBundle bundle) throws CatalogApiException {
@@ -409,8 +408,11 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(transitions.size(), 3);
final BusinessSubscriptionTransition previousTransition = transitions.get(0);
final BusinessSubscriptionTransition transition = transitions.get(1);
+ Assert.assertEquals(transition.getBundleId(), bundle.getId());
Assert.assertEquals(transition.getExternalKey(), bundle.getKey());
+ Assert.assertEquals(transition.getAccountId(), account.getId());
Assert.assertEquals(transition.getAccountKey(), account.getExternalKey());
+ Assert.assertEquals(transition.getSubscriptionId(), subscription.getId());
Assert.assertEquals(transition.getEvent().getCategory(), ProductCategory.BASE);
Assert.assertEquals(transition.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.CHANGE);
@@ -421,7 +423,6 @@ public class TestAnalytics extends TestIntegrationBase {
// Verify the next subscription
// No billing period for the trial phase
Assert.assertEquals(transition.getNextSubscription().getBillingPeriod(), BillingPeriod.NO_BILLING_PERIOD.toString());
- Assert.assertEquals(transition.getNextSubscription().getBundleId(), subscription.getBundleId());
Assert.assertEquals(transition.getNextSubscription().getCurrency(), account.getCurrency().toString());
Assert.assertEquals(transition.getNextSubscription().getPhase(), PhaseType.TRIAL.toString());
// We're still in trial
@@ -433,8 +434,6 @@ public class TestAnalytics extends TestIntegrationBase {
Assert.assertEquals(transition.getNextSubscription().getSlug(), subscription.getCurrentPhase().getName());
Assert.assertEquals(transition.getNextSubscription().getStartDate(), requestedDate);
Assert.assertEquals(transition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
- // It's still the same subscription
- Assert.assertEquals(transition.getNextSubscription().getSubscriptionId(), subscription.getId());
// The account should have two invoices for the trial phase of both subscriptions
Assert.assertEquals(analyticsUserApi.getInvoicesForAccount(account.getExternalKey()).size(), 2);