Return-Path: X-Original-To: apmail-bigtop-commits-archive@www.apache.org Delivered-To: apmail-bigtop-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0FDA1183C2 for ; Wed, 15 Jul 2015 03:00:40 +0000 (UTC) Received: (qmail 8513 invoked by uid 500); 15 Jul 2015 03:00:39 -0000 Delivered-To: apmail-bigtop-commits-archive@bigtop.apache.org Received: (qmail 8472 invoked by uid 500); 15 Jul 2015 03:00:39 -0000 Mailing-List: contact commits-help@bigtop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: bigtop-dev@bigtop.apache.org Delivered-To: mailing list commits@bigtop.apache.org Received: (qmail 8463 invoked by uid 99); 15 Jul 2015 03:00:39 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Jul 2015 03:00:39 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 841F6E0A9E; Wed, 15 Jul 2015 03:00:39 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: rnowling@apache.org To: commits@bigtop.apache.org Message-Id: <1a3a50a5a7dd40fda1cbb6a17664c320@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: bigtop git commit: BIGTOP-1932. [BigPetStore] Add larger product collection Date: Wed, 15 Jul 2015 03:00:39 +0000 (UTC) Repository: bigtop Updated Branches: refs/heads/master 9e0cbe595 -> 6aea780a2 BIGTOP-1932. [BigPetStore] Add larger product collection Project: http://git-wip-us.apache.org/repos/asf/bigtop/repo Commit: http://git-wip-us.apache.org/repos/asf/bigtop/commit/6aea780a Tree: http://git-wip-us.apache.org/repos/asf/bigtop/tree/6aea780a Diff: http://git-wip-us.apache.org/repos/asf/bigtop/diff/6aea780a Branch: refs/heads/master Commit: 6aea780a2c6bcf7de518294641de13b6c105e327 Parents: 9e0cbe5 Author: RJ Nowling Authored: Mon Jul 13 19:56:51 2015 -0500 Committer: RJ Nowling Committed: Tue Jul 14 21:58:57 2015 -0500 ---------------------------------------------------------------------- .../bigpetstore/datagenerator/Constants.java | 27 +- .../datagenerator/ProductGenerator.java | 19 +- .../bigpetstore/datagenerator/cli/Driver.java | 4 +- .../framework/pdfs/DiscretePDF.java | 52 ---- .../framework/pdfs/MultinomialPDF.java | 57 ++++ .../BoundedMultiModalGaussianSampler.java | 25 +- .../samplers/RouletteWheelSampler.java | 4 +- .../collections/MediumProductCollection.java | 275 +++++++++++++++++++ .../purchase/MultinomialPurchasingModel.java | 12 +- .../MultinomialPurchasingModelSampler.java | 93 ++++--- .../framework/pdfs/TestMultinomialPDF.java | 41 +++ .../cartesian/TestCartesianProductBase.java | 15 + .../cartesian/TestCartesianProductField.java | 15 + .../products/rules/TestAlwaysTrueRule.java | 30 ++ .../generators/products/rules/TestAndRule.java | 51 ++++ .../products/rules/TestFieldPredicate.java | 42 +++ .../generators/products/rules/TestNotRule.java | 36 +++ .../generators/products/rules/TestOrRule.java | 51 ++++ 18 files changed, 724 insertions(+), 125 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/Constants.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/Constants.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/Constants.java index c719054..be7b6a9 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/Constants.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/Constants.java @@ -17,10 +17,12 @@ package org.apache.bigtop.bigpetstore.datagenerator; import java.io.File; import java.util.List; +import java.util.Set; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Pair; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; public class Constants { @@ -30,13 +32,19 @@ public class Constants MARKOV; } + public static enum ProductsCollectionSize + { + SMALL, + MEDIUM; + } + public static final File COORDINATES_FILE = new File("zips.csv"); public static final File INCOMES_FILE = new File("ACS_12_5YR_S1903/ACS_12_5YR_S1903_with_ann.csv"); public static final File POPULATION_FILE = new File("population_data.csv"); public static final File NAMEDB_FILE = new File("namedb/data/data.dat"); - public static final String PRODUCTS_COLLECTION = "small"; + public static final ProductsCollectionSize PRODUCTS_COLLECTION = ProductsCollectionSize.MEDIUM; public static final double INCOME_SCALING_FACTOR = 100.0; @@ -68,17 +76,24 @@ public class Constants public static final double PRODUCT_MSM_LOOPBACK_WEIGHT_LOWERBOUND = 0.05; public static final double PRODUCT_MSM_LOOPBACK_WEIGHT_UPPERBOUND = 0.95; - public static final double PRODUCT_MULTINOMIAL_HIGH_WEIGHT = 10.0; + public static final double PRODUCT_MULTINOMIAL_POSITIVE_WEIGHT = 10.0; public static final double PRODUCT_MULTINOMIAL_NEUTRAL_WEIGHT = 1.0; - public static final double PRODUCT_MULTINOMIAL_LOW_WEIGHT = 0.1; - public static final double PRODUCT_MULTINOMIAL_MIN_PERCENT = 0.01; // 1% - public static final int PRODUCT_MULTINOMIAL_MIN_COUNT = 2; - public static final double PRODUCT_MULTINOMIAL_MAX_PERCENT = 0.1; // 10% + public static final double PRODUCT_MULTINOMIAL_NEGATIVE_WEIGHT = 0.1; + public static final int PRODUCT_MULTINOMIAL_POSITIVE_COUNT_MIN = 1; + public static final double PRODUCT_MULTINOMIAL_POSITIVE_FREQUENCY = 0.1; // 10% public static final String PRODUCT_QUANTITY = "quantity"; public static final String PRODUCT_CATEGORY = "category"; public static final String PRODUCT_UNIT_PRICE = "unitPrice"; public static final String PRODUCT_PRICE = "price"; + /* + * Until we have a more intelligent way (e.g., based on range) of dealing with prices, + * let's exclude them. + */ + public static final Set PRODUCT_MODEL_EXCLUDED_FIELDS = ImmutableSet.of(PRODUCT_CATEGORY, + PRODUCT_UNIT_PRICE, + PRODUCT_PRICE); + public static final double STOP_CATEGORY_WEIGHT = 0.01; } http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/ProductGenerator.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/ProductGenerator.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/ProductGenerator.java index fb3e068..cd008ac 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/ProductGenerator.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/ProductGenerator.java @@ -17,22 +17,33 @@ package org.apache.bigtop.bigpetstore.datagenerator; import java.util.List; +import org.apache.bigtop.bigpetstore.datagenerator.Constants.ProductsCollectionSize; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.inputs.ProductCategory; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.collections.MediumProductCollection; import org.apache.bigtop.bigpetstore.datagenerator.generators.products.collections.SmallProductCollection; public class ProductGenerator { - String collection; + ProductsCollectionSize collection; - public ProductGenerator(String collection) + public ProductGenerator(ProductsCollectionSize collection) { this.collection = collection; } public List generate() { - SmallProductCollection collection = new SmallProductCollection(); - List categories = collection.generateProductCategory(); + List categories; + + if(collection.equals(ProductsCollectionSize.SMALL)) + { + SmallProductCollection collection = new SmallProductCollection(); + categories = collection.generateProductCategory(); + } else + { + MediumProductCollection collection = new MediumProductCollection(); + categories = collection.generateProductCategory(); + } return categories; } http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/cli/Driver.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/cli/Driver.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/cli/Driver.java index 435b620..5b222cc 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/cli/Driver.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/cli/Driver.java @@ -245,9 +245,7 @@ public class Driver for(PurchasingModel model : profiles) { Object productModel = model.getProfile(category.getCategoryLabel()); - String record = category.getCategoryLabel() + ","; - record += i + ","; - record += productModel.toString() + "\n"; + String record = productModel.toString(); outputStream.write(record.getBytes()); http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/DiscretePDF.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/DiscretePDF.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/DiscretePDF.java deleted file mode 100644 index 190aca3..0000000 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/DiscretePDF.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * 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.bigpetstore.datagenerator.framework.pdfs; - -import java.util.Map; -import java.util.Set; - -import com.google.common.collect.ImmutableMap; - -public class DiscretePDF implements ProbabilityDensityFunction -{ - private final ImmutableMap probabilities; - - public DiscretePDF(Map probabilities) - { - this.probabilities = ImmutableMap.copyOf(probabilities); - } - - public Set getData() - { - return probabilities.keySet(); - } - - public double probability(T value) - { - if(probabilities.containsKey(value)) - { - return probabilities.get(value); - } - - return 0.0; - } - - @Override - public String toString() - { - return "DiscretePDF(" + probabilities.toString() +")"; - } -} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/MultinomialPDF.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/MultinomialPDF.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/MultinomialPDF.java new file mode 100644 index 0000000..7605156 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/MultinomialPDF.java @@ -0,0 +1,57 @@ +/** + * 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.bigpetstore.datagenerator.framework.pdfs; + +import java.util.Map; +import java.util.Set; + +import com.google.common.collect.ImmutableMap; + +public class MultinomialPDF implements ProbabilityDensityFunction +{ + private final ImmutableMap probabilities; + + public MultinomialPDF(Map probabilities) + { + this.probabilities = ImmutableMap.copyOf(probabilities); + } + + public Set getData() + { + return probabilities.keySet(); + } + + public double probability(T value) + { + if(probabilities.containsKey(value)) + { + return probabilities.get(value); + } + + return 0.0; + } + + @Override + public String toString() + { + String str = ""; + for(Map.Entry entry: probabilities.entrySet()) + { + str += entry.getValue() + "," + entry.getKey() + "\n"; + } + return str; + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/BoundedMultiModalGaussianSampler.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/BoundedMultiModalGaussianSampler.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/BoundedMultiModalGaussianSampler.java index 475b24d..83ec666 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/BoundedMultiModalGaussianSampler.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/BoundedMultiModalGaussianSampler.java @@ -42,17 +42,20 @@ public class BoundedMultiModalGaussianSampler implements Sampler public Double sample() { - int idx = rng.nextInt(distributions.size()); - - double mean = distributions.get(idx).getFirst(); - double std = distributions.get(idx).getSecond(); - - double value = mean + rng.nextGaussian() * std; - - value = Math.min(value, this.max); - value = Math.max(value, this.min); - - return value; + while(true) + { + int idx = rng.nextInt(distributions.size()); + + double mean = distributions.get(idx).getFirst(); + double std = distributions.get(idx).getSecond(); + + double value = mean + rng.nextGaussian() * std; + + if (value >= this.min && value <= this.max) + { + return value; + } + } } } http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/RouletteWheelSampler.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/RouletteWheelSampler.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/RouletteWheelSampler.java index 72681f8..0537966 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/RouletteWheelSampler.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/framework/samplers/RouletteWheelSampler.java @@ -21,7 +21,7 @@ import java.util.Random; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Pair; import org.apache.bigtop.bigpetstore.datagenerator.framework.SeedFactory; -import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.DiscretePDF; +import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.MultinomialPDF; import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.ProbabilityDensityFunction; import com.google.common.collect.ImmutableList; @@ -37,7 +37,7 @@ public class RouletteWheelSampler implements Sampler return new RouletteWheelSampler(domainWeights, factory); } - public static RouletteWheelSampler create(DiscretePDF pdf, SeedFactory factory) + public static RouletteWheelSampler create(MultinomialPDF pdf, SeedFactory factory) { return new RouletteWheelSampler(pdf.getData(), pdf, factory); } http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/collections/MediumProductCollection.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/collections/MediumProductCollection.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/collections/MediumProductCollection.java new file mode 100644 index 0000000..2ec72d1 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/collections/MediumProductCollection.java @@ -0,0 +1,275 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.collections; + +import java.util.List; + +import org.apache.bigtop.bigpetstore.datagenerator.datamodels.PetSpecies; +import org.apache.bigtop.bigpetstore.datagenerator.datamodels.inputs.ProductCategory; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.ProductCategoryBuilder; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.ProductFieldValue; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.rules.AndRule; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.rules.FieldPredicate; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.rules.NotRule; +import org.apache.bigtop.bigpetstore.datagenerator.generators.products.rules.OrRule; + +import com.google.common.collect.Lists; + +public class MediumProductCollection +{ + private ProductCategory createDogFood() + { + ProductCategoryBuilder builder = new ProductCategoryBuilder(); + + builder.addApplicableSpecies(PetSpecies.DOG); + builder.setCategory("dry dog food"); + builder.setTriggerTransaction(true); + builder.setDailyUsageRate(2.0); + builder.setAmountUsedPetPetAverage(0.25); + builder.setAmountUsedPetPetVariance(0.1); + builder.setTriggerTransactionRate(2.0); + builder.setTriggerPurchaseRate(7.0); + builder.setBasePrice(2.0); + + builder.addPropertyValues("brand", + new ProductFieldValue("Wellfed", 0.67, 1.0), + new ProductFieldValue("Happy Pup", 0.67, 1.0), + new ProductFieldValue("Dog Days", 1.0, 1.0), + new ProductFieldValue("Chef Corgi", 0.0, 1.0)); + + builder.addPropertyValues("meat", + new ProductFieldValue("Chicken", 0.0, 1.0), + new ProductFieldValue("Pork", 0.0, 1.0), + new ProductFieldValue("Lamb", 0.1, 1.0), + new ProductFieldValue("Salmon", 0.25, 1.0), + new ProductFieldValue("Venison", 0.5, 1.0), + new ProductFieldValue("Rabbit", 0.5, 1.0), + new ProductFieldValue("Vegetarian", 0.0, 1.0)); + + builder.addPropertyValues("grain", + new ProductFieldValue("Corn", 0.0, 1.0), + new ProductFieldValue("Potatoes", 0.1, 1.0), + new ProductFieldValue("Barley", 0.1, 1.0), + new ProductFieldValue("Rice", 0.0, 1.0), + new ProductFieldValue("Soy", 0.1, 1.0)); + + builder.addPropertyValues("lifestage", + new ProductFieldValue("Senior", 0.0, 1.0), + new ProductFieldValue("Puppy", 0.0, 1.0), + new ProductFieldValue("Adult", 0.0, 1.0)); + + builder.addPropertyValues("organic", + new ProductFieldValue("false", 0.0, 1.0), + new ProductFieldValue("true", 0.0, 1.1)); + + builder.addPropertyValues("quantity", + new ProductFieldValue(4.5, 0.0, 4.5), + new ProductFieldValue(15.0, 0.0, 15.0), + new ProductFieldValue(30.0, 0.0, 30.0)); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Chef Corgi"), + new FieldPredicate("organic", "true"))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Chef Corgi"), + new FieldPredicate("meat", "Vegetarian"))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Dog Days"), + new FieldPredicate("organic", "false"))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("grain", "Corn"), + new OrRule( + new FieldPredicate("organic", "true"), + new FieldPredicate("meat", "Venison"), + new FieldPredicate("meat", "Rabbit"), + new FieldPredicate("meat", "Lamb"), + new FieldPredicate("meat", "Salmon")))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("organic", "true"), + new FieldPredicate("meat", "Pork"))); + + builder.addExclusionRule(new AndRule( + new NotRule(new FieldPredicate("grain", "Corn")), + new FieldPredicate("meat", "Pork"))); + + builder.addExclusionRule(new AndRule( + new OrRule( + new FieldPredicate("brand", "Chef Corgi"), + new FieldPredicate("brand", "Happy Pup")), + new OrRule( + new FieldPredicate("meat", "Rabbit"), + new FieldPredicate("meat", "Venison")) + )); + + return builder.build(); + } + + private ProductCategory createCatFood() + { + ProductCategoryBuilder builder = new ProductCategoryBuilder(); + + builder.addApplicableSpecies(PetSpecies.CAT); + builder.setCategory("dry cat food"); + builder.setTriggerTransaction(true); + builder.setDailyUsageRate(2.0); + builder.setAmountUsedPetPetAverage(0.1); + builder.setAmountUsedPetPetVariance(0.05); + builder.setTriggerTransactionRate(2.0); + builder.setTriggerPurchaseRate(7.0); + builder.setBasePrice(2.14); + + builder.addPropertyValues("brand", + new ProductFieldValue("Wellfed", 0.67, 1.0), + new ProductFieldValue("Feisty Feline", 0.72, 1.0), + new ProductFieldValue("Pretty Cat", 0.0, 1.0)); + + builder.addPropertyValues("meat", + new ProductFieldValue("Tuna", 0.0, 1.0), + new ProductFieldValue("Chicken", 0.0, 1.0), + new ProductFieldValue("Turkey", 0.0, 1.0), + new ProductFieldValue("Salmon", 0.1, 1.0)); + + builder.addPropertyValues("lifestyle", + new ProductFieldValue("Indoor", 0.0, 1.0), + new ProductFieldValue("Outdoor", 0.0, 1.0), + new ProductFieldValue("Weight Management", 0.1, 1.0)); + + builder.addPropertyValues("lifestage", + new ProductFieldValue("Senior", 0.0, 1.0), + new ProductFieldValue("Kitten", 0.0, 1.0), + new ProductFieldValue("Adult", 0.0, 1.0)); + + builder.addPropertyValues("organic", + new ProductFieldValue("true", 0.0, 1.1), + new ProductFieldValue("false", 0.0, 1.0)); + + builder.addPropertyValues("quantity", + new ProductFieldValue(7.0, 0.0, 7.0), + new ProductFieldValue(15.0, 0.0, 15.0)); + + builder.addPropertyValues("hairball management", + new ProductFieldValue("true", 0.1, 1.0), + new ProductFieldValue("false", 0.0, 1.0)); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Pretty Cat"), + new FieldPredicate("organic", "true"))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Feisty Feline"), + new FieldPredicate("organic", "false"))); + + return builder.build(); + } + + private ProductCategory createKittyLitter() + { + ProductCategoryBuilder builder = new ProductCategoryBuilder(); + + builder.addApplicableSpecies(PetSpecies.CAT); + builder.setCategory("kitty litter"); + builder.setTriggerTransaction(true); + builder.setDailyUsageRate(1.0); + builder.setAmountUsedPetPetAverage(0.1); + builder.setAmountUsedPetPetVariance(0.05); + builder.setTriggerTransactionRate(2.0); + builder.setTriggerPurchaseRate(7.0); + builder.setBasePrice(1.43); + + builder.addPropertyValues("brand", + new ProductFieldValue("Pretty Cat", 0.0, 1.0), + new ProductFieldValue("Feisty Feline", 0.1, 1.0)); + + builder.addPropertyValues("material", + new ProductFieldValue("clay", 0.0, 1.0), + new ProductFieldValue("pellets", 0.1, 1.0)); + + builder.addPropertyValues("clumping", + new ProductFieldValue("true", 0.0, 1.0), + new ProductFieldValue("false", 0.0, 1.0)); + + builder.addPropertyValues("odor control", + new ProductFieldValue("true", 0.1, 1.0), + new ProductFieldValue("false", 0.0, 1.0)); + + builder.addPropertyValues("quantity", + new ProductFieldValue(7.0, 0.0, 7.0), + new ProductFieldValue(14.0, 0.0, 14.0), + new ProductFieldValue(28.0, 0.0, 28.0)); + + return builder.build(); + } + + private ProductCategory createPoopBags() + { + ProductCategoryBuilder builder = new ProductCategoryBuilder(); + + builder.addApplicableSpecies(PetSpecies.DOG); + builder.setCategory("poop bags"); + builder.setTriggerTransaction(true); + builder.setDailyUsageRate(2.0); + builder.setAmountUsedPetPetAverage(1.0); + builder.setAmountUsedPetPetVariance(0.5); + builder.setTriggerTransactionRate(2.0); + builder.setTriggerPurchaseRate(7.0); + builder.setBasePrice(0.17); + + builder.addPropertyValues("brand", + new ProductFieldValue("Chef Corgi", 0.0, 1.0), + new ProductFieldValue("Happy Pup", 0.67, 1.0), + new ProductFieldValue("Dog Days", 1.0, 1.0)); + + builder.addPropertyValues("color", + new ProductFieldValue("blue", 0.0, 1.0), + new ProductFieldValue("multicolor (pastels)", 0.0, 1.0), + new ProductFieldValue("multicolor (solids)", 0.0, 1.0), + new ProductFieldValue("designs", 0.0, 1.0)); + + builder.addPropertyValues("recycled material", + new ProductFieldValue("false", 0.0, 60.0), + new ProductFieldValue("true", 0.1, 120.0)); + + builder.addPropertyValues("quantity", + new ProductFieldValue(60.0, 0.0, 60.0), + new ProductFieldValue(120.0, 0.0, 120.0)); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Chef Corgi"), + new FieldPredicate("recycled material", "true"))); + + builder.addExclusionRule(new AndRule( + new FieldPredicate("brand", "Dog Days"), + new FieldPredicate("recycled material", "false"))); + + return builder.build(); + } + + public List generateProductCategory() + { + List productCategories = Lists.newArrayList(); + + productCategories.add(this.createDogFood()); + productCategories.add(this.createCatFood()); + productCategories.add(this.createKittyLitter()); + productCategories.add(this.createPoopBags()); + + return productCategories; + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModel.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModel.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModel.java index 1adb5bd..336a898 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModel.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModel.java @@ -19,7 +19,7 @@ import java.util.Map; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Product; import org.apache.bigtop.bigpetstore.datagenerator.framework.SeedFactory; -import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.DiscretePDF; +import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.MultinomialPDF; import org.apache.bigtop.bigpetstore.datagenerator.framework.samplers.RouletteWheelSampler; import org.apache.bigtop.bigpetstore.datagenerator.framework.samplers.Sampler; @@ -27,14 +27,14 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; -public class MultinomialPurchasingModel implements PurchasingModel> +public class MultinomialPurchasingModel implements PurchasingModel> { private static final long serialVersionUID = 5863830733003282570L; - private final ImmutableMap> productPDFs; + private final ImmutableMap> productPDFs; - public MultinomialPurchasingModel(Map> productPDFs) + public MultinomialPurchasingModel(Map> productPDFs) { this.productPDFs = ImmutableMap.copyOf(productPDFs); } @@ -46,7 +46,7 @@ public class MultinomialPurchasingModel implements PurchasingModel getProfile(String category) + public MultinomialPDF getProfile(String category) { return productPDFs.get(category); } @@ -57,7 +57,7 @@ public class MultinomialPurchasingModel implements PurchasingModel> processes = Maps.newHashMap(); for(String category : getProductCategories()) { - DiscretePDF pdf = productPDFs.get(category); + MultinomialPDF pdf = productPDFs.get(category); processes.put(category, RouletteWheelSampler.create(pdf, seedFactory)); } http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModelSampler.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModelSampler.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModelSampler.java index 55fef69..bea39ba 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModelSampler.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/main/java/org/apache/bigtop/bigpetstore/datagenerator/generators/purchase/MultinomialPurchasingModelSampler.java @@ -16,8 +16,8 @@ package org.apache.bigtop.bigpetstore.datagenerator.generators.purchase; import java.util.Collection; +import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Vector; import org.apache.bigtop.bigpetstore.datagenerator.Constants; @@ -25,12 +25,15 @@ import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Pair; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Product; import org.apache.bigtop.bigpetstore.datagenerator.datamodels.inputs.ProductCategory; import org.apache.bigtop.bigpetstore.datagenerator.framework.SeedFactory; -import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.DiscretePDF; +import org.apache.bigtop.bigpetstore.datagenerator.framework.pdfs.MultinomialPDF; import org.apache.bigtop.bigpetstore.datagenerator.framework.samplers.Sampler; import org.apache.bigtop.bigpetstore.datagenerator.framework.samplers.UniformIntSampler; +import org.apache.bigtop.bigpetstore.datagenerator.framework.samplers.UniformSampler; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import com.google.common.collect.Multimap; public class MultinomialPurchasingModelSampler implements Sampler { @@ -43,59 +46,64 @@ public class MultinomialPurchasingModelSampler implements Sampler> input) throws Exception + protected List shuffle(Collection input) throws Exception { + Vector shuffled = new Vector<>(input); for(int i = 0; i < input.size() - 1; i++) { int swapIdx = new UniformIntSampler(i, input.size() - 1, seedFactory).sample(); - Pair tmp = input.get(i); - input.set(i, input.get(swapIdx)); - input.set(swapIdx, tmp); + T tmp = shuffled.get(i); + shuffled.set(i, shuffled.get(swapIdx)); + shuffled.set(swapIdx, tmp); } + + return shuffled; } protected Map, Double> generateFieldValueWeights(ProductCategory productCategory) throws Exception { - Set> fieldValuesSet = Sets.newHashSet(); + // Get all values for each field by iterating over all products + Multimap allFieldValues = HashMultimap.create(); for(String fieldName : productCategory.getFieldNames()) { - for(Product p : productCategory.getProducts()) + if(!Constants.PRODUCT_MODEL_EXCLUDED_FIELDS.contains(fieldName)) { - Object fieldValue = p.getFieldValue(fieldName); - fieldValuesSet.add(Pair.create(fieldName, fieldValue)); + for(Product p : productCategory.getProducts()) + { + Object fieldValue = p.getFieldValue(fieldName); + allFieldValues.put(fieldName, fieldValue); + } } } - - Vector> fieldValues = new Vector>(fieldValuesSet); - shuffle(fieldValues); - - int lowerbound = Math.max(Constants.PRODUCT_MULTINOMIAL_MIN_COUNT, - (int) Math.ceil(fieldValues.size() * Constants.PRODUCT_MULTINOMIAL_MIN_PERCENT)); - int upperbound = Math.max(Constants.PRODUCT_MULTINOMIAL_MIN_COUNT + 1, - (int) Math.floor(fieldValues.size() * Constants.PRODUCT_MULTINOMIAL_MAX_PERCENT)); - - Sampler countSampler = new UniformIntSampler(lowerbound, upperbound, seedFactory); - int highWeightCount = countSampler.sample(); - int lowWeightCount = countSampler.sample(); - + + Sampler sampler = new UniformSampler(seedFactory); + + // shuffle field values Map, Double> fieldValueWeights = Maps.newHashMap(); - for(int i = 0; i < fieldValues.size(); i++) + for(Map.Entry> entry : allFieldValues.asMap().entrySet()) { - if(i < highWeightCount) - { - fieldValueWeights.put(fieldValues.get(i), Constants.PRODUCT_MULTINOMIAL_HIGH_WEIGHT); - } - else if(i >= highWeightCount && i < (lowWeightCount + highWeightCount)) - { - fieldValueWeights.put(fieldValues.get(i), Constants.PRODUCT_MULTINOMIAL_LOW_WEIGHT); - } - else + String fieldName = entry.getKey(); + List shuffled = shuffle(entry.getValue()); + + for(int i = 0; i < shuffled.size(); i++) { - fieldValueWeights.put(fieldValues.get(i), Constants.PRODUCT_MULTINOMIAL_NEUTRAL_WEIGHT); + double weight = Constants.PRODUCT_MULTINOMIAL_POSITIVE_WEIGHT; + if ((i + 1) > Constants.PRODUCT_MULTINOMIAL_POSITIVE_COUNT_MIN) + { + double r = sampler.sample(); + if (r >= Constants.PRODUCT_MULTINOMIAL_POSITIVE_FREQUENCY) + { + weight = Constants.PRODUCT_MULTINOMIAL_NEGATIVE_WEIGHT; + } + } + + Object fieldValue = shuffled.get(i); + fieldValueWeights.put(new Pair(fieldName, fieldValue), weight); } } + - return fieldValueWeights; + return ImmutableMap.copyOf(fieldValueWeights); } protected Map generateProductWeights(Map, Double> fieldValueWeights, @@ -107,9 +115,12 @@ public class MultinomialPurchasingModelSampler implements Sampler key = Pair.create(fieldName, fieldValue); - weight *= fieldValueWeights.get(key); + if(!Constants.PRODUCT_MODEL_EXCLUDED_FIELDS.contains(fieldName)) + { + Object fieldValue = p.getFieldValue(fieldName); + Pair key = Pair.create(fieldName, fieldValue); + weight *= fieldValueWeights.get(key); + } } productWeights.put(p, weight); } @@ -119,12 +130,12 @@ public class MultinomialPurchasingModelSampler implements Sampler> pdfs = Maps.newHashMap(); + Map> pdfs = Maps.newHashMap(); for(ProductCategory productCategory : productCategories) { Map, Double> fieldWeights = this.generateFieldValueWeights(productCategory); Map productWeights = this.generateProductWeights(fieldWeights, productCategory); - pdfs.put(productCategory.getCategoryLabel(), new DiscretePDF(productWeights)); + pdfs.put(productCategory.getCategoryLabel(), new MultinomialPDF(productWeights)); } return new MultinomialPurchasingModel(pdfs); http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/TestMultinomialPDF.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/TestMultinomialPDF.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/TestMultinomialPDF.java new file mode 100644 index 0000000..8952389 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/framework/pdfs/TestMultinomialPDF.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.bigpetstore.datagenerator.framework.pdfs; + +import java.util.Map; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; + +public class TestMultinomialPDF +{ + + @Test + public void testToString() + { + Map objects = ImmutableMap.of("A", 0.1, "B", 0.3, "C", 0.5); + MultinomialPDF pdf = new MultinomialPDF(objects); + String string = pdf.toString(); + Set observed = Sets.newHashSet(string.split("\n")); + Set expected = Sets.newHashSet("0.1,A", "0.3,B", "0.5,C"); + + Assert.assertEquals(expected, observed); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductBase.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductBase.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductBase.java index f171980..3b7c2e8 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductBase.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductBase.java @@ -1,3 +1,18 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.cartesian; import java.util.Arrays; http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductField.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductField.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductField.java index 42d62c7..5071a54 100644 --- a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductField.java +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/cartesian/TestCartesianProductField.java @@ -1,3 +1,18 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.cartesian; import java.util.Arrays; http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAlwaysTrueRule.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAlwaysTrueRule.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAlwaysTrueRule.java new file mode 100644 index 0000000..c32fa1b --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAlwaysTrueRule.java @@ -0,0 +1,30 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.rules; + +import org.junit.Assert; +import org.junit.Test; + +public class TestAlwaysTrueRule +{ + + @Test + public void testRuleMatches() + { + Rule rule = new AlwaysTrueRule(); + Assert.assertTrue(rule.ruleMatches(null)); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAndRule.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAndRule.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAndRule.java new file mode 100644 index 0000000..b930c38 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestAndRule.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.bigpetstore.datagenerator.generators.products.rules; + +import org.junit.Assert; +import org.junit.Test; + +public class TestAndRule +{ + + @Test + public void testRuleMatches() + { + Rule rule = new AndRule( + new AlwaysTrueRule(), + new AlwaysTrueRule()); + Assert.assertTrue(rule.ruleMatches(null)); + + rule = new AndRule( + new AlwaysTrueRule(), + new NotRule( + new AlwaysTrueRule())); + Assert.assertFalse(rule.ruleMatches(null)); + + rule = new AndRule( + new NotRule( + new AlwaysTrueRule()), + new AlwaysTrueRule()); + Assert.assertFalse(rule.ruleMatches(null)); + + rule = new AndRule( + new NotRule( + new AlwaysTrueRule()), + new NotRule( + new AlwaysTrueRule())); + Assert.assertFalse(rule.ruleMatches(null)); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestFieldPredicate.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestFieldPredicate.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestFieldPredicate.java new file mode 100644 index 0000000..88cae45 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestFieldPredicate.java @@ -0,0 +1,42 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.rules; + +import java.util.Map; + +import org.apache.bigtop.bigpetstore.datagenerator.datamodels.Product; +import org.junit.Assert; +import org.junit.Test; + +import com.google.common.collect.ImmutableMap; + +public class TestFieldPredicate +{ + + @Test + public void testRuleMatches() + { + Map fields = ImmutableMap.of("brand", (Object) "Chef Corgi", + "flavor", (Object) "chicken"); + Product product = new Product(fields); + + Rule rule = new FieldPredicate("brand", "Chef Corgi"); + Assert.assertTrue(rule.ruleMatches(product)); + + rule = new FieldPredicate("brand", "Happy Pup"); + Assert.assertFalse(rule.ruleMatches(product)); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestNotRule.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestNotRule.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestNotRule.java new file mode 100644 index 0000000..ee284af --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestNotRule.java @@ -0,0 +1,36 @@ +/** + * 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.bigpetstore.datagenerator.generators.products.rules; + +import org.junit.Assert; +import org.junit.Test; + +public class TestNotRule +{ + + @Test + public void testRuleMatches() + { + Rule rule = new NotRule( + new AlwaysTrueRule()); + Assert.assertFalse(rule.ruleMatches(null)); + + rule = new NotRule( + new NotRule( + new AlwaysTrueRule())); + Assert.assertTrue(rule.ruleMatches(null)); + } +} http://git-wip-us.apache.org/repos/asf/bigtop/blob/6aea780a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestOrRule.java ---------------------------------------------------------------------- diff --git a/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestOrRule.java b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestOrRule.java new file mode 100644 index 0000000..fd6f817 --- /dev/null +++ b/bigtop-bigpetstore/bigpetstore-data-generator/src/test/java/org/apache/bigtop/bigpetstore/datagenerator/generators/products/rules/TestOrRule.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.bigpetstore.datagenerator.generators.products.rules; + +import org.junit.Assert; +import org.junit.Test; + +public class TestOrRule +{ + + @Test + public void testRuleMatches() + { + Rule rule = new OrRule( + new AlwaysTrueRule(), + new AlwaysTrueRule()); + Assert.assertTrue(rule.ruleMatches(null)); + + rule = new OrRule( + new AlwaysTrueRule(), + new NotRule( + new AlwaysTrueRule())); + Assert.assertTrue(rule.ruleMatches(null)); + + rule = new OrRule( + new NotRule( + new AlwaysTrueRule()), + new AlwaysTrueRule()); + Assert.assertTrue(rule.ruleMatches(null)); + + rule = new OrRule( + new NotRule( + new AlwaysTrueRule()), + new NotRule( + new AlwaysTrueRule())); + Assert.assertFalse(rule.ruleMatches(null)); + } +}