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

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

package co.wuunder.rule_engine; package co.wuunder.rule_engine;


import java.util.Objects;

public class RateRule { public class RateRule {
public final String id;
public final int minWeight; public final int minWeight;
public final int maxWeight; public final int maxWeight;
public final int maxLengthHeightWidth; public final int maxLengthHeightWidth;
public final String deliveryCountry; public final String deliveryCountry;
public final String deliveryAddressType; 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, int maxDimension, String pickupCountry, String pickupAddressType, String deliveryCountry,
String deliveryAddressType) { String deliveryAddressType) {
this.id = id;
this.minWeight = minWeight; this.minWeight = minWeight;
this.maxWeight = maxWeight; this.maxWeight = maxWeight;
this.maxLengthHeightWidth = maxLengthHeightWidth; this.maxLengthHeightWidth = maxLengthHeightWidth;
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;

RateRule rateRule = (RateRule) o; 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 @Override
public int hashCode() { 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

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

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 org.junit.jupiter.api.Test;


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


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


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


@Test @Test
public void perf() { public void perf() {
int numberOfShipments = 50; int numberOfShipments = 50;


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


long end = System.currentTimeMillis(); long end = System.currentTimeMillis();


return new Shipment(random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt(), random.nextInt() % 2 == 0, random.nextInt() % 2 == 0, pickupAddress, deliveryAddress); 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