MCPcopy
hub / github.com/pocketbase/pocketbase / buildResolversExpr

Function buildResolversExpr

tools/search/filter.go:169–250  ·  view source on GitHub ↗
(
	left *ResolverResult,
	op fexpr.SignOp,
	right *ResolverResult,
)

Source from the content-addressed store, hash-verified

167}
168
169func buildResolversExpr(
170 left *ResolverResult,
171 op fexpr.SignOp,
172 right *ResolverResult,
173) (dbx.Expression, error) {
174 var expr dbx.Expression
175
176 switch op {
177 case fexpr.SignEq, fexpr.SignAnyEq:
178 expr = resolveEqualExpr(true, left, right)
179 case fexpr.SignNeq, fexpr.SignAnyNeq:
180 expr = resolveEqualExpr(false, left, right)
181 case fexpr.SignLike, fexpr.SignAnyLike:
182 // the right side is a column and therefor wrap it with "%" for contains like behavior
183 if len(right.Params) == 0 {
184 expr = dbx.NewExp(fmt.Sprintf("%s LIKE ('%%' || %s || '%%') ESCAPE '\\'", left.Identifier, right.Identifier), left.Params)
185 } else {
186 expr = dbx.NewExp(fmt.Sprintf("%s LIKE %s ESCAPE '\\'", left.Identifier, right.Identifier), mergeParams(left.Params, wrapLikeParams(right.Params)))
187 }
188 case fexpr.SignNlike, fexpr.SignAnyNlike:
189 // the right side is a column and therefor wrap it with "%" for not-contains like behavior
190 if len(right.Params) == 0 {
191 expr = dbx.NewExp(fmt.Sprintf("%s NOT LIKE ('%%' || %s || '%%') ESCAPE '\\'", left.Identifier, right.Identifier), left.Params)
192 } else {
193 expr = dbx.NewExp(fmt.Sprintf("%s NOT LIKE %s ESCAPE '\\'", left.Identifier, right.Identifier), mergeParams(left.Params, wrapLikeParams(right.Params)))
194 }
195 case fexpr.SignLt, fexpr.SignAnyLt:
196 expr = dbx.NewExp(fmt.Sprintf("%s < %s", left.Identifier, right.Identifier), mergeParams(left.Params, right.Params))
197 case fexpr.SignLte, fexpr.SignAnyLte:
198 expr = dbx.NewExp(fmt.Sprintf("%s <= %s", left.Identifier, right.Identifier), mergeParams(left.Params, right.Params))
199 case fexpr.SignGt, fexpr.SignAnyGt:
200 expr = dbx.NewExp(fmt.Sprintf("%s > %s", left.Identifier, right.Identifier), mergeParams(left.Params, right.Params))
201 case fexpr.SignGte, fexpr.SignAnyGte:
202 expr = dbx.NewExp(fmt.Sprintf("%s >= %s", left.Identifier, right.Identifier), mergeParams(left.Params, right.Params))
203 }
204
205 if expr == nil {
206 return nil, fmt.Errorf("unknown expression operator %q", op)
207 }
208
209 // multi-match expressions
210 if !isAnyMatchOp(op) {
211 if left.MultiMatchSubQuery != nil && right.MultiMatchSubQuery != nil {
212 mm := &manyVsManyExpr{
213 left: left,
214 right: right,
215 op: op,
216 }
217
218 expr = dbx.Enclose(dbx.And(expr, mm))
219 } else if left.MultiMatchSubQuery != nil {
220 mm := &manyVsOneExpr{
221 nullFallback: left.NullFallback,
222 subQuery: left.MultiMatchSubQuery,
223 op: op,
224 otherOperand: right,
225 }
226

Callers 3

resolveTokenizedExprFunction · 0.85
BuildMethod · 0.85
BuildMethod · 0.85

Calls 4

resolveEqualExprFunction · 0.85
mergeParamsFunction · 0.85
wrapLikeParamsFunction · 0.85
isAnyMatchOpFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…