Find process find query with filter/project/order by/limits like a mongodb.
(table string, availFields FieldMap, query map[string]interface{}, projection map[string]interface{},
orderBy map[string]interface{}, skip *int64, limit *int64)
| 24 | |
| 25 | // Find process find query with filter/project/order by/limits like a mongodb. |
| 26 | func Find(table string, availFields FieldMap, query map[string]interface{}, projection map[string]interface{}, |
| 27 | orderBy map[string]interface{}, skip *int64, limit *int64) ( |
| 28 | statement string, args []interface{}, fields FieldMap, err error) { |
| 29 | fields = FieldMap{} |
| 30 | statement = `SELECT ` |
| 31 | |
| 32 | // project segment |
| 33 | projectionFields, projectionStatement, err := ResolveProjection(projection, availFields) |
| 34 | if err != nil { |
| 35 | err = errors.Wrapf(err, "resolve query result projection failed") |
| 36 | return |
| 37 | } |
| 38 | fields.Merge(projectionFields) |
| 39 | statement += projectionStatement |
| 40 | |
| 41 | // table segment |
| 42 | statement += fmt.Sprintf(` FROM "%s" `, table) |
| 43 | |
| 44 | // where segment |
| 45 | filterFields, filterStatement, filterArgs, err := ResolveFilter(query, availFields) |
| 46 | if err != nil { |
| 47 | err = errors.Wrapf(err, "resolve query filter failed") |
| 48 | return |
| 49 | } |
| 50 | fields.Merge(filterFields) |
| 51 | args = append(args, filterArgs...) |
| 52 | |
| 53 | if filterStatement != "" { |
| 54 | statement += " WHERE " |
| 55 | statement += filterStatement |
| 56 | } |
| 57 | |
| 58 | // order by segment |
| 59 | orderByFields, orderByStatement, err := ResolveOrderBy(orderBy, availFields) |
| 60 | if err != nil { |
| 61 | err = errors.Wrapf(err, "resolve order by failed") |
| 62 | return |
| 63 | } |
| 64 | fields.Merge(orderByFields) |
| 65 | |
| 66 | if orderByStatement != "" { |
| 67 | statement += " ORDER BY " |
| 68 | statement += orderByStatement |
| 69 | } |
| 70 | |
| 71 | if skip != nil || limit != nil { |
| 72 | if skip == nil { |
| 73 | statement += fmt.Sprintf(" LIMIT %d", *limit) |
| 74 | } else if limit == nil { |
| 75 | statement += fmt.Sprintf(" LIMIT %d, -1", *skip) |
| 76 | } else { |
| 77 | statement += fmt.Sprintf(" LIMIT %d, %d", *skip, *limit) |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | return |
| 82 | } |
| 83 |
no test coverage detected