diff --git a/compliance b/compliance index ffa8a5a..304b287 160000 --- a/compliance +++ b/compliance @@ -1 +1 @@ -Subproject commit ffa8a5ac6eb73c4297ff7d997ac5786ee4309d59 +Subproject commit 304b287a9537673227c2e300a34ff8e4757579c5 diff --git a/pkg/interpreter/interpreter.go b/pkg/interpreter/interpreter.go index 7d5dc95..f8d7277 100644 --- a/pkg/interpreter/interpreter.go +++ b/pkg/interpreter/interpreter.go @@ -371,7 +371,13 @@ func (intr *treeInterpreter) Execute(node parsing.ASTNode, value interface{}) (i } stringType, ok := left.(string) if allowString && ok { - return stringType, nil + // a projection is really a sub-expression in disguise + // we must evaluate the right hand expression + result, err := intr.Execute(node.Children[1], stringType) + if err != nil { + return nil, err + } + return result, nil } return nil, nil } diff --git a/pkg/interpreter/interpreter_test.go b/pkg/interpreter/interpreter_test.go index 7d664cb..b31db14 100644 --- a/pkg/interpreter/interpreter_test.go +++ b/pkg/interpreter/interpreter_test.go @@ -195,6 +195,15 @@ func TestCanSupportSliceOfStructsWithFunctions(t *testing.T) { assert.Equal(result.(float64), 2.0) } +func TestCanSupportEvaluatingRightHandSideOfStringSlice(t *testing.T) { + assert := assert.New(t) + data := make(map[string]interface{}) + result, err := search(t, "'foo'[:].length(@)", data) + assert.Nil(err) + assert.Equal(result.(float64), 3.0) + +} + func BenchmarkInterpretSingleFieldStruct(b *testing.B) { assert := assert.New(b) caller := NewFunctionCaller(functions.GetDefaultFunctions()...)