From a6418a60698a8014b8502e15d46dfff608aad0bb Mon Sep 17 00:00:00 2001 From: Christopher LaPointe Date: Thu, 15 Sep 2022 21:34:13 -0400 Subject: [PATCH] Optimize bucketing --- docs/usage/expressions.md | 2 +- pkg/expressions/stdlib/funcsCommon.go | 11 ++++++----- pkg/expressions/stdlib/funcsTime.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/usage/expressions.md b/docs/usage/expressions.md index 52006cd..9a00b0f 100644 --- a/docs/usage/expressions.md +++ b/docs/usage/expressions.md @@ -88,7 +88,7 @@ Evaluates arguments in-order, chosing the first non-empty result. ### Bucket -Syntax: `{bucket intVal bucketSize}` +Syntax: `{bucket intVal "bucketSize"}` Given a value, create equal-sized buckets and place each value in those buckets diff --git a/pkg/expressions/stdlib/funcsCommon.go b/pkg/expressions/stdlib/funcsCommon.go index 5082a6a..d8516e3 100644 --- a/pkg/expressions/stdlib/funcsCommon.go +++ b/pkg/expressions/stdlib/funcsCommon.go @@ -23,17 +23,18 @@ func kfBucket(args []KeyBuilderStage) KeyBuilderStage { if len(args) != 2 { return stageLiteral(ErrorArgCount) } + + bucketSize, err := strconv.Atoi(EvalStageOrDefault(args[1], "")) + if err != nil { + return stageLiteral(ErrorType) + } + return KeyBuilderStage(func(context KeyBuilderContext) string { val, err := strconv.Atoi(args[0](context)) if err != nil { return ErrorType } - bucketSize, err := strconv.Atoi(args[1](context)) - if err != nil { - return ErrorType - } - return strconv.Itoa((val / bucketSize) * bucketSize) }) } diff --git a/pkg/expressions/stdlib/funcsTime.go b/pkg/expressions/stdlib/funcsTime.go index 1115bb4..ad15ad9 100644 --- a/pkg/expressions/stdlib/funcsTime.go +++ b/pkg/expressions/stdlib/funcsTime.go @@ -260,7 +260,7 @@ func kfTimeAttr(args []KeyBuilderStage) KeyBuilderStage { attrName, hasAttrName := EvalStaticStage(args[1]) if !hasAttrName { - return stageLiteral(ErrorType) + return stageLiteral(ErrorConst) } tz, tzOk := parseTimezoneLocation(EvalStageIndexOrDefault(args, 2, "")) if !tzOk {