Fixed bug when splatting empty array #1613

This commit is contained in:
Mike Farah 2023-03-31 16:24:23 +11:00
parent 496035c75a
commit a389bb64b8
3 changed files with 18 additions and 1 deletions

View File

@ -27,6 +27,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
log.Debugf("-- collectOperation") log.Debugf("-- collectOperation")
if context.MatchingNodes.Len() == 0 { if context.MatchingNodes.Len() == 0 {
log.Debugf("nothing to collect")
node := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Value: "[]"} node := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq", Value: "[]"}
candidate := &CandidateNode{Node: node} candidate := &CandidateNode{Node: node}
return context.SingleChildContext(candidate), nil return context.SingleChildContext(candidate), nil
@ -41,6 +42,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
} }
if evaluateAllTogether { if evaluateAllTogether {
log.Debugf("collect together")
collectedNode, err := collectTogether(d, context, expressionNode.RHS) collectedNode, err := collectTogether(d, context, expressionNode.RHS)
if err != nil { if err != nil {
return Context{}, err return Context{}, err
@ -56,6 +58,8 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
collectedNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"} collectedNode := &yaml.Node{Kind: yaml.SequenceNode, Tag: "!!seq"}
collectCandidate := candidate.CreateReplacement(collectedNode) collectCandidate := candidate.CreateReplacement(collectedNode)
log.Debugf("collect rhs: %v", expressionNode.RHS.Operation.toString())
collectExpResults, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS) collectExpResults, err := d.GetMatchingNodes(context.SingleChildContext(candidate), expressionNode.RHS)
if err != nil { if err != nil {
return Context{}, err return Context{}, err
@ -66,6 +70,7 @@ func collectOperator(d *dataTreeNavigator, context Context, expressionNode *Expr
log.Debugf("found this: %v", NodeToString(resultC)) log.Debugf("found this: %v", NodeToString(resultC))
collectedNode.Content = append(collectedNode.Content, unwrapDoc(resultC.Node)) collectedNode.Content = append(collectedNode.Content, unwrapDoc(resultC.Node))
} }
log.Debugf("done collect rhs: %v", expressionNode.RHS.Operation.toString())
results.PushBack(collectCandidate) results.PushBack(collectCandidate)
} }

View File

@ -80,6 +80,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
// BUT we still return the original context back (see jq) // BUT we still return the original context back (see jq)
// https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|... // https://stedolan.github.io/jq/manual/#Variable/SymbolicBindingOperator:...as$identifier|...
log.Debugf("--traverseArrayOperator")
if expressionNode.RHS != nil && expressionNode.RHS.RHS != nil && expressionNode.RHS.RHS.Operation.OperationType == createMapOpType { if expressionNode.RHS != nil && expressionNode.RHS.RHS != nil && expressionNode.RHS.RHS.Operation.OperationType == createMapOpType {
return sliceArrayOperator(d, context, expressionNode.RHS.RHS) return sliceArrayOperator(d, context, expressionNode.RHS.RHS)
} }
@ -103,6 +105,8 @@ func traverseArrayOperator(d *dataTreeNavigator, context Context, expressionNode
} }
var indicesToTraverse = rhs.MatchingNodes.Front().Value.(*CandidateNode).Node.Content var indicesToTraverse = rhs.MatchingNodes.Front().Value.(*CandidateNode).Node.Content
log.Debugf("indicesToTraverse %v", len(indicesToTraverse))
//now we traverse the result of the lhs against the indices we found //now we traverse the result of the lhs against the indices we found
result, err := traverseNodesWithArrayIndices(lhs, indicesToTraverse, prefs) result, err := traverseNodesWithArrayIndices(lhs, indicesToTraverse, prefs)
if err != nil { if err != nil {
@ -231,7 +235,8 @@ func traverseMap(context Context, matchingNode *CandidateNode, keyNode *yaml.Nod
return nil, err return nil, err
} }
if !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 { if !splat && !prefs.DontAutoCreate && !context.DontAutoCreate && newMatches.Len() == 0 {
log.Debugf("no matches, creating one")
//no matches, create one automagically //no matches, create one automagically
valueNode := &yaml.Node{Tag: "!!null", Kind: yaml.ScalarNode, Value: "null"} valueNode := &yaml.Node{Tag: "!!null", Kind: yaml.ScalarNode, Value: "null"}

View File

@ -35,6 +35,13 @@ steps:
` `
var traversePathOperatorScenarios = []expressionScenario{ var traversePathOperatorScenarios = []expressionScenario{
{
skipDoc: true,
description: "splat empty map",
document: "{}",
expression: ".[]",
expected: []string{},
},
{ {
skipDoc: true, skipDoc: true,
document: `[[1]]`, document: `[[1]]`,