package index import ( "fmt" "github.com/iancoleman/orderedmap" "go.mongodb.org/mongo-driver/bson" "git.pyer.club/kingecg/godocdb/storage" ) // IndexType 表示索引类型 type IndexType string const ( SingleField IndexType = "single" Composite IndexType = "composite" ) // IndexMetadata 索引元数据 type IndexMetadata struct { Name string Type IndexType KeyFields []string } // IndexStore 管理索引的存储和查询 type IndexStore struct { storage *storage.LevelDBStorage } // NewIndexStore 创建新的索引存储实例 func NewIndexStore(path string) (*IndexStore, error) { storage, err := storage.NewLevelDBStorage(path) if err != nil { return nil, err } return &IndexStore{storage: storage}, nil } // CreateIndex 创建索引 func (is *IndexStore) CreateIndex(indexName string, indexType IndexType, keyFields []string) error { // 存储索引元数据 metadata := IndexMetadata{ Name: indexName, Type: indexType, KeyFields: keyFields, } data, err := bson.Marshal(metadata) if err != nil { return fmt.Errorf("failed to marshal index metadata: %v", err) } key := []byte(fmt.Sprintf("indexes:metadata:%s", indexName)) if err := is.storage.Put(key, data); err != nil { return err } // 初始化索引存储结构 indexKey := fmt.Sprintf("indexes:data:%s", indexName) index := orderedmap.New() indexData, _ := bson.Marshal(index) return is.storage.Put([]byte(indexKey), indexData) } // DropIndex 删除索引 func (is *IndexStore) DropIndex(indexName string) error { // 删除元数据 metadataKey := []byte(fmt.Sprintf("indexes:metadata:%s", indexName)) if err := is.storage.Delete(metadataKey); err != nil { return err } // 删除索引数据 indexKey := []byte(fmt.Sprintf("indexes:data:%s", indexName)) return is.storage.Delete(indexKey) } // GetIndexMetadata 获取索引元数据 func (is *IndexStore) GetIndexMetadata(indexName string) (*IndexMetadata, error) { key := []byte(fmt.Sprintf("indexes:metadata:%s", indexName)) rawData, err := is.storage.Get(key) if err != nil { return nil, fmt.Errorf("index not found: %v", err) } var metadata IndexMetadata if err := bson.Unmarshal(rawData, &metadata); err != nil { return nil, err } return &metadata, nil }