From 3bfe17c88a994b364744605cc02e8f0e1335c5b0 Mon Sep 17 00:00:00 2001 From: Sven Rebhan Date: Wed, 18 Sep 2024 18:31:19 +0200 Subject: [PATCH] feat: Detect name conflicts after name resolution --- cmd/influx_tools/parquet/schema.go | 36 ++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/cmd/influx_tools/parquet/schema.go b/cmd/influx_tools/parquet/schema.go index 5e0f85fa3df..dfd8cae7bd3 100644 --- a/cmd/influx_tools/parquet/schema.go +++ b/cmd/influx_tools/parquet/schema.go @@ -143,6 +143,8 @@ func (s *schemaCreator) extractSchema(ctx context.Context) (err error) { func (s *schemaCreator) validate() (bool, error) { var hasConflicts bool + + // Check for conflicting field types var typeConflicts []string for field := range s.conflicts { hasConflicts = true @@ -151,9 +153,10 @@ func (s *schemaCreator) validate() (bool, error) { } } if len(typeConflicts) > 0 { - return true, fmt.Errorf("unresolved type conflicts for %q", strings.Join(typeConflicts, ",")) + return true, fmt.Errorf("unresolved type conflicts for %s", strings.Join(typeConflicts, ",")) } + // Check for name clashes between tags and fields var nameConflicts []string for _, field := range s.fieldKeys { for _, tag := range s.tags { @@ -166,7 +169,36 @@ func (s *schemaCreator) validate() (bool, error) { } } if len(nameConflicts) > 0 { - return true, fmt.Errorf("unresolved name conflicts for %q", strings.Join(nameConflicts, ",")) + return true, fmt.Errorf("unresolved name conflicts for %s", strings.Join(nameConflicts, ",")) + } + + // Check for name clashes after resolving field names + resolvedFieldKeys := make([]string, 0, len(s.fieldKeys)) + for _, field := range s.fieldKeys { + if n, found := s.nameResolutions[field]; found { + resolvedFieldKeys = append(resolvedFieldKeys, n) + } else { + resolvedFieldKeys = append(resolvedFieldKeys, field) + } + } + var resolvedConflicts []string + for i, field := range resolvedFieldKeys { + origField := s.fieldKeys[i] + for _, tag := range s.tags { + if tag == field { + hasConflicts = true + resolvedConflicts = append(resolvedConflicts, "resolved '"+origField+"' with tag '"+tag+"'") + } + } + for j, f := range resolvedFieldKeys { + if i > j && field == f { + hasConflicts = true + resolvedConflicts = append(resolvedConflicts, "resolved '"+origField+"' with field '"+f+"'") + } + } + } + if len(resolvedConflicts) > 0 { + return true, fmt.Errorf("conflicts after field name resolution for %s", strings.Join(resolvedConflicts, ", ")) } return hasConflicts, nil