From 4f3fe256aac368c3523ec216357c59effd3c29f7 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Fri, 19 Mar 2021 12:09:32 +1100 Subject: [PATCH] Fixed precedence of CREATE_MAP (https://github.com/mikefarah/yq/issues/753) --- pkg/yqlib/expression_processing_test.go | 15 +++++++++++++++ pkg/yqlib/lib.go | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/yqlib/expression_processing_test.go b/pkg/yqlib/expression_processing_test.go index d7ebbd08..28bcedff 100644 --- a/pkg/yqlib/expression_processing_test.go +++ b/pkg/yqlib/expression_processing_test.go @@ -12,6 +12,21 @@ var pathTests = []struct { expectedTokens []interface{} expectedPostFix []interface{} }{ + { + `[]|join(".")`, + append(make([]interface{}, 0), "[", "EMPTY", "]", "PIPE", "JOIN", "(", ". (string)", ")"), + append(make([]interface{}, 0), "EMPTY", "COLLECT", "SHORT_PIPE", ". (string)", "JOIN", "PIPE" ), + }, + { + `{"cool": .b or .c}`, + append(make([]interface{}, 0), "{", "cool (string)", "CREATE_MAP", "b", "OR", "c", "}"), + append(make([]interface{}, 0), "cool (string)", "b", "c", "OR", "CREATE_MAP", "COLLECT_OBJECT", "SHORT_PIPE"), + }, + { + `{"cool": []|join(".")}`, + append(make([]interface{}, 0), "{", "cool (string)", "CREATE_MAP", "[", "EMPTY", "]", "PIPE", "JOIN", "(", ". (string)", ")", "}"), + append(make([]interface{}, 0), "cool (string)", "EMPTY", "COLLECT", "SHORT_PIPE", ". (string)", "JOIN", "PIPE", "CREATE_MAP", "COLLECT_OBJECT", "SHORT_PIPE"), + }, { `.a as $item ireduce (0; . + $item)`, // note - add code to shuffle reduce to this position for postfix append(make([]interface{}, 0), "a", "ASSIGN_VARIABLE", "GET_VARIABLE", "REDUCE", "(", "0 (int64)", "BLOCK", "SELF", "ADD", "GET_VARIABLE", ")"), diff --git a/pkg/yqlib/lib.go b/pkg/yqlib/lib.go index c318016c..d855eb35 100644 --- a/pkg/yqlib/lib.go +++ b/pkg/yqlib/lib.go @@ -50,7 +50,9 @@ var alternativeOpType = &operationType{Type: "ALTERNATIVE", NumArgs: 2, Preceden var equalsOpType = &operationType{Type: "EQUALS", NumArgs: 2, Precedence: 40, Handler: equalsOperator} var notEqualsOpType = &operationType{Type: "EQUALS", NumArgs: 2, Precedence: 40, Handler: notEqualsOperator} -var createMapOpType = &operationType{Type: "CREATE_MAP", NumArgs: 2, Precedence: 40, Handler: createMapOperator} + +//createmap needs to be above union, as we use union to build the components of the objects +var createMapOpType = &operationType{Type: "CREATE_MAP", NumArgs: 2, Precedence: 15, Handler: createMapOperator} var shortPipeOpType = &operationType{Type: "SHORT_PIPE", NumArgs: 2, Precedence: 45, Handler: pipeOperator}