From 49de041998ae8946c399126de2fedbb7e5bd916b Mon Sep 17 00:00:00 2001 From: Daisuke Maki Date: Fri, 17 Feb 2017 07:20:50 +0900 Subject: [PATCH] Change how to identify an index --- format/format_test.go | 2 +- model/index.go | 20 +++++++++++++++----- model/interface.go | 1 + parser.go | 18 +++++++++--------- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/format/format_test.go b/format/format_test.go index 5a57a39..5f5d4f9 100644 --- a/format/format_test.go +++ b/format/format_test.go @@ -22,7 +22,7 @@ func TestFormat(t *testing.T) { opt := model.NewTableOption("ENGINE", "InnoDB", false) table.AddOption(opt) - index := model.NewIndex(model.IndexKindPrimaryKey) + index := model.NewIndex(model.IndexKindPrimaryKey, table.ID()) index.SetName("hoge_pk") index.AddColumns("fuga") table.AddIndex(index) diff --git a/model/index.go b/model/index.go index f463e3e..3ac8dce 100644 --- a/model/index.go +++ b/model/index.go @@ -3,26 +3,36 @@ package model import ( "crypto/sha256" "fmt" - "io" ) // NewIndex creates a new index with the given index kind. -func NewIndex(kind IndexKind) Index { +func NewIndex(kind IndexKind, table string) Index { return &index{ - kind: kind, + kind: kind, + table: table, } } func (stmt *index) ID() string { // This is tricky. and index may or may not have a name. It would // have been so much easier if we did, but we don't, so we'll fake - // something + // something. + // + // In case we don't have a name, we need to know the table, the kind, + // the type, // the column(s), and the reference(s). name := "index" if stmt.HasName() { name = name + "#" + stmt.Name() } h := sha256.New() - io.WriteString(h, fmt.Sprintf("%v, %v, %v, %v, %v, %v", stmt.symbol, stmt.kind, stmt.name, stmt.typ, stmt.columns, stmt.reference)) + fmt.Fprintf(h, + "%s.%s.%s.%v.%s", + stmt.table, + stmt.kind, + stmt.typ, + stmt.columns, + stmt.reference, + ) return fmt.Sprintf("%s#%x", name, h.Sum(nil)) } diff --git a/model/interface.go b/model/interface.go index 613b2b4..12531c8 100644 --- a/model/interface.go +++ b/model/interface.go @@ -73,6 +73,7 @@ type index struct { kind IndexKind name maybeString typ IndexType + table string columns []string // TODO Options. reference Reference diff --git a/parser.go b/parser.go index 12e36f4..e650687 100644 --- a/parser.go +++ b/parser.go @@ -360,17 +360,17 @@ func (p *Parser) parseTableConstraint(ctx *parseCtx, table model.Table) error { var index model.Index switch t := ctx.peek(); t.Type { case PRIMARY: - index = model.NewIndex(model.IndexKindPrimaryKey) + index = model.NewIndex(model.IndexKindPrimaryKey, table.ID()) if err := p.parseColumnIndexPrimaryKey(ctx, index); err != nil { return err } case UNIQUE: - index = model.NewIndex(model.IndexKindUnique) + index = model.NewIndex(model.IndexKindUnique, table.ID()) if err := p.parseColumnIndexUniqueKey(ctx, index); err != nil { return err } case FOREIGN: - index = model.NewIndex(model.IndexKindForeignKey) + index = model.NewIndex(model.IndexKindForeignKey, table.ID()) if err := p.parseColumnIndexForeignKey(ctx, index); err != nil { return err } @@ -387,7 +387,7 @@ func (p *Parser) parseTableConstraint(ctx *parseCtx, table model.Table) error { } func (p *Parser) parseTablePrimaryKey(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindPrimaryKey) + index := model.NewIndex(model.IndexKindPrimaryKey, table.ID()) if err := p.parseColumnIndexPrimaryKey(ctx, index); err != nil { return err } @@ -396,7 +396,7 @@ func (p *Parser) parseTablePrimaryKey(ctx *parseCtx, table model.Table) error { } func (p *Parser) parseTableUniqueKey(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindUnique) + index := model.NewIndex(model.IndexKindUnique, table.ID()) if err := p.parseColumnIndexUniqueKey(ctx, index); err != nil { return err } @@ -405,7 +405,7 @@ func (p *Parser) parseTableUniqueKey(ctx *parseCtx, table model.Table) error { } func (p *Parser) parseTableIndex(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindNormal) + index := model.NewIndex(model.IndexKindNormal, table.ID()) if err := p.parseColumnIndexKey(ctx, index); err != nil { return err } @@ -414,7 +414,7 @@ func (p *Parser) parseTableIndex(ctx *parseCtx, table model.Table) error { } func (p *Parser) parseTableFulltextIndex(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindFullText) + index := model.NewIndex(model.IndexKindFullText, table.ID()) if err := p.parseColumnIndexFullTextKey(ctx, index); err != nil { return err } @@ -423,7 +423,7 @@ func (p *Parser) parseTableFulltextIndex(ctx *parseCtx, table model.Table) error } func (p *Parser) parseTableSpatialIndex(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindSpatial) + index := model.NewIndex(model.IndexKindSpatial, table.ID()) if err := p.parseColumnIndexSpatialKey(ctx, index); err != nil { return err } @@ -432,7 +432,7 @@ func (p *Parser) parseTableSpatialIndex(ctx *parseCtx, table model.Table) error } func (p *Parser) parseTableForeignKey(ctx *parseCtx, table model.Table) error { - index := model.NewIndex(model.IndexKindForeignKey) + index := model.NewIndex(model.IndexKindForeignKey, table.ID()) if err := p.parseColumnIndexForeignKey(ctx, index); err != nil { return err }