| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // 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
- }
|