github.com/weaviate/weaviate@v1.24.6/entities/schema/nested_properties.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package schema 13 14 import "github.com/weaviate/weaviate/entities/models" 15 16 // merges nPropsExt with nPropsBase 17 // returns new slice without changing input ones 18 // and bool indicating whether there was changes done comparing to base slice 19 func MergeRecursivelyNestedProperties(nPropsBase, nPropsExt []*models.NestedProperty, 20 ) ([]*models.NestedProperty, bool) { 21 merged := false 22 nProps := make([]*models.NestedProperty, len(nPropsBase), len(nPropsBase)+len(nPropsExt)) 23 copy(nProps, nPropsBase) 24 25 existingIndexMap := map[string]int{} 26 for index := range nProps { 27 existingIndexMap[nProps[index].Name] = index 28 } 29 30 for _, nProp := range nPropsExt { 31 index, exists := existingIndexMap[nProp.Name] 32 if !exists { 33 existingIndexMap[nProp.Name] = len(nProps) 34 nProps = append(nProps, nProp) 35 merged = true 36 } else if _, isNested := AsNested(nProps[index].DataType); isNested { 37 if mergedProps, mergedNested := MergeRecursivelyNestedProperties(nProps[index].NestedProperties, 38 nProp.NestedProperties, 39 ); mergedNested { 40 nPropCopy := *nProps[index] 41 nProps[index] = &nPropCopy 42 nProps[index].NestedProperties = mergedProps 43 merged = true 44 } 45 } 46 } 47 48 return nProps, merged 49 }