From 9cabb70470a226b4211d16f55da9fc83d68a4187 Mon Sep 17 00:00:00 2001 From: Mauro Sanz Date: Tue, 8 Dec 2020 16:52:05 -0300 Subject: [PATCH] Matchers refactor --- .../java/io/split/client/SplitClientImpl.java | 25 +---- .../io/split/engine/evaluator/Evaluator.java | 5 +- .../split/engine/evaluator/EvaluatorImp.java | 37 ++++--- .../split/engine/matchers/AllKeysMatcher.java | 4 +- .../engine/matchers/AttributeMatcher.java | 10 +- .../split/engine/matchers/BetweenMatcher.java | 4 +- .../split/engine/matchers/BooleanMatcher.java | 6 +- .../engine/matchers/CombiningMatcher.java | 9 +- .../engine/matchers/DependencyMatcher.java | 20 +--- .../split/engine/matchers/EqualToMatcher.java | 4 +- .../matchers/GreaterThanOrEqualToMatcher.java | 4 +- .../matchers/LessThanOrEqualToMatcher.java | 4 +- .../io/split/engine/matchers/Matcher.java | 4 +- .../matchers/UserDefinedSegmentMatcher.java | 4 +- .../collections/ContainsAllOfSetMatcher.java | 4 +- .../collections/ContainsAnyOfSetMatcher.java | 4 +- .../collections/EqualToSetMatcher.java | 4 +- .../collections/PartOfSetMatcher.java | 4 +- .../strings/ContainsAnyOfMatcher.java | 4 +- .../strings/EndsWithAnyOfMatcher.java | 4 +- .../strings/RegularExpressionMatcher.java | 4 +- .../strings/StartsWithAnyOfMatcher.java | 4 +- .../matchers/strings/WhitelistMatcher.java | 4 +- .../split/engine/evaluator/EvaluatorTest.java | 103 +++++++++--------- 24 files changed, 126 insertions(+), 153 deletions(-) diff --git a/client/src/main/java/io/split/client/SplitClientImpl.java b/client/src/main/java/io/split/client/SplitClientImpl.java index fb5775a5e..140e581d1 100644 --- a/client/src/main/java/io/split/client/SplitClientImpl.java +++ b/client/src/main/java/io/split/client/SplitClientImpl.java @@ -1,10 +1,8 @@ package io.split.client; -import com.google.common.annotations.VisibleForTesting; import io.split.client.api.Key; import io.split.client.api.SplitResult; import io.split.client.dtos.Event; -import io.split.client.exceptions.ChangeNumberExceptionWrapper; import io.split.client.impressions.Impression; import io.split.client.impressions.ImpressionsManager; import io.split.engine.evaluator.Evaluator; @@ -34,7 +32,6 @@ public final class SplitClientImpl implements SplitClient { public static final SplitResult SPLIT_RESULT_CONTROL = new SplitResult(Treatments.CONTROL, null); private static final String GET_TREATMENT_LABEL = "sdk.getTreatment"; - private static final String EXCEPTION = "exception"; private static final Logger _log = LoggerFactory.getLogger(SplitClientImpl.class); @@ -315,7 +312,7 @@ private SplitResult getTreatmentWithConfigInternal(String label, String matching long start = System.currentTimeMillis(); - EvaluatorImp.TreatmentLabelAndChangeNumber result = getTreatmentResultWithoutImpressions(matchingKey, bucketingKey, split, attributes); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(matchingKey, bucketingKey, split, attributes); recordStats( matchingKey, @@ -350,21 +347,6 @@ private void recordStats(String matchingKey, String bucketingKey, String split, } } - private EvaluatorImp.TreatmentLabelAndChangeNumber getTreatmentResultWithoutImpressions(String matchingKey, String bucketingKey, String split, Map attributes) { - EvaluatorImp.TreatmentLabelAndChangeNumber result; - try { - result = _evaluator.evaluateFeature(matchingKey, bucketingKey, split, attributes, this); - } catch (ChangeNumberExceptionWrapper e) { - result = new EvaluatorImp.TreatmentLabelAndChangeNumber(Treatments.CONTROL, EXCEPTION, e.changeNumber()); - _log.error("Exception", e.wrappedException()); - } catch (Exception e) { - result = new EvaluatorImp.TreatmentLabelAndChangeNumber(Treatments.CONTROL, EXCEPTION); - _log.error("Exception", e); - } - - return result; - } - private Event createEvent(String key, String trafficType, String eventType) { Event event = new Event(); event.eventTypeId = eventType; @@ -373,9 +355,4 @@ private Event createEvent(String key, String trafficType, String eventType) { event.timestamp = System.currentTimeMillis(); return event; } - - @VisibleForTesting - public String getTreatmentWithoutImpressions(String matchingKey, String bucketingKey, String split, Map attributes) { - return getTreatmentResultWithoutImpressions(matchingKey, bucketingKey, split, attributes).treatment; - } } diff --git a/client/src/main/java/io/split/engine/evaluator/Evaluator.java b/client/src/main/java/io/split/engine/evaluator/Evaluator.java index f1db804f1..fbcc52c35 100644 --- a/client/src/main/java/io/split/engine/evaluator/Evaluator.java +++ b/client/src/main/java/io/split/engine/evaluator/Evaluator.java @@ -1,10 +1,7 @@ package io.split.engine.evaluator; -import io.split.client.SplitClientImpl; -import io.split.client.exceptions.ChangeNumberExceptionWrapper; - import java.util.Map; public interface Evaluator { - EvaluatorImp.TreatmentLabelAndChangeNumber evaluateFeature(String matchingKey, String bucketingKey, String split, Map attributes, SplitClientImpl splitClient) throws ChangeNumberExceptionWrapper; + EvaluatorImp.TreatmentLabelAndChangeNumber evaluateFeature(String matchingKey, String bucketingKey, String split, Map attributes); } diff --git a/client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java b/client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java index f2457c523..667be4163 100644 --- a/client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java +++ b/client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java @@ -1,6 +1,5 @@ package io.split.engine.evaluator; -import io.split.client.SplitClientImpl; import io.split.client.dtos.ConditionType; import io.split.client.exceptions.ChangeNumberExceptionWrapper; import io.split.engine.SDKReadinessGates; @@ -21,6 +20,7 @@ public class EvaluatorImp implements Evaluator { private static final String DEFAULT_RULE = "default rule"; private static final String KILLED = "killed"; private static final String DEFINITION_NOT_FOUND = "definition not found"; + private static final String EXCEPTION = "exception"; private static final Logger _log = LoggerFactory.getLogger(EvaluatorImp.class); @@ -34,19 +34,28 @@ public EvaluatorImp(SDKReadinessGates gates, } @Override - public TreatmentLabelAndChangeNumber evaluateFeature(String matchingKey, String bucketingKey, String split, Map attributes, SplitClientImpl splitClient) throws ChangeNumberExceptionWrapper { - ParsedSplit parsedSplit = _splitFetcher.fetch(split); - - if (parsedSplit == null) { - if (_gates.isSDKReadyNow()) { - _log.warn( - "getTreatment: you passed \"" + split + "\" that does not exist in this environment, " + - "please double check what Splits exist in the web console."); + public TreatmentLabelAndChangeNumber evaluateFeature(String matchingKey, String bucketingKey, String split, Map attributes) { + try { + ParsedSplit parsedSplit = _splitFetcher.fetch(split); + + if (parsedSplit == null) { + if (_gates.isSDKReadyNow()) { + _log.warn( + "getTreatment: you passed \"" + split + "\" that does not exist in this environment, " + + "please double check what Splits exist in the web console."); + } + return new TreatmentLabelAndChangeNumber(Treatments.CONTROL, DEFINITION_NOT_FOUND); } - return new TreatmentLabelAndChangeNumber(Treatments.CONTROL, DEFINITION_NOT_FOUND); - } - return getTreatment(matchingKey, bucketingKey, parsedSplit, attributes, splitClient); + return getTreatment(matchingKey, bucketingKey, parsedSplit, attributes); + } + catch (ChangeNumberExceptionWrapper e) { + _log.error("Evaluator Exception", e.wrappedException()); + return new EvaluatorImp.TreatmentLabelAndChangeNumber(Treatments.CONTROL, EXCEPTION, e.changeNumber()); + } catch (Exception e) { + _log.error("Evaluator Exception", e); + return new EvaluatorImp.TreatmentLabelAndChangeNumber(Treatments.CONTROL, EXCEPTION); + } } /** @@ -57,7 +66,7 @@ public TreatmentLabelAndChangeNumber evaluateFeature(String matchingKey, String * @return * @throws ChangeNumberExceptionWrapper */ - private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bucketingKey, ParsedSplit parsedSplit, Map attributes, SplitClientImpl splitClient) throws ChangeNumberExceptionWrapper { + private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bucketingKey, ParsedSplit parsedSplit, Map attributes) throws ChangeNumberExceptionWrapper { try { if (parsedSplit.killed()) { String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(parsedSplit.defaultTreatment()) : null; @@ -92,7 +101,7 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu inRollout = true; } - if (parsedCondition.matcher().match(matchingKey, bucketingKey, attributes, splitClient)) { + if (parsedCondition.matcher().match(matchingKey, bucketingKey, attributes, this)) { String treatment = Splitter.getTreatment(bk, parsedSplit.seed(), parsedCondition.partitions(), parsedSplit.algo()); String config = parsedSplit.configurations() != null ? parsedSplit.configurations().get(treatment) : null; return new TreatmentLabelAndChangeNumber(treatment, parsedCondition.label(), parsedSplit.changeNumber(), config); diff --git a/client/src/main/java/io/split/engine/matchers/AllKeysMatcher.java b/client/src/main/java/io/split/engine/matchers/AllKeysMatcher.java index 461d1bffa..bad142453 100644 --- a/client/src/main/java/io/split/engine/matchers/AllKeysMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/AllKeysMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -12,7 +12,7 @@ public final class AllKeysMatcher implements Matcher { @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/AttributeMatcher.java b/client/src/main/java/io/split/engine/matchers/AttributeMatcher.java index a86d5b3ae..b4670509c 100644 --- a/client/src/main/java/io/split/engine/matchers/AttributeMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/AttributeMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import java.util.Map; import java.util.Objects; @@ -27,9 +27,9 @@ public AttributeMatcher(String attribute, Matcher matcher, boolean negate) { _matcher = new NegatableMatcher(matcher, negate); } - public boolean match(String key, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(String key, String bucketingKey, Map attributes, Evaluator evaluator) { if (_attribute == null) { - return _matcher.match(key, bucketingKey, attributes, splitClient); + return _matcher.match(key, bucketingKey, attributes, evaluator); } if (attributes == null) { @@ -95,8 +95,8 @@ public NegatableMatcher(Matcher matcher, boolean negate) { @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { - boolean result = _delegate.match(matchValue, bucketingKey, attributes, splitClient); + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { + boolean result = _delegate.match(matchValue, bucketingKey, attributes, evaluator); return (_negate) ? !result : result; } diff --git a/client/src/main/java/io/split/engine/matchers/BetweenMatcher.java b/client/src/main/java/io/split/engine/matchers/BetweenMatcher.java index 2447d2831..dd77d9810 100644 --- a/client/src/main/java/io/split/engine/matchers/BetweenMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/BetweenMatcher.java @@ -1,7 +1,7 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; import io.split.client.dtos.DataType; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -36,7 +36,7 @@ public BetweenMatcher(long start, long end, DataType dataType) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { Long keyAsLong; if (_dataType == DataType.DATETIME) { diff --git a/client/src/main/java/io/split/engine/matchers/BooleanMatcher.java b/client/src/main/java/io/split/engine/matchers/BooleanMatcher.java index c8e881e9b..28b3783a8 100644 --- a/client/src/main/java/io/split/engine/matchers/BooleanMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/BooleanMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -14,7 +14,7 @@ public BooleanMatcher(boolean booleanValue) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } @@ -26,7 +26,7 @@ public boolean match(Object matchValue, String bucketingKey, Map @Override public String toString() { - return "is " + Boolean.toString(_booleanValue); + return "is " + _booleanValue; } @Override diff --git a/client/src/main/java/io/split/engine/matchers/CombiningMatcher.java b/client/src/main/java/io/split/engine/matchers/CombiningMatcher.java index ae5463e73..52a7d0874 100644 --- a/client/src/main/java/io/split/engine/matchers/CombiningMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/CombiningMatcher.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import io.split.client.SplitClientImpl; import io.split.client.dtos.MatcherCombiner; +import io.split.engine.evaluator.Evaluator; import java.util.List; import java.util.Map; @@ -38,24 +39,24 @@ public CombiningMatcher(MatcherCombiner combiner, List delegat checkArgument(_delegates.size() > 0); } - public boolean match(String key, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(String key, String bucketingKey, Map attributes, Evaluator evaluator) { if (_delegates.isEmpty()) { return false; } switch (_combiner) { case AND: - return and(key, bucketingKey, attributes, splitClient); + return and(key, bucketingKey, attributes, evaluator); default: throw new IllegalArgumentException("Unknown combiner: " + _combiner); } } - private boolean and(String key, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + private boolean and(String key, String bucketingKey, Map attributes, Evaluator evaluator) { boolean result = true; for (AttributeMatcher delegate : _delegates) { - result &= (delegate.match(key, bucketingKey, attributes, splitClient)); + result &= (delegate.match(key, bucketingKey, attributes, evaluator)); } return result; } diff --git a/client/src/main/java/io/split/engine/matchers/DependencyMatcher.java b/client/src/main/java/io/split/engine/matchers/DependencyMatcher.java index b7be62cfd..5c6b3f2a5 100644 --- a/client/src/main/java/io/split/engine/matchers/DependencyMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/DependencyMatcher.java @@ -1,9 +1,10 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Supports the logic: if user is in split "feature" treatments ["on","off"] @@ -18,7 +19,7 @@ public DependencyMatcher(String split, List treatments) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } @@ -27,16 +28,7 @@ public boolean match(Object matchValue, String bucketingKey, Map return false; } - String result = splitClient.getTreatmentWithoutImpressions( - (String) matchValue, - bucketingKey, - _split, - attributes - ); - -// if(Treatments.isControl(result)) { -// throw new ParentIsControlException(); -// } + String result = evaluator.evaluateFeature((String) matchValue, bucketingKey, _split, attributes).treatment; return _treatments.contains(result); } @@ -58,8 +50,8 @@ public boolean equals(Object o) { DependencyMatcher that = (DependencyMatcher) o; - if (_split != null ? !_split.equals(that._split) : that._split != null) return false; - return _treatments != null ? _treatments.equals(that._treatments) : that._treatments == null; + if (!Objects.equals(_split, that._split)) return false; + return Objects.equals(_treatments, that._treatments); } @Override diff --git a/client/src/main/java/io/split/engine/matchers/EqualToMatcher.java b/client/src/main/java/io/split/engine/matchers/EqualToMatcher.java index fa8f478be..c2d853a26 100644 --- a/client/src/main/java/io/split/engine/matchers/EqualToMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/EqualToMatcher.java @@ -1,7 +1,7 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; import io.split.client.dtos.DataType; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -29,7 +29,7 @@ public EqualToMatcher(long compareTo, DataType dataType) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { Long keyAsLong; if (_dataType == DataType.DATETIME) { diff --git a/client/src/main/java/io/split/engine/matchers/GreaterThanOrEqualToMatcher.java b/client/src/main/java/io/split/engine/matchers/GreaterThanOrEqualToMatcher.java index 63310c592..7804fbe32 100644 --- a/client/src/main/java/io/split/engine/matchers/GreaterThanOrEqualToMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/GreaterThanOrEqualToMatcher.java @@ -1,7 +1,7 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; import io.split.client.dtos.DataType; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -29,7 +29,7 @@ public GreaterThanOrEqualToMatcher(long compareTo, DataType dataType) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { Long keyAsLong; if (_dataType == DataType.DATETIME) { diff --git a/client/src/main/java/io/split/engine/matchers/LessThanOrEqualToMatcher.java b/client/src/main/java/io/split/engine/matchers/LessThanOrEqualToMatcher.java index 8bea36ea3..5afa35dc8 100644 --- a/client/src/main/java/io/split/engine/matchers/LessThanOrEqualToMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/LessThanOrEqualToMatcher.java @@ -1,7 +1,7 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; import io.split.client.dtos.DataType; +import io.split.engine.evaluator.Evaluator; import java.util.Map; @@ -28,7 +28,7 @@ public LessThanOrEqualToMatcher(long compareTo, DataType dataType) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { Long keyAsLong; if (_dataType == DataType.DATETIME) { diff --git a/client/src/main/java/io/split/engine/matchers/Matcher.java b/client/src/main/java/io/split/engine/matchers/Matcher.java index 1e604d778..3acabb7bc 100644 --- a/client/src/main/java/io/split/engine/matchers/Matcher.java +++ b/client/src/main/java/io/split/engine/matchers/Matcher.java @@ -1,9 +1,9 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import java.util.Map; public interface Matcher { - boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient); + boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator); } diff --git a/client/src/main/java/io/split/engine/matchers/UserDefinedSegmentMatcher.java b/client/src/main/java/io/split/engine/matchers/UserDefinedSegmentMatcher.java index a9796cb2c..5e78478a6 100644 --- a/client/src/main/java/io/split/engine/matchers/UserDefinedSegmentMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/UserDefinedSegmentMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.segments.Segment; import java.util.Map; @@ -27,7 +27,7 @@ public UserDefinedSegmentMatcher(Segment segment) { @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (!(matchValue instanceof String)) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/collections/ContainsAllOfSetMatcher.java b/client/src/main/java/io/split/engine/matchers/collections/ContainsAllOfSetMatcher.java index a947cc6f5..f55e207e1 100644 --- a/client/src/main/java/io/split/engine/matchers/collections/ContainsAllOfSetMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/collections/ContainsAllOfSetMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.collections; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -24,7 +24,7 @@ public ContainsAllOfSetMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/collections/ContainsAnyOfSetMatcher.java b/client/src/main/java/io/split/engine/matchers/collections/ContainsAnyOfSetMatcher.java index 9e123546a..9747cd689 100644 --- a/client/src/main/java/io/split/engine/matchers/collections/ContainsAnyOfSetMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/collections/ContainsAnyOfSetMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.collections; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -25,7 +25,7 @@ public ContainsAnyOfSetMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/collections/EqualToSetMatcher.java b/client/src/main/java/io/split/engine/matchers/collections/EqualToSetMatcher.java index dd108e5a6..467cfcd19 100644 --- a/client/src/main/java/io/split/engine/matchers/collections/EqualToSetMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/collections/EqualToSetMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.collections; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -25,7 +25,7 @@ public EqualToSetMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/collections/PartOfSetMatcher.java b/client/src/main/java/io/split/engine/matchers/collections/PartOfSetMatcher.java index 996847ece..4f9fc9217 100644 --- a/client/src/main/java/io/split/engine/matchers/collections/PartOfSetMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/collections/PartOfSetMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.collections; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -25,7 +25,7 @@ public PartOfSetMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/strings/ContainsAnyOfMatcher.java b/client/src/main/java/io/split/engine/matchers/strings/ContainsAnyOfMatcher.java index 474fe92e4..286462297 100644 --- a/client/src/main/java/io/split/engine/matchers/strings/ContainsAnyOfMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/strings/ContainsAnyOfMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.strings; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -23,7 +23,7 @@ public ContainsAnyOfMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; diff --git a/client/src/main/java/io/split/engine/matchers/strings/EndsWithAnyOfMatcher.java b/client/src/main/java/io/split/engine/matchers/strings/EndsWithAnyOfMatcher.java index edbd5c5b4..33a63ac03 100644 --- a/client/src/main/java/io/split/engine/matchers/strings/EndsWithAnyOfMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/strings/EndsWithAnyOfMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.strings; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -23,7 +23,7 @@ public EndsWithAnyOfMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; diff --git a/client/src/main/java/io/split/engine/matchers/strings/RegularExpressionMatcher.java b/client/src/main/java/io/split/engine/matchers/strings/RegularExpressionMatcher.java index ca6b699bd..b651bae0a 100644 --- a/client/src/main/java/io/split/engine/matchers/strings/RegularExpressionMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/strings/RegularExpressionMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.strings; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Map; @@ -16,7 +16,7 @@ public RegularExpressionMatcher(String matcherValue) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/strings/StartsWithAnyOfMatcher.java b/client/src/main/java/io/split/engine/matchers/strings/StartsWithAnyOfMatcher.java index 0529d13be..b758dba36 100644 --- a/client/src/main/java/io/split/engine/matchers/strings/StartsWithAnyOfMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/strings/StartsWithAnyOfMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.strings; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -23,7 +23,7 @@ public StartsWithAnyOfMatcher(Collection compareTo) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { if (matchValue == null) { return false; } diff --git a/client/src/main/java/io/split/engine/matchers/strings/WhitelistMatcher.java b/client/src/main/java/io/split/engine/matchers/strings/WhitelistMatcher.java index 0efc0d7d6..afedc4050 100644 --- a/client/src/main/java/io/split/engine/matchers/strings/WhitelistMatcher.java +++ b/client/src/main/java/io/split/engine/matchers/strings/WhitelistMatcher.java @@ -1,6 +1,6 @@ package io.split.engine.matchers.strings; -import io.split.client.SplitClientImpl; +import io.split.engine.evaluator.Evaluator; import io.split.engine.matchers.Matcher; import java.util.Collection; @@ -22,7 +22,7 @@ public WhitelistMatcher(Collection whitelist) { } @Override - public boolean match(Object matchValue, String bucketingKey, Map attributes, SplitClientImpl splitClient) { + public boolean match(Object matchValue, String bucketingKey, Map attributes, Evaluator evaluator) { return _whitelist.contains(matchValue); } diff --git a/client/src/test/java/io/split/engine/evaluator/EvaluatorTest.java b/client/src/test/java/io/split/engine/evaluator/EvaluatorTest.java index dcceee83b..2b3994bd4 100644 --- a/client/src/test/java/io/split/engine/evaluator/EvaluatorTest.java +++ b/client/src/test/java/io/split/engine/evaluator/EvaluatorTest.java @@ -6,7 +6,6 @@ import io.split.client.SplitFactory; import io.split.client.dtos.ConditionType; import io.split.client.dtos.Partition; -import io.split.client.exceptions.ChangeNumberExceptionWrapper; import io.split.client.impressions.ImpressionsManager; import io.split.engine.SDKReadinessGates; import io.split.engine.experiments.ParsedCondition; @@ -26,18 +25,17 @@ import static org.junit.Assert.assertEquals; public class EvaluatorTest { - private static final String MatchingKey = "test"; - private static final String BucketingKey = "test"; - private static final String SplitName = "split_name_test"; - private static final Long ChangeNumber = 123123L; - private static final String DefaultTreatmentValue = "defaultTreatment"; - private static final String TestLabelValue = "test label"; - private static final String TrafficTypeValue = "tt"; - private static final String TreatmentValue = "treatment_test"; + private static final String MATCHING_KEY = "test"; + private static final String BUCKETING_KEY = "test"; + private static final String SPLIT_NAME = "split_name_test"; + private static final Long CHANGE_NUMBER = 123123L; + private static final String DEFAULT_TREATMENT_VALUE = "defaultTreatment"; + private static final String TEST_LABEL_VALUE = "test label"; + private static final String TRAFFIC_TYPE_VALUE = "tt"; + private static final String TREATMENT_VALUE = "treatment_test"; private SplitFetcher _splitFetcher; private Evaluator _evaluator; - private SplitClientImpl _splitClient; private CombiningMatcher _matcher; private Map _configurations; private List _conditions; @@ -48,7 +46,6 @@ public void before() { SDKReadinessGates gates = Mockito.mock(SDKReadinessGates.class); _splitFetcher = Mockito.mock(SplitFetcher.class); _evaluator = new EvaluatorImp(gates, _splitFetcher); - _splitClient = getSplitClient(_splitFetcher, gates, _evaluator); _matcher = Mockito.mock(CombiningMatcher.class); _configurations = new HashMap<>(); @@ -57,100 +54,100 @@ public void before() { } @Test - public void evaluateWhenSplitNameDoesNotExistReturnControl() throws ChangeNumberExceptionWrapper { - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(null); + public void evaluateWhenSplitNameDoesNotExistReturnControl() { + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(null); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); assertEquals("control", result.treatment); assertEquals("definition not found", result.label); } @Test - public void evaluateWhenSplitIsKilledReturnDefaultTreatment() throws ChangeNumberExceptionWrapper { - ParsedSplit split = ParsedSplit.createParsedSplitForTests(SplitName, 0, true, DefaultTreatmentValue, _conditions, TrafficTypeValue, ChangeNumber, 2); - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(split); + public void evaluateWhenSplitIsKilledReturnDefaultTreatment() { + ParsedSplit split = ParsedSplit.createParsedSplitForTests(SPLIT_NAME, 0, true, DEFAULT_TREATMENT_VALUE, _conditions, TRAFFIC_TYPE_VALUE, CHANGE_NUMBER, 2); + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(split); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); - assertEquals(DefaultTreatmentValue, result.treatment); + assertEquals(DEFAULT_TREATMENT_VALUE, result.treatment); assertEquals("killed", result.label); - assertEquals(ChangeNumber, result.changeNumber); + assertEquals(CHANGE_NUMBER, result.changeNumber); } @Test - public void evaluateWithoutConditionsReturnDefaultTreatment() throws ChangeNumberExceptionWrapper { - ParsedSplit split = ParsedSplit.createParsedSplitForTests(SplitName, 0, false, DefaultTreatmentValue, _conditions, TrafficTypeValue, ChangeNumber, 2); - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(split); + public void evaluateWithoutConditionsReturnDefaultTreatment() { + ParsedSplit split = ParsedSplit.createParsedSplitForTests(SPLIT_NAME, 0, false, DEFAULT_TREATMENT_VALUE, _conditions, TRAFFIC_TYPE_VALUE, CHANGE_NUMBER, 2); + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(split); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); - assertEquals(DefaultTreatmentValue, result.treatment); + assertEquals(DEFAULT_TREATMENT_VALUE, result.treatment); assertEquals("default rule", result.label); - assertEquals(ChangeNumber, result.changeNumber); + assertEquals(CHANGE_NUMBER, result.changeNumber); } @Test - public void evaluateWithRollOutConditionBucketIsBiggerTrafficAllocationReturnDefaultTreatment() throws ChangeNumberExceptionWrapper { + public void evaluateWithRollOutConditionBucketIsBiggerTrafficAllocationReturnDefaultTreatment() { Partition partition = new Partition(); - partition.treatment = TreatmentValue; + partition.treatment = TREATMENT_VALUE; partition.size = 100; _partitions.add(partition); - ParsedCondition condition = new ParsedCondition(ConditionType.ROLLOUT, _matcher,_partitions, TestLabelValue); + ParsedCondition condition = new ParsedCondition(ConditionType.ROLLOUT, _matcher,_partitions, TEST_LABEL_VALUE); _conditions.add(condition); - ParsedSplit split = new ParsedSplit(SplitName, 0, false, DefaultTreatmentValue, _conditions, TrafficTypeValue, ChangeNumber, 10, 12, 2, _configurations); + ParsedSplit split = new ParsedSplit(SPLIT_NAME, 0, false, DEFAULT_TREATMENT_VALUE, _conditions, TRAFFIC_TYPE_VALUE, CHANGE_NUMBER, 10, 12, 2, _configurations); - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(split); - Mockito.when(condition.matcher().match(MatchingKey, BucketingKey, null, _splitClient)).thenReturn(true); + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(split); + Mockito.when(condition.matcher().match(MATCHING_KEY, BUCKETING_KEY, null, _evaluator)).thenReturn(true); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); - assertEquals(DefaultTreatmentValue, result.treatment); + assertEquals(DEFAULT_TREATMENT_VALUE, result.treatment); assertEquals("not in split", result.label); - assertEquals(ChangeNumber, result.changeNumber); + assertEquals(CHANGE_NUMBER, result.changeNumber); } @Test - public void evaluateWithRollOutConditionTrafficAllocationIsBiggerBucketReturnTreatment() throws ChangeNumberExceptionWrapper { + public void evaluateWithRollOutConditionTrafficAllocationIsBiggerBucketReturnTreatment() { Partition partition = new Partition(); - partition.treatment = TreatmentValue; + partition.treatment = TREATMENT_VALUE; partition.size = 100; _partitions.add(partition); - ParsedCondition condition = new ParsedCondition(ConditionType.ROLLOUT, _matcher, _partitions, TestLabelValue); + ParsedCondition condition = new ParsedCondition(ConditionType.ROLLOUT, _matcher, _partitions, TEST_LABEL_VALUE); _conditions.add(condition); - ParsedSplit split = new ParsedSplit(SplitName, 0, false, DefaultTreatmentValue, _conditions, TrafficTypeValue, ChangeNumber, 60, 18, 2, _configurations); + ParsedSplit split = new ParsedSplit(SPLIT_NAME, 0, false, DEFAULT_TREATMENT_VALUE, _conditions, TRAFFIC_TYPE_VALUE, CHANGE_NUMBER, 60, 18, 2, _configurations); - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(split); - Mockito.when(condition.matcher().match(MatchingKey, BucketingKey, null, _splitClient)).thenReturn(true); + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(split); + Mockito.when(condition.matcher().match(MATCHING_KEY, BUCKETING_KEY, null, _evaluator)).thenReturn(true); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); - assertEquals(TreatmentValue, result.treatment); - assertEquals(TestLabelValue, result.label); - assertEquals(ChangeNumber, result.changeNumber); + assertEquals(TREATMENT_VALUE, result.treatment); + assertEquals(TEST_LABEL_VALUE, result.label); + assertEquals(CHANGE_NUMBER, result.changeNumber); } @Test - public void evaluateWithWhitelistConditionReturnTreatment() throws ChangeNumberExceptionWrapper { + public void evaluateWithWhitelistConditionReturnTreatment() { Partition partition = new Partition(); - partition.treatment = TreatmentValue; + partition.treatment = TREATMENT_VALUE; partition.size = 100; _partitions.add(partition); ParsedCondition condition = new ParsedCondition(ConditionType.WHITELIST, _matcher, _partitions, "test whitelist label"); _conditions.add(condition); - ParsedSplit split = new ParsedSplit(SplitName, 0, false, DefaultTreatmentValue, _conditions, TrafficTypeValue, ChangeNumber, 60, 18, 2, _configurations); + ParsedSplit split = new ParsedSplit(SPLIT_NAME, 0, false, DEFAULT_TREATMENT_VALUE, _conditions, TRAFFIC_TYPE_VALUE, CHANGE_NUMBER, 60, 18, 2, _configurations); - Mockito.when(_splitFetcher.fetch(SplitName)).thenReturn(split); - Mockito.when(condition.matcher().match(MatchingKey, BucketingKey, null, _splitClient)).thenReturn(true); + Mockito.when(_splitFetcher.fetch(SPLIT_NAME)).thenReturn(split); + Mockito.when(condition.matcher().match(MATCHING_KEY, BUCKETING_KEY, null, _evaluator)).thenReturn(true); - EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MatchingKey, BucketingKey, SplitName, null, _splitClient); + EvaluatorImp.TreatmentLabelAndChangeNumber result = _evaluator.evaluateFeature(MATCHING_KEY, BUCKETING_KEY, SPLIT_NAME, null); - assertEquals(TreatmentValue, result.treatment); + assertEquals(TREATMENT_VALUE, result.treatment); assertEquals("test whitelist label", result.label); - assertEquals(ChangeNumber, result.changeNumber); + assertEquals(CHANGE_NUMBER, result.changeNumber); } private SplitClientImpl getSplitClient(SplitFetcher splitFetcher, SDKReadinessGates gates, Evaluator evaluator) {