xb

Custom 接口(中文)

Custom 接口是 xb 扩展能力的核心。框架不再内置大量方言,而是让用户在几分钟内实现任意数据库(SQL 或向量)的序列化逻辑。


1. 接口定义

type Custom interface {
    Generate(built *xb.Built) (any, error)
}

2. 最小示例

type MyVectorCustom struct{}

func (c *MyVectorCustom) Generate(built *xb.Built) (any, error) {
    payload := map[string]any{
        "collection": built.Table,
        "filter":     built.FilterJSON(),
        "vector":     built.Vector,
    }
    return payload, nil
}

json, err := xb.Of("vectors").
    Custom(&MyVectorCustom{}).
    VectorSearch("embedding", vec, 10).
    Build().
    JsonOfSelect()

3. 设计目标

目标 说明
极简接口 一个接口、一个方法
隔离性 用户可独立迭代,无需 fork xb
性能 接口调用约 1ns,无额外分支
面向未来 新特性出现时,用户可立即实现

4. 推荐结构

type MilvusCustom struct {
    Endpoint string
    Timeout  time.Duration
}

func NewMilvusBuilder() *MilvusBuilder {
    return &MilvusBuilder{
        custom: &MilvusCustom{
            Endpoint: "http://localhost:19530",
            Timeout:  3 * time.Second,
        },
    }
}

func (c *MilvusCustom) Generate(built *xb.Built) (any, error) {
    req := buildMilvusPayload(built)
    return req, nil
}

5. 测试建议

func TestMilvusCustom_Generate(t *testing.T) {
    built := xb.Of("code_vectors").
        VectorSearch("embedding", xb.Vector{0.1, 0.2}, 5).
        Build()

    custom := NewMilvusBuilder().Build()
    payload, err := custom.Generate(built)

    require.NoError(t, err)
    snapshot.AssertJSON(t, payload)
}

6. 适用场景

场景 示例
向量数据库 JSON Qdrant(官方)、Milvus、Pinecone
SQL 方言扩展 Oracle upsert、ClickHouse FORMAT
内部 API 公司自研搜索服务
混合模式 同一 builder 输出 SQL + JSON

7. 相关文档

若你发布了可复用的 Custom 适配,欢迎在 doc/en/doc/cn/ 中追加说明并提交 PR。