diff --git a/pkg/yqlib/operator_add.go b/pkg/yqlib/operator_add.go index 37be8f81..2d7fa8de 100644 --- a/pkg/yqlib/operator_add.go +++ b/pkg/yqlib/operator_add.go @@ -38,9 +38,9 @@ func toNodes(candidate *CandidateNode, lhs *CandidateNode) []*CandidateNode { func addOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) { log.Debugf("Add operator") - // if we don't have any matching nodes, but we were piped into (have a parent exp?) then we - // shouldn't calcWhenEmpt - calcWhenEmpty := expressionNode.Parent == nil + // only calculate when empty IF we are the root expression; OR + // calcWhenEmpty := expressionNode.Parent == nil || expressionNode.Parent.LHS == expressionNode + calcWhenEmpty := context.MatchingNodes.Len() > 0 return crossFunction(d, context.ReadOnlyClone(), expressionNode, add, calcWhenEmpty) } diff --git a/pkg/yqlib/operator_add_test.go b/pkg/yqlib/operator_add_test.go index 92ed3d96..9d4d6e7b 100644 --- a/pkg/yqlib/operator_add_test.go +++ b/pkg/yqlib/operator_add_test.go @@ -50,6 +50,62 @@ var addOperatorScenarios = []expressionScenario{ expression: `select(.) | "cat" + .`, expected: []string{}, }, + { + skipDoc: true, + document: `[]`, + expression: `.[] | (.a + "|" + .b)`, + expected: []string{}, + }, + { + skipDoc: true, + document: `[]`, + expression: `.[] | (.a + "|")`, + expected: []string{}, + }, + { + skipDoc: true, + document: `[]`, + expression: `.[] | ("|" + .a)`, + expected: []string{}, + }, + { + skipDoc: true, + document: `resources: [foo, bar, baz]`, + expression: `.missing + .resources | .[]`, + expected: []string{ + "D0, P[resources 0], (!!str)::foo\n", + "D0, P[resources 1], (!!str)::bar\n", + "D0, P[resources 2], (!!str)::baz\n", + }, + }, + { + skipDoc: true, + document: `resources: [foo, bar, baz]`, + expression: `. | .missing + .resources | .[]`, + expected: []string{ + "D0, P[resources 0], (!!str)::foo\n", + "D0, P[resources 1], (!!str)::bar\n", + "D0, P[resources 2], (!!str)::baz\n", + }, + }, + { + skipDoc: true, + document: `resources: [foo, bar, baz]`, + expression: `. | .missing + .resources`, + expected: []string{ + "D0, P[resources], (!!seq)::[foo, bar, baz]\n", + }, + }, + { + skipDoc: true, + document: `resources: [foo, bar, baz]`, + expression: `. | .missing + .resources | .[]`, + expected: []string{ + "D0, P[resources 0], (!!str)::foo\n", + "D0, P[resources 1], (!!str)::bar\n", + "D0, P[resources 2], (!!str)::baz\n", + }, + }, { skipDoc: true, document: `[{a: foo, b: bar}, {a: 1, b: 2}]`, diff --git a/scripts/compare-jq.sh b/scripts/compare-jq.sh new file mode 100755 index 00000000..1412db73 --- /dev/null +++ b/scripts/compare-jq.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -e + +exp=$1 +file=$2 + +if [ "$2" == "" ]; then + echo "yq" + ./yq -oj -n "$1" + echo "jq" + jq -n "$1" + +else + + echo "yq" + ./yq -oj "$1" $2 + echo "jq" + ./yq $2 -oj | jq "$1" +fi \ No newline at end of file diff --git a/scripts/compare-versions-output.sh b/scripts/compare-versions-output.sh new file mode 100644 index 00000000..081663b1 --- /dev/null +++ b/scripts/compare-versions-output.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +test_data=' +- foo: false +' + +for version in 4.45.1 4.45.2 4.45.3; do + for command in '.[] | (select(.foo) | {"foo": .foo} // {})' '.[] | (select(.foo) | {.foo} // {})'; do + echo ${version} "${command}" + echo ------- + echo "${test_data}" | podman run -i --rm mikefarah/yq:${version} -o json "${command}" + echo ------- + echo + done +done \ No newline at end of file