From 41c08891d32c070fb7ad33eae4fec6a99f555fce Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Wed, 28 Oct 2020 11:34:01 +1100 Subject: [PATCH] create object fixes --- pkg/yqlib/treeops/candidate_node.go | 10 ++++++---- pkg/yqlib/treeops/operator_collect_object.go | 4 +++- ..._object_test.go => operator_collect_object_test.go} | 9 +++++++++ pkg/yqlib/treeops/operator_create_map_test.go | 8 ++++++++ pkg/yqlib/treeops/operator_multilpy.go | 2 ++ pkg/yqlib/treeops/operator_multiply_test.go | 2 +- pkg/yqlib/treeops/operator_traverse_path.go | 4 ++-- 7 files changed, 31 insertions(+), 8 deletions(-) rename pkg/yqlib/treeops/{operation_collection_object_test.go => operator_collect_object_test.go} (83%) diff --git a/pkg/yqlib/treeops/candidate_node.go b/pkg/yqlib/treeops/candidate_node.go index f1ed656..39336b8 100644 --- a/pkg/yqlib/treeops/candidate_node.go +++ b/pkg/yqlib/treeops/candidate_node.go @@ -42,10 +42,12 @@ func (n *CandidateNode) UpdateAttributesFrom(other *CandidateNode) { } n.Node.Kind = other.Node.Kind n.Node.Tag = other.Node.Tag - // not sure if this ever should happen here... - // if other.Node.Style != 0 { - // n.Node.Style = other.Node.Style - // } + + // merge will pickup the style of the new thing + // when autocreating nodes + if n.Node.Style == 0 { + n.Node.Style = other.Node.Style + } n.Node.FootComment = other.Node.FootComment n.Node.HeadComment = other.Node.HeadComment n.Node.LineComment = other.Node.LineComment diff --git a/pkg/yqlib/treeops/operator_collect_object.go b/pkg/yqlib/treeops/operator_collect_object.go index 4cfee96..e46971c 100644 --- a/pkg/yqlib/treeops/operator_collect_object.go +++ b/pkg/yqlib/treeops/operator_collect_object.go @@ -44,8 +44,10 @@ func collect(d *dataTreeNavigator, aggregate *list.List, remainingMatches *list. splatCandidate := splatEl.Value.(*CandidateNode) newCandidate := aggCandidate.Copy() newCandidate.Path = nil + splatCandidateClone := splatCandidate.Copy() + splatCandidateClone.Path = nil - newCandidate, err := multiply(d, newCandidate, splatCandidate) + newCandidate, err := multiply(d, newCandidate, splatCandidateClone) if err != nil { return nil, err } diff --git a/pkg/yqlib/treeops/operation_collection_object_test.go b/pkg/yqlib/treeops/operator_collect_object_test.go similarity index 83% rename from pkg/yqlib/treeops/operation_collection_object_test.go rename to pkg/yqlib/treeops/operator_collect_object_test.go index 62333ee..bd90ac1 100644 --- a/pkg/yqlib/treeops/operation_collection_object_test.go +++ b/pkg/yqlib/treeops/operator_collect_object_test.go @@ -30,6 +30,15 @@ var collectObjectOperatorScenarios = []expressionScenario{ "D0, P[], (!!map)::Mike: dog\nf: burger\n", }, }, + { + document: `{name: Mike, pets: {cows: [apl, bba]}}`, + expression: `{"a":.name, "b":.pets}`, + expected: []string{ + `D0, P[], (!!map)::a: Mike +b: {cows: [apl, bba]} +`, + }, + }, } func TestCollectObjectOperatorScenarios(t *testing.T) { diff --git a/pkg/yqlib/treeops/operator_create_map_test.go b/pkg/yqlib/treeops/operator_create_map_test.go index af0bd22..65839b5 100644 --- a/pkg/yqlib/treeops/operator_create_map_test.go +++ b/pkg/yqlib/treeops/operator_create_map_test.go @@ -27,6 +27,14 @@ var createMapOperatorScenarios = []expressionScenario{ "D0, P[], (!!seq)::- f: hotdog\n- f: burger\n", }, }, + { + document: `{name: Mike, pets: {cows: [apl, bba]}}`, + expression: `"a":.name, "b":.pets`, + expected: []string{ + "D0, P[], (!!seq)::- a: Mike\n", + "D0, P[], (!!seq)::- b: {cows: [apl, bba]}\n", + }, + }, } func TestCreateMapOperatorScenarios(t *testing.T) { diff --git a/pkg/yqlib/treeops/operator_multilpy.go b/pkg/yqlib/treeops/operator_multilpy.go index 1853700..6224e7c 100644 --- a/pkg/yqlib/treeops/operator_multilpy.go +++ b/pkg/yqlib/treeops/operator_multilpy.go @@ -48,6 +48,8 @@ func MultiplyOperator(d *dataTreeNavigator, matchingNodes *list.List, pathNode * func multiply(d *dataTreeNavigator, lhs *CandidateNode, rhs *CandidateNode) (*CandidateNode, error) { lhs.Node = UnwrapDoc(lhs.Node) rhs.Node = UnwrapDoc(rhs.Node) + log.Debugf("Multipling LHS: %v", NodeToString(lhs)) + log.Debugf("- RHS: %v", NodeToString(rhs)) if lhs.Node.Kind == yaml.MappingNode && rhs.Node.Kind == yaml.MappingNode || (lhs.Node.Kind == yaml.SequenceNode && rhs.Node.Kind == yaml.SequenceNode) { diff --git a/pkg/yqlib/treeops/operator_multiply_test.go b/pkg/yqlib/treeops/operator_multiply_test.go index 319a35c..b2cc2b4 100644 --- a/pkg/yqlib/treeops/operator_multiply_test.go +++ b/pkg/yqlib/treeops/operator_multiply_test.go @@ -61,7 +61,7 @@ b: `, expression: `. * {"a":.b}`, expected: []string{ - `D0, P[], (!!map)::a: {things: great, also: me} + `D0, P[], (!!map)::a: {things: great, also: "me"} b: also: "me" `, diff --git a/pkg/yqlib/treeops/operator_traverse_path.go b/pkg/yqlib/treeops/operator_traverse_path.go index 2dba41d..583fab4 100644 --- a/pkg/yqlib/treeops/operator_traverse_path.go +++ b/pkg/yqlib/treeops/operator_traverse_path.go @@ -37,7 +37,7 @@ func traverse(d *dataTreeNavigator, matchingNode *CandidateNode, pathNode *Opera log.Debug("Traversing %v", NodeToString(matchingNode)) value := matchingNode.Node - if value.Tag == "!!null" { + if value.Tag == "!!null" && pathNode.Value != "[]" { log.Debugf("Guessing kind") // we must ahve added this automatically, lets guess what it should be now switch pathNode.Value.(type) { @@ -45,7 +45,7 @@ func traverse(d *dataTreeNavigator, matchingNode *CandidateNode, pathNode *Opera log.Debugf("probably an array") value.Kind = yaml.SequenceNode default: - log.Debugf("probabel a map") + log.Debugf("probably a map") value.Kind = yaml.MappingNode } value.Tag = ""