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:
Dominik Schmidt committed 2026-08-18 17:12:32 +02:00
1 parent ac3c2b4579
commit b09834f98d
2 files changed
+27 -6

No files matched your search

+17 -6
View File
@@ -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"))
})
})