mirror of
https://github.com/mikefarah/yq.git
synced 2026-07-06 21:55:37 +00:00
fix: correct key order after add, flatten, keys, sort, reverse and shuffle
Signed-off-by: Antoine Deschênes <antoine.deschenes@linux.com>
This commit is contained in:
parent
b84fd47934
commit
b15ce77cad
@ -239,14 +239,13 @@ func (n *CandidateNode) AddKeyValueChild(rawKey *CandidateNode, rawValue *Candid
|
|||||||
func (n *CandidateNode) AddChild(rawChild *CandidateNode) {
|
func (n *CandidateNode) AddChild(rawChild *CandidateNode) {
|
||||||
value := rawChild.Copy()
|
value := rawChild.Copy()
|
||||||
value.SetParent(n)
|
value.SetParent(n)
|
||||||
if value.Key != nil {
|
value.IsMapKey = false
|
||||||
value.Key.SetParent(n)
|
|
||||||
} else {
|
index := len(n.Content)
|
||||||
index := len(n.Content)
|
keyNode := createScalarNode(index, fmt.Sprintf("%v", index))
|
||||||
keyNode := createScalarNode(index, fmt.Sprintf("%v", index))
|
keyNode.SetParent(n)
|
||||||
keyNode.SetParent(n)
|
value.Key = keyNode
|
||||||
value.Key = keyNode
|
|
||||||
}
|
|
||||||
n.Content = append(n.Content, value)
|
n.Content = append(n.Content, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -119,6 +119,60 @@ var deleteOperatorScenarios = []expressionScenario{
|
|||||||
"D0, P[], (!!map)::a: []\n",
|
"D0, P[], (!!map)::a: []\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry appended to an array",
|
||||||
|
document: `[1,2]`,
|
||||||
|
expression: `. += [3] | del(.[2])`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::[1, 2]\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry after sorting an array",
|
||||||
|
document: `[3,2,1]`,
|
||||||
|
expression: `sort | del(.[2])`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::[1, 2]\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry after reversing an array",
|
||||||
|
document: `[1,2,3]`,
|
||||||
|
expression: `reverse | del(.[2])`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::[3, 2]\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry after shuffling an array",
|
||||||
|
document: `[1,2,3]`,
|
||||||
|
expression: `shuffle | del(.[2])`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::[3, 1]\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry from keys array",
|
||||||
|
document: `{"a": 1, "b": 2, "c": 3}`,
|
||||||
|
expression: `keys | del(.[] | select(.=="b"))`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::- \"a\"\n- \"c\"\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skipDoc: true,
|
||||||
|
description: "Delete entry after flattening an array",
|
||||||
|
document: `[1,[2],[[3]]]`,
|
||||||
|
expression: `flatten | del(.[2])`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[], (!!seq)::[1, 2]\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
document: `a: [10,x,10, 10, x, 10]`,
|
document: `a: [10,x,10, 10, x, 10]`,
|
||||||
|
|||||||
@ -21,8 +21,8 @@ var flattenOperatorScenarios = []expressionScenario{
|
|||||||
expression: `flatten[]`,
|
expression: `flatten[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[0], (!!int)::1\n",
|
"D0, P[0], (!!int)::1\n",
|
||||||
"D0, P[0], (!!int)::2\n",
|
"D0, P[1], (!!int)::2\n",
|
||||||
"D0, P[0], (!!int)::3\n",
|
"D0, P[2], (!!int)::3\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -40,8 +40,8 @@ var flattenOperatorScenarios = []expressionScenario{
|
|||||||
expression: `flatten(1)[]`,
|
expression: `flatten(1)[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[0], (!!int)::1\n",
|
"D0, P[0], (!!int)::1\n",
|
||||||
"D0, P[0], (!!int)::2\n",
|
"D0, P[1], (!!int)::2\n",
|
||||||
"D0, P[0], (!!seq)::[3]\n",
|
"D0, P[2], (!!seq)::[3]\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -65,19 +65,20 @@ func getMapKeys(node *CandidateNode) *CandidateNode {
|
|||||||
for index := 0; index < len(node.Content); index = index + 2 {
|
for index := 0; index < len(node.Content); index = index + 2 {
|
||||||
contents = append(contents, node.Content[index])
|
contents = append(contents, node.Content[index])
|
||||||
}
|
}
|
||||||
return &CandidateNode{Kind: SequenceNode, Tag: "!!seq", Content: contents}
|
|
||||||
|
seq := &CandidateNode{Kind: SequenceNode, Tag: "!!seq"}
|
||||||
|
seq.AddChildren(contents)
|
||||||
|
return seq
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIndices(node *CandidateNode) *CandidateNode {
|
func getIndices(node *CandidateNode) *CandidateNode {
|
||||||
var contents = make([]*CandidateNode, len(node.Content))
|
var contents = make([]*CandidateNode, len(node.Content))
|
||||||
|
|
||||||
for index := range node.Content {
|
for index := range node.Content {
|
||||||
contents[index] = &CandidateNode{
|
contents[index] = createScalarNode(index, fmt.Sprintf("%v", index))
|
||||||
Kind: ScalarNode,
|
|
||||||
Tag: "!!int",
|
|
||||||
Value: fmt.Sprintf("%v", index),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &CandidateNode{Kind: SequenceNode, Tag: "!!seq", Content: contents}
|
seq := &CandidateNode{Kind: SequenceNode, Tag: "!!seq"}
|
||||||
|
seq.AddChildren(contents)
|
||||||
|
return seq
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,8 +45,8 @@ var keysOperatorScenarios = []expressionScenario{
|
|||||||
document: `{dog: woof, cat: meow}`,
|
document: `{dog: woof, cat: meow}`,
|
||||||
expression: `keys[]`,
|
expression: `keys[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[dog], (!!str)::dog\n",
|
"D0, P[0], (!!str)::dog\n",
|
||||||
"D0, P[cat], (!!str)::cat\n",
|
"D0, P[1], (!!str)::cat\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -17,8 +17,8 @@ var reverseOperatorScenarios = []expressionScenario{
|
|||||||
document: "[1, 2]",
|
document: "[1, 2]",
|
||||||
expression: `reverse[]`,
|
expression: `reverse[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[1], (!!int)::2\n",
|
"D0, P[0], (!!int)::2\n",
|
||||||
"D0, P[0], (!!int)::1\n",
|
"D0, P[1], (!!int)::1\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -26,7 +26,12 @@ func shuffleOperator(_ *dataTreeNavigator, context Context, _ *ExpressionNode) (
|
|||||||
|
|
||||||
a := result.Content
|
a := result.Content
|
||||||
|
|
||||||
myRand.Shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
|
myRand.Shuffle(len(a), func(i, j int) {
|
||||||
|
a[i], a[j] = a[j], a[i]
|
||||||
|
oldIndex := a[i].Key.Value
|
||||||
|
a[i].Key.Value = a[j].Key.Value
|
||||||
|
a[j].Key.Value = oldIndex
|
||||||
|
})
|
||||||
|
|
||||||
results.PushBack(result)
|
results.PushBack(result)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,9 +17,9 @@ var shuffleOperatorScenarios = []expressionScenario{
|
|||||||
document: "[1, 2, 3]",
|
document: "[1, 2, 3]",
|
||||||
expression: `shuffle[]`,
|
expression: `shuffle[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[2], (!!int)::3\n",
|
"D0, P[0], (!!int)::3\n",
|
||||||
"D0, P[0], (!!int)::1\n",
|
"D0, P[1], (!!int)::1\n",
|
||||||
"D0, P[1], (!!int)::2\n",
|
"D0, P[2], (!!int)::2\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -17,8 +17,8 @@ var sortByOperatorScenarios = []expressionScenario{
|
|||||||
document: "[{a: banana},{a: apple}]",
|
document: "[{a: banana},{a: apple}]",
|
||||||
expression: `sort_by(.a)[]`,
|
expression: `sort_by(.a)[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[1], (!!map)::{a: apple}\n",
|
"D0, P[0], (!!map)::{a: apple}\n",
|
||||||
"D0, P[0], (!!map)::{a: banana}\n",
|
"D0, P[1], (!!map)::{a: banana}\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -27,9 +27,9 @@ var sortByOperatorScenarios = []expressionScenario{
|
|||||||
document: "[{a: banana},null,{a: apple}]",
|
document: "[{a: banana},null,{a: apple}]",
|
||||||
expression: `sort_by(.a)[]`,
|
expression: `sort_by(.a)[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[1], (!!null)::null\n",
|
"D0, P[0], (!!null)::null\n",
|
||||||
"D0, P[2], (!!map)::{a: apple}\n",
|
"D0, P[1], (!!map)::{a: apple}\n",
|
||||||
"D0, P[0], (!!map)::{a: banana}\n",
|
"D0, P[2], (!!map)::{a: banana}\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -149,8 +149,8 @@ var sortByOperatorScenarios = []expressionScenario{
|
|||||||
document: "[8,null]",
|
document: "[8,null]",
|
||||||
expression: `sort[]`,
|
expression: `sort[]`,
|
||||||
expected: []string{
|
expected: []string{
|
||||||
"D0, P[1], (!!null)::null\n",
|
"D0, P[0], (!!null)::null\n",
|
||||||
"D0, P[0], (!!int)::8\n",
|
"D0, P[1], (!!int)::8\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user