Skip to content

Commit 42763db

Browse files
authored
Allow multiple OR filters (#14)
makie it possible to have multiple and filters * AB#9044
1 parent c7d9a8e commit 42763db

File tree

3 files changed

+61
-28
lines changed

3 files changed

+61
-28
lines changed

Taskfile.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ tasks:
7272
cmds:
7373
- task: builder-start
7474
- defer: {task: builder-cleanup}
75-
- task: local-all
75+
- docker exec -t {{.BUILD_CONTAINER}} task local-all
7676

7777
local-all:
7878
desc: |

datatrails-common-api/marshalers/query/attributeparser.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -225,31 +225,36 @@ func handleFilters(msg protoreflect.ProtoMessage, p runtime.QueryParameterParser
225225

226226
// did user specify any filters in the query string
227227
if values.Has(string(prop.Name())) {
228-
// get the filters from query
229-
filterSpec := values.Get(string(prop.Name()))
230-
231-
// split the filter terms
232-
filters, err := getFilterParts(filterSpec)
233-
if err != nil {
234-
return err
235-
}
236228

237229
// create mutable 'filters' property
238230
filtersMutable := msg.ProtoReflect().Mutable(prop)
239-
// append new filter to the list
240-
newFilter := filtersMutable.List().NewElement()
241-
// get the descriptor for the 'or' element of a filter
242-
orDesc := newFilter.Message().Descriptor().Fields().ByJSONName("or")
243-
// create mutable 'or' proprty of a filter
244-
or := newFilter.Message().Mutable(orDesc)
245-
246-
// append our terms eg. attributes.foo=5 to the 'or'
247-
for _, term := range filters {
248-
v := protoreflect.ValueOf(term)
249-
or.List().Append(v)
231+
232+
// get the filters from query
233+
//filterSpec := values.Get(string(prop.Name()))
234+
filterSpecs := values[string(prop.Name())]
235+
for _, filterSpec := range filterSpecs {
236+
237+
// split the filter terms
238+
filters, err := getFilterParts(filterSpec)
239+
if err != nil {
240+
return err
241+
}
242+
243+
// append new filter to the list
244+
newFilter := filtersMutable.List().NewElement()
245+
// get the descriptor for the 'or' element of a filter
246+
orDesc := newFilter.Message().Descriptor().Fields().ByJSONName("or")
247+
// create mutable 'or' proprty of a filter
248+
or := newFilter.Message().Mutable(orDesc)
249+
250+
// append our terms eg. attributes.foo=5 to the 'or'
251+
for _, term := range filters {
252+
v := protoreflect.ValueOf(term)
253+
or.List().Append(v)
254+
}
255+
// append our new filter to 'filters'
256+
filtersMutable.List().Append(newFilter)
250257
}
251-
// append our new filter to 'filters'
252-
filtersMutable.List().Append(newFilter)
253258
}
254259

255260
return nil

datatrails-common-api/marshalers/query/attributeparser_test.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,59 @@ func TestFilterParsing(t *testing.T) {
2020
values url.Values
2121
parser runtime.QueryParameterParser
2222
isError bool
23-
expectedResult []string
23+
expectedResult [][]string
2424
}{
2525
{
2626
name: "test simple or",
2727
message: &assets.ListAssetsRequest{},
2828
values: map[string][]string{"filters": {"attributes.foo=2 OR attributes.bar=2"}},
2929
parser: &runtime.DefaultQueryParser{},
30-
expectedResult: []string{"attributes.foo=2", "attributes.bar=2"},
30+
expectedResult: [][]string{{"attributes.foo=2", "attributes.bar=2"}},
31+
},
32+
{
33+
name: "test multiple or",
34+
message: &assets.ListAssetsRequest{},
35+
values: map[string][]string{"filters": {"attributes.foo=2 OR attributes.bar=2", "attributes.foo=dd OR attributes.bar=77"}},
36+
parser: &runtime.DefaultQueryParser{},
37+
expectedResult: [][]string{{"attributes.foo=2", "attributes.bar=2"}, {"attributes.foo=dd", "attributes.bar=77"}},
3138
},
3239
{
3340
name: "test or *",
3441
message: &assets.ListAssetsRequest{},
3542
values: map[string][]string{"filters": {"attributes.foo=* oR attributes.bar=2"}},
3643
parser: &runtime.DefaultQueryParser{},
37-
expectedResult: []string{"attributes.foo=*", "attributes.bar=2"},
44+
expectedResult: [][]string{{"attributes.foo=*", "attributes.bar=2"}},
3845
},
3946
{
4047
name: "test or 5 terms",
4148
message: &assets.ListAssetsRequest{},
4249
values: map[string][]string{"filters": {"attributes.foo=2 or attributes.bar=2 OR attributes.lop=2 oR attributes.foo=22 Or attributes.bar=77"}},
4350
parser: &runtime.DefaultQueryParser{},
44-
expectedResult: []string{"attributes.foo=2", "attributes.bar=2", "attributes.lop=2", "attributes.foo=22", "attributes.bar=77"},
51+
expectedResult: [][]string{{"attributes.foo=2", "attributes.bar=2", "attributes.lop=2", "attributes.foo=22", "attributes.bar=77"}},
52+
},
53+
{
54+
name: "test 4 filter terms",
55+
message: &assets.ListAssetsRequest{},
56+
values: map[string][]string{"filters": {
57+
"attributes.foo=2 or attributes.bar=2 OR attributes.lop=2",
58+
"attribtues.basss=e88 oR attributes.foxo=22",
59+
"attribtues.ba=e oR attributes.foo=22 Or attributes.bar=77",
60+
"something=xx oR attributes.gg=22 Or attributes.bar=87",
61+
}},
62+
parser: &runtime.DefaultQueryParser{},
63+
expectedResult: [][]string{
64+
{"attributes.foo=2", "attributes.bar=2", "attributes.lop=2"},
65+
{"attribtues.basss=e88", "attributes.foxo=22"},
66+
{"attribtues.ba=e", "attributes.foo=22", "attributes.bar=77"},
67+
{"something=xx", "attributes.gg=22", "attributes.bar=87"}},
4568
},
4669
{
4770
name: "test bad filter",
4871
message: &assets.ListAssetsRequest{},
4972
values: map[string][]string{"filters": {"attributes.foo=2 OF attributes.bar=2"}},
5073
parser: &runtime.DefaultQueryParser{},
5174
isError: true,
52-
expectedResult: []string{},
75+
expectedResult: [][]string{},
5376
},
5477
{
5578
name: "test nil message",
@@ -68,7 +91,12 @@ func TestFilterParsing(t *testing.T) {
6891
assert.Nil(t, result)
6992
}
7093
if result == nil && test.message != nil {
71-
assert.Equal(t, test.message.Filters[0].Or, test.expectedResult)
94+
95+
assert.Equal(t, len(test.message.Filters), len(test.expectedResult))
96+
for idx, expected := range test.expectedResult {
97+
assert.Equal(t, test.message.Filters[idx].Or, expected)
98+
}
99+
72100
}
73101
})
74102
}

0 commit comments

Comments
 (0)