added :lower modifier

This commit is contained in:
Gani Georgiev
2024-12-06 16:08:39 +02:00
parent 1abd6ca5c0
commit e8f49c31e4
34 changed files with 181 additions and 93 deletions

View File

@@ -15,6 +15,7 @@ import (
"github.com/pocketbase/pocketbase/tools/list"
"github.com/pocketbase/pocketbase/tools/search"
"github.com/pocketbase/pocketbase/tools/security"
"github.com/spf13/cast"
)
// maxNestedRels defines the max allowed nested relations depth.
@@ -113,6 +114,11 @@ func (r *runner) run() (*search.ResolverResult, error) {
if modifier == lengthModifier && len(r.activeProps) == 3 {
return r.processRequestInfoLengthModifier(bodyField)
}
// check for body arrayble fields ":lower" modifier
if modifier == lowerModifier && len(r.activeProps) == 3 {
return r.processRequestInfoLowerModifier(bodyField)
}
}
// some other @request.* static field
@@ -262,6 +268,19 @@ func toSlice(value any) []any {
return result
}
func (r *runner) processRequestInfoLowerModifier(bodyField Field) (*search.ResolverResult, error) {
rawValue := cast.ToString(r.resolver.requestInfo.Body[bodyField.GetName()])
placeholder := "infoLower" + bodyField.GetName() + security.PseudorandomString(6)
result := &search.ResolverResult{
Identifier: "LOWER({:" + placeholder + "})",
Params: dbx.Params{placeholder: rawValue},
}
return result, nil
}
func (r *runner) processRequestInfoLengthModifier(bodyField Field) (*search.ResolverResult, error) {
if _, ok := bodyField.(MultiValuer); !ok {
return nil, fmt.Errorf("field %q doesn't support multivalue operations", bodyField.GetName())
@@ -661,6 +680,21 @@ func (r *runner) processLastProp(collection *Collection, prop string) (*search.R
cleanFieldName := inflector.Columnify(field.GetName())
// field with ":lower" modifier
// -------------------------------------------------------
if modifier == lowerModifier {
result := &search.ResolverResult{
Identifier: "LOWER([[" + r.activeTableAlias + "." + cleanFieldName + "]])",
}
if r.withMultiMatch {
r.multiMatch.valueIdentifier = "LOWER([[" + r.multiMatchActiveTableAlias + "." + cleanFieldName + "]])"
result.MultiMatchSubQuery = r.multiMatch
}
return result, nil
}
// arrayable fields with ":length" modifier
// -------------------------------------------------------
if modifier == lengthModifier && isMultivaluer {