From bca40cf0c9c7b75e6d5b4a9ac8b927eb17590c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 21 Apr 2021 09:08:42 +0200 Subject: [PATCH] Fix Params case handling in where with slices of structs (e.g. Pages) Fixes #7009 --- tpl/collections/where.go | 11 ++++++++++- tpl/collections/where_test.go | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/tpl/collections/where.go b/tpl/collections/where.go index cada675f3d1..c371f6ae86a 100644 --- a/tpl/collections/where.go +++ b/tpl/collections/where.go @@ -382,12 +382,21 @@ func (ns *Namespace) checkWhereArray(seqv, kv, mv reflect.Value, path []string, vvv = reflect.ValueOf(params.Get(path...)) } else { vvv = rvv - for _, elemName := range path { + for i, elemName := range path { var err error vvv, err = evaluateSubElem(vvv, elemName) + if err != nil { continue } + + if i < len(path)-1 && vvv.IsValid() { + if params, ok := vvv.Interface().(maps.Params); ok { + // The current path element is the map itself, .Params. + vvv = reflect.ValueOf(params.Get(path[i+1:]...)) + break + } + } } } } else { diff --git a/tpl/collections/where_test.go b/tpl/collections/where_test.go index 75ee109f9df..47b61bdcafe 100644 --- a/tpl/collections/where_test.go +++ b/tpl/collections/where_test.go @@ -164,6 +164,24 @@ func TestWhere(t *testing.T) { {1: "a", 2: "m"}, }, }, + // Case insensitive maps.Params + // Slice of structs + { + seq: []TstParams{{params: maps.Params{"i": 0, "color": "indigo"}}, {params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 2, "color": "green"}}, {params: maps.Params{"i": 3, "color": "blue"}}}, + key: ".Params.COLOR", match: "blue", + expect: []TstParams{{params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 3, "color": "blue"}}}, + }, + { + seq: []TstParams{{params: maps.Params{"nested": map[string]interface{}{"color": "indigo"}}}, {params: maps.Params{"nested": map[string]interface{}{"color": "blue"}}}}, + key: ".Params.NEsTED.COLOR", match: "blue", + expect: []TstParams{{params: maps.Params{"nested": map[string]interface{}{"color": "blue"}}}}, + }, + { + seq: []TstParams{{params: maps.Params{"i": 0, "color": "indigo"}}, {params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 2, "color": "green"}}, {params: maps.Params{"i": 3, "color": "blue"}}}, + key: ".Params", match: "blue", + expect: []TstParams{}, + }, + // Slice of maps { seq: []maps.Params{ {"a": "a1", "b": "b1"}, {"a": "a2", "b": "b2"},