mongodb: fix querying non-string values

Signed-off-by: Dmitry Shmulevich <dmitsh@users.noreply.github.com>
This commit is contained in:
Dmitry Shmulevich 2022-03-15 19:05:53 -07:00
parent d05523be8a
commit dcfb3454c1
3 changed files with 59 additions and 4 deletions

View File

@ -37,7 +37,12 @@ type Query struct {
func (q *Query) VisitEQ(f *query.EQ) (string, error) {
// { <key>: <val> }
return fmt.Sprintf(`{ "value.%s": %q }`, f.Key, f.Val), nil
switch v := f.Val.(type) {
case string:
return fmt.Sprintf(`{ "value.%s": %q }`, f.Key, v), nil
default:
return fmt.Sprintf(`{ "value.%s": %v }`, f.Key, v), nil
}
}
func (q *Query) VisitIN(f *query.IN) (string, error) {
@ -45,9 +50,18 @@ func (q *Query) VisitIN(f *query.IN) (string, error) {
if len(f.Vals) == 0 {
return "", fmt.Errorf("empty IN operator for key %q", f.Key)
}
str := fmt.Sprintf(`{ "value.%s": { "$in": [ %q`, f.Key, f.Vals[0])
for _, v := range f.Vals[1:] {
str += fmt.Sprintf(", %q", v)
str := fmt.Sprintf(`{ "value.%s": { "$in": [ `, f.Key)
for i := 0; i < len(f.Vals); i++ {
if i > 0 {
str += ", "
}
switch v := f.Vals[i].(type) {
case string:
str += fmt.Sprintf("%q", v)
default:
str += fmt.Sprintf("%v", v)
}
}
str += " ] } }"

View File

@ -44,6 +44,10 @@ func TestMongoQuery(t *testing.T) {
input: "../../tests/state/query/q4.json",
query: `{ "$or": [ { "value.person.org": "A" }, { "$and": [ { "value.person.org": "B" }, { "value.state": { "$in": [ "CA", "WA" ] } } ] } ] }`,
},
{
input: "../../tests/state/query/q6.json",
query: `{ "$or": [ { "value.person.id": 123 }, { "$and": [ { "value.person.org": "B" }, { "value.person.id": { "$in": [ 567, 890 ] } } ] } ] }`,
},
}
for _, test := range tests {
data, err := ioutil.ReadFile(test.input)

37
tests/state/query/q6.json Normal file
View File

@ -0,0 +1,37 @@
{
"filter": {
"OR": [
{
"EQ": {
"person.id": 123
}
},
{
"AND": [
{
"EQ": {
"person.org": "B"
}
},
{
"IN": {
"person.id": [567, 890]
}
}
]
}
]
},
"sort": [
{
"key": "state",
"order": "DESC"
},
{
"key": "person.name"
}
],
"page": {
"limit": 2
}
}