// index_manager.go package sqldef import ( "fmt" "strings" ) // IndexManager 索引管理器 type IndexManager struct { ddlExecutor DDLExecutor } // IndexDefinition 索引定义 type IndexDefinition struct { TableName string IndexName string Columns []string IsUnique bool IsPrimary bool } // NewIndexManager 创建索引管理器 func NewIndexManager(executor DDLExecutor) *IndexManager { return &IndexManager{ ddlExecutor: executor, } } // CreateIndex 创建索引 func (im *IndexManager) CreateIndex(idx *IndexDefinition) error { var indexType string if idx.IsPrimary { indexType = "PRIMARY KEY" } else if idx.IsUnique { indexType = "UNIQUE INDEX" } else { indexType = "INDEX" } columns := strings.Join(idx.Columns, ", ") sql := fmt.Sprintf("CREATE %s %s ON %s (%s)", indexType, idx.IndexName, idx.TableName, columns) return im.ddlExecutor.ExecuteDDL(sql) } // DropIndex 删除索引 func (im *IndexManager) DropIndex(tableName, indexName string) error { sql := fmt.Sprintf("DROP INDEX %s ON %s", indexName, tableName) return im.ddlExecutor.ExecuteDDL(sql) } // TableManager 添加索引相关方法 func (tm *TableManager) SetIndexManager(im *IndexManager) { // 可以在这里关联索引管理器 } // CreateIndexesFromDDL 从DDL语句中解析并创建索引 func (tm *TableManager) CreateIndexesFromDDL() error { // 获取所有表 tables := tm.GetRegisteredTables() for _, tableName := range tables { ddl, exists := tm.GetTableDDL(tableName) if !exists { continue } // 解析DDL中的索引信息 indexes := parseIndexesFromDDL(ddl) // 创建索引 for _, index := range indexes { if err := tm.ddlExecutor.ExecuteDDL(index); err != nil { return fmt.Errorf("创建索引失败: %w", err) } } } return nil } // parseIndexesFromDDL 从DDL语句中解析索引 func parseIndexesFromDDL(ddl string) []string { var indexes []string lines := strings.Split(ddl, "\n") for _, line := range lines { line = strings.TrimSpace(line) if strings.Contains(line, "INDEX") || strings.Contains(line, "PRIMARY KEY") { // 移除末尾的逗号 line = strings.TrimSuffix(line, ",") indexes = append(indexes, line) } } return indexes }