Skip to content

Commit 473bf70

Browse files
Compute queryformat during convert of dto
Signed-off-by: Thomas Poignant <[email protected]>
1 parent 0c3da5e commit 473bf70

File tree

8 files changed

+61
-26
lines changed

8 files changed

+61
-26
lines changed

internal/cache/cache_manager_test.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ trackEvents = false
105105
"test-flag": {
106106
Rules: &[]flag.Rule{
107107
{
108-
Query: testconvert.String("key eq \"random-key\""),
108+
Query: testconvert.String("key eq \"random-key\""),
109+
QueryFormat: "nikunjy",
109110
Percentages: &map[string]float64{
110111
"false_var": 0,
111112
"true_var": 100,
@@ -152,7 +153,8 @@ test-flag:
152153
"test-flag": {
153154
Rules: &[]flag.Rule{
154155
{
155-
Query: testconvert.String("key eq \"random-key\""),
156+
Query: testconvert.String("key eq \"random-key\""),
157+
QueryFormat: flag.NikunjyQueryFormat,
156158
Percentages: &map[string]float64{
157159
"false_var": 0,
158160
"true_var": 100,
@@ -206,7 +208,8 @@ test-flag:
206208
"test-flag": {
207209
Rules: &[]flag.Rule{
208210
{
209-
Query: testconvert.String("key eq \"random-key\""),
211+
Query: testconvert.String("key eq \"random-key\""),
212+
QueryFormat: flag.NikunjyQueryFormat,
210213
Percentages: &map[string]float64{
211214
"false_var": 0,
212215
"true_var": 100,
@@ -310,7 +313,8 @@ test-flag:
310313
},
311314
Rules: &[]flag.Rule{
312315
{
313-
Query: testconvert.String("key eq \"random-key\""),
316+
Query: testconvert.String("key eq \"random-key\""),
317+
QueryFormat: flag.NikunjyQueryFormat,
314318
Percentages: &map[string]float64{
315319
"false_var": 0,
316320
"true_var": 100,
@@ -365,7 +369,8 @@ test-flag2:
365369
},
366370
Rules: &[]flag.Rule{
367371
{
368-
Query: testconvert.String("key eq \"random-key\""),
372+
Query: testconvert.String("key eq \"random-key\""),
373+
QueryFormat: flag.NikunjyQueryFormat,
369374
Percentages: &map[string]float64{
370375
"false_var": 0,
371376
"true_var": 100,
@@ -384,7 +389,8 @@ test-flag2:
384389
},
385390
Rules: &[]flag.Rule{
386391
{
387-
Query: testconvert.String("key eq \"random-key\""),
392+
Query: testconvert.String("key eq \"random-key\""),
393+
QueryFormat: flag.NikunjyQueryFormat,
388394
Percentages: &map[string]float64{
389395
"false_var": 100,
390396
"true_var": 0,

internal/flag/rule.go

+6-10
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ import (
1616
"github.com/thomaspoignant/go-feature-flag/internal/utils"
1717
)
1818

19-
type QueryFormat = string
20-
21-
const (
22-
NikunjyQueryFormat QueryFormat = "nikunjy"
23-
JSONLogicQueryFormat QueryFormat = "jsonlogic"
24-
)
25-
2619
// Rule represents a rule applied by the flag.
2720
type Rule struct {
2821
// Name is the name of the rule, this field is mandatory if you want
@@ -48,6 +41,8 @@ type Rule struct {
4841

4942
// Disable indicates that this rule is disabled.
5043
Disable *bool `json:"disable,omitempty" yaml:"disable,omitempty" toml:"disable,omitempty" jsonschema:"title=disable,description=Indicates that this rule is disabled."` // nolint: lll
44+
45+
QueryFormat QueryFormat `json:"-" yaml:"-" toml:"-"` // nolint: lll
5146
}
5247

5348
// Evaluate is checking if the rule applies to for the user.
@@ -361,10 +356,11 @@ func (r *Rule) GetTrimmedQuery() string {
361356

362357
// GetQueryFormat is returning the format used for the query
363358
func (r *Rule) GetQueryFormat() QueryFormat {
364-
if utils.IsJSONObject(r.GetTrimmedQuery()) {
365-
return JSONLogicQueryFormat
359+
if r.QueryFormat != "" {
360+
return r.QueryFormat
366361
}
367-
return NikunjyQueryFormat
362+
r.QueryFormat = GetQueryFormat(*r)
363+
return r.QueryFormat
368364
}
369365

370366
func (r *Rule) GetQuery() string {

internal/flag/rule_queryformat.go

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package flag
2+
3+
import "github.com/thomaspoignant/go-feature-flag/internal/utils"
4+
5+
type QueryFormat = string
6+
7+
const (
8+
NikunjyQueryFormat QueryFormat = "nikunjy"
9+
JSONLogicQueryFormat QueryFormat = "jsonlogic"
10+
)
11+
12+
func GetQueryFormat(rule Rule) QueryFormat {
13+
if utils.IsJSONObject(rule.GetTrimmedQuery()) {
14+
return JSONLogicQueryFormat
15+
}
16+
return NikunjyQueryFormat
17+
}

model/dto/converter.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,21 @@ func ConvertDtoToInternalFlag(dto DTO) flag.InternalFlag {
1414
}
1515
}
1616

17+
// We add the information of the type of query format we have
18+
var rules *[]flag.Rule
19+
if dto.Rules != nil {
20+
rulesTmp := make([]flag.Rule, len(*dto.Rules))
21+
for i, r := range *dto.Rules {
22+
r.QueryFormat = flag.GetQueryFormat(r)
23+
rulesTmp[i] = r
24+
}
25+
rules = &rulesTmp
26+
}
27+
1728
return flag.InternalFlag{
1829
BucketingKey: dto.BucketingKey,
1930
Variations: dto.Variations,
20-
Rules: dto.Rules,
31+
Rules: rules,
2132
DefaultRule: dto.DefaultRule,
2233
TrackEvents: dto.TrackEvents,
2334
Disable: dto.Disable,

model/dto/converter_test.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,17 @@ func TestConvertV1DtoToInternalFlag(t *testing.T) {
7878
"var1": testconvert.Interface("var1"),
7979
"var2": testconvert.Interface("var2"),
8080
},
81-
Rules: &[]flag.Rule{{
82-
Name: testconvert.String("rule1"),
83-
Query: testconvert.String("key eq \"key\""),
84-
Percentages: &map[string]float64{"var_true": 100, "var_false": 0}},
81+
Rules: &[]flag.Rule{
8582
{
86-
Name: testconvert.String("rule2"),
87-
Query: testconvert.String("key eq \"key2\""),
83+
Name: testconvert.String("rule1"),
84+
Query: testconvert.String("key eq \"key\""),
85+
QueryFormat: flag.NikunjyQueryFormat,
86+
Percentages: &map[string]float64{"var_true": 100, "var_false": 0},
87+
},
88+
{
89+
Name: testconvert.String("rule2"),
90+
Query: testconvert.String("key eq \"key2\""),
91+
QueryFormat: flag.NikunjyQueryFormat,
8892
ProgressiveRollout: &flag.ProgressiveRollout{
8993
Initial: &flag.ProgressiveRolloutStep{
9094
Variation: testconvert.String("var1"),
@@ -101,6 +105,7 @@ func TestConvertV1DtoToInternalFlag(t *testing.T) {
101105
{
102106
Name: testconvert.String("rule3"),
103107
Query: testconvert.String("key eq \"key3\""),
108+
QueryFormat: flag.NikunjyQueryFormat,
104109
VariationResult: testconvert.String("var2"),
105110
},
106111
},

notifier/discordnotifier/testdata/should_call_webhook_and_have_valid_results.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
},
2828
{
2929
"name": "Rules",
30-
"value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}",
30+
"value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil), QueryFormat:\"\"}}",
3131
"inline": false
3232
},
3333
{

notifier/microsoftteamsnotifier/testdata/should_call_webhook_and_have_valid_results.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
},
1919
{
2020
"type": "TextBlock",
21-
"text": "Changes detected in your feature flag file on: **{{hostname}}**\n * ❌ Flag **test-flag** deleted\n * 🆕 Flag **test-flag3** created\n * ✏️ Flag **test-flag2** updated\n * DefaultRule.Percentages: (*map[string]float64){\"False\":0, \"True\":100} =\u003e nil\n * DefaultRule.VariationResult: nil =\u003e (*string)(\"Default\")\n * Disable: nil =\u003e (*bool)(true)\n * Experimentation: (*flag.ExperimentationRollout){Start:(*time.Time){wall:0, ext:63230976200, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}, End:(*time.Time){wall:0, ext:63230967800, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}} =\u003e nil\n * Rules: nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}\n * TrackEvents: nil =\u003e (*bool)(false)\n * Variations.Default: false =\u003e true\n * Version: nil =\u003e (*string)(\"1.1\")",
21+
"text": "Changes detected in your feature flag file on: **MacBook-Pro-de-Thomas.local**\n * ❌ Flag **test-flag** deleted\n * 🆕 Flag **test-flag3** created\n * ✏️ Flag **test-flag2** updated\n * DefaultRule.Percentages: (*map[string]float64){\"False\":0, \"True\":100} =\u003e nil\n * DefaultRule.VariationResult: nil =\u003e (*string)(\"Default\")\n * Disable: nil =\u003e (*bool)(true)\n * Experimentation: (*flag.ExperimentationRollout){Start:(*time.Time){wall:0, ext:63230976200, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}, End:(*time.Time){wall:0, ext:63230967800, loc:(*time.Location){name:\"\", zone:[]time.zone(nil), tx:[]time.zoneTrans(nil), extend:\"\", cacheStart:0, cacheEnd:0, cacheZone:(*time.zone)(nil)}}} =\u003e nil\n * Rules: nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil), QueryFormat:\"\"}}\n * TrackEvents: nil =\u003e (*bool)(false)\n * Variations.Default: false =\u003e true\n * Version: nil =\u003e (*string)(\"1.1\")",
2222
"wrap": true
2323
}
2424
],

notifier/slacknotifier/testdata/should_call_webhook_and_have_valid_results.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
},
3636
{
3737
"title": "Rules",
38-
"value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil)}}",
38+
"value": "nil =\u003e (*[]flag.Rule){flag.Rule{Name:(*string)(\"rule1\"), Query:(*string)(\"key eq \\\"not-a-ke\\\"\"), VariationResult:(*string)(nil), Percentages:(*map[string]float64){\"False\":20, \"True\":80}, ProgressiveRollout:(*flag.ProgressiveRollout)(nil), Disable:(*bool)(nil), QueryFormat:\"\"}}",
3939
"short": false
4040
},
4141
{

0 commit comments

Comments
 (0)