129 lines
2.8 KiB
Go
129 lines
2.8 KiB
Go
package api
|
||
|
||
import (
|
||
"sync"
|
||
|
||
"git.pyer.club/kingecg/godocdb/document"
|
||
"git.pyer.club/kingecg/godocdb/index" // "fmt"
|
||
)
|
||
|
||
// "go.mongodb.org/mongo-driver/bson"
|
||
|
||
// 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, "", 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{}
|
||
}
|