Skip to content

Commit 319bb94

Browse files
committed
feat: Add Interceptor + Extension Guides (v0.9.2)
## 🎯 Core Updates ### 1. Interceptor (Infrastructure) New `interceptor/` package for global SQL build observation: - **Type-safe boundaries**: `BeforeBuild(meta *Metadata)` compile-time enforced - **Global**: Register once, apply to all queries - **Use for**: Logging, monitoring (Prometheus), auditing, distributed tracing - **NOT for**: Business logic (multi-tenancy, permissions should be explicit) **Design Highlight**: ```go // ✅ Can only set metadata (compile-time constraint) func (i *MyInterceptor) BeforeBuild(meta *interceptor.Metadata) error { meta.UserID = 123 // ✅ OK meta.Eq("tenant_id", x) // ❌ Compilation Error return nil } ``` **Files**: - `interceptor/metadata.go` - Strongly-typed metadata - `interceptor/interceptor.go` - Interceptor interface - `interceptor/registry.go` - Global registry - `interceptor_test.go` - 5 tests (tests as docs) - `builder_x.go` - Integrate Meta() and interceptor calls - `to_sql.go` - Built passes Meta --- ### 2. Extension Guides New extension guides for users: - `doc/CUSTOM_VECTOR_DB_GUIDE.md` - How to support Milvus, Weaviate, etc. - `doc/CUSTOM_JOINS_GUIDE.md` - How to extend custom JOINs (ASOF, LATERAL, etc.) **Principles**: - ✅ Extend in your own package, don't modify sqlxb core - ✅ Keep method chaining - ✅ Follow sqlxb style --- ### 3. Documentation Cleanup Removed 7 outdated design docs: - VECTOR_DATABASE_DESIGN.md - VECTOR_DIVERSITY_API_DESIGN.md - VECTOR_EXECUTIVE_SUMMARY.md - VECTOR_IMPLEMENTATION_COMPLETE.md - VECTOR_PAIN_POINTS_ANALYSIS.md - VECTOR_SUMMARY.md - VECTOR_RELEASE_NOTES.md Updated all API examples to match actual implementation. --- ## 🎊 Philosophy ### Grassroots Culture - **Interceptor**: No docs, no examples, tests as documentation - Don't use = Zero learning cost - Use = Learn from tests - Hit limit = Understand design - **Clear Boundaries**: - Interceptor for infrastructure only - Business logic must be explicit --- ## ✅ Tests - 5 new Interceptor tests, all passing ✅ - All existing tests passing ✅ - 100% backward compatible ✅ --- **Co-authored-by**: AI Assistant (Claude) **Philosophy**: Grassroots culture, Explicit over implicit, Simple over complex
1 parent 8a29169 commit 319bb94

30 files changed

+2586
-4488
lines changed

CHANGELOG_v0.9.2.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# v0.9.2 更新日志
2+
3+
**发布日期**: 2025-10-27
4+
5+
---
6+
7+
## ✨ 新增功能
8+
9+
### 1. Interceptor 拦截器
10+
11+
独立的 `interceptor/` 包,用于全局观察 SQL 构建过程。
12+
13+
**特点**
14+
- ✅ 类型安全:`BeforeBuild(meta *Metadata)` 编译时限制
15+
- ✅ 全局性:注册一次,所有查询生效
16+
- ✅ 用途:日志、监控、审计
17+
- ❌ 不用于:业务逻辑(多租户、权限应显式写)
18+
19+
**文件**
20+
- `interceptor/metadata.go`
21+
- `interceptor/interceptor.go`
22+
- `interceptor/registry.go`
23+
- `interceptor_test.go` (5 个测试)
24+
25+
---
26+
27+
### 2. 扩展指南
28+
29+
新增两份扩展指南:
30+
- `doc/CUSTOM_VECTOR_DB_GUIDE.md` - 如何支持 Milvus, Weaviate 等
31+
- `doc/CUSTOM_JOINS_GUIDE.md` - 如何扩展自定义 JOIN
32+
33+
---
34+
35+
## 🧹 文档清理
36+
37+
删除 7 个过时文档,更新所有 API 示例。
38+
39+
---
40+
41+
## ✅ 测试
42+
43+
- 新增 5 个 Interceptor 测试 ✅
44+
- 所有现有测试通过 ✅
45+
- 100% 向后兼容 ✅
46+
47+
---
48+
49+
**升级**`go get github.com/x-ream/[email protected]`
50+

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ This makes sqlxb **one of the first major Go ORM projects successfully maintaine
105105
Quick links:
106106
- [Vector Database Quick Start](./doc/VECTOR_QUICKSTART.md)
107107
- [Vector Diversity + Qdrant Guide](./doc/VECTOR_DIVERSITY_QDRANT.md)
108-
- [API Design](./doc/VECTOR_DIVERSITY_API_DESIGN.md)
109108
- [All Filtering Mechanisms](./doc/ALL_FILTERING_MECHANISMS.md)
109+
- [Custom Vector DB Guide](./doc/CUSTOM_VECTOR_DB_GUIDE.md) - 扩展其他向量数据库
110+
- [Custom JOINs Guide](./doc/CUSTOM_JOINS_GUIDE.md) - 扩展自定义 JOIN
110111
- [Contributors](./doc/CONTRIBUTORS.md)
111112

