Skip to content

Commit

Permalink
sort the tables (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
austin-artificial committed May 30, 2023
1 parent d02edee commit dc118b6
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
13 changes: 13 additions & 0 deletions analyzer/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package analyzer
import (
"errors"
"fmt"
"sort"

"github.com/sirupsen/logrus"

Expand Down Expand Up @@ -59,6 +60,8 @@ func (a analyzer) Analyze() (*database.Result, error) {
if err != nil {
return nil, err
}
// sort the tables so the output is more deterministic
sortTables(selectedTables)

tableResults, err := a.GetColumnsAndConstraints(db, selectedTables)
if err != nil {
Expand All @@ -68,6 +71,16 @@ func (a analyzer) Analyze() (*database.Result, error) {
return &database.Result{Tables: tableResults}, nil
}

func sortTables(tables []database.TableDetail) {
sort.SliceStable(tables, func(i, j int) bool {
if tables[i].Schema != tables[j].Schema {
return tables[i].Schema < tables[j].Schema
}
return tables[i].Name < tables[j].Name
})

}

func (a analyzer) GetConnectionString() (string, error) {
if connectionString := a.config.ConnectionString(); connectionString != "" {
return connectionString, nil
Expand Down
40 changes: 40 additions & 0 deletions analyzer/analyzer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,4 +257,44 @@ func TestAnalyzer_Analyze(t *testing.T) {
assert.Nil(t, err)
assert.NotNil(t, result)
})
t.Run("Sorts the tables", func(t *testing.T) {
// Arrange
analyzer, configMock, connectionFactoryMock, questionerMock := getAnalyzerWithMocks()
connectorMock := mocks.Connector{}
configMock.On("ConnectionString").Return("validConnectionString").Once()
connectionFactoryMock.On("NewConnector", "validConnectionString").Return(&connectorMock, nil).Once()
connectorMock.On("Connect").Return(nil).Once()
connectorMock.On("Close").Return().Once()
configMock.On("Schemas").Return([]string{"schemaA", "schemaB"}).Once()
// The tables returned are unsorted
configMock.On("SelectedTables").Return([]string{
"schemaB.tableB",
"schemaA.tableB",
"schemaA.tableA",
"schemaB.tableA"}).Once()
connectorMock.On("GetColumns", database.TableDetail{Schema: "schemaA", Name: "tableA"}).Return([]database.ColumnResult{}, nil).Once()
connectorMock.On("GetColumns", database.TableDetail{Schema: "schemaA", Name: "tableB"}).Return([]database.ColumnResult{}, nil).Once()
connectorMock.On("GetColumns", database.TableDetail{Schema: "schemaB", Name: "tableA"}).Return([]database.ColumnResult{}, nil).Once()
connectorMock.On("GetColumns", database.TableDetail{Schema: "schemaB", Name: "tableB"}).Return([]database.ColumnResult{}, nil).Once()
connectorMock.On("GetConstraints", database.TableDetail{Schema: "schemaA", Name: "tableA"}).Return([]database.ConstraintResult{}, nil).Once()
connectorMock.On("GetConstraints", database.TableDetail{Schema: "schemaA", Name: "tableB"}).Return([]database.ConstraintResult{}, nil).Once()
connectorMock.On("GetConstraints", database.TableDetail{Schema: "schemaB", Name: "tableA"}).Return([]database.ConstraintResult{}, nil).Once()
connectorMock.On("GetConstraints", database.TableDetail{Schema: "schemaB", Name: "tableB"}).Return([]database.ConstraintResult{}, nil).Once()

// Act
result, err := analyzer.Analyze()

// Assert
configMock.AssertExpectations(t)
connectionFactoryMock.AssertExpectations(t)
questionerMock.AssertExpectations(t)
connectorMock.AssertExpectations(t)
assert.Nil(t, err)
assert.NotNil(t, result)
// The tables are now sorted
assert.Equal(t, result.Tables[0].Table, database.TableDetail{Schema: "schemaA", Name: "tableA"})
assert.Equal(t, result.Tables[1].Table, database.TableDetail{Schema: "schemaA", Name: "tableB"})
assert.Equal(t, result.Tables[2].Table, database.TableDetail{Schema: "schemaB", Name: "tableA"})
assert.Equal(t, result.Tables[3].Table, database.TableDetail{Schema: "schemaB", Name: "tableB"})
})
}

0 comments on commit dc118b6

Please sign in to comment.