module Optimizely::Audience
Public Instance Methods
user_meets_audience_conditions?(config, experiment, attributes, logger, logging_hash = nil, logging_key = nil)
click to toggle source
# File lib/optimizely/audience.rb, line 27 def user_meets_audience_conditions?(config, experiment, attributes, logger, logging_hash = nil, logging_key = nil) # Determine for given experiment/rollout rule if user satisfies the audience conditions. # # config - Representation of the Optimizely project config. # experiment - Experiment/Rollout rule in which user is to be bucketed. # attributes - Hash representing user attributes which will be used in determining if # the audience conditions are met. # logger - Provides a logger instance. # logging_hash - Optional string representing logs hash inside Helpers::Constants. # This defaults to 'EXPERIMENT_AUDIENCE_EVALUATION_LOGS'. # logging_key - Optional string to be logged as an identifier of experiment under evaluation. # This defaults to experiment['key']. # # Returns boolean representing if user satisfies audience conditions for the audiences or not. decide_reasons = [] logging_hash ||= 'EXPERIMENT_AUDIENCE_EVALUATION_LOGS' logging_key ||= experiment['key'] logs_hash = Object.const_get "Optimizely::Helpers::Constants::#{logging_hash}" audience_conditions = experiment['audienceConditions'] || experiment['audienceIds'] message = format(logs_hash['EVALUATING_AUDIENCES_COMBINED'], logging_key, audience_conditions) logger.log(Logger::DEBUG, message) # Return true if there are no audiences if audience_conditions.empty? message = format(logs_hash['AUDIENCE_EVALUATION_RESULT_COMBINED'], logging_key, 'TRUE') logger.log(Logger::INFO, message) decide_reasons.push(message) return true, decide_reasons end attributes ||= {} custom_attr_condition_evaluator = CustomAttributeConditionEvaluator.new(attributes, logger) evaluate_custom_attr = lambda do |condition| return custom_attr_condition_evaluator.evaluate(condition) end evaluate_audience = lambda do |audience_id| audience = config.get_audience_from_id(audience_id) return nil unless audience audience_conditions = audience['conditions'] message = format(logs_hash['EVALUATING_AUDIENCE'], audience_id, audience_conditions) logger.log(Logger::DEBUG, message) decide_reasons.push(message) audience_conditions = JSON.parse(audience_conditions) if audience_conditions.is_a?(String) result = ConditionTreeEvaluator.evaluate(audience_conditions, evaluate_custom_attr) result_str = result.nil? ? 'UNKNOWN' : result.to_s.upcase message = format(logs_hash['AUDIENCE_EVALUATION_RESULT'], audience_id, result_str) logger.log(Logger::DEBUG, message) decide_reasons.push(message) result end eval_result = ConditionTreeEvaluator.evaluate(audience_conditions, evaluate_audience) eval_result ||= false message = format(logs_hash['AUDIENCE_EVALUATION_RESULT_COMBINED'], logging_key, eval_result.to_s.upcase) logger.log(Logger::INFO, message) decide_reasons.push(message) [eval_result, decide_reasons] end