ResolveFilter resolves filter object and returns as full where statement.
(q map[string]interface{}, availFields FieldMap)
| 208 | |
| 209 | // ResolveFilter resolves filter object and returns as full where statement. |
| 210 | func ResolveFilter(q map[string]interface{}, availFields FieldMap) ( |
| 211 | fields FieldMap, statement string, args []interface{}, err error) { |
| 212 | if q == nil { |
| 213 | return |
| 214 | } |
| 215 | |
| 216 | fields = FieldMap{} |
| 217 | var subStatements []string |
| 218 | |
| 219 | if len(q) == 0 { |
| 220 | return |
| 221 | } |
| 222 | |
| 223 | for k, v := range q { |
| 224 | switch { |
| 225 | case k == "$and" || k == "$or" || k == "$nor": |
| 226 | var ( |
| 227 | childFields FieldMap |
| 228 | childStatement string |
| 229 | childArgs []interface{} |
| 230 | childQuery []map[string]interface{} |
| 231 | ) |
| 232 | childQuery, err = getNonEmptyArrayOfObjects(v) |
| 233 | if err != nil { |
| 234 | err = errors.Wrapf(err, "%s operator", k) |
| 235 | return |
| 236 | } |
| 237 | childFields, childStatement, childArgs, err = logicRelation(childQuery, availFields, opMap[k]) |
| 238 | if err != nil { |
| 239 | return |
| 240 | } |
| 241 | if k == "$nor" { |
| 242 | // $nor empty result should be false |
| 243 | if childStatement == "" { |
| 244 | childStatement = "TRUE" |
| 245 | } |
| 246 | childStatement = "NOT (" + childStatement + ")" |
| 247 | } else { |
| 248 | if childStatement == "" { |
| 249 | continue |
| 250 | } |
| 251 | } |
| 252 | fields.Merge(childFields) |
| 253 | subStatements = append(subStatements, childStatement) |
| 254 | args = append(args, childArgs...) |
| 255 | case k == "$comment": |
| 256 | // ignore |
| 257 | case strings.HasPrefix(k, "$"): |
| 258 | err = errors.Errorf("invalid operator %s", k) |
| 259 | return |
| 260 | default: |
| 261 | // treat key as column |
| 262 | if !availFields[k] { |
| 263 | err = errors.Errorf("unknown field: %s", k) |
| 264 | return |
| 265 | } |
| 266 | |
| 267 | var ( |
no test coverage detected