Browse Source

Use non-random rules to ensure all rules are matched

master
Pascal Widdershoven 6 years ago
parent
commit
66d5dad762

+ 0
- 21
src/main/java/co/wuunder/rule_engine/RandomRules.java View File

@@ -1,21 +0,0 @@
package co.wuunder.rule_engine;

import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;

import static java.util.stream.Collectors.toList;

public class RandomRules {
private static final Random random = new Random(System.currentTimeMillis());

public static List<RateRule> randomRules(int numberOfRules) {
return IntStream.range(0, numberOfRules)
.mapToObj(RandomRules::randomRule)
.collect(toList());
}

private static RateRule randomRule(int _n) {
return new RateRule(random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt() % 2 == 0, random.nextInt(), "NL", "consumer", "NL", "consumer");
}
}

+ 16
- 25
src/main/java/co/wuunder/rule_engine/RateRule.java View File

@@ -1,6 +1,9 @@
package co.wuunder.rule_engine;

import java.util.Objects;

public class RateRule {
public final String id;
public final int minWeight;
public final int maxWeight;
public final int maxLengthHeightWidth;
@@ -11,9 +14,10 @@ public class RateRule {
public final String deliveryCountry;
public final String deliveryAddressType;

public RateRule(int minWeight, int maxWeight, int maxLengthHeightWidth, boolean isReturn,
public RateRule(String id, int minWeight, int maxWeight, int maxLengthHeightWidth, boolean isReturn,
int maxDimension, String pickupCountry, String pickupAddressType, String deliveryCountry,
String deliveryAddressType) {
this.id = id;
this.minWeight = minWeight;
this.maxWeight = maxWeight;
this.maxLengthHeightWidth = maxLengthHeightWidth;
@@ -29,34 +33,21 @@ public class RateRule {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

RateRule rateRule = (RateRule) o;

if (minWeight != rateRule.minWeight) return false;
if (maxWeight != rateRule.maxWeight) return false;
if (maxLengthHeightWidth != rateRule.maxLengthHeightWidth) return false;
if (isReturn != rateRule.isReturn) return false;
if (maxDimension != rateRule.maxDimension) return false;
if (pickupCountry != null ? !pickupCountry.equals(rateRule.pickupCountry) : rateRule.pickupCountry != null)
return false;
if (pickupAddressType != null ? !pickupAddressType.equals(rateRule.pickupAddressType) : rateRule.pickupAddressType != null)
return false;
if (deliveryCountry != null ? !deliveryCountry.equals(rateRule.deliveryCountry) : rateRule.deliveryCountry != null)
return false;
return deliveryAddressType != null ? deliveryAddressType.equals(rateRule.deliveryAddressType) : rateRule.deliveryAddressType == null;
return minWeight == rateRule.minWeight &&
maxWeight == rateRule.maxWeight &&
maxLengthHeightWidth == rateRule.maxLengthHeightWidth &&
isReturn == rateRule.isReturn &&
maxDimension == rateRule.maxDimension &&
Objects.equals(id, rateRule.id) &&
Objects.equals(pickupCountry, rateRule.pickupCountry) &&
Objects.equals(pickupAddressType, rateRule.pickupAddressType) &&
Objects.equals(deliveryCountry, rateRule.deliveryCountry) &&
Objects.equals(deliveryAddressType, rateRule.deliveryAddressType);
}

@Override
public int hashCode() {
int result = minWeight;
result = 31 * result + maxWeight;
result = 31 * result + maxLengthHeightWidth;
result = 31 * result + (isReturn ? 1 : 0);
result = 31 * result + maxDimension;
result = 31 * result + (pickupCountry != null ? pickupCountry.hashCode() : 0);
result = 31 * result + (pickupAddressType != null ? pickupAddressType.hashCode() : 0);
result = 31 * result + (deliveryCountry != null ? deliveryCountry.hashCode() : 0);
result = 31 * result + (deliveryAddressType != null ? deliveryAddressType.hashCode() : 0);
return result;
return Objects.hash(id, minWeight, maxWeight, maxLengthHeightWidth, isReturn, maxDimension, pickupCountry, pickupAddressType, deliveryCountry, deliveryAddressType);
}
}

+ 31
- 0
src/main/java/co/wuunder/rule_engine/RateRules.java View File

@@ -0,0 +1,31 @@
package co.wuunder.rule_engine;

import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;

import static java.util.stream.Collectors.toList;

public class RateRules {
private static final Random random = new Random(System.currentTimeMillis());

public static List<RateRule> randomRules(int numberOfRules) {
return IntStream.range(0, numberOfRules)
.mapToObj(RateRules::randomRule)
.collect(toList());
}

public static List<RateRule> rules(int numberOfRules) {
return IntStream.range(0, numberOfRules)
.mapToObj(RateRules::rule)
.collect(toList());
}

private static RateRule randomRule(int n) {
return new RateRule("Rule " + n, random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt() % 2 == 0, random.nextInt(), "NL", "consumer", "NL", "consumer");
}

private static RateRule rule(int n) {
return new RateRule("Rule " + n, 0, 99999, 99999, false, 99999, "NL", "consumer", "NL", "consumer");
}
}

+ 12
- 6
src/test/java/PerfTest.java View File

@@ -1,14 +1,13 @@
import co.wuunder.rule_engine.Address;
import co.wuunder.rule_engine.RuleEngine;
import co.wuunder.rule_engine.Shipment;
import co.wuunder.rule_engine.*;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Random;

import static co.wuunder.rule_engine.RandomRules.*;
import static co.wuunder.rule_engine.RateRules.*;

public class PerfTest {
private final RuleEngine ruleEngine = new RuleEngine(randomRules(100_000));
private final RuleEngine ruleEngine = new RuleEngine(RateRules.rules(100_000));

@Test
public void perf() {
@@ -16,7 +15,7 @@ public class PerfTest {
int numberOfShipments = 50;

for(int i = 0 ; i < numberOfShipments; i++) {
ruleEngine.generateRules(randomShipment());
ruleEngine.generateRules(shipment());
}

long end = System.currentTimeMillis();
@@ -31,4 +30,11 @@ public class PerfTest {

return new Shipment(random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt() % 2 == 0, random.nextInt() % 2 == 0, pickupAddress, deliveryAddress);
}

private Shipment shipment() {
Address pickupAddress = new Address("NL", "");
Address deliveryAddress = new Address("NL", "");

return new Shipment(10, 10, 10, 10, false, false, pickupAddress, deliveryAddress);
}
}

Loading…
Cancel
Save