bucketing

package
v2.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 25, 2024 License: MIT Imports: 22 Imported by: 0

Documentation

Index

Constants

View Source
const (
	OperatorAnd = "and"
	OperatorOr  = "or"
)
View Source
const (
	VariableEvaluatedEvent    = "variableEvaluated"
	VariableDefaultedEvent    = "variableDefaulted"
	AggVariableEvaluatedEvent = "aggVariableEvaluated"
	AggVariableDefaultedEvent = "aggVariableDefaulted"
)
View Source
const (
	TypeAll           = "all"
	TypeUser          = "user"
	TypeOptIn         = "optIn"
	TypeAudienceMatch = "audienceMatch"
)
View Source
const (
	SubTypeUserID          = "user_id"
	SubTypeEmail           = "email"
	SubTypeIP              = "ip"
	SubTypeCountry         = "country"
	SubTypePlatform        = "platform"
	SubTypePlatformVersion = "platformVersion"
	SubTypeAppVersion      = "appVersion"
	SubTypeDeviceModel     = "deviceModel"
	SubTypeCustomData      = "customData"
)
View Source
const (
	ComparatorEqual        = "="
	ComparatorNotEqual     = "!="
	ComparatorGreater      = ">"
	ComparatorGreaterEqual = ">="
	ComparatorLess         = "<"
	ComparatorLessEqual    = "<="
	ComparatorExist        = "exist"
	ComparatorNotExist     = "!exist"
	ComparatorContain      = "contain"
	ComparatorNotContain   = "!contain"
)
View Source
const (
	DataKeyTypeString  = "String"
	DataKeyTypeBoolean = "Boolean"
	DataKeyTypeNumber  = "Number"
)
View Source
const (
	VariableTypesString = "String"
	VariableTypesNumber = "Number"
	VariableTypesJSON   = "JSON"
	VariableTypesBool   = "Boolean"
)

Variables

View Source
var ErrFailedToDecideVariation = errors.New("Failed to decide target variation")
View Source
var ErrInvalidVariableType = errors.New("Invalid variable type")
View Source
var ErrMissingFeature = errors.New("Config missing feature for variable")
View Source
var ErrMissingVariable = errors.New("Config missing variable")
View Source
var ErrMissingVariableForVariation = errors.New("Config missing variable for variation")
View Source
var ErrMissingVariation = errors.New("Config missing variation")
View Source
var ErrQueueFull = fmt.Errorf("Max queue size reached")
View Source
var ErrUserDoesNotQualifyForTargets = errors.New("User does not qualify for any targets for feature")
View Source
var ErrUserRollout = errors.New("User does not qualify for feature rollout")

Functions

func GenerateBucketedConfig

func GenerateBucketedConfig(sdkKey string, user api.PopulatedUser, clientCustomData map[string]interface{}) (*api.BucketedUserConfig, error)

func GetClientCustomData

func GetClientCustomData(sdkKey string) map[string]interface{}

func SetClientCustomData

func SetClientCustomData(sdkKey string, data map[string]interface{})

func SetConfig

func SetConfig(rawJSON []byte, sdkKey, etag string, eventQueue ...*EventQueue) error

func VariableForUser

func VariableForUser(sdkKey string, user api.PopulatedUser, variableKey string, expectedVariableType string, eventQueue *EventQueue, clientCustomData map[string]interface{}) (variableType string, variableValue any, err error)

Types

type AggregateEventQueue

type AggregateEventQueue map[string]VariableAggMap

func (*AggregateEventQueue) BuildBatchRecords

func (agg *AggregateEventQueue) BuildBatchRecords(platformData *api.PlatformData) api.UserEventsBatchRecord

type AllFilter

type AllFilter struct {
	PassFilter
}

type Audience

type Audience struct {
	NoIdAudience
	Id string `json:"_id"`
}

type AudienceMatchFilter

type AudienceMatchFilter struct {
	Audiences []string `json:"_audiences"`
	// contains filtered or unexported fields
}

func (*AudienceMatchFilter) Evaluate

func (filter *AudienceMatchFilter) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

func (AudienceMatchFilter) GetComparator

func (f AudienceMatchFilter) GetComparator() string

func (AudienceMatchFilter) GetSubType

