Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/main/java/cloud/eppo/BaseEppoClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,18 @@ protected EppoValue getTypedAssignment(
return defaultValue;
}

// Evaluate flag with details
FlagEvaluationResult evaluationResult =
FlagEvaluator.evaluateFlag(
flag, flagKey, subjectKey, subjectAttributes, config.isConfigObfuscated());
flag,
flagKey,
subjectKey,
subjectAttributes,
config.isConfigObfuscated(),
config.getEnvironmentName(),
config.getConfigFetchedAt(),
config.getConfigPublishedAt());

EppoValue assignedValue =
evaluationResult.getVariation() != null ? evaluationResult.getVariation().getValue() : null;

Expand Down
188 changes: 170 additions & 18 deletions src/main/java/cloud/eppo/FlagEvaluationResult.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package cloud.eppo;

import cloud.eppo.api.Attributes;
import cloud.eppo.api.*;
import cloud.eppo.ufc.dto.Variation;
import java.util.Date;
import java.util.Map;
import java.util.Objects;

/** Flag evaluation result that includes detailed evaluation information. */
public class FlagEvaluationResult {

private final String flagKey;
Expand All @@ -14,6 +16,7 @@ public class FlagEvaluationResult {
private final Variation variation;
private final Map<String, String> extraLogging;
private final boolean doLog;
private final EvaluationDetails evaluationDetails;

public FlagEvaluationResult(
String flagKey,
Expand All @@ -22,45 +25,68 @@ public FlagEvaluationResult(
String allocationKey,
Variation variation,
Map<String, String> extraLogging,
boolean doLog) {
boolean doLog,
EvaluationDetails evaluationDetails) {
this.flagKey = flagKey;
this.subjectKey = subjectKey;
this.subjectAttributes = subjectAttributes;
this.allocationKey = allocationKey;
this.variation = variation;
this.extraLogging = extraLogging;
this.doLog = doLog;
this.evaluationDetails = evaluationDetails;
}

@Override
public String toString() {
return "FlagEvaluationResult{" +
"flagKey='" + flagKey + '\'' +
", subjectKey='" + subjectKey + '\'' +
", subjectAttributes=" + subjectAttributes +
", allocationKey='" + allocationKey + '\'' +
", variation=" + variation +
", extraLogging=" + extraLogging +
", doLog=" + doLog +
'}';
return "FlagEvaluationResult{"
+ "flagKey='"
+ flagKey
+ '\''
+ ", subjectKey='"
+ subjectKey
+ '\''
+ ", subjectAttributes="
+ subjectAttributes
+ ", allocationKey='"
+ allocationKey
+ '\''
+ ", variation="
+ variation
+ ", extraLogging="
+ extraLogging
+ ", doLog="
+ doLog
+ ", evaluationDetails="
+ evaluationDetails
+ '}';
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
FlagEvaluationResult that = (FlagEvaluationResult) o;
return doLog == that.doLog
&& Objects.equals(flagKey, that.flagKey)
&& Objects.equals(subjectKey, that.subjectKey)
&& Objects.equals(subjectAttributes, that.subjectAttributes)
&& Objects.equals(allocationKey, that.allocationKey)
&& Objects.equals(variation, that.variation)
&& Objects.equals(extraLogging, that.extraLogging);
&& Objects.equals(flagKey, that.flagKey)
&& Objects.equals(subjectKey, that.subjectKey)
&& Objects.equals(subjectAttributes, that.subjectAttributes)
&& Objects.equals(allocationKey, that.allocationKey)
&& Objects.equals(variation, that.variation)
&& Objects.equals(extraLogging, that.extraLogging)
&& Objects.equals(evaluationDetails, that.evaluationDetails);
}

@Override
public int hashCode() {
return Objects.hash(flagKey, subjectKey, subjectAttributes, allocationKey, variation, extraLogging, doLog);
return Objects.hash(
flagKey,
subjectKey,
subjectAttributes,
allocationKey,
variation,
extraLogging,
doLog,
evaluationDetails);
}

public String getFlagKey() {
Expand Down Expand Up @@ -90,4 +116,130 @@ public Map<String, String> getExtraLogging() {
public boolean doLog() {
return doLog;
}

public EvaluationDetails getEvaluationDetails() {
return evaluationDetails;
}

/** Builder to construct flag evaluation results during flag evaluation. */
public static class Builder {
private String flagKey;
private String subjectKey;
private Attributes subjectAttributes;
private String allocationKey;
private Variation variation;
private Map<String, String> extraLogging;
private boolean doLog;

// Delegate to EvaluationDetails.Builder for evaluation details
private final EvaluationDetails.Builder detailsBuilder = EvaluationDetails.builder();

public Builder flagKey(String flagKey) {
this.flagKey = flagKey;
return this;
}

public Builder subjectKey(String subjectKey) {
this.subjectKey = subjectKey;
return this;
}

public Builder subjectAttributes(Attributes subjectAttributes) {
this.subjectAttributes = subjectAttributes;
return this;
}

public Builder allocationKey(String allocationKey) {
this.allocationKey = allocationKey;
return this;
}

public Builder variation(Variation variation) {
this.variation = variation;
return this;
}

public Builder extraLogging(Map<String, String> extraLogging) {
this.extraLogging = extraLogging;
return this;
}

public Builder doLog(boolean doLog) {
this.doLog = doLog;
return this;
}

public Builder environmentName(String environmentName) {
detailsBuilder.environmentName(environmentName);
return this;
}

public Builder flagEvaluationCode(FlagEvaluationCode code) {
detailsBuilder.flagEvaluationCode(code);
return this;
}

public Builder flagEvaluationDescription(String description) {
detailsBuilder.flagEvaluationDescription(description);
return this;
}

public Builder banditKey(String banditKey) {
detailsBuilder.banditKey(banditKey);
return this;
}

public Builder banditAction(String banditAction) {
detailsBuilder.banditAction(banditAction);
return this;
}

public Builder matchedRule(MatchedRule matchedRule) {
detailsBuilder.matchedRule(matchedRule);
return this;
}

public Builder matchedAllocation(AllocationDetails matchedAllocation) {
detailsBuilder.matchedAllocation(matchedAllocation);
return this;
}

public Builder addUnmatchedAllocation(AllocationDetails allocation) {
detailsBuilder.addUnmatchedAllocation(allocation);
return this;
}

public Builder addUnevaluatedAllocation(AllocationDetails allocation) {
detailsBuilder.addUnevaluatedAllocation(allocation);
return this;
}

public Builder configFetchedAt(Date configFetchedAt) {
detailsBuilder.configFetchedAt(configFetchedAt);
return this;
}

public Builder configPublishedAt(Date configPublishedAt) {
detailsBuilder.configPublishedAt(configPublishedAt);
return this;
}

public FlagEvaluationResult build() {
// Set variation details before building
if (variation != null) {
detailsBuilder.variationKey(variation.getKey());
detailsBuilder.variationValue(variation.getValue());
}

return new FlagEvaluationResult(
flagKey,
subjectKey,
subjectAttributes,
allocationKey,
variation,
extraLogging,
doLog,
detailsBuilder.build());
}
}
}
Loading