112113
## Contributing

builder_x.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
// limitations under the License.
1717
package sqlxb
1818

19-
import "fmt"
19+
import (
20+
"fmt"
21+
"github.com/x-ream/sqlxb/interceptor"
22+
)
2023

2124
// ToId build sql, like: SELECT DISTINCT f.id FROM foo f INNER_JOIN JOIN (SELECT foo_id FROM bar) b ON b.foo_id = f.id
2225
// Sql for MySQL, Clickhouse....
@@ -41,6 +44,15 @@ type BuilderX struct {
4144
isWithoutOptimization bool
4245

4346
alia string
47+
meta *interceptor.Metadata // ⭐ 新增:元数据(v0.9.2)
48+
}
49+
50+
// Meta 获取元数据
51+
func (x *BuilderX) Meta() *interceptor.Metadata {
52+
if x.meta == nil {
53+
x.meta = &interceptor.Metadata{}
54+
}
55+
return x.meta
4456
}
4557

4658
func Of(tableNameOrPo interface{}) *BuilderX {
@@ -277,11 +289,27 @@ func (x *BuilderX) Build() *Built {
277289
panic("sqlxb.Builder is nil")
278290
}
279291

292+
// ⭐ 执行 BeforeBuild 拦截器(只设置元数据)
293+
for _, ic := range interceptor.GetAll() {
294+
if err := ic.BeforeBuild(x.Meta()); err != nil {
295+
panic(fmt.Sprintf("Interceptor %s BeforeBuild failed: %v", ic.Name(), err))
296+
}
297+
}
298+
280299
if x.inserts != nil && len(*(x.inserts)) > 0 {
281300
built := Built{
282301
OrFromSql: x.orFromSql,
283302
Inserts: x.inserts,
303+
Meta: x.meta, // ⭐ 传递元数据
284304
}
305+
306+
// ⭐ 执行 AfterBuild 拦截器
307+
for _, ic := range interceptor.GetAll() {
308+
if err := ic.AfterBuild(&built); err != nil {
309+
panic(fmt.Sprintf("Interceptor %s AfterBuild failed: %v", ic.Name(), err))
310+
}
311+
}
312+
285313
return &built
286314
}
287315

@@ -299,11 +327,19 @@ func (x *BuilderX) Build() *Built {
299327
OrFromSql: x.orFromSql,
300328
Fxs: x.sxs,
301329
Svs: x.svs,
330+
Meta: x.meta, // ⭐ 传递元数据
302331
}
303332

304333
if x.pageBuilder != nil {
305334
built.PageCondition = &x.pageBuilder.condition
306335
}
307336

337+
// ⭐ 执行 AfterBuild 拦截器
338+
for _, ic := range interceptor.GetAll() {
339+
if err := ic.AfterBuild(&built); err != nil {
340+
panic(fmt.Sprintf("Interceptor %s AfterBuild failed: %v", ic.Name(), err))
341+
}
342+
}
343+
308344
return &built
309345
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
feat: 新增 Interceptor 拦截器 + 扩展指南文档 (v0.9.2)
2+
3+
## 🎯 核心更新
4+
5+
### 1. Interceptor 拦截器(基础设施)
6+
7+
新增独立的 `interceptor/` 包,用于全局观察 SQL 构建过程:
8+
9+
- **类型安全边界**:`BeforeBuild(meta *Metadata)` 编译时强制只能设置元数据
10+
- **全局性**:注册一次,所有查询自动执行
11+
- **用途**:日志、监控(Prometheus)、审计、分布式追踪
12+
- **不用于**:业务逻辑(多租户、权限、软删除应显式写)
13+
14+
**设计亮点**:
15+
```go
16+
// ✅ 只能设置元数据(编译时限制)
17+
func (i *MyInterceptor) BeforeBuild(meta *interceptor.Metadata) error {
18+
meta.UserID = 123 // ✅ 可以
19+
meta.Eq("tenant_id", x) // ❌ 编译错误
20+
return nil
21+
}
22+
```
23+
24+
**文件**:
25+
- `interceptor/metadata.go` - 强类型元数据结构
26+
- `interceptor/interceptor.go` - 拦截器接口
27+
- `interceptor/registry.go` - 全局注册管理
28+
- `interceptor_test.go` - 5 个测试(测试即文档)
29+
- `builder_x.go` - 集成 Meta() 和拦截器调用
30+
- `to_sql.go` - Built 传递 Meta
31+
32+
---
33+
34+
### 2. 扩展指南文档
35+
36+
新增两份扩展指南,帮助用户扩展 sqlxb:
37+
38+
- `doc/CUSTOM_VECTOR_DB_GUIDE.md` - 如何支持 Milvus, Weaviate 等向量数据库
39+
- `doc/CUSTOM_JOINS_GUIDE.md` - 如何扩展 ClickHouse ASOF JOIN 等
40+
41+
**设计原则**:
42+
- ✅ 在自己包内扩展,不修改 sqlxb 核心
43+
- ✅ 保持链式调用
44+
- ✅ 遵循 sqlxb 风格
45+
46+
---
47+
48+
### 3. 文档清理
49+
50+
删除 7 个早期设计文档(已过时):
51+
- VECTOR_DATABASE_DESIGN.md
52+
- VECTOR_DIVERSITY_API_DESIGN.md
53+
- VECTOR_EXECUTIVE_SUMMARY.md
54+
- VECTOR_IMPLEMENTATION_COMPLETE.md
55+
- VECTOR_PAIN_POINTS_ANALYSIS.md
56+
- VECTOR_SUMMARY.md
57+
- VECTOR_RELEASE_NOTES.md
58+
59+
更新所有文档的 API 示例,确保与实际实现一致。
60+
61+
---
62+
63+
## 🎊 设计哲学
64+
65+
### 草根文化
66+
67+
- **Interceptor**:无文档、无示例,测试即文档
68+
- 不用 = 零学习成本
69+
- 用了 = 看测试学习
70+
- 遇到限制 = 理解设计
71+
72+
- **边界清晰**:
73+
- Interceptor 只用于基础设施
74+
- 业务逻辑必须显式(多租户、权限应显式写)
75+
76+
---
77+
78+
## ✅ 测试
79+
80+
- 新增 5 个 Interceptor 测试,全部通过 ✅
81+
- 所有现有测试保持通过 ✅
82+
- 100% 向后兼容 ✅
83+
84+
---
85+
86+
**Co-authored-by**: AI Assistant (Claude)
87+
**Philosophy**: 草根文化、显式优于隐式、简洁优于复杂
88+
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
feat: Add Interceptor + Extension Guides (v0.9.2)
2+
3+
## 🎯 Core Updates
4+
5+
### 1. Interceptor (Infrastructure)
6+
7+
New `interceptor/` package for global SQL build observation:
8+
9+
- **Type-safe boundaries**: `BeforeBuild(meta *Metadata)` compile-time enforced
10+
- **Global**: Register once, apply to all queries
11+
- **Use for**: Logging, monitoring (Prometheus), auditing, distributed tracing
12+
- **NOT for**: Business logic (multi-tenancy, permissions should be explicit)
13+
14+
**Design Highlight**:
15+
```go
16+
// ✅ Can only set metadata (compile-time constraint)
17+
func (i *MyInterceptor) BeforeBuild(meta *interceptor.Metadata) error {
18+
meta.UserID = 123 // ✅ OK
19+
meta.Eq("tenant_id", x) // ❌ Compilation Error
20+
return nil
21+
}
22+
```
23+
24+
**Files**:
25+
- `interceptor/metadata.go` - Strongly-typed metadata
26+
- `interceptor/interceptor.go` - Interceptor interface
27+
- `interceptor/registry.go` - Global registry
28+
- `interceptor_test.go` - 5 tests (tests as docs)
29+
- `builder_x.go` - Integrate Meta() and interceptor calls
30+
- `to_sql.go` - Built passes Meta
31+
32+
---
33+
34+
### 2. Extension Guides
35+
36+
New extension guides for users:
37+
38+
- `doc/CUSTOM_VECTOR_DB_GUIDE.md` - How to support Milvus, Weaviate, etc.
39+
- `doc/CUSTOM_JOINS_GUIDE.md` - How to extend custom JOINs (ASOF, LATERAL, etc.)
40+
41+
**Principles**:
42+
- ✅ Extend in your own package, don't modify sqlxb core
43+
- ✅ Keep method chaining
44+
- ✅ Follow sqlxb style
45+
46+
---
47+
48+
### 3. Documentation Cleanup
49+
50+
Removed 7 outdated design docs:
51+
- VECTOR_DATABASE_DESIGN.md
52+
- VECTOR_DIVERSITY_API_DESIGN.md
53+
- VECTOR_EXECUTIVE_SUMMARY.md
54+
- VECTOR_IMPLEMENTATION_COMPLETE.md
55+
- VECTOR_PAIN_POINTS_ANALYSIS.md
56+
- VECTOR_SUMMARY.md
57+
- VECTOR_RELEASE_NOTES.md
58+
59+
Updated all API examples to match actual implementation.
60+
61+
---
62+
63+
## 🎊 Philosophy
64+
65+
### Grassroots Culture
66+
67+
- **Interceptor**: No docs, no examples, tests as documentation
68+
- Don't use = Zero learning cost
69+
- Use = Learn from tests
70+
- Hit limit = Understand design
71+
72+
- **Clear Boundaries**:
73+
- Interceptor for infrastructure only
74+
- Business logic must be explicit
75+
76+
---
77+
78+
## ✅ Tests
79+
80+
- 5 new Interceptor tests, all passing ✅
81+
- All existing tests passing ✅
82+
- 100% backward compatible ✅
83+
84+
---
85+
86+
**Co-authored-by**: AI Assistant (Claude)
87+
**Philosophy**: Grassroots culture, Explicit over implicit, Simple over complex
88+

0 commit comments

Comments
 (0)