8000 [FSSDK-10762] Implement UPS request batching for decideForKeys by raju-opti · Pull Request #549 · optimizely/java-sdk · GitHub
[go: up one dir, main page]

Skip to content

[FSSDK-10762] Implement UPS request batching for decideForKeys #549

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
8000
Prev Previous commit
Next Next commit
update
  • Loading branch information
raju-opti committed Oct 18, 2024
commit 437048c77f017f467ca04972179c885b8847be7b
3 changes: 0 additions & 3 deletions .vscode/settings.json

This file was deleted.

235 changes: 1 addition & 234 deletions core-api/src/main/java/com/optimizely/ab/Optimizely.java
8000
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* Copyright 2016-2023, Optimizely, Inc. and contributors *
* Copyright 2016-2024, Optimizely, Inc. and contributors *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
Expand Down Expand Up @@ -42,7 +42,6 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
import javax.xml.catalog.CatalogFeatures.Feature;

import java.io.Closeable;
import java.util.*;
Expand Down Expand Up @@ -1193,111 +1192,6 @@ private OptimizelyUserContext createUserContextCopy(@Nonnull String userId, @Non
return new OptimizelyUserContext(this, userId, attributes, Collections.EMPTY_MAP, null, false);
}

// OptimizelyDecision decide(@Nonnull OptimizelyUserContext user,
// @Nonnull String key,
// @Nonnull List<OptimizelyDecideOption> options) {
//
// ProjectConfig projectConfig = getProjectConfig();
// if (projectConfig == null) {
// return OptimizelyDecision.newErrorDecision(key, user, DecisionMessage.SDK_NOT_READY.reason());
// }
//
// FeatureFlag flag = projectConfig.getFeatureKeyMapping().get(key);
// if (flag == null) {
// return OptimizelyDecision.newErrorDecision(key, user, DecisionMessage.FLAG_KEY_INVALID.reason(key));
// }
//
// String userId = user.getUserId();
// Map<String, Object> attributes = user.getAttributes();
// Boolean decisionEventDispatched = false;
// List<OptimizelyDecideOption> allOptions = getAllOptions(options);
// DecisionReasons decisionReasons = DefaultDecisionReasons.newInstance(allOptions);
//
// Map<String, ?> copiedAttributes = new HashMap<>(attributes);
// FeatureDecision flagDecision;
//
// // Check Forced Decision
// OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flag.getKey(), null);
// DecisionResponse<Variation> forcedDecisionVariation = decisionService.validatedForcedDecision(optimizelyDecisionContext, projectConfig, user);
// decisionReasons.merge(forcedDecisionVariation.getReasons());
// if (forcedDecisionVariation.getResult() != null) {
// flagDecision = new FeatureDecision(null, forcedDecisionVariation.getResult(), FeatureDecision.DecisionSource.FEATURE_TEST);
// } else {
// // Regular decision
// DecisionResponse<FeatureDecision> decisionVariation = decisionService.getVariationForFeature(
// flag,
// user,
// projectConfig,
// allOptions);
// flagDecision = decisionVariation.getResult();
// decisionReasons.merge(decisionVariation.getReasons());
// }
//
// Boolean flagEnabled = false;
// if (flagDecision.variation != null) {
// if (flagDecision.variation.getFeatureEnabled()) {
// flagEnabled = true;
// }
// }
// logger.info("Feature \"{}\" is enabled for user \"{}\"? {}", key, userId, flagEnabled);
//
// Map<String, Object> variableMap = new HashMap<>();
// if (!allOptions.contains(OptimizelyDecideOption.EXCLUDE_VARIABLES)) {
// DecisionResponse<Map<String, Object>> decisionVariables = getDecisionVariableMap(
// flag,
// flagDecision.variation,
// flagEnabled);
// variableMap = decisionVariables.getResult();
// decisionReasons.merge(decisionVariables.getReasons());
// }
// OptimizelyJSON optimizelyJSON = new OptimizelyJSON(variableMap);
//
// FeatureDecision.DecisionSource decisionSource = FeatureDecision.DecisionSource.ROLLOUT;
// if (flagDecision.decisionSource != null) {
// decisionSource = flagDecision.decisionSource;
// }
//
// List<String> reasonsToReport = decisionReasons.toReport();
// String variationKey = flagDecision.variation != null ? flagDecision.variation.getKey() : null;
// // TODO: add ruleKey values when available later. use a copy of experimentKey until then.
// // add to event metadata as well (currently set to experimentKey)
// String ruleKey = flagDecision.experiment != null ? flagDecision.experiment.getKey() : null;
//
// if (!allOptions.contains(OptimizelyDecideOption.DISABLE_DECISION_EVENT)) {
// decisionEventDispatched = sendImpression(
// projectConfig,
// flagDecision.experiment,
// userId,
// copiedAttributes,
// flagDecision.variation,
// key,
// decisionSource.toString(),
// flagEnabled);
// }
//
// DecisionNotification decisionNotification = DecisionNotification.newFlagDecisionNotificationBuilder()
// .withUserId(userId)
// .withAttributes(copiedAttributes)
// .withFlagKey(key)
// .withEnabled(flagEnabled)
// .withVariables(variableMap)
// .withVariationKey(variationKey)
// .withRuleKey(ruleKey)
// .withReasons(reasonsToReport)
// .withDecisionEventDispatched(decisionEventDispatched)
// .build();
// notificationCenter.send(decisionNotification);
//
// return new OptimizelyDecision(
// variationKey,
// flagEnabled,
// optimizelyJSON,
// ruleKey,
// key,
// user,
// reasonsToReport);
// }
//
Optional<FeatureDecision> getForcedDecision(@Nonnull String flagKey,
@Nonnull DecisionReasons decisionReasons,
@Nonnull ProjectConfig projectConfig,
Expand All @@ -1313,7 +1207,6 @@ Optional<FeatureDecision> getForcedDecision(@Nonnull String flagKey,
return Optional.empty();
}

// TODO: UPS refactor cleanup
OptimizelyDecision decide(@Nonnull OptimizelyUserContext user,
@Nonnull String key,
@Nonnull List<OptimizelyDecideOption> options) {
Expand All @@ -1322,106 +1215,6 @@ OptimizelyDecision decide(@Nonnull OptimizelyUserContext user,
return OptimizelyDecision.newErrorDecision(key, user, DecisionMessage.SDK_NOT_READY.reason());
}
return decideForKeys(user, Arrays.asList(key), options).get(key);

// ProjectConfig projectConfig = getProjectConfig();
// if (projectConfig == null) {
// return OptimizelyDecision.newErrorDecision(key, user, DecisionMessage.SDK_NOT_READY.reason());
// }
//
// FeatureFlag flag = projectConfig.getFeatureKeyMapping().get(key);
// if (flag == null) {
// return OptimizelyDecision.newErrorDecision(key, user, DecisionMessage.FLAG_KEY_INVALID.reason(key));
// }
//
// String userId = user.getUserId();
// Map<String, Object> attributes = user.getAttributes();
// Boolean decisionEventDispatched = false;
// List<OptimizelyDecideOption> allOptions = getAllOptions(options);
// DecisionReasons decisionReasons = DefaultDecisionReasons.newInstance(allOptions);
//
// Map<String, ?> copiedAttributes = new HashMap<>(attributes);
// FeatureDecision flagDecision;
//
// // Check Forced Decision
// OptimizelyDecisionContext optimizelyDecisionContext = new OptimizelyDecisionContext(flag.getKey(), null);
// DecisionResponse<Variation> forcedDecisionVariation = decisionService.validatedForcedDecision(optimizelyDecisionContext, projectConfig, user);
// decisionReasons.merge(forcedDecisionVariation.getReasons());
// if (forcedDecisionVariation.getResult() != null) {
// flagDecision = new FeatureDecision(null, forcedDecisionVariation.getResult(), FeatureDecision.DecisionSource.FEATURE_TEST);
// } else {
// // Regular decision
// DecisionResponse<FeatureDecision> decisionVariation = decisionService.getVariationForFeature(
// flag,
// user,
// projectConfig,
// allOptions);
// flagDecision = decisionVariation.getResult();
// decisionReasons.merge(decisionVariation.getReasons());
// }
//
// Boolean flagEnabled = false;
// if (flagDecision.variation != null) {
// if (flagDecision.variation.getFeatureEnabled()) {
// flagEnabled = true;
// }
// }
// logger.info("Feature \"{}\" is enabled for user \"{}\"? {}", key, userId, flagEnabled);
//
// Map<String, Object> variableMap = new HashMap<>();
// if (!allOptions.contains(OptimizelyDecideOption.EXCLUDE_VARIABLES)) {
// DecisionResponse<Map<String, Object>> decisionVariables = getDecisionVariableMap(
// flag,
// flagDecision.variation,
// flagEnabled);
// variableMap = decisionVariables.getResult();
// decisionReasons.merge(decisionVariables.getReasons());
// }
// OptimizelyJSON optimizelyJSON = new OptimizelyJSON(variableMap);
//
// FeatureDecision.DecisionSource decisionSource = FeatureDecision.DecisionSource.ROLLOUT;
// if (flagDecision.decisionSource != null) {
// decisionSource = flagDecision.decisionSource;
// }
//
// List<String> reasonsToReport = decisionReasons.toReport();
// String variationKey = flagDecision.variation != null ? flagDecision.variation.getKey() : null;
// // TODO: add ruleKey values when available later. use a copy of experimentKey until then.
// // add to event metadata as well (currently set to experimentKey)
// String ruleKey = flagDecision.experiment != null ? flagDecision.experiment.getKey() : null;
//
// if (!allOptions.contains(OptimizelyDecideOption.DISABLE_DECISION_EVENT)) {
// decisionEventDispatched = sendImpression(
// projectConfig,
// flagDecision.experiment,
// userId,
// copiedAttributes,
// flagDecision.variation,
// key,
// decisionSource.toString(),
// flagEnabled);
// }
//
// DecisionNotification decisionNotification = DecisionNotification.newFlagDecisionNotificationBuilder()
// .withUserId(userId)
// .withAttributes(copiedAttributes)
// .withFlagKey(key)
// .withEnabled(flagEnabled)
// .withVariables(variableMap)
// .withVariationKey(variationKey)
// .withRuleKey(ruleKey)
// .withReasons(reasonsToReport)
// .withDecisionEventDispatched(decisionEventDispatched)
// .build();
// notificationCenter.send(decisionNotification);
//
// return new OptimizelyDecision(
// variationKey,
// flagEnabled,
// optimizelyJSON,
// ruleKey,
// key,
// user,
// reasonsToReport);
}

private OptimizelyDecision createOptimizelyDecision(
Expand Down Expand Up @@ -1505,7 +1298,6 @@ private OptimizelyDecision createOptimizelyDecision(
reasonsToReport);
}

// TODO: UPS refactor cleanup
Map<String, OptimizelyDecision> decideForKeys(@Nonnull OptimizelyUserContext user,
@Nonnull List<String> keys,
@Nonnull List<OptimizelyDecideOption> options) {
Expand Down Expand Up @@ -1570,31 +1362,6 @@ Map<String, OptimizelyDecision> decideForKeys(@Nonnull OptimizelyUserContext use

return decisionMap;
}

// Map<String, OptimizelyDecision> decideForKeys(@Nonnull OptimizelyUserContext user,
// @Nonnull List<String> keys,
// @Nonnull List<OptimizelyDecideOption> options) {
// Map<String, OptimizelyDecision> decisionMap = new HashMap<>();
//
// ProjectConfig projectConfig = getProjectConfig();
// if (projectConfig == null) {
// logger.error("Optimizely instance is not valid, failing isFeatureEnabled call.");
// return decisionMap;
// }
//
// if (keys.isEmpty()) return decisionMap;
//
// List<OptimizelyDecideOption> allOptions = getAllOptions(options);
//
// for (String key : keys) {
// OptimizelyDecision decision = decide(user, key, options);
// if (!allOptions.contains(OptimizelyDecideOption.ENABLED_FLAGS_ONLY) || decision.getEnabled()) {
// decisionMap.put(key, decision);
// }
// }
//
// return decisionMap;
// }

Map<String, OptimizelyDecision> decideAll(@Nonnull OptimizelyUserContext user,
@Nonnull List<OptimizelyDecideOption> options) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* Copyright 2017-2022, Optimizely, Inc. and contributors *
* Copyright 2017-2022, 2024, Optimizely, Inc. and contributors *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
Expand Down Expand Up @@ -203,31 +203,6 @@ public DecisionResponse<FeatureDecision> getVariationForFeature(@Nonnull Feature
@Nonnull OptimizelyUserContext user,
@Nonnull ProjectConfig projectConfig,
@Nonnull List<OptimizelyDecideOption> options) {
// DecisionReasons reasons = DefaultDecisionReasons.newInstance();
//
// DecisionResponse<FeatureDecision> decisionVariationResponse = getVariationFromExperiment(projectConfig, featureFlag, user, options);
// reasons.merge(decisionVariationResponse.getReasons());
//
// FeatureDecision decision = decisionVariationResponse.getResult();
// if (decision != null) {
// return new DecisionResponse(decision, reasons);
// }
//
// DecisionResponse<FeatureDecision> decisionFeatureResponse = getVariationForFeatureInRollout(featureFlag, user, projectConfig);
// reasons.merge(decisionFeatureResponse.getReasons());
// decision = decisionFeatureResponse.getResult();
//
// String message;
// if (decision.variation == null) {
// message = reasons.addInfo("The user \"%s\" was not bucketed into a rollout for feature flag \"%s\".",
// user.getUserId(), featureFlag.getKey());
// } else {
// message = reasons.addInfo("The user \"%s\" was bucketed into a rollout for feature flag \"%s\".",
// user.getUserId(), featureFlag.getKey());
// }
// logger.info(message);
//
// return new DecisionResponse(decision, reasons);
return getVariationsForFeatureList(Arrays.asList(featureFlag), user, projectConfig, options).get(0);
}

Expand Down Expand Up @@ -329,30 +304,6 @@ public List<DecisionResponse<FeatureDecision>> getVariationsForFeatureList(@Non
}

return decisions;

// DecisionResponse<FeatureDecision> decisionVariationResponse = getVariationFromExperiment(projectConfig, featureFlag, user, options);
// reasons.merge(decisionVariationResponse.getReasons());
//
// FeatureDecision decision = decisionVariationResponse.getResult();
// if (decision != null) {
// return new DecisionResponse(decision, reasons);
// }

// DecisionResponse<FeatureDecision> decisionFeatureResponse = getVariationForFeatureInRollout(featureFlag, user, projectConfig);
// reasons.merge(decisionFeatureResponse.getReasons());
// decision = decisionFeatureResponse.getResult();
//
// String message;
// if (decision.variation == null) {
// message = reasons.addInfo("The user \"%s\" was not bucketed into a rollout for feature flag \"%s\".",
// user.getUserId(), featureFlag.getKey());
// } else {
// message = reasons.addInfo("The user \"%s\" was bucketed into a rollout for feature flag \"%s\".",
// user.getUserId(), featureFlag.getKey());
// }
// logger.info(message);
//
// return new DecisionResponse(decision, reasons);
}

@Nonnull
Expand Down Expand Up @@ -788,7 +739,7 @@ public DecisionResponse<Variation> getForcedVariation(@Nonnull Experiment experi
}


public DecisionResponse<Variation> getVariationFromExperimentRule(@Nonnull ProjectConfig projectConfig,
private DecisionResponse<Variation> getVariationFromExperimentRule(@Nonnull ProjectConfig projectConfig,
@Nonnull String flagKey,
@Nonnull Experiment rule,
@Nonnull OptimizelyUserContext user,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
*
* Copyright 2021-2023, Optimizely and contributors
* Copyright 2021-2024, Optimizely and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Loading
Loading
0