From edb4069f2e8736b6c7750acde2b35ae1b3d4d0b7 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 9 Oct 2023 16:34:05 +0200 Subject: [PATCH] Support validation of arrays of arrays of nested objects --- internal/fields/validate.go | 7 ++++ internal/fields/validate_test.go | 57 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/internal/fields/validate.go b/internal/fields/validate.go index bc5f46cadc..11ee9390ee 100644 --- a/internal/fields/validate.go +++ b/internal/fields/validate.go @@ -797,6 +797,13 @@ func (v *Validator) parseSingleElementValue(key string, definition FieldDefiniti return nil } return errs + case []interface{}: + // This can be an array of array of objects. Elasticsearh will probably + // flatten this. So even if this is quite unexpected, let's try to handle it. + if v.specVersion.LessThan(semver3_0_1) { + break + } + return forEachElementValue(key, definition, val, doc, v.parseSingleElementValue) default: return fmt.Errorf("field %q is a group of fields, it cannot store values", key) } diff --git a/internal/fields/validate_test.go b/internal/fields/validate_test.go index d6c3eb8824..0047c45d54 100644 --- a/internal/fields/validate_test.go +++ b/internal/fields/validate_test.go @@ -679,6 +679,63 @@ func Test_parseElementValue(t *testing.T) { } }, }, + // arrays of elements in nested objects + { + key: "good_array_of_nested", + value: []interface{}{ + []interface{}{ + map[string]interface{}{ + "id": "somehost-id", + "hostname": "somehost", + }, + }, + }, + definition: FieldDefinition{ + Name: "good_array_of_nested", + Type: "nested", + Fields: []FieldDefinition{ + { + Name: "id", + Type: "keyword", + }, + { + Name: "hostname", + Type: "keyword", + }, + }, + }, + specVersion: *semver3_0_1, + }, + { + key: "array_of_nested", + value: []interface{}{ + []interface{}{ + map[string]interface{}{ + "id": "somehost-id", + "hostname": "somehost", + }, + }, + }, + definition: FieldDefinition{ + Name: "array_of_nested", + Type: "nested", + Fields: []FieldDefinition{ + { + Name: "id", + Type: "keyword", + }, + }, + }, + specVersion: *semver3_0_1, + fail: true, + assertError: func(t *testing.T, err error) { + var errs multierror.Error + require.ErrorAs(t, err, &errs) + if assert.Len(t, errs, 1) { + assert.Contains(t, errs[0].Error(), `"array_of_nested.hostname" is undefined`) + } + }, + }, } { t.Run(test.key, func(t *testing.T) {