public static boolean isValid(String expression) { try { FilterExpression.of(expression); return true; } catch (IllegalArgumentException e) { return false; } }
public static FilterExpression of(String expression) { if (expression.equals("true")) { return ALWAYS_TRUE; } final ANTLRInputStream inputStream = new ANTLRInputStream(expression); final FilterLexer lexer = new FilterLexer(inputStream); lexer.getErrorListeners().clear(); lexer.addErrorListener(ERROR_LISTENER); final CommonTokenStream tokenStream = new CommonTokenStream(lexer); final FilterParser parser = new FilterParser(tokenStream); parser.getErrorListeners().clear(); parser.addErrorListener(ERROR_LISTENER); return new FilterExpression(expression, parser); }
protected Experiment(Experiments owner, String name) { this.owner = owner; this.name = name; this.filter = FilterExpression.alwaysTrue(); this.hashAttributes = EMPTY_SET; this.allocations = new Allocations(); this.treatments = Maps.newConcurrentMap(); this.overrides = Maps.newConcurrentMap(); this.seed = (int) IdentityBuilder.seed(0).putString(name).hash(); }
private TreatmentOverrideEntity(TreatmentOverride override) { this.name = override.getName(); this.treatment = override.getTreatment().getName(); this.filter = override.getFilter().toString(); } }
private Treatment getTreatmentWithOverrides(Experiment experiment, Identity identity, AttributesMap attributes) { for (TreatmentOverride override : experiment.getOverrides()) { if (override.getFilter().evaluate(attributes)) { return override.getTreatment(); } } return experiment.getTreatment(identity, attributes); }
@Override public TreatmentOverrideDto toDto(TreatmentOverride override) { return new TreatmentOverrideDto( override.getName(), override.getFilter().toString(), override.getTreatment().getName() ); }
/** * Returns all active treatments for all active experiments for an identity, taking overrides into account */ public Map<Experiment, Treatment> getActiveTreatments(Identity identity) { strategy.onCacheRead(context); final Map<Experiment, Treatment> result = Maps.newHashMap(); final AttributesMap attributes = identity .computeAttributes() .filter(Identity.getSupportedAttributes(identity.getClass())); for (final Experiment experiment : cache.getActiveExperiments().values()) { if (!experiment.getFilter().evaluate(attributes)) { continue; } final Treatment treatment = getTreatmentWithOverrides(experiment, identity, attributes); if (treatment == null) { continue; } result.put(experiment, treatment); } return result; }
public Builder filter(String filter) { this.filter = FilterExpression.of(filter); return this; }
private ExperimentEntity(Experiment experiment) { name = experiment.getName(); seed = experiment.getSeed(); description = experiment.getDescription(); active = experiment.isActive(); created = experiment.getCreated(); modified = experiment.getModified(); activated = experiment.getActivated(); deactivated = experiment.getDeactivated(); filter = experiment.getFilter().toString(); hashAttributes = Lists.newArrayList(experiment.getHashAttributes()); treatments = Lists.newArrayList(Collections2.transform(experiment.getTreatments(), TREATMENT_MAPPER)); allocations = Lists.transform(experiment.getAllocations(), ALLOCATION_MAPPER); overrides = Lists.transform(experiment.getOverrides(),TREATMENT_OVERRIDE_MAPPER); }
/** * Returns the current active treatment for an experiment name and identity, taking overrides into account */ public Treatment getActiveTreatment(String experimentName, Identity identity) { strategy.onCacheRead(experimentName, context); final Experiment experiment = cache.getActiveExperiments().get(experimentName); final AttributesMap attributes = identity .computeAttributes() .filter(Identity.getSupportedAttributes(identity.getClass())); if (experiment == null || !experiment.getFilter().evaluate(attributes)) { return null; } return getTreatmentWithOverrides(experiment, identity, attributes); }
this.name = name; this.description = description; this.filter = Objects.firstNonNull(filter, FilterExpression.alwaysTrue()); this.hashAttributes = Objects.firstNonNull(hashAttributes, EMPTY_SET); this.active = active;
/** * Add a treatment override for an identity * @param treatmentName The treatment an identity should receive * @param overrideName The name of the override * @param filter A filter expression that describes which attributes this override should apply for */ public Experiment addOverride(String overrideName, String treatmentName, String filter) { final FilterExpression filterExp = FilterExpression.of(filter); final TreatmentOverride override = new TreatmentOverride(overrideName, filterExp, treatment(treatmentName)); overrides.put(overrideName, override); return this; }
@Override public ExperimentDto toDto(Experiment experiment) { if (experiment == null) { return null; } return new ExperimentDto( experiment.getName(), experiment.getSeed(), experiment.getDescription(), experiment.getFilter() != null ? experiment.getFilter().toString() : null, experiment.getHashAttributes() != null ? Sets.newLinkedHashSet(experiment.getHashAttributes()) : null, experiment.isActive(), experiment.getCreated(), experiment.getModified(), experiment.getActivated(), experiment.getDeactivated(), safeArrayList(mappers.toDto(experiment.getTreatments(), TreatmentDto.class)), safeArrayList(mappers.toDto(experiment.getAllocations(), AllocationDto.class)), safeArrayList(mappers.toDto(experiment.getOverrides(), TreatmentOverrideDto.class)) ); }
public Builder addOverride(String name, String filter, String treatmentName) { overrides.add(new TreatmentOverride(name, FilterExpression.of(filter), getTreatment(treatmentName))); return this; }
experiment.setFilter(FilterExpression.of(request.getFilter().orNull()));
experiment.setFilter(FilterExpression.of(request.getFilter()));
.addTreatment("control", "the default") .addTreatment("pie", "show them pie") .setFilter(FilterExpression.of("identified")) .allocate("control", 25) .allocate("pie", 25) .create("composite") .setFilter(FilterExpression.of(String.format("%s & %s", User.ATTR_IDENTIFIED, Device.ATTR_DEVICE))) .setHashAttributes(Device.ATTR_DEVICE) .addTreatment("control")