93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
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
|
|
} |