xb

xb (eXtensible Builder)

OSCS Status workflow build GitHub tag Go Report Card

Languages: English 中文

xb is an AI-first SQL/JSON builder for relational + vector databases. One fluent API builds:

Everything flows through Custom() + Build() so the surface stays tiny even as capabilities grow.

Notes


Highlights


Quickstart

Build SQL

package main

import "github.com/fndome/xb"

type Cat struct {
    ID    uint64   `db:"id"`
    Name  string   `db:"name"`
    Age   *uint    `db:"age"`
    Price *float64 `db:"price"`
}

func main() {
    built := xb.Of(&Cat{}).
        Eq("status", 1).
        Gte("age", 3).
        Build()

    sql, args, _ := built.SqlOfSelect()
    // SELECT * FROM t_cat WHERE status = ? AND age >= ?
    _ = sql
    _ = args
}
queryVector := xb.Vector{0.1, 0.2, 0.3}

json, err := xb.Of(&CodeVector{}).
    Custom(
        xb.NewQdrantBuilder().
            Recommend(func(rb *xb.RecommendBuilder) {
                rb.Positive(123, 456).Negative(789).Limit(20)
            }).
            Build(),
    ).
    Eq("language", "golang").
    VectorSearch("embedding", queryVector, 10).
    Build().
    JsonOfSelect()

if err != nil {
    panic(err)
}
// POST json to /collections/{name}/points/recommend

Advanced Capabilities

CTE + UNION pipelines

report := xb.Of("recent_orders").
    With("recent_orders", func(sb *xb.BuilderX) {
        sb.From("orders o").
            Select("o.id", "o.user_id").
            Gt("o.created_at", since30Days)
    }).
    WithRecursive("team_hierarchy", func(sb *xb.BuilderX) {
        sb.From("users u").
            Select("u.id", "u.manager_id").
            Eq("u.active", true)
    }).
    UNION(xb.ALL, func(sb *xb.BuilderX) {
        sb.From("archived_orders ao").
            Select("ao.id", "ao.user_id")
    }).
    Meta(func(meta *interceptor.Metadata) {
        meta.TraceID = traceID
        meta.Set("source", "dashboard")
    }).
    Build()

sql, args, _ := report.SqlOfSelect()

JOIN builder with subqueries

builder := xb.X().
    Select("p.id", "p.weight").
    FromX(func(fb *xb.FromBuilder) {
        fb.Sub(func(sb *xb.BuilderX) {
            sb.Select("id", "type").
                From("t_pet").
                Gt("id", 10000)
        }).As("p").
            JOIN(xb.INNER).Of("t_dog").As("d").On("d.pet_id = p.id").
            JOIN(xb.LEFT).Of("t_cat").As("c").On("c.pet_id = p.id").
            Cond(func(on *xb.ON) {
					on.Gt("p.weight", 10)
				})
    }).
    Ne("p.type", "PIG")

sql, args, _ := builder.Build().SqlOfSelect()

Qdrant Recommend / Discover / Scroll

Interceptors & Metadata

Dialect & Custom


Documentation

Topic English Chinese
Overview & Index doc/en/README.md doc/cn/README.md
Quickstart doc/en/QUICKSTART.md doc/cn/QUICKSTART.md
Qdrant Guide doc/en/QDRANT_GUIDE.md doc/cn/QDRANT_GUIDE.md
Vector Guide doc/en/VECTOR_GUIDE.md doc/cn/VECTOR_GUIDE.md
Custom Interface doc/en/CUSTOM_INTERFACE.md doc/cn/CUSTOM_INTERFACE.md
Auto-filter (nil/0 skip) doc/en/ALL_FILTERING_MECHANISMS.md doc/cn/FILTERING.md
Join optimization doc/en/CUSTOM_JOINS_GUIDE.md (coming soon)
AI Application Starter doc/en/AI_APPLICATION.md doc/cn/AI_APPLICATION.md

We are migrating docs into doc/en/ + doc/cn/. Legacy files remain under doc/ until the move completes.


Contributing

We welcome issues, discussions, PRs!

Before opening a PR:

  1. Run go test ./...
  2. Update docs/tests related to your change
  3. Describe behavior changes clearly in the PR template

License

Apache License 2.0 — see LICENSE.