diff --git a/query/grammar/grammar_test.go b/query/grammar/grammar_test.go index 952a24cc..81279add 100644 --- a/query/grammar/grammar_test.go +++ b/query/grammar/grammar_test.go @@ -10,7 +10,7 @@ import ( var _ = Describe("grammar", func() { It("parses", func() { - result, err := ParsePEG("john:doe metadata.name=bob metadata.name!=harry spec.status.reason!=\"failed reson\" -jane johnny type!=pod type!=replicaset namespace!=\"a,b,c\"") + result, err := ParsePEG("metadata.name=bob metadata.name!=harry spec.status.reason!=\"failed reson\" -jane johnny type!=pod type!=replicaset namespace!=\"a,b,c\"") Expect(err).To(BeNil()) resultJSON, err := json.Marshal(result) @@ -21,11 +21,6 @@ var _ = Describe("grammar", func() { { "op": "and", "fields": [ - { - "field": "john", - "value": "doe", - "op": ":" - }, { "field": "metadata.name", "value": "bob", diff --git a/query/grammar/grammer.go b/query/grammar/grammer.go index 69eee670..8bf3d921 100644 --- a/query/grammar/grammer.go +++ b/query/grammar/grammer.go @@ -884,9 +884,9 @@ var g = &grammar{ pos: position{line: 119, col: 5, offset: 1872}, expr: &charClassMatcher{ pos: position{line: 119, col: 5, offset: 1872}, - val: "[a-zA-Z0-9_*-]", - chars: []rune{'_', '*', '-'}, - ranges: []rune{'a', 'z', 'A', 'Z', '0', '9'}, + val: "[a-zA-Z0-9_*-:\\\\[\\]]", + chars: []rune{'_', '\\', '[', ']'}, + ranges: []rune{'a', 'z', 'A', 'Z', '0', '9', '*', ':'}, ignoreCase: false, inverted: false, }, @@ -895,11 +895,11 @@ var g = &grammar{ }, { name: "_", - pos: position{line: 123, col: 1, offset: 1928}, + pos: position{line: 123, col: 1, offset: 1934}, expr: &zeroOrMoreExpr{ - pos: position{line: 124, col: 5, offset: 1934}, + pos: position{line: 124, col: 5, offset: 1940}, expr: &charClassMatcher{ - pos: position{line: 124, col: 5, offset: 1934}, + pos: position{line: 124, col: 5, offset: 1940}, val: "[ \\t]", chars: []rune{' ', '\t'}, ignoreCase: false, @@ -909,11 +909,11 @@ var g = &grammar{ }, { name: "EOF", - pos: position{line: 126, col: 1, offset: 1942}, + pos: position{line: 126, col: 1, offset: 1948}, expr: ¬Expr{ - pos: position{line: 127, col: 5, offset: 1950}, + pos: position{line: 127, col: 5, offset: 1956}, expr: &anyMatcher{ - line: 127, col: 6, offset: 1951, + line: 127, col: 6, offset: 1957, }, }, }, diff --git a/query/grammar/grammer.peg b/query/grammar/grammer.peg index 85e34203..c0958dcc 100644 --- a/query/grammar/grammer.peg +++ b/query/grammar/grammer.peg @@ -116,7 +116,7 @@ Float } Identifier - = [a-zA-Z0-9_*-]+ { + = [a-zA-Z0-9_*-:\\[\]]+ { return string(c.text), nil } diff --git a/query/models.go b/query/models.go index d81caa11..f8d8a1fe 100644 --- a/query/models.go +++ b/query/models.go @@ -203,6 +203,7 @@ func (qm QueryModel) Apply(ctx context.Context, q types.QueryField, tx *gorm.DB) var err error if q.Field != "" { + originalField := q.Field q.Field = strings.ToLower(q.Field) if alias, ok := qm.Aliases[q.Field]; ok { q.Field = alias @@ -230,8 +231,8 @@ func (qm QueryModel) Apply(ctx context.Context, q types.QueryField, tx *gorm.DB) } for _, column := range qm.JSONColumns { - if strings.HasPrefix(q.Field, column) { - tx = JSONPathMapper(ctx, tx, column, strings.TrimPrefix(q.Field, column+"."), val) + if strings.HasPrefix(originalField, column) { + tx = JSONPathMapper(ctx, tx, column, strings.TrimPrefix(originalField, column+"."), val) q.Field = column } } diff --git a/tests/query_resource_selector_test.go b/tests/query_resource_selector_test.go index 073a99bc..59ee1f80 100644 --- a/tests/query_resource_selector_test.go +++ b/tests/query_resource_selector_test.go @@ -324,7 +324,13 @@ var _ = ginkgo.Describe("Resoure Selector with PEG", ginkgo.Ordered, func() { resource: "config", }, { - description: "config item query", + description: "config item query with :: in string", + query: `name=node-b type=Kubernetes::Node`, + expectedIDs: []uuid.UUID{dummy.KubernetesNodeB.ID}, + resource: "config", + }, + { + description: "config item query with quotes", query: `name="node-b" type="Kubernetes::Node"`, expectedIDs: []uuid.UUID{dummy.KubernetesNodeB.ID}, resource: "config", @@ -403,7 +409,7 @@ var _ = ginkgo.Describe("Resoure Selector with PEG", ginkgo.Ordered, func() { }, { description: "config soft and limit query", - query: `name=node-* type="Kubernetes::Node" limit=1 sort=name`, + query: `name=node-* type=Kubernetes::Node limit=1 sort=name`, expectedIDs: []uuid.UUID{dummy.KubernetesNodeA.ID}, resource: "config", }, @@ -425,6 +431,18 @@ var _ = ginkgo.Describe("Resoure Selector with PEG", ginkgo.Ordered, func() { expectedIDs: []uuid.UUID{dummy.EKSCluster.ID, dummy.EC2InstanceB.ID}, resource: "config", }, + { + description: "config array query", + query: `config.spec.template.spec.containers[0].name=logistics-api`, + expectedIDs: []uuid.UUID{dummy.LogisticsAPIDeployment.ID}, + resource: "config", + }, + { + description: "config array query with integer matching", + query: `config.spec.template.spec.containers[0].ports[0].containerPort=80`, + expectedIDs: []uuid.UUID{dummy.LogisticsAPIDeployment.ID}, + resource: "config", + }, } fmap := map[string]func(context.Context, int, ...types.ResourceSelector) ([]uuid.UUID, error){