From b42bf64ad43ee8d30aa8623225fae7b46f6ace9c Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Tue, 16 May 2023 19:40:33 +0300 Subject: [PATCH 1/3] flatten stripping relations --- schema/table.go | 21 ++++++++------------- schema/table_test.go | 4 ++++ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/schema/table.go b/schema/table.go index 58b4bf3493..fefbbd5754 100644 --- a/schema/table.go +++ b/schema/table.go @@ -173,9 +173,10 @@ func (tt Tables) FilterDfsFunc(include, exclude func(*Table) bool, skipDependent } func (tt Tables) ToArrowSchemas() Schemas { - schemas := make(Schemas, 0, len(tt.FlattenTables())) - for _, t := range tt.FlattenTables() { - schemas = append(schemas, t.ToArrowSchema()) + flattened := tt.FlattenTables() + schemas := make(Schemas, len(flattened)) + for i, t := range flattened { + schemas[i] = t.ToArrowSchema() } return schemas } @@ -228,19 +229,13 @@ func (tt Tables) FilterDfs(tables, skipTables []string, skipDependentTables bool func (tt Tables) FlattenTables() Tables { tables := make(Tables, 0, len(tt)) for _, t := range tt { - tables = append(tables, t) + table := *t + table.Relations = nil + tables = append(tables, &table) tables = append(tables, t.Relations.FlattenTables()...) } - tableNames := make(map[string]bool) - dedupedTables := make(Tables, 0, len(tables)) - for _, t := range tables { - if _, found := tableNames[t.Name]; !found { - dedupedTables = append(dedupedTables, t) - tableNames[t.Name] = true - } - } - return dedupedTables + return tables } func (tt Tables) TableNames() []string { diff --git a/schema/table_test.go b/schema/table_test.go index cc3aadb1d0..a19b00042e 100644 --- a/schema/table_test.go +++ b/schema/table_test.go @@ -27,6 +27,10 @@ func TestTablesFlatten(t *testing.T) { if len(tables) != 2 { t.Fatal("expected 2 tables") } + tables = tables.FlattenTables() + if len(tables) != 2 { + t.Fatal("expected 2 tables") + } } func TestTablesFilterDFS(t *testing.T) { From 7fd6b1dc8133485c1b6ac41d2120f9d989079138 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Wed, 17 May 2023 09:33:28 +0300 Subject: [PATCH 2/3] dedup --- schema/table.go | 11 ++++++++++- schema/table_test.go | 23 +++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/schema/table.go b/schema/table.go index fefbbd5754..2174bff848 100644 --- a/schema/table.go +++ b/schema/table.go @@ -235,7 +235,16 @@ func (tt Tables) FlattenTables() Tables { tables = append(tables, t.Relations.FlattenTables()...) } - return tables + seen := make(map[string]struct{}) + deduped := make(Tables, 0, len(tables)) + for _, t := range tables { + if _, found := seen[t.Name]; !found { + deduped = append(deduped, t) + seen[t.Name] = struct{}{} + } + } + + return deduped } func (tt Tables) TableNames() []string { diff --git a/schema/table_test.go b/schema/table_test.go index a19b00042e..c70c2b3f2b 100644 --- a/schema/table_test.go +++ b/schema/table_test.go @@ -5,6 +5,7 @@ import ( "github.com/apache/arrow/go/v13/arrow" "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" ) var testTable = &Table{ @@ -19,14 +20,24 @@ var testTable = &Table{ } func TestTablesFlatten(t *testing.T) { - tables := Tables{testTable}.FlattenTables() - if len(tables) != 2 { - t.Fatal("expected 2 tables") + srcTables := Tables{testTable} + tables := srcTables.FlattenTables() + require.Equal(t, 1, len(srcTables)) // verify that the source Tables were left untouched + require.Equal(t, 1, len(testTable.Relations)) + require.Equal(t, 2, len(tables)) + for _, table := range tables { + require.Nil(t, table.Relations) } - tables = Tables{testTable}.FlattenTables() - if len(tables) != 2 { - t.Fatal("expected 2 tables") + + srcTables = Tables{testTable, testTable} + tables = srcTables.FlattenTables() + require.Equal(t, 2, len(srcTables)) // verify that the source Tables were left untouched + require.Equal(t, 1, len(testTable.Relations)) + require.Equal(t, 2, len(tables)) + for _, table := range tables { + require.Nil(t, table.Relations) } + tables = tables.FlattenTables() if len(tables) != 2 { t.Fatal("expected 2 tables") From 246059cd811ab49fdadaecf71f7f75c73c5f8df3 Mon Sep 17 00:00:00 2001 From: candiduslynx Date: Wed, 17 May 2023 09:51:30 +0300 Subject: [PATCH 3/3] clip --- schema/table.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/schema/table.go b/schema/table.go index 2174bff848..a0a0940f23 100644 --- a/schema/table.go +++ b/schema/table.go @@ -7,6 +7,7 @@ import ( "github.com/apache/arrow/go/v13/arrow" "github.com/cloudquery/plugin-sdk/v3/internal/glob" + "golang.org/x/exp/slices" ) // TableResolver is the main entry point when a table is sync is called. @@ -244,7 +245,7 @@ func (tt Tables) FlattenTables() Tables { } } - return deduped + return slices.Clip(deduped) } func (tt Tables) TableNames() []string {