func (f AudienceMatchFilter) GetSubType() string

func (AudienceMatchFilter) GetType

func (f AudienceMatchFilter) GetType() string

func (AudienceMatchFilter) Type

func (f AudienceMatchFilter) Type() string

type AudienceOperator

type AudienceOperator struct {
	Operator string       `json:"operator"`
	Filters  MixedFilters `json:"filters"`
}

func (AudienceOperator) Evaluate

func (operator AudienceOperator) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

func (AudienceOperator) GetFilters

func (o AudienceOperator) GetFilters() []FilterOrOperator

func (AudienceOperator) GetOperator

func (o AudienceOperator) GetOperator() string

type ConfigFeature

type ConfigFeature struct {
	Id            string                 `json:"_id"`
	Type          string                 `json:"type" validate:"regexp=^(release|experiment|permission|ops)$"`
	Key           string                 `json:"key"`
	Variations    []*Variation           `json:"variations"`
	Configuration FeatureConfiguration   `json:"configuration"`
	Settings      map[string]interface{} `json:"settings"`
}

type CustomDataFilter

type CustomDataFilter struct {
	*UserFilter
	DataKey     string `json:"dataKey"`
	DataKeyType string `json:"dataKeyType" validate:"regexp=^(String|Boolean|Number)$"`
}

func (*CustomDataFilter) Evaluate

func (filter *CustomDataFilter) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

func (CustomDataFilter) GetComparator

func (f CustomDataFilter) GetComparator() string

func (CustomDataFilter) GetSubType

func (f CustomDataFilter) GetSubType() string

func (CustomDataFilter) GetType

func (f CustomDataFilter) GetType() string

func (CustomDataFilter) SubType

func (f CustomDataFilter) SubType() string

func (CustomDataFilter) Type

func (f CustomDataFilter) Type() string

type EventQueue

type EventQueue struct {
	// contains filtered or unexported fields
}

func NewEventQueue

func NewEventQueue(sdkKey string, options *api.EventQueueOptions, platformData *api.PlatformData) (*EventQueue, error)

func (*EventQueue) Close

func (eq *EventQueue) Close() (err error)

func (*EventQueue) FlushEventQueue

func (eq *EventQueue) FlushEventQueue() (map[string]api.FlushPayload, error)

func (*EventQueue) HandleFlushResults

func (eq *EventQueue) HandleFlushResults(successPayloads []string, failurePayloads []string, failureWithRetryPayloads []string)

func (*EventQueue) MergeAggEventQueueKeys

func (eq *EventQueue) MergeAggEventQueueKeys(config *configBody)

func (*EventQueue) Metrics

func (eq *EventQueue) Metrics() (int32, int32, int32)

func (*EventQueue) QueueAggregateEvent

func (eq *EventQueue) QueueAggregateEvent(config api.BucketedUserConfig, event api.Event) error

QueueAggregateEvent queues an aggregate event to be sent to the server - but offloads aggregation of the event to a different goroutine.

func (*EventQueue) QueueEvent

func (eq *EventQueue) QueueEvent(user api.User, event api.Event) error

func (*EventQueue) QueueVariableEvaluatedEvent

func (eq *EventQueue) QueueVariableEvaluatedEvent(variableKey, featureId, variationId string, variableDefaulted bool) error

func (*EventQueue) UserQueueLength

func (eq *EventQueue) UserQueueLength() int

type FeatureAggMap

type FeatureAggMap map[string]VariationAggMap

type FeatureConfiguration

type FeatureConfiguration struct {
	Id               string                 `json:"_id"`
	Prerequisites    []FeaturePrerequisites `json:"prerequisites"`
	WinningVariation api.FeatureVariation   `json:"winningVariation"`
	ForcedUsers      map[string]string      `json:"forcedUsers"`
	Targets          []*Target              `json:"targets"`
}

type FeaturePrerequisites

type FeaturePrerequisites struct {
	Feature    string `json:"_feature"`
	Comparator string `json:"comparator" validate:"regexp=^(=|!=)$"`
}

type FilterOrOperator

type FilterOrOperator interface {
	Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool
}

A FilterOrOperator represents either an individual filter or a nested sequence of filters with a logical operator.

