mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-09-12 21:58:58 -04:00
fix(search): reject CaseInsensitive on non-keyword/path fields
CaseInsensitive routes queries to a <field>_lowercase sibling that is only generated for keyword/path fields, so marking any other type CaseInsensitive would silently match nothing. Validate now rejects it up front.
This commit is contained in:
1 parent
ac3c2b4579
commit
b09834f98d
2 files changed
+27
-6
No files matched your search
@@ -17,17 +17,28 @@ func Validate(t reflect.Type, overrides map[string]FieldOpts) error {
|
||||
return nil
|
||||
}
|
||||
names := collectNames(t, "")
|
||||
var unknown []string
|
||||
for k := range overrides {
|
||||
var unknown, miscased []string
|
||||
for k, opts := range overrides {
|
||||
if _, ok := names[k]; !ok {
|
||||
unknown = append(unknown, k)
|
||||
continue
|
||||
}
|
||||
// CaseInsensitive routes queries to a <field>_lowercase sibling, which is
|
||||
// only generated for keyword/path fields; on any other type the query
|
||||
// would target a non-existent field and silently match nothing.
|
||||
if opts.caseInsensitive() && !isCasedType(opts) {
|
||||
miscased = append(miscased, k)
|
||||
}
|
||||
}
|
||||
if len(unknown) == 0 {
|
||||
return nil
|
||||
if len(unknown) > 0 {
|
||||
sort.Strings(unknown)
|
||||
return fmt.Errorf("mapping: unknown override keys: %s", strings.Join(unknown, ", "))
|
||||
}
|
||||
sort.Strings(unknown)
|
||||
return fmt.Errorf("mapping: unknown override keys: %s", strings.Join(unknown, ", "))
|
||||
if len(miscased) > 0 {
|
||||
sort.Strings(miscased)
|
||||
return fmt.Errorf("mapping: CaseInsensitive is only valid on keyword/path fields: %s", strings.Join(miscased, ", "))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func collectNames(t reflect.Type, prefix string) map[string]struct{} {
|
||||
|
||||
@@ -44,4 +44,14 @@ var _ = Describe("Validate", func() {
|
||||
It("accepts empty overrides", func() {
|
||||
Expect(Validate(reflect.TypeFor[sample](), nil)).To(Succeed())
|
||||
})
|
||||
|
||||
It("rejects CaseInsensitive on a non-keyword/path field", func() {
|
||||
True := true
|
||||
err := Validate(reflect.TypeFor[sample](), map[string]FieldOpts{
|
||||
"Name": {Type: TypeFulltext, CaseInsensitive: &True},
|
||||
})
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err.Error()).To(ContainSubstring("Name"))
|
||||
Expect(err.Error()).To(ContainSubstring("CaseInsensitive"))
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user