killbill-aplcache

Merge pull request #634 from marksimu/perf Use hash lookup

11/3/2016 7:10:17 PM

Details

diff --git a/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java b/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
index 6f52dc1..9f4d4d1 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/plugin/StandaloneCatalogMapper.java
@@ -76,6 +76,7 @@ import org.killbill.billing.catalog.rules.DefaultPlanRules;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
 public class StandaloneCatalogMapper {
@@ -83,8 +84,8 @@ public class StandaloneCatalogMapper {
     private final String catalogName;
     private final BillingMode recurringBillingMode;
 
-    private Iterable<Product> tmpDefaultProducts;
-    private Iterable<Plan> tmpDefaultPlans;
+    private Map<String, Product> tmpDefaultProducts;
+    private Map<String, Plan> tmpDefaultPlans;
     private DefaultPriceListSet tmpDefaultPriceListSet;
     private Map<String, DefaultPriceList> tmpDefaultPriceListMap;
 
@@ -110,19 +111,16 @@ public class StandaloneCatalogMapper {
         result.setUnits(toDefaultUnits(pluginCatalog.getUnits()));
         result.setPlanRules(toDefaultPlanRules(pluginCatalog.getPlanRules()));
         for (final Product cur : pluginCatalog.getProducts()) {
-            for (Product target :  result.getCurrentProducts()) {
-                if (target.getName().equals(cur.getName())) {
-                    ((DefaultProduct) target).setAvailable(toFilteredDefaultProduct(cur.getAvailable()));
-                    ((DefaultProduct) target).setIncluded(toFilteredDefaultProduct(cur.getIncluded()));
-                    break;
-                }
+            final Product target = result.getCatalogEntityCollectionProduct().findByName(cur.getName());
+            if (target != null) {
+                ((DefaultProduct) target).setAvailable(toFilteredDefaultProduct(cur.getAvailable()));
+                ((DefaultProduct) target).setIncluded(toFilteredDefaultProduct(cur.getIncluded()));
             }
         }
         result.initialize(result, catalogURI);
         return result;
     }
 
-
     private DefaultPlanRules toDefaultPlanRules(final PlanRules input) {
         final DefaultPlanRules result = new DefaultPlanRules();
         result.setBillingAlignmentCase(toDefaultCaseBillingAlignments(input.getCaseBillingAlignment()));
@@ -257,15 +255,11 @@ public class StandaloneCatalogMapper {
 
     private Iterable<Product> toDefaultProducts(final Iterable<Product> input) {
         if (tmpDefaultProducts == null) {
-            final Function<Product, Product> productTransformer = new Function<Product, Product>() {
-                @Override
-                public Product apply(final Product input) {
-                    return toDefaultProduct(input);
-                }
-            };
-            tmpDefaultProducts = ImmutableList.copyOf(Iterables.transform(input, productTransformer));
+            final Map<String, Product> map = new HashMap<String, Product>();
+            for (final Product product : input) map.put(product.getName(), toDefaultProduct(product));
+            tmpDefaultProducts = ImmutableMap.copyOf(map);
         }
-        return tmpDefaultProducts;
+        return tmpDefaultProducts.values();
     }
 
     private Collection<Product> toFilteredDefaultProduct(final Collection<Product> input) {
@@ -280,12 +274,8 @@ public class StandaloneCatalogMapper {
         });
         final Collection<Product> filteredAndOrdered = new ArrayList<Product>(input.size());
         for (final String cur : inputProductNames) {
-            final Product found = findOrIllegalState(tmpDefaultProducts, new Predicate<Product>() {
-                @Override
-                public boolean apply(final Product inputPredicate) {
-                    return inputPredicate.getName().equals(cur);
-                }
-            }, "Failed to find product " + cur);
+            final Product found = tmpDefaultProducts.get(cur);
+            if (found == null) throw new IllegalStateException("Failed to find product " + cur);
             filteredAndOrdered.add(found);
         }
         return filteredAndOrdered;
@@ -293,22 +283,18 @@ public class StandaloneCatalogMapper {
 
     private Iterable<Plan> toDefaultPlans(final Iterable<Plan> input) {
         if (tmpDefaultPlans == null) {
-            final Function<Plan, Plan> planTransformer = new Function<Plan, Plan>() {
-                @Override
-                public Plan apply(final Plan input) {
-                    return toDefaultPlan(input);
-                }
-            };
-            tmpDefaultPlans = ImmutableList.copyOf(Iterables.transform(input, planTransformer));
+            final Map<String, Plan> map = new HashMap<String, Plan>();
+            for (final Plan plan : input) map.put(plan.getName(), toDefaultPlan(plan));
+            tmpDefaultPlans = ImmutableMap.copyOf(map);
         }
-        return tmpDefaultPlans;
+        return tmpDefaultPlans.values();
     }
 
     private Iterable<Plan> toFilterDefaultPlans(final String priceListName) {
         if (tmpDefaultPlans == null) {
             throw new IllegalStateException("Cannot filter on uninitialized plans");
         }
-        return Iterables.filter(tmpDefaultPlans, new Predicate<Plan>() {
+        return Iterables.filter(tmpDefaultPlans.values(), new Predicate<Plan>() {
             @Override
             public boolean apply(final Plan input) {
                 return input.getPriceListName().equals(priceListName);
@@ -390,12 +376,8 @@ public class StandaloneCatalogMapper {
             return null;
         }
         if (tmpDefaultProducts != null) {
-            final Product existingProduct = findOrIllegalState(tmpDefaultProducts, new Predicate<Product>() {
-                @Override
-                public boolean apply(final Product predicateInput) {
-                    return predicateInput.getName().equals(input.getName());
-                }
-            }, "Unknown product " + input.getName());
+            final Product existingProduct = tmpDefaultProducts.get(input.getName());
+            if (existingProduct == null) throw new IllegalStateException("Unknown product " + input.getName());
             return existingProduct;
         }
         final DefaultProduct result = new DefaultProduct();
@@ -407,12 +389,8 @@ public class StandaloneCatalogMapper {
 
     private Plan toDefaultPlan(final Plan input) {
         if (tmpDefaultPlans != null) {
-            final Plan existingPlan = findOrIllegalState(tmpDefaultPlans, new Predicate<Plan>() {
-                @Override
-                public boolean apply(final Plan predicateInput) {
-                    return predicateInput.getName().equals(input.getName());
-                }
-            }, "Unknown plan " + input.getName());
+            final Plan existingPlan = tmpDefaultPlans.get(input.getName());
+            if (existingPlan == null) throw new IllegalStateException("Unknown plan " + input.getName());
             return existingPlan;
         }
         final DefaultPlan result = new DefaultPlan();
@@ -497,11 +475,4 @@ public class StandaloneCatalogMapper {
         return ImmutableList.<C>copyOf(input).toArray(foo);
     }
 
-    private <T> T findOrIllegalState(final Iterable<T> input, final Predicate<T> predicate, final String msg) {
-        T result = Iterables.<T> tryFind(input, predicate).orNull();
-        if (result == null) {
-            throw new IllegalStateException(msg);
-        }
-        return result;
-    }
 }
\ No newline at end of file