type InitializedFilter

type InitializedFilter interface {
	Initialize() error
}

For compiling values inside a filter after parsing, or other optimizations

type MixedFilters

type MixedFilters []FilterOrOperator

MixedFilters is used to parse a list of generic filters from JSON that can be one of several types, and transform them into specific implementations (e.g. UserFilter).

func (*MixedFilters) UnmarshalJSON

func (m *MixedFilters) UnmarshalJSON(data []byte) error

type NativeBucketingConfiguration

type NativeBucketingConfiguration struct {
	FlushEventsInterval          time.Duration `json:"flushEventsMS"`
	DisableAutomaticEventLogging bool          `json:"disableAutomaticEventLogging"`
	DisableCustomEventLogging    bool          `json:"disableCustomEventLogging"`
}

type NoIdAudience

type NoIdAudience struct {
	Filters *AudienceOperator `json:"filters"`
}

type NoPassFilter

type NoPassFilter struct{}

func (NoPassFilter) Evaluate

func (filter NoPassFilter) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

type OptInFilter

type OptInFilter struct {
	NoPassFilter
}

OptInFilter never passes, because it's only supported by Cloud Bucketing.

type OptionsType

type OptionsType struct {
	Lexicographical bool
	ZeroExtend      bool
}

type PassFilter

type PassFilter struct{}

func (PassFilter) Evaluate

func (filter PassFilter) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

type Rollout

type Rollout struct {
	Type            string         `json:"type" validate:"regexp=^(schedule|gradual|stepped)$"`
	StartPercentage float64        `json:"startPercentage"`
	StartDate       time.Time      `json:"startDate"`
	Stages          []RolloutStage `json:"stages"`
}

type RolloutStage

type RolloutStage struct {
	Type       string    `json:"type"`
	Date       time.Time `json:"date"`
	Percentage float64   `json:"percentage" validate:"regexp=^(linear|discrete)$"`
}

type Target

type Target struct {
	Id           string               `json:"_id"`
	Audience     *Audience            `json:"_audience"`
	Rollout      *Rollout             `json:"rollout"`
	Distribution []TargetDistribution `json:"distribution"`
}

func (*Target) DecideTargetVariation

func (t *Target) DecideTargetVariation(boundedHash float64) (string, error)

type TargetDistribution

type TargetDistribution struct {
	Variation  string  `json:"_variation"`
	Percentage float64 `json:"percentage"`
}

type UserEventQueue

type UserEventQueue map[string]api.UserEventsBatchRecord

func (*UserEventQueue) BuildBatchRecords

func (u *UserEventQueue) BuildBatchRecords() []api.UserEventsBatchRecord

type UserFilter

type UserFilter struct {
	Values []interface{} `json:"values"`

	CompiledStringVals []string
	CompiledBoolVals   []bool
	CompiledNumVals    []float64
	// contains filtered or unexported fields
}

func (*UserFilter) Evaluate

func (filter *UserFilter) Evaluate(audiences map[string]NoIdAudience, user api.PopulatedUser, clientCustomData map[string]interface{}) bool

func (UserFilter) GetComparator

func (f UserFilter) GetComparator() string

func (UserFilter) GetSubType

func (f UserFilter) GetSubType() string

func (UserFilter) GetType

func (f UserFilter) GetType() string

func (*UserFilter) Initialize

func (f *UserFilter) Initialize() error

func (UserFilter) Type

func (f UserFilter) Type() string

type Variable

type Variable struct {
	Id   string `json:"_id" validate:"required"`
	Type string `json:"type" validate:"oneof=String Boolean Number JSON"`
	Key  string `json:"key" validate:"required"`
}

type VariableAggMap

type VariableAggMap map[string]FeatureAggMap

type Variation

type Variation struct {
	Id        string              `json:"_id"`
	Name      string              `json:"name"`
	Key       string              `json:"key"`
	Variables []VariationVariable `json:"variables"`
}

func (*Variation) GetVariableById

func (v *Variation) GetVariableById(id string) *VariationVariable

type VariationAggMap

type VariationAggMap map[string]int64

type VariationVariable

type VariationVariable struct {
	Var   string      `json:"_var"`
	Value interface{} `json:"value"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL