説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index_manager.go 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // index_manager.go
  2. package sqldef
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. // IndexManager 索引管理器
  8. type IndexManager struct {
  9. ddlExecutor DDLExecutor
  10. }
  11. // IndexDefinition 索引定义
  12. type IndexDefinition struct {
  13. TableName string
  14. IndexName string
  15. Columns []string
  16. IsUnique bool
  17. IsPrimary bool
  18. }
  19. // NewIndexManager 创建索引管理器
  20. func NewIndexManager(executor DDLExecutor) *IndexManager {
  21. return &IndexManager{
  22. ddlExecutor: executor,
  23. }
  24. }
  25. // CreateIndex 创建索引
  26. func (im *IndexManager) CreateIndex(idx *IndexDefinition) error {
  27. var indexType string
  28. if idx.IsPrimary {
  29. indexType = "PRIMARY KEY"
  30. } else if idx.IsUnique {
  31. indexType = "UNIQUE INDEX"
  32. } else {
  33. indexType = "INDEX"
  34. }
  35. columns := strings.Join(idx.Columns, ", ")
  36. sql := fmt.Sprintf("CREATE %s %s ON %s (%s)",
  37. indexType, idx.IndexName, idx.TableName, columns)
  38. return im.ddlExecutor.ExecuteDDL(sql)
  39. }
  40. // DropIndex 删除索引
  41. func (im *IndexManager) DropIndex(tableName, indexName string) error {
  42. sql := fmt.Sprintf("DROP INDEX %s ON %s", indexName, tableName)
  43. return im.ddlExecutor.ExecuteDDL(sql)
  44. }
  45. // TableManager 添加索引相关方法
  46. func (tm *TableManager) SetIndexManager(im *IndexManager) {
  47. // 可以在这里关联索引管理器
  48. }
  49. // CreateIndexesFromDDL 从DDL语句中解析并创建索引
  50. func (tm *TableManager) CreateIndexesFromDDL() error {
  51. // 获取所有表
  52. tables := tm.GetRegisteredTables()
  53. for _, tableName := range tables {
  54. ddl, exists := tm.GetTableDDL(tableName)
  55. if !exists {
  56. continue
  57. }
  58. // 解析DDL中的索引信息
  59. indexes := parseIndexesFromDDL(ddl)
  60. // 创建索引
  61. for _, index := range indexes {
  62. if err := tm.ddlExecutor.ExecuteDDL(index); err != nil {
  63. return fmt.Errorf("创建索引失败: %w", err)
  64. }
  65. }
  66. }
  67. return nil
  68. }
  69. // parseIndexesFromDDL 从DDL语句中解析索引
  70. func parseIndexesFromDDL(ddl string) []string {
  71. var indexes []string
  72. lines := strings.Split(ddl, "\n")
  73. for _, line := range lines {
  74. line = strings.TrimSpace(line)
  75. if strings.Contains(line, "INDEX") || strings.Contains(line, "PRIMARY KEY") {
  76. // 移除末尾的逗号
  77. line = strings.TrimSuffix(line, ",")
  78. indexes = append(indexes, line)
  79. }
  80. }
  81. return indexes
  82. }