From 38776e35ab45b72fe33287c5f78dc48324d83108 Mon Sep 17 00:00:00 2001 From: go-jet Date: Sun, 21 Mar 2021 17:14:15 +0100 Subject: [PATCH] Remove methods from Table interface that affects receiver object Modifying SQL builder receiver object can produce unwanted side effects. --- internal/jet/table.go | 28 +++++++++----------------- internal/jet/table_test.go | 41 +++----------------------------------- internal/jet/testutils.go | 6 +++--- 3 files changed, 15 insertions(+), 60 deletions(-) diff --git a/internal/jet/table.go b/internal/jet/table.go index 68f5962..78abb99 100644 --- a/internal/jet/table.go +++ b/internal/jet/table.go @@ -15,22 +15,27 @@ type Table interface { columns() []Column SchemaName() string TableName() string - AS(alias string) Alias() string - Schema(schemaName string) } // NewTable creates new table with schema Name, table Name and list of columns -func NewTable(schemaName, name string, columns ...ColumnExpression) SerializerTable { +func NewTable(schemaName, name, alias string, columns ...ColumnExpression) SerializerTable { t := tableImpl{ schemaName: schemaName, name: name, + alias: alias, columnList: columns, } + columnTableName := name + + if alias != "" { + columnTableName = alias + } + for _, c := range columns { - c.setTableName(name) + c.setTableName(columnTableName) } return &t @@ -43,14 +48,6 @@ type tableImpl struct { columnList []ColumnExpression } -func (t *tableImpl) AS(alias string) { - t.alias = alias - - for _, c := range t.columnList { - c.setTableName(alias) - } -} - func (t *tableImpl) SchemaName() string { return t.schemaName } @@ -73,10 +70,6 @@ func (t *tableImpl) Alias() string { return t.alias } -func (t *tableImpl) Schema(schemaName string) { - t.schemaName = schemaName -} - func (t *tableImpl) serialize(statement StatementType, out *SQLBuilder, options ...SerializeOption) { if t == nil { panic("jet: tableImpl is nil") @@ -163,9 +156,6 @@ func (t *joinTableImpl) Alias() string { return "" } -func (t *joinTableImpl) Schema(schemaName string) { -} - func (t *joinTableImpl) serialize(statement StatementType, out *SQLBuilder, options ...SerializeOption) { if t == nil { panic("jet: Join table is nil. ") diff --git a/internal/jet/table_test.go b/internal/jet/table_test.go index 47923cd..b880784 100644 --- a/internal/jet/table_test.go +++ b/internal/jet/table_test.go @@ -6,7 +6,7 @@ import ( ) func TestNewTable(t *testing.T) { - newTable := NewTable("schema", "table", IntegerColumn("intCol")) + newTable := NewTable("schema", "table", "", IntegerColumn("intCol")) require.Equal(t, newTable.SchemaName(), "schema") require.Equal(t, newTable.TableName(), "table") @@ -16,8 +16,8 @@ func TestNewTable(t *testing.T) { } func TestNewJoinTable(t *testing.T) { - newTable1 := NewTable("schema", "table", IntegerColumn("intCol1")) - newTable2 := NewTable("schema", "table2", IntegerColumn("intCol2")) + newTable1 := NewTable("schema", "table", "", IntegerColumn("intCol1")) + newTable2 := NewTable("schema", "table2", "", IntegerColumn("intCol2")) joinTable := NewJoinTable(newTable1, newTable2, InnerJoin, IntegerColumn("intCol1").EQ(IntegerColumn("intCol2"))) @@ -31,38 +31,3 @@ INNER JOIN schema.table2 ON ("intCol1" = "intCol2")`) require.Equal(t, joinTable.columns()[0].Name(), "intCol1") require.Equal(t, joinTable.columns()[1].Name(), "intCol2") } - -func TestSchemaNameSet(t *testing.T) { - newTable := NewTable("schema", "table") - newTable.Schema("foo") - newTable.AS("bar") - assertClauseSerialize(t, newTable, `foo.table AS bar`) -} - -func TestSchemaNameClear(t *testing.T) { - newTable := NewTable("schema", "table") - newTable.Schema("") - newTable.AS("bar") - assertClauseSerialize(t, newTable, `table AS bar`) -} - -func TestNewJoinTableSchemaNameSet(t *testing.T) { - newTable1 := NewTable("schema", "table", IntegerColumn("intCol1")) - newTable2 := NewTable("schema", "table2", IntegerColumn("intCol2")) - - newTable1.Schema("foo") - newTable2.Schema("foo") - - joinTable := NewJoinTable(newTable1, newTable2, InnerJoin, IntegerColumn("intCol1").EQ(IntegerColumn("intCol2"))) - joinTable.Schema("xxx") - - assertClauseSerialize(t, joinTable, `foo.table -INNER JOIN foo.table2 ON ("intCol1" = "intCol2")`) - - require.Equal(t, joinTable.SchemaName(), "foo") - require.Equal(t, joinTable.TableName(), "") - - require.Equal(t, len(joinTable.columns()), 2) - require.Equal(t, joinTable.columns()[0].Name(), "intCol1") - require.Equal(t, joinTable.columns()[1].Name(), "intCol2") -} diff --git a/internal/jet/testutils.go b/internal/jet/testutils.go index 268ae06..43f1f5d 100644 --- a/internal/jet/testutils.go +++ b/internal/jet/testutils.go @@ -26,7 +26,7 @@ var ( table1ColBool = BoolColumn("col_bool") table1ColDate = DateColumn("col_date") ) -var table1 = NewTable("db", "table1", table1Col1, table1ColInt, table1ColFloat, table1Col3, table1ColTime, table1ColTimez, table1ColBool, table1ColDate, table1ColTimestamp, table1ColTimestampz) +var table1 = NewTable("db", "table1", "", table1Col1, table1ColInt, table1ColFloat, table1Col3, table1ColTime, table1ColTimez, table1ColBool, table1ColDate, table1ColTimestamp, table1ColTimestampz) var ( table2Col3 = IntegerColumn("col3") @@ -41,14 +41,14 @@ var ( table2ColTimestampz = TimestampzColumn("col_timestampz") table2ColDate = DateColumn("col_date") ) -var table2 = NewTable("db", "table2", table2Col3, table2Col4, table2ColInt, table2ColFloat, table2ColStr, table2ColBool, table2ColTime, table2ColTimez, table2ColDate, table2ColTimestamp, table2ColTimestampz) +var table2 = NewTable("db", "table2", "", table2Col3, table2Col4, table2ColInt, table2ColFloat, table2ColStr, table2ColBool, table2ColTime, table2ColTimez, table2ColDate, table2ColTimestamp, table2ColTimestampz) var ( table3Col1 = IntegerColumn("col1") table3ColInt = IntegerColumn("col_int") table3StrCol = StringColumn("col2") ) -var table3 = NewTable("db", "table3", table3Col1, table3ColInt, table3StrCol) +var table3 = NewTable("db", "table3", "", table3Col1, table3ColInt, table3StrCol) func assertClauseSerialize(t *testing.T, clause Serializer, query string, args ...interface{}) { out := SQLBuilder{Dialect: defaultDialect}