mirror of
https://gitee.com/rulego/streamsql.git
synced 2026-07-06 06:20:50 +00:00
5.3 KiB
5.3 KiB
StreamSQL Functions 模块重构总结
重构目标
将所有函数计算相关的逻辑都迁移到 functions 模块,让 aggregator 模块只负责调用 functions 模块,简化自定义函数的扩展过程。
重构成果
1. 统一的函数管理
- 所有聚合函数和分析函数都在
functions模块中实现 aggregator模块只保留接口定义和适配器逻辑- 新增自定义函数只需要在
functions模块中添加,无需修改多个模块
2. 支持增量计算的聚合函数
所有聚合函数都实现了 AggregatorFunction 接口,支持:
New(): 创建新实例Add(value): 增量添加值Result(): 获取聚合结果Reset(): 重置状态Clone(): 克隆实例
3. 支持状态管理的分析函数
所有分析函数都实现了 AnalyticalFunction 接口,支持:
Reset(): 重置函数状态Clone(): 克隆函数实例- 状态保持和历史数据管理
4. 自动适配器机制
- AggregatorAdapter: 将 functions 模块的聚合函数适配到 aggregator 模块
- AnalyticalAdapter: 将 functions 模块的分析函数适配到 aggregator 模块
- AnalyticalAggregatorAdapter: 将分析函数适配为聚合器接口
已实现的函数
聚合函数 (支持增量计算)
sum: 求和avg: 平均值min: 最小值max: 最大值count: 计数stddev: 标准差median: 中位数percentile: 百分位数collect: 收集所有值last_value: 最后一个值merge_agg: 合并聚合stddevs: 样本标准差deduplicate: 去重var: 总体方差vars: 样本方差
分析函数 (支持状态管理)
lag: 滞后函数latest: 最新值changed_col: 变化列had_changed: 是否变化
窗口函数
window_start: 窗口开始时间window_end: 窗口结束时间expression: 表达式函数
使用方法
1. 创建聚合器实例
// 通过 aggregator 模块(推荐)
agg := aggregator.CreateBuiltinAggregator(aggregator.Sum)
// 直接通过 functions 模块
sumFunc := functions.NewSumFunction()
aggInstance := sumFunc.New()
2. 增量计算
agg.Add(10.0)
agg.Add(20.0)
agg.Add(30.0)
result := agg.Result() // 60.0
3. 分析函数使用
lagFunc := functions.NewLagFunction()
ctx := &functions.FunctionContext{
Data: make(map[string]interface{}),
}
// 第一个值返回默认值 nil
result1, _ := lagFunc.Execute(ctx, []interface{}{10})
// 第二个值返回第一个值 10
result2, _ := lagFunc.Execute(ctx, []interface{}{20})
4. 添加自定义函数
// 1. 实现聚合函数
type CustomSumFunction struct {
*functions.BaseFunction
sum float64
}
// 2. 实现必要的接口方法
func (f *CustomSumFunction) New() functions.AggregatorFunction { ... }
func (f *CustomSumFunction) Add(value interface{}) { ... }
func (f *CustomSumFunction) Result() interface{} { ... }
// ... 其他方法
// 3. 注册函数
functions.Register(NewCustomSumFunction())
functions.RegisterAggregatorAdapter("custom_sum")
兼容性
- 完全兼容现有的 aggregator 模块接口
- 现有代码无需修改
- 新的函数会优先使用 functions 模块的实现
- 保留了原有的注册机制作为后备
性能优化
- 增量计算减少重复计算开销
- 函数注册表提供快速查找
- 适配器模式保持接口兼容性
- 状态管理支持复杂分析场景
测试覆盖
所有重构后的功能都有完整的测试覆盖:
TestFunctionsAggregatorIntegration: 聚合函数集成测试TestAnalyticalFunctionsIntegration: 分析函数集成测试TestComplexAggregators: 复杂聚合器测试TestWindowFunctions: 窗口函数测试TestAdapterFunctions: 适配器功能测试
扩展建议
- SQL 解析器调整: 在解析聚合函数时,优先查找 functions 模块中的注册函数
- 动态函数发现: 支持运行时动态加载函数
- 函数组合: 支持函数的组合和链式调用
- 性能监控: 添加函数执行性能监控和优化
- 更多内置函数: 基于新的架构添加更多统计和分析函数
文件结构
functions/
├── aggregator_interface.go # 聚合器和分析函数接口定义
├── aggregator_adapter.go # 适配器实现
├── analytical_aggregator_adapter.go # 分析函数聚合器适配器
├── functions_aggregation.go # 聚合函数实现
├── functions_analytical.go # 分析函数实现
├── functions_window.go # 窗口函数实现
├── init.go # 函数注册
├── integration_test.go # 集成测试
├── custom_example.go # 自定义函数示例
└── README.md # 使用文档
aggregator/
├── builtin.go # 简化的聚合器接口和适配逻辑
└── analytical_aggregators.go # 简化的分析聚合器占位符
这次重构成功实现了将所有函数计算逻辑统一到 functions 模块的目标,大大简化了自定义函数的扩展过程。