From 49b810ceddf83332d03a9a0f99d5fa58d7081851 Mon Sep 17 00:00:00 2001 From: Mike Farah Date: Mon, 19 Oct 2020 08:36:33 +1100 Subject: [PATCH] Multiply wip --- pkg/yqlib/treeops/lib.go | 2 ++ pkg/yqlib/treeops/operator_merge.go | 20 ++++++++++++++++++ pkg/yqlib/treeops/operator_merge_test.go | 27 ++++++++++++++++++++++++ pkg/yqlib/treeops/path_tokeniser.go | 1 + pkg/yqlib/treeops/sample.yaml | 1 + pkg/yqlib/treeops/temp.json | 6 ++++++ 6 files changed, 57 insertions(+) create mode 100644 pkg/yqlib/treeops/operator_merge.go create mode 100644 pkg/yqlib/treeops/operator_merge_test.go create mode 100644 pkg/yqlib/treeops/sample.yaml create mode 100644 pkg/yqlib/treeops/temp.json diff --git a/pkg/yqlib/treeops/lib.go b/pkg/yqlib/treeops/lib.go index e66bb28..34be9b0 100644 --- a/pkg/yqlib/treeops/lib.go +++ b/pkg/yqlib/treeops/lib.go @@ -40,6 +40,8 @@ var Union = &OperationType{Type: "UNION", NumArgs: 2, Precedence: 10, Handler: U var Intersection = &OperationType{Type: "INTERSECTION", NumArgs: 2, Precedence: 20, Handler: IntersectionOperator} var Assign = &OperationType{Type: "ASSIGN", NumArgs: 2, Precedence: 40, Handler: AssignOperator} +var Multiply = &OperationType{Type: "MULTIPLY", NumArgs: 2, Precedence: 40, Handler: MultiplyOperator} + var Equals = &OperationType{Type: "EQUALS", NumArgs: 2, Precedence: 40, Handler: EqualsOperator} var Pipe = &OperationType{Type: "PIPE", NumArgs: 2, Precedence: 45, Handler: PipeOperator} diff --git a/pkg/yqlib/treeops/operator_merge.go b/pkg/yqlib/treeops/operator_merge.go new file mode 100644 index 0000000..86ebbc1 --- /dev/null +++ b/pkg/yqlib/treeops/operator_merge.go @@ -0,0 +1,20 @@ +package treeops + +import "github.com/elliotchance/orderedmap" + +func MultiplyOperator(d *dataTreeNavigator, matchingNodes *orderedmap.OrderedMap, pathNode *PathTreeNode) (*orderedmap.OrderedMap, error) { + lhs, err := d.getMatchingNodes(matchingNodes, pathNode.Lhs) + if err != nil { + return nil, err + } + for el := lhs.Front(); el != nil; el = el.Next() { + candidate := el.Value.(*CandidateNode) + + // TODO handle scalar mulitplication + switch candidate.Node.Kind { + case + } + + } + return matchingNodes, nil +} diff --git a/pkg/yqlib/treeops/operator_merge_test.go b/pkg/yqlib/treeops/operator_merge_test.go new file mode 100644 index 0000000..c0cc75f --- /dev/null +++ b/pkg/yqlib/treeops/operator_merge_test.go @@ -0,0 +1,27 @@ +package treeops + +import ( + "testing" +) + +var mergeOperatorScenarios = []expressionScenario{ + { + document: `{a: frog, b: cat}`, + expression: `.a * .b`, + expected: []string{ + "D0, P[], (!!map)::{a: cat, b: cat}\n", + }, + }, { + document: `{a: {things: great}, b: {also: me}}`, + expression: `.a * .b`, + expected: []string{ + "D0, P[], (!!map)::{a: {also: me, things: great}, b: {also: me}}\n", + }, + }, +} + +func TestMergeOperatorScenarios(t *testing.T) { + for _, tt := range mergeOperatorScenarios { + testScenario(t, &tt) + } +} diff --git a/pkg/yqlib/treeops/path_tokeniser.go b/pkg/yqlib/treeops/path_tokeniser.go index ec120b2..25a77ee 100644 --- a/pkg/yqlib/treeops/path_tokeniser.go +++ b/pkg/yqlib/treeops/path_tokeniser.go @@ -153,6 +153,7 @@ func initLexer() (*lex.Lexer, error) { lexer.Add([]byte(`\[`), literalToken(OpenCollect, "[", false)) lexer.Add([]byte(`\]`), literalToken(CloseCollect, "]", true)) + lexer.Add([]byte(`\*`), opToken(Multiply)) // lexer.Add([]byte(`[^ \,\|\.\[\(\)=]+`), stringValue(false)) err := lexer.Compile() diff --git a/pkg/yqlib/treeops/sample.yaml b/pkg/yqlib/treeops/sample.yaml new file mode 100644 index 0000000..7997a4d --- /dev/null +++ b/pkg/yqlib/treeops/sample.yaml @@ -0,0 +1 @@ +{a: {b: apple, c: cactus}} \ No newline at end of file diff --git a/pkg/yqlib/treeops/temp.json b/pkg/yqlib/treeops/temp.json new file mode 100644 index 0000000..fd19e6d --- /dev/null +++ b/pkg/yqlib/treeops/temp.json @@ -0,0 +1,6 @@ +{ + "a": { + "b": "apple", + "c": "cactus" + } +}