132 lines
2.8 KiB
Go
132 lines
2.8 KiB
Go
|
package api
|
|||
|
|
|||
|
import (
|
|||
|
"sync"
|
|||
|
)
|
|||
|
|
|||
|
import (
|
|||
|
// "fmt"
|
|||
|
|
|||
|
// "go.mongodb.org/mongo-driver/bson"
|
|||
|
"git.pyer.club/kingecg/godocdb/document"
|
|||
|
"git.pyer.club/kingecg/godocdb/index"
|
|||
|
)
|
|||
|
|
|||
|
// Collection MongoDB兼容的集合结构
|
|||
|
type Collection struct {
|
|||
|
name string
|
|||
|
indexStore *index.IndexStore
|
|||
|
documentStore *document.DocumentStore
|
|||
|
}
|
|||
|
|
|||
|
var (
|
|||
|
indexStores = make(map[string]*index.IndexStore)
|
|||
|
indexStoreMu sync.RWMutex
|
|||
|
)
|
|||
|
|
|||
|
// NewCollection 创建新的集合实例
|
|||
|
func NewCollection(name string, storagePath string) (*Collection, error) {
|
|||
|
ds, err := document.NewDocumentStore(storagePath)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
is, err := getIndexStore(storagePath)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
return &Collection{
|
|||
|
name: name,
|
|||
|
documentStore: ds,
|
|||
|
indexStore: is,
|
|||
|
}, nil
|
|||
|
}
|
|||
|
|
|||
|
// InsertOne 插入单个文档
|
|||
|
func (coll *Collection) InsertOne(doc interface{}) error {
|
|||
|
// 自动生成文档ID
|
|||
|
docID := generateID()
|
|||
|
|
|||
|
// 将collection信息传递给文档管理层和索引管理层
|
|||
|
if err := coll.documentStore.StoreDocument(coll.name, docID, doc); err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// 创建相关索引(需要实现generateID)
|
|||
|
return coll.createRelatedIndexes(doc)
|
|||
|
}
|
|||
|
|
|||
|
// Find 查询文档
|
|||
|
func (coll *Collection) Find(filter interface{}) (*Cursor, error) {
|
|||
|
// 使用collection信息进行索引查询
|
|||
|
fieldValue := extractFilterValue(filter) // 需要实现过滤器解析
|
|||
|
docIDs, err := coll.indexStore.GetIndexedDocuments(coll.name, "default_index", fieldValue)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
// 获取实际文档数据
|
|||
|
docs := make([]interface{}, 0, len(docIDs))
|
|||
|
for _, id := range docIDs {
|
|||
|
var doc interface{}
|
|||
|
if err := coll.documentStore.GetDocument(coll.name, id, &doc); err == nil {
|
|||
|
docs = append(docs, doc)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return newCursor(docs), nil
|
|||
|
}
|
|||
|
|
|||
|
// 以下为简化实现,需要补充完整
|
|||
|
|
|||
|
func (coll *Collection) createRelatedIndexes(doc interface{}) error {
|
|||
|
// 实现自动创建相关索引(根据注解或配置)
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func getIndexStore(path string) (*index.IndexStore, error) {
|
|||
|
indexStoreMu.RLock()
|
|||
|
if is, ok := indexStores[path]; ok {
|
|||
|
indexStoreMu.RUnlock()
|
|||
|
return is, nil
|
|||
|
}
|
|||
|
indexStoreMu.RUnlock()
|
|||
|
|
|||
|
indexStoreMu.Lock()
|
|||
|
defer indexStoreMu.Unlock()
|
|||
|
|
|||
|
// Double-check in case it was added before acquiring the lock
|
|||
|
if is, ok := indexStores[path]; ok {
|
|||
|
return is, nil
|
|||
|
}
|
|||
|
|
|||
|
is, err := index.NewIndexStore(path)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
indexStores[path] = is
|
|||
|
return is, nil
|
|||
|
}
|
|||
|
|
|||
|
func generateID() string {
|
|||
|
// 生成唯一文档ID
|
|||
|
return "doc_123456"
|
|||
|
}
|
|||
|
|
|||
|
func extractFilterValue(filter interface{}) interface{} {
|
|||
|
// 解析过滤条件获取字段值
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// Cursor 游标用于遍历查询结果
|
|||
|
type Cursor struct {
|
|||
|
// ... 实现细节 ...
|
|||
|
}
|
|||
|
|
|||
|
func newCursor(docs []interface{}) *Cursor {
|
|||
|
// 创建新的游标实例
|
|||
|
return &Cursor{}
|
|||
|
}
|