You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bigtop.apache.org by rn...@apache.org on 2015/08/25 16:21:41 UTC
[07/11] bigtop git commit: BIGTOP-1984. Extract samplers library from
BigPetStore data generator
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/cli/Simulation.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/cli/Simulation.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/cli/Simulation.java
new file mode 100644
index 0000000..16aabf0
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/cli/Simulation.java
@@ -0,0 +1,188 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.cli;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.bigtop.datagenerators.bigpetstore.Constants;
+import org.apache.bigtop.datagenerators.bigpetstore.CustomerGenerator;
+import org.apache.bigtop.datagenerators.bigpetstore.ProductGenerator;
+import org.apache.bigtop.datagenerators.bigpetstore.PurchasingModelGenerator;
+import org.apache.bigtop.datagenerators.bigpetstore.StoreGenerator;
+import org.apache.bigtop.datagenerators.bigpetstore.TransactionGenerator;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Customer;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Store;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Transaction;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.InputData;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ProductCategory;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.purchase.PurchasingModel;
+import org.apache.bigtop.datagenerators.samplers.SeedFactory;
+import org.apache.bigtop.datagenerators.samplers.samplers.RouletteWheelSampler;
+import org.apache.bigtop.datagenerators.samplers.samplers.Sampler;
+
+import com.google.common.collect.Lists;
+
+public class Simulation
+{
+ InputData inputData;
+ SeedFactory seedFactory;
+ int nStores;
+ int nCustomers;
+ int nPurchasingModels;
+ double simulationTime;
+
+ List<Store> stores;
+ List<Customer> customers;
+ Sampler<PurchasingModel> purchasingModelSampler;
+ List<PurchasingModel> purchasingProfiles;
+ List<Transaction> transactions;
+ List<ProductCategory> productCategories;
+
+ public Simulation(InputData inputData, int nStores, int nCustomers, int nPurchasingModels, double simulationTime, long seed)
+ {
+ this.inputData = inputData;
+ this.nStores = nStores;
+ this.nCustomers = nCustomers;
+ this.nPurchasingModels = nPurchasingModels;
+ this.simulationTime = simulationTime;
+ seedFactory = new SeedFactory(seed);
+ }
+
+ public void generateStores() throws Exception
+ {
+ System.out.println("Generating stores");
+ StoreGenerator storeGenerator = new StoreGenerator(inputData, seedFactory);
+
+ stores = new Vector<Store>();
+ for(int i = 0; i < nStores; i++)
+ {
+ Store store = storeGenerator.generate();
+ stores.add(store);
+ }
+
+ stores = Collections.unmodifiableList(stores);
+
+ System.out.println("Generated " + stores.size() + " stores");
+ }
+
+ public void generateCustomers() throws Exception
+ {
+ System.out.println("Generating customers");
+ CustomerGenerator generator = new CustomerGenerator(inputData, stores, seedFactory);
+
+ customers = new Vector<Customer>();
+ for(int i = 0; i < nCustomers; i++)
+ {
+ Customer customer = generator.generate();
+ customers.add(customer);
+ }
+
+ customers = Collections.unmodifiableList(customers);
+
+ System.out.println("Generated " + customers.size() + " customers");
+ }
+
+ public void generateProducts()
+ {
+ System.out.println("Generating products");
+ ProductGenerator generator = new ProductGenerator(Constants.PRODUCTS_COLLECTION);
+ productCategories = generator.generate();
+ }
+
+ public void generatePurchasingProfiles() throws Exception
+ {
+ System.out.println("Generating purchasing profiles");
+ PurchasingModelGenerator generator = new PurchasingModelGenerator(productCategories, seedFactory);
+
+ purchasingProfiles = new Vector<PurchasingModel>();
+ for(int i = 0; i < nPurchasingModels; i++)
+ {
+ PurchasingModel profile = generator.generate();
+ purchasingProfiles.add(profile);
+ }
+
+ System.out.println("Generated " + purchasingProfiles.size() + " purchasing profiles");
+
+ purchasingModelSampler = RouletteWheelSampler.createUniform(purchasingProfiles, seedFactory);
+ }
+
+ public void generateTransactions() throws Exception
+ {
+ System.out.println("Generating transactions");
+ transactions = Lists.newArrayList();
+
+ for(int i = 0; i < nCustomers; i++)
+ {
+ Customer customer = customers.get(i);
+ PurchasingModel profile = purchasingModelSampler.sample();
+
+ TransactionGenerator generator = new TransactionGenerator(customer,
+ profile, productCategories, seedFactory);
+
+ while(true)
+ {
+ Transaction transaction = generator.generate();
+
+ if(transaction.getDateTime() > simulationTime)
+ break;
+ transactions.add(transaction);
+ }
+ }
+
+ System.out.println("Generated " + transactions.size() + " transactions");
+ }
+
+ public void simulate() throws Exception
+ {
+ generateStores();
+ generateCustomers();
+ generateProducts();
+ generatePurchasingProfiles();
+ generateTransactions();
+ }
+
+ public List<Store> getStores()
+ {
+ return stores;
+ }
+
+ public List<Customer> getCustomers()
+ {
+ return customers;
+ }
+
+ public List<Transaction> getTransactions()
+ {
+ return transactions;
+ }
+
+ public InputData getInputData()
+ {
+ return inputData;
+ }
+
+ public List<ProductCategory> getProductCategories()
+ {
+ return this.productCategories;
+ }
+
+ public List<PurchasingModel> getPurchasingProfiles()
+ {
+ return this.purchasingProfiles;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Customer.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Customer.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Customer.java
new file mode 100644
index 0000000..8847a36
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Customer.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels;
+
+import java.io.Serializable;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+import org.apache.commons.lang3.tuple.Pair;
+
+public class Customer implements Serializable
+{
+ private static final long serialVersionUID = 5739806281335931258L;
+
+ int id;
+ Pair<String, String> name;
+ ZipcodeRecord location;
+ Store store;
+
+ public Customer(int id, Pair<String, String> name, Store store, ZipcodeRecord location)
+ {
+ this.id = id;
+ this.name = name;
+ this.location = location;
+ this.store = store;
+ }
+
+ public int getId()
+ {
+ return id;
+ }
+
+ public Pair<String, String> getName()
+ {
+ return name;
+ }
+
+ public ZipcodeRecord getLocation()
+ {
+ return location;
+ }
+
+ public Store getStore()
+ {
+ return store;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/PetSpecies.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/PetSpecies.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/PetSpecies.java
new file mode 100644
index 0000000..393626c
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/PetSpecies.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels;
+
+public enum PetSpecies
+{
+ DOG,
+ CAT;
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Product.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Product.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Product.java
new file mode 100644
index 0000000..da82647
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Product.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+public class Product implements Serializable
+{
+ private static final long serialVersionUID = 4519472063058037956L;
+
+ ImmutableMap<String, Object> fields;
+
+ public Product(Map<String, Object> fields)
+ {
+ this.fields = ImmutableMap.copyOf(fields);
+ }
+
+ public ImmutableSet<String> getFieldNames()
+ {
+ return fields.keySet();
+ }
+
+ public Object getFieldValue(String fieldName)
+ {
+ return fields.get(fieldName);
+ }
+
+ public String getFieldValueAsString(String fieldName)
+ {
+ return fields.get(fieldName).toString();
+ }
+
+ public Double getFieldValueAsDouble(String fieldName)
+ {
+ Object value = getFieldValue(fieldName);
+ try
+ {
+ Double doubleValue = (Double) value;
+ return doubleValue;
+ }
+ catch(ClassCastException e)
+ {
+ return null;
+ }
+ }
+
+ public Long getFieldValueAsLong(String fieldName)
+ {
+ Object value = getFieldValue(fieldName);
+ try
+ {
+ Long longValue = (Long) value;
+ return longValue;
+ }
+ catch(ClassCastException e)
+ {
+ try
+ {
+ Integer intValue = (Integer) value;
+ return new Long(intValue);
+ }
+ catch(ClassCastException f)
+ {
+ return null;
+ }
+ }
+ }
+
+ public String toString()
+ {
+ String str = "";
+ for(Map.Entry<String, Object> entry : fields.entrySet())
+ {
+ str += entry.getKey() + "=" + entry.getValue() + ";";
+ }
+
+ return str;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Store.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Store.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Store.java
new file mode 100644
index 0000000..61730dd
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Store.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels;
+
+import java.io.Serializable;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+
+public class Store implements Serializable
+{
+ private static final long serialVersionUID = 2347066623022747969L;
+
+ int id;
+ String name;
+ ZipcodeRecord location;
+
+ public Store(int id, String name, ZipcodeRecord location)
+ {
+ this.id = id;
+ this.name = name;
+ this.location = location;
+ }
+
+ public int getId()
+ {
+ return id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public ZipcodeRecord getLocation()
+ {
+ return location;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Transaction.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Transaction.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Transaction.java
new file mode 100644
index 0000000..0ea8a66
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/Transaction.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.google.common.collect.ImmutableList;
+
+public class Transaction implements Serializable
+{
+ private static final long serialVersionUID = 103133601154354349L;
+
+ final int id;
+ final Customer customer;
+ final Store store;
+ final Double dateTime;
+ final ImmutableList<Product> products;
+
+ public Transaction(int id, Customer customer, Store store, Double dateTime, List<Product> products)
+ {
+ this.id = id;
+ this.customer = customer;
+ this.store = store;
+ this.dateTime = dateTime;
+ this.products = ImmutableList.copyOf(products);
+ }
+
+ public int getId()
+ {
+ return id;
+ }
+
+ public Customer getCustomer()
+ {
+ return customer;
+ }
+
+ public Store getStore()
+ {
+ return store;
+ }
+
+ public Double getDateTime()
+ {
+ return dateTime;
+ }
+
+ public ImmutableList<Product> getProducts()
+ {
+ return products;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/InputData.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/InputData.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/InputData.java
new file mode 100644
index 0000000..7f5eddf
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/InputData.java
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+
+public class InputData implements Serializable
+{
+ private static final long serialVersionUID = 9078989799806707788L;
+
+ List<ZipcodeRecord> zipcodeTable;
+ Names names;
+
+ public InputData(List<ZipcodeRecord> zipcodeTable,
+ Names names)
+ {
+ this.zipcodeTable = Collections.unmodifiableList(zipcodeTable);
+ this.names = names;
+ }
+
+ public List<ZipcodeRecord> getZipcodeTable()
+ {
+ return zipcodeTable;
+ }
+
+ public Names getNames()
+ {
+ return names;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/Names.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/Names.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/Names.java
new file mode 100644
index 0000000..2d6da89
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/Names.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+
+public class Names implements Serializable
+{
+ private static final long serialVersionUID = 2731634747628534453L;
+
+ final ImmutableMap<String, Double> firstNames;
+ final ImmutableMap<String, Double> lastNames;
+
+ public Names(Map<String, Double> firstNames,
+ Map<String, Double> lastNames)
+ {
+ this.firstNames = ImmutableMap.copyOf(firstNames);
+ this.lastNames = ImmutableMap.copyOf(lastNames);
+ }
+
+ public ImmutableMap<String, Double> getFirstNames()
+ {
+ return firstNames;
+ }
+
+ public ImmutableMap<String, Double> getLastNames()
+ {
+ return lastNames;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ProductCategory.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ProductCategory.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ProductCategory.java
new file mode 100644
index 0000000..c14d499
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ProductCategory.java
@@ -0,0 +1,108 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.PetSpecies;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Product;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+public class ProductCategory implements Serializable
+{
+ private static final long serialVersionUID = -7638076590334497836L;
+
+ String categoryLabel;
+ ImmutableSet<PetSpecies> applicableSpecies;
+ ImmutableSet<String> fieldNames;
+ boolean triggerTransaction;
+ double dailyUsageRate;
+ double amountUsedPerPetAverage;
+ double amountUsedPerPetVariance;
+ double triggerTransactionRate;
+ double triggerPurchaseRate;
+ ImmutableList<Product> products;
+
+ public ProductCategory(String categoryLabel, Set<PetSpecies> species, Set<String> fieldNames,
+ boolean triggerTransaction, double dailyUsageRate, double amountUsedPerPetAverage,
+ double amountUsedPerPetVariance, double triggerTransactionRate,
+ double triggerPurchaseRate, List<Product> products)
+ {
+ this.categoryLabel = categoryLabel;
+ this.applicableSpecies = ImmutableSet.copyOf(species);
+ this.fieldNames = ImmutableSet.copyOf(fieldNames);
+ this.triggerTransaction = triggerTransaction;
+ this.dailyUsageRate = dailyUsageRate;
+ this.amountUsedPerPetAverage = amountUsedPerPetAverage;
+ this.amountUsedPerPetVariance = amountUsedPerPetVariance;
+ this.triggerTransactionRate = triggerTransactionRate;
+ this.triggerPurchaseRate = triggerPurchaseRate;
+ this.products = ImmutableList.copyOf(products);
+ }
+
+ public String getCategoryLabel()
+ {
+ return categoryLabel;
+ }
+
+ public ImmutableSet<PetSpecies> getApplicableSpecies()
+ {
+ return applicableSpecies;
+ }
+
+ public ImmutableSet<String> getFieldNames()
+ {
+ return fieldNames;
+ }
+ public Boolean getTriggerTransaction()
+ {
+ return triggerTransaction;
+ }
+
+ public Double getDailyUsageRate()
+ {
+ return dailyUsageRate;
+ }
+
+ public Double getBaseAmountUsedAverage()
+ {
+ return amountUsedPerPetAverage;
+ }
+
+ public Double getBaseAmountUsedVariance()
+ {
+ return amountUsedPerPetVariance;
+ }
+
+ public Double getTransactionTriggerRate()
+ {
+ return triggerTransactionRate;
+ }
+
+ public Double getPurchaseTriggerRate()
+ {
+ return triggerPurchaseRate;
+ }
+
+ public ImmutableList<Product> getProducts()
+ {
+ return products;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ZipcodeRecord.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ZipcodeRecord.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ZipcodeRecord.java
new file mode 100644
index 0000000..e5eeb60
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datamodels/inputs/ZipcodeRecord.java
@@ -0,0 +1,90 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+public class ZipcodeRecord implements Serializable
+{
+ private static final long serialVersionUID = 1769986686070108470L;
+
+ final String zipcode;
+ final Pair<Double, Double> coordinates;
+ final String city;
+ final String state;
+ final double medianHouseholdIncome;
+ final long population;
+
+ public ZipcodeRecord(String zipcode, Pair<Double, Double> coordinates,
+ String city, String state, double medianHouseholdIncome, long population)
+ {
+ this.city = city;
+ this.state = state;
+ this.zipcode = zipcode;
+ this.coordinates = coordinates;
+ this.medianHouseholdIncome = medianHouseholdIncome;
+ this.population = population;
+ }
+
+ public String getZipcode()
+ {
+ return zipcode;
+ }
+
+ public Pair<Double, Double> getCoordinates()
+ {
+ return coordinates;
+ }
+
+ public double getMedianHouseholdIncome()
+ {
+ return medianHouseholdIncome;
+ }
+
+ public long getPopulation()
+ {
+ return population;
+ }
+
+ public double distance(ZipcodeRecord other)
+ {
+ if(other.getZipcode().equals(zipcode))
+ return 0.0;
+
+ Pair<Double, Double> otherCoords = other.getCoordinates();
+
+ double dist = Math.sin(Math.toRadians(coordinates.getLeft())) *
+ Math.sin(Math.toRadians(otherCoords.getLeft())) +
+ Math.cos(Math.toRadians(coordinates.getLeft())) *
+ Math.cos(Math.toRadians(otherCoords.getLeft())) *
+ Math.cos(Math.toRadians(coordinates.getRight() - otherCoords.getRight()));
+ dist = Math.toDegrees(Math.acos(dist)) * 69.09;
+
+ return dist;
+ }
+
+ public String getCity()
+ {
+ return city;
+ }
+
+ public String getState()
+ {
+ return state;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/NameReader.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/NameReader.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/NameReader.java
new file mode 100644
index 0000000..ec5412a
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/NameReader.java
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datareaders;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Scanner;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.Names;
+
+import com.google.common.collect.Maps;
+
+public class NameReader
+{
+ InputStream path;
+
+ public NameReader(InputStream path)
+ {
+ this.path = path;
+ }
+
+ public Names readData() throws FileNotFoundException
+ {
+ Scanner scanner = new Scanner(path);
+
+ Map<String, Double> firstNames = Maps.newHashMap();
+ Map<String, Double> lastNames = Maps.newHashMap();
+
+ while(scanner.hasNextLine())
+ {
+ String line = scanner.nextLine();
+ String[] cols = line.trim().split(",");
+
+ String name = cols[0];
+ double weight = Double.parseDouble(cols[5]);
+
+ if(cols[4].equals("1"))
+ firstNames.put(name, weight);
+ if(cols[3].equals("1"))
+ lastNames.put(name, weight);
+ }
+
+ scanner.close();
+
+ return new Names(firstNames, lastNames);
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/ZipcodeReader.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/ZipcodeReader.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/ZipcodeReader.java
new file mode 100644
index 0000000..2478c8e
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/datareaders/ZipcodeReader.java
@@ -0,0 +1,193 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.datareaders;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.Vector;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+
+public class ZipcodeReader
+{
+ private static class ZipcodeLocationRecord
+ {
+ public final Pair<Double, Double> coordinates;
+ public final String state;
+ public final String city;
+
+ public ZipcodeLocationRecord(Pair<Double, Double> coordinates,
+ String city, String state)
+ {
+ this.coordinates = coordinates;
+ this.city = city;
+ this.state = state;
+ }
+ }
+
+ InputStream zipcodeIncomesFile = null;
+ InputStream zipcodePopulationFile = null;
+ InputStream zipcodeCoordinatesFile = null;
+
+ public void setIncomesFile(InputStream path)
+ {
+ this.zipcodeIncomesFile = path;
+ }
+
+ public void setPopulationFile(InputStream path)
+ {
+ this.zipcodePopulationFile = path;
+ }
+
+ public void setCoordinatesFile(InputStream path)
+ {
+ this.zipcodeCoordinatesFile = path;
+ }
+
+ private ImmutableMap<String, Double> readIncomeData(InputStream path) throws FileNotFoundException
+ {
+ Scanner scanner = new Scanner(path);
+
+ // skip headers
+ scanner.nextLine();
+ scanner.nextLine();
+
+ Map<String, Double> entries = Maps.newHashMap();
+ while(scanner.hasNextLine())
+ {
+ String line = scanner.nextLine().trim();
+ String[] cols = line.split(",");
+ // zipcodes are in the form "ZCTA5 XXXXX"
+ String zipcode = cols[2].split(" ")[1].trim();
+ try
+ {
+ double medianHouseholdIncome = Integer.parseInt(cols[5].trim());
+ entries.put(zipcode, medianHouseholdIncome);
+ }
+ catch(NumberFormatException e)
+ {
+
+ }
+ }
+
+ scanner.close();
+
+ return ImmutableMap.copyOf(entries);
+ }
+
+ private ImmutableMap<String, Long> readPopulationData(InputStream path) throws FileNotFoundException
+ {
+ Scanner scanner = new Scanner(path);
+
+ // skip header
+ scanner.nextLine();
+
+ Map<String, Long> entries = Maps.newHashMap();
+ while(scanner.hasNextLine())
+ {
+ String line = scanner.nextLine().trim();
+
+ if(line.length() == 0)
+ continue;
+
+ String[] cols = line.split(",");
+
+ String zipcode = cols[0].trim();
+ Long population = Long.parseLong(cols[1].trim());
+
+ if(entries.containsKey(zipcode))
+ {
+ entries.put(zipcode, Math.max(entries.get(zipcode), population));
+ }
+ else
+ {
+ entries.put(zipcode, population);
+ }
+ }
+
+ scanner.close();
+
+ return ImmutableMap.copyOf(entries);
+ }
+
+ private ImmutableMap<String, ZipcodeLocationRecord> readCoordinates(InputStream path) throws FileNotFoundException
+ {
+ Scanner scanner = new Scanner(path);
+
+ // skip header
+ scanner.nextLine();
+
+ Map<String, ZipcodeLocationRecord> entries = Maps.newHashMap();
+ while(scanner.hasNextLine())
+ {
+ String line = scanner.nextLine().trim();
+
+ String[] cols = line.split(", ");
+
+ // remove quote marks
+ String zipcode = cols[0].substring(1, cols[0].length() - 1);
+ String state = cols[1].substring(1, cols[1].length() - 1);
+ Double latitude = Double.parseDouble(cols[2].substring(1, cols[2].length() - 1));
+ Double longitude = Double.parseDouble(cols[3].substring(1, cols[3].length() - 1));
+ String city = cols[4].substring(1, cols[4].length() - 1);
+
+ Pair<Double, Double> coords = Pair.of(latitude, longitude);
+
+ ZipcodeLocationRecord record = new ZipcodeLocationRecord(coords, city, state);
+
+ entries.put(zipcode, record);
+ }
+
+ scanner.close();
+
+ return ImmutableMap.copyOf(entries);
+ }
+
+ public ImmutableList<ZipcodeRecord> readData() throws FileNotFoundException
+ {
+ ImmutableMap<String, Double> incomes = readIncomeData(this.zipcodeIncomesFile);
+ ImmutableMap<String, Long> populations = readPopulationData(this.zipcodePopulationFile);
+ ImmutableMap<String, ZipcodeLocationRecord> coordinates = readCoordinates(this.zipcodeCoordinatesFile);
+
+ Set<String> zipcodeSubset = new HashSet<String>(incomes.keySet());
+ zipcodeSubset.retainAll(populations.keySet());
+ zipcodeSubset.retainAll(coordinates.keySet());
+
+ List<ZipcodeRecord> table = new Vector<ZipcodeRecord>();
+ for(String zipcode : zipcodeSubset)
+ {
+ ZipcodeRecord record = new ZipcodeRecord(zipcode,
+ coordinates.get(zipcode).coordinates,
+ coordinates.get(zipcode).city,
+ coordinates.get(zipcode).state,
+ incomes.get(zipcode),
+ populations.get(zipcode));
+ table.add(record);
+ }
+
+ return ImmutableList.copyOf(table);
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerLocationPDF.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerLocationPDF.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerLocationPDF.java
new file mode 100644
index 0000000..08cbc81
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerLocationPDF.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.customer;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Store;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+import org.apache.bigtop.datagenerators.samplers.pdfs.ProbabilityDensityFunction;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+
+public class CustomerLocationPDF implements ProbabilityDensityFunction<ZipcodeRecord>
+{
+ private final Map<ZipcodeRecord, Double> pdf;
+
+ public CustomerLocationPDF(List<ZipcodeRecord> zipcodes, Store store, double averageDistance)
+ {
+ this.pdf = build(zipcodes, store, averageDistance);
+ }
+
+ protected ImmutableMap<ZipcodeRecord, Double> build(List<ZipcodeRecord> zipcodeTable,
+ Store store, double averageDistance)
+ {
+ double lambda = 1.0 / averageDistance;
+
+ Map<ZipcodeRecord, Double> zipcodeWeights = Maps.newHashMap();
+ double totalWeight = 0.0;
+ for(ZipcodeRecord record : zipcodeTable)
+ {
+ double dist = record.distance(store.getLocation());
+
+ double weight = lambda * Math.exp(-1.0 * lambda * dist);
+ totalWeight += weight;
+ zipcodeWeights.put(record, weight);
+ }
+
+ Map<ZipcodeRecord, Double> pdf = Maps.newHashMap();
+ for(ZipcodeRecord record : zipcodeTable)
+ {
+ pdf.put(record, zipcodeWeights.get(record) / totalWeight);
+ }
+
+ return ImmutableMap.copyOf(pdf);
+ }
+
+ public double probability(ZipcodeRecord record)
+ {
+ if(!this.pdf.containsKey(record))
+ return 0.0;
+
+ return this.pdf.get(record);
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSampler.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSampler.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSampler.java
new file mode 100644
index 0000000..13b69a3
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSampler.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.customer;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Customer;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Store;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+import org.apache.bigtop.datagenerators.samplers.samplers.ConditionalSampler;
+import org.apache.bigtop.datagenerators.samplers.samplers.Sampler;
+import org.apache.commons.lang3.tuple.Pair;
+
+public class CustomerSampler implements Sampler<Customer>
+{
+ private final Sampler<Integer> idSampler;
+ private final Sampler<String> firstNameSampler;
+ private final Sampler<String> lastNameSampler;
+ private final Sampler<Store> storeSampler;
+ private final ConditionalSampler<ZipcodeRecord, Store> locationSampler;
+
+
+ public CustomerSampler(Sampler<Integer> idSampler, Sampler<String> firstNameSampler,
+ Sampler<String> lastNameSampler, Sampler<Store> storeSampler,
+ ConditionalSampler<ZipcodeRecord, Store> locationSampler)
+ {
+ this.idSampler = idSampler;
+ this.firstNameSampler = firstNameSampler;
+ this.lastNameSampler = lastNameSampler;
+ this.storeSampler = storeSampler;
+ this.locationSampler = locationSampler;
+ }
+
+ public Customer sample() throws Exception
+ {
+ Integer id = idSampler.sample();
+ Pair<String, String> name = Pair.of(firstNameSampler.sample(),
+ lastNameSampler.sample());
+ Store store = storeSampler.sample();
+ ZipcodeRecord location = locationSampler.sample(store);
+
+ return new Customer(id, name, store, location);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSamplerBuilder.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSamplerBuilder.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSamplerBuilder.java
new file mode 100644
index 0000000..56ab761
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerSamplerBuilder.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.customer;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.bigtop.datagenerators.bigpetstore.Constants;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Customer;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Store;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.InputData;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ZipcodeRecord;
+import org.apache.bigtop.datagenerators.samplers.SeedFactory;
+import org.apache.bigtop.datagenerators.samplers.pdfs.ProbabilityDensityFunction;
+import org.apache.bigtop.datagenerators.samplers.samplers.ConditionalSampler;
+import org.apache.bigtop.datagenerators.samplers.samplers.RouletteWheelSampler;
+import org.apache.bigtop.datagenerators.samplers.samplers.Sampler;
+import org.apache.bigtop.datagenerators.samplers.samplers.SequenceSampler;
+
+import com.google.common.collect.Maps;
+
+public class CustomerSamplerBuilder
+{
+ private final List<Store> stores;
+ private final InputData inputData;
+ private final SeedFactory seedFactory;
+
+ public CustomerSamplerBuilder(List<Store> stores, InputData inputData, SeedFactory seedFactory)
+ {
+ this.stores = stores;
+ this.seedFactory = seedFactory;
+ this.inputData = inputData;
+ }
+
+ protected ConditionalSampler<ZipcodeRecord, Store> buildLocationSampler()
+ {
+ final Map<Store, Sampler<ZipcodeRecord>> locationSamplers = Maps.newHashMap();
+ for(Store store : stores)
+ {
+ ProbabilityDensityFunction<ZipcodeRecord> locationPDF = new CustomerLocationPDF(inputData.getZipcodeTable(),
+ store, Constants.AVERAGE_CUSTOMER_STORE_DISTANCE);
+ Sampler<ZipcodeRecord> locationSampler = RouletteWheelSampler.create(inputData.getZipcodeTable(), locationPDF, seedFactory);
+ locationSamplers.put(store, locationSampler);
+ }
+
+ return new ConditionalSampler<ZipcodeRecord, Store>()
+ {
+ public ZipcodeRecord sample(Store store) throws Exception
+ {
+ return locationSamplers.get(store).sample();
+ }
+ };
+ }
+
+ public Sampler<Customer> build()
+ {
+ ProbabilityDensityFunction<Store> storePDF = new CustomerStorePDF(stores);
+
+ Sampler<Integer> idSampler = new SequenceSampler();
+ Sampler<String> firstNameSampler = RouletteWheelSampler.create(inputData.getNames().getFirstNames(), seedFactory);
+ Sampler<String> lastNameSampler = RouletteWheelSampler.create(inputData.getNames().getLastNames(), seedFactory);
+ Sampler<Store> storeSampler = RouletteWheelSampler.create(stores, storePDF, seedFactory);
+
+ return new CustomerSampler(idSampler, firstNameSampler, lastNameSampler, storeSampler, buildLocationSampler());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerStorePDF.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerStorePDF.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerStorePDF.java
new file mode 100644
index 0000000..6131454
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/customer/CustomerStorePDF.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.customer;
+
+import java.util.List;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Store;
+import org.apache.bigtop.datagenerators.samplers.pdfs.ProbabilityDensityFunction;
+
+public class CustomerStorePDF implements ProbabilityDensityFunction<Store>
+{
+ double populationSum = 0.0;
+
+ public CustomerStorePDF(List<Store> stores)
+ {
+ for(Store store : stores)
+ {
+ populationSum += (double) store.getLocation().getPopulation();
+ }
+ }
+
+ @Override
+ public double probability(Store store)
+ {
+ return ((double) store.getLocation().getPopulation()) / populationSum;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductBuilderIterator.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductBuilderIterator.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductBuilderIterator.java
new file mode 100644
index 0000000..bf64ea7
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductBuilderIterator.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.bigtop.datagenerators.bigpetstore.Constants;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Product;
+
+import com.google.common.collect.Maps;
+
+public class ProductBuilderIterator implements Iterator<Product>
+{
+ Iterator<Map<String, ProductFieldValue>> productIterator;
+ double basePrice;
+ String productCategory;
+
+ public ProductBuilderIterator(double basePrice, String productCategory,
+ Iterator<Map<String, ProductFieldValue>> productIterator)
+ {
+ this.productIterator = productIterator;
+ this.basePrice = basePrice;
+ this.productCategory = productCategory;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return productIterator != null && productIterator.hasNext();
+ }
+
+ @Override
+ public Product next()
+ {
+ Map<String, ProductFieldValue> productComponents = productIterator.next();
+
+ double sum = 0.0;
+ double product = 1.0;
+
+ Map<String, Object> productFields = Maps.newHashMap();
+
+ for(Map.Entry<String, ProductFieldValue> entry : productComponents.entrySet())
+ {
+ productFields.put(entry.getKey(), entry.getValue().getValue());
+ sum += entry.getValue().getAdd();
+ product *= entry.getValue().getMultiply();
+ }
+
+ double quantity = (Double) productFields.get(Constants.PRODUCT_QUANTITY);
+ double price = product * (sum + basePrice);
+ double unitPrice = price / quantity;
+
+ productFields.put(Constants.PRODUCT_UNIT_PRICE, unitPrice);
+ productFields.put(Constants.PRODUCT_PRICE, price);
+ productFields.put(Constants.PRODUCT_CATEGORY, productCategory);
+
+ return new Product(productFields);
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException("ProductBuilder does not support remove()");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductCategoryBuilder.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductCategoryBuilder.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductCategoryBuilder.java
new file mode 100644
index 0000000..d105ec3
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductCategoryBuilder.java
@@ -0,0 +1,195 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import org.apache.bigtop.datagenerators.bigpetstore.Constants;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.PetSpecies;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Product;
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.inputs.ProductCategory;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.AlwaysTrueRule;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.NotRule;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.OrRule;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.Rule;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+public class ProductCategoryBuilder
+{
+ String categoryLabel;
+ Set<PetSpecies> applicableSpecies;
+ Boolean triggerTransaction;
+ Double dailyUsageRate;
+ Double amountUsedPerPetAverage;
+ Double amountUsedPerPetVariance;
+ Double triggerTransactionRate;
+ Double triggerPurchaseRate;
+ List<Rule> exclusionRules;
+ Map<String, Collection<ProductFieldValue>> productFieldValues;
+ Double basePrice;
+ List<Product> products;
+
+ public ProductCategoryBuilder()
+ {
+ applicableSpecies = Sets.newHashSet();
+
+ dailyUsageRate = 0.0;
+ amountUsedPerPetAverage = 0.0;
+ amountUsedPerPetVariance = 0.0;
+ triggerTransactionRate = 0.0;
+ triggerPurchaseRate = 0.0;
+ triggerTransaction = false;
+ categoryLabel = null;
+ exclusionRules = new Vector<Rule>();
+ productFieldValues = Maps.newHashMap();
+ basePrice = 1.0;
+ products = Lists.newArrayList();
+ }
+
+ public void setCategory(String category)
+ {
+ this.categoryLabel = category;
+ }
+
+ public void setTriggerTransaction(Boolean triggerTransaction)
+ {
+ this.triggerTransaction = triggerTransaction;
+ }
+
+ public void setDailyUsageRate(Double dailyUsageRate)
+ {
+ this.dailyUsageRate = dailyUsageRate;
+ }
+
+ public void setAmountUsedPetPetAverage(Double baseAmountUsedAverage)
+ {
+ this.amountUsedPerPetAverage = baseAmountUsedAverage;
+ }
+
+ public void setAmountUsedPetPetVariance(Double baseAmountUsedVariance)
+ {
+ this.amountUsedPerPetVariance = baseAmountUsedVariance;
+ }
+
+ public void setTriggerTransactionRate(Double triggerTransactionRate)
+ {
+ this.triggerTransactionRate = triggerTransactionRate;
+ }
+
+ public void setTriggerPurchaseRate(Double triggerPurchaseRate)
+ {
+ this.triggerPurchaseRate = triggerPurchaseRate;
+ }
+
+ public void addApplicableSpecies(PetSpecies species)
+ {
+ this.applicableSpecies.add(species);
+ }
+
+ public void addProduct(Product product)
+ {
+ products.add(product);
+ }
+
+ public void addExclusionRule(Rule rule)
+ {
+ this.exclusionRules.add(rule);
+ }
+
+ public void addPropertyValues(String fieldName, ProductFieldValue ... values)
+ {
+ this.productFieldValues.put(fieldName, Arrays.asList(values));
+ }
+
+ public void setBasePrice(double basePrice)
+ {
+ this.basePrice = basePrice;
+ }
+
+
+ protected List<Product> generateProducts()
+ {
+ Rule combinedRules = new NotRule(new AlwaysTrueRule());
+ if(exclusionRules.size() == 1)
+ {
+ combinedRules = exclusionRules.get(0);
+ }
+ else if(exclusionRules.size() > 1)
+ {
+ combinedRules = new OrRule(exclusionRules.toArray(new Rule[] {}));
+ }
+
+ Iterator<Product> productIterator = new ProductIterator(productFieldValues, combinedRules,
+ basePrice, categoryLabel);
+
+ while(productIterator.hasNext())
+ {
+ products.add(productIterator.next());
+ }
+
+ return products;
+ }
+
+ public void validateProducts()
+ {
+ for(Product product : products)
+ {
+ if(!product.getFieldNames().contains(Constants.PRODUCT_CATEGORY))
+ {
+ throw new IllegalStateException("Product must have field " + Constants.PRODUCT_CATEGORY);
+ }
+
+ if(!product.getFieldNames().contains(Constants.PRODUCT_QUANTITY))
+ {
+ throw new IllegalStateException("Product must have field " + Constants.PRODUCT_QUANTITY);
+ }
+
+ if(!product.getFieldNames().contains(Constants.PRODUCT_PRICE))
+ {
+ throw new IllegalStateException("Product must have field " + Constants.PRODUCT_PRICE);
+ }
+
+ if(!product.getFieldNames().contains(Constants.PRODUCT_UNIT_PRICE))
+ {
+ throw new IllegalStateException("Product must have field " + Constants.PRODUCT_UNIT_PRICE);
+ }
+ }
+ }
+
+ public ProductCategory build()
+ {
+ List<Product> products = generateProducts();
+
+ Set<String> fieldNames = Sets.newHashSet();
+ for(Product product : products)
+ {
+ fieldNames.addAll(product.getFieldNames());
+ }
+
+ return new ProductCategory(categoryLabel, applicableSpecies, fieldNames, triggerTransaction,
+ dailyUsageRate, amountUsedPerPetAverage, amountUsedPerPetVariance, triggerTransactionRate,
+ triggerPurchaseRate, products);
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFieldValue.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFieldValue.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFieldValue.java
new file mode 100644
index 0000000..1499fcd
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFieldValue.java
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products;
+
+public class ProductFieldValue
+{
+ Object value;
+ double add;
+ double multiply;
+
+ public ProductFieldValue(Object value, double add, double multiply)
+ {
+ this.value = value;
+ this.add = add;
+ this.multiply = multiply;
+ }
+
+ public Object getValue()
+ {
+ return value;
+ }
+
+ public double getAdd()
+ {
+ return add;
+ }
+
+ public double getMultiply()
+ {
+ return multiply;
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFilterIterator.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFilterIterator.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFilterIterator.java
new file mode 100644
index 0000000..10a5f3a
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductFilterIterator.java
@@ -0,0 +1,72 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products;
+
+import java.util.Iterator;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Product;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.Rule;
+
+public class ProductFilterIterator implements Iterator<Product>
+{
+ Rule rule;
+ Iterator<Product> products;
+ Product buffer;
+
+ public ProductFilterIterator(Rule rule, Iterator<Product> products)
+ {
+ this.rule = rule;
+ this.products = products;
+ this.buffer = getNext();
+ }
+
+ private Product getNext()
+ {
+ while(products.hasNext())
+ {
+ Product product = products.next();
+
+ if(!rule.ruleMatches(product))
+ {
+ return product;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return buffer != null;
+ }
+
+ @Override
+ public Product next()
+ {
+ Product previous = buffer;
+ buffer = getNext();
+
+ return previous;
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException("ProductFilter does not support remove()");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductIterator.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductIterator.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductIterator.java
new file mode 100644
index 0000000..032b0e4
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/ProductIterator.java
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.bigtop.datagenerators.bigpetstore.datamodels.Product;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian.CartesianProduct;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian.CartesianProductBase;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian.CartesianProductField;
+import org.apache.bigtop.datagenerators.bigpetstore.generators.products.rules.Rule;
+
+public class ProductIterator implements Iterator<Product>
+{
+
+ Iterator<Product> productIterator;
+
+ public ProductIterator(Map<String, Collection<ProductFieldValue>> fieldValues, Rule matcher,
+ double basePrice, String productCategory)
+ {
+ productIterator = new ProductFilterIterator(matcher,
+ new ProductBuilderIterator(basePrice, productCategory,
+ buildCartesianProductIterator(fieldValues)));
+ }
+
+ public Iterator<Map<String, ProductFieldValue>>
+ buildCartesianProductIterator(Map<String, Collection<ProductFieldValue>> fieldValues)
+ {
+ CartesianProduct<ProductFieldValue> product = null;
+ for(Map.Entry<String, Collection<ProductFieldValue>> pair : fieldValues.entrySet())
+ {
+ if(product == null)
+ {
+ product = new CartesianProductBase<ProductFieldValue>(pair.getKey(), pair.getValue());
+ } else
+ {
+ product = new CartesianProductField<ProductFieldValue>(pair.getKey(), pair.getValue(), product);
+ }
+
+ }
+
+ return product;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return productIterator.hasNext();
+ }
+
+ @Override
+ public Product next()
+ {
+ return productIterator.next();
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException("ProductIterator does not support remove()");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProduct.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProduct.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProduct.java
new file mode 100644
index 0000000..2d1c005
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProduct.java
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public interface CartesianProduct<T> extends Iterator<Map<String, T>>
+{
+
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductBase.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductBase.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductBase.java
new file mode 100644
index 0000000..7765469
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductBase.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+public class CartesianProductBase<T> implements CartesianProduct<T>
+{
+ String fieldName;
+ Iterator<T> fieldValues;
+
+ public CartesianProductBase(String fieldName, Collection<T> fieldValues)
+ {
+ this.fieldName = fieldName;
+ this.fieldValues = fieldValues.iterator();
+ }
+
+
+ @Override
+ public boolean hasNext()
+ {
+ return fieldValues.hasNext();
+ }
+
+ @Override
+ public Map<String, T> next()
+ {
+ Map<String, T> map = new HashMap<String, T>();
+ map.put(fieldName, fieldValues.next());
+
+ return map;
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException("CartesianProductBase does not support remove()");
+ }
+}
http://git-wip-us.apache.org/repos/asf/bigtop/blob/15af83eb/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductField.java
----------------------------------------------------------------------
diff --git a/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductField.java b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductField.java
new file mode 100644
index 0000000..38939f6
--- /dev/null
+++ b/bigtop-data-generators/bigpetstore-data-generator/src/main/java/org/apache/bigtop/datagenerators/bigpetstore/generators/products/cartesian/CartesianProductField.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.bigtop.datagenerators.bigpetstore.generators.products.cartesian;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+public class CartesianProductField<T> implements CartesianProduct<T>
+{
+ String fieldName;
+ Iterator<T> fieldValuesIterator;
+ Collection<T> fieldValues;
+ CartesianProduct<T> previous;
+ Map<String, T> baseValue;
+
+ public CartesianProductField(String fieldName, Collection<T> fieldValues, CartesianProduct<T> previous)
+ {
+ this.fieldValues = fieldValues;
+ this.fieldName = fieldName;
+ this.previous = previous;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return previous.hasNext() || (fieldValuesIterator != null && fieldValuesIterator.hasNext());
+ }
+
+ @Override
+ public Map<String, T> next()
+ {
+ if(fieldValuesIterator != null)
+ {
+ Map<String, T> map = new HashMap<String, T>(baseValue);
+ map.put(fieldName, fieldValuesIterator.next());
+
+ if(!fieldValuesIterator.hasNext())
+ {
+ fieldValuesIterator = null;
+ }
+
+ return map;
+ } else if(previous.hasNext())
+ {
+ baseValue = previous.next();
+ fieldValuesIterator = fieldValues.iterator();
+
+ Map<String, T> map = new HashMap<String, T>(baseValue);
+ map.put(fieldName, fieldValuesIterator.next());
+
+ return map;
+ }
+
+ throw new NoSuchElementException();
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException("CartesianProductBase does not support remove()");
+ }
+
+}