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"},