diff --git a/pkg/yqlib/operator_select.go b/pkg/yqlib/operator_select.go index 8d033b1e..269441b3 100644 --- a/pkg/yqlib/operator_select.go +++ b/pkg/yqlib/operator_select.go @@ -17,22 +17,25 @@ func selectOperator(d *dataTreeNavigator, context Context, expressionNode *Expre return Context{}, err } - // grab the first value - first := rhs.MatchingNodes.Front() + // find any truthy node + var errDecoding error + includeResult := false - if first != nil { - result := first.Value.(*CandidateNode) - log.Debugf("result %v", NodeToString(result)) - includeResult, errDecoding := isTruthy(result) + for resultEl := rhs.MatchingNodes.Front(); resultEl != nil; resultEl = resultEl.Next() { + result := resultEl.Value.(*CandidateNode) + includeResult, errDecoding = isTruthy(result) log.Debugf("isTruthy %v", includeResult) if errDecoding != nil { return Context{}, errDecoding } - if includeResult { - results.PushBack(candidate) + break } } + + if includeResult { + results.PushBack(candidate) + } } return context.ChildContext(results), nil } diff --git a/pkg/yqlib/operator_select_test.go b/pkg/yqlib/operator_select_test.go index 4d24e55e..b046c748 100644 --- a/pkg/yqlib/operator_select_test.go +++ b/pkg/yqlib/operator_select_test.go @@ -5,6 +5,28 @@ import ( ) var selectOperatorScenarios = []expressionScenario{ + { + skipDoc: true, + document: `cat`, + expression: `select(false, true)`, + expected: []string{ + "D0, P[], (doc)::cat\n", + }, + }, + { + skipDoc: true, + document: `cat`, + expression: `select(true, false)`, + expected: []string{ + "D0, P[], (doc)::cat\n", + }, + }, + { + skipDoc: true, + document: `cat`, + expression: `select(false)`, + expected: []string{}, + }, { description: "Select elements from array", document: `[cat,goat,dog]`,