MCPcopy Index your code
hub / github.com/CovenantSQL/CovenantSQL / Find

Function Find

cmd/cql-proxy/resolver/query_builder.go:26–82  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

24
25// Find process find query with filter/project/order by/limits like a mongodb.
26func 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

Callers 1

userDataFindFunction · 0.92

Calls 4

ResolveProjectionFunction · 0.85
ResolveFilterFunction · 0.85
ResolveOrderByFunction · 0.85
MergeMethod · 0.80

Tested by

no test coverage detected