eorm
eorm copied to clipboard
WIP 分库分表---结果集处理 ditinct
我的思路是这样的:我们会将数据存在两个地方,treemap和heap中。treemap保存排序列相同的所有数据行做部分去重。整体流程是这样的,首先初始化先从sql.Rows取数据放入heap中。然后需要将最小的那个排序列的所有数据行拿出来放入treemap做去重。我们在next的时候去treemap中拿数据,如果treemap中的数据被拿光了,就再从heap中取值
大佬们看看测试还需要补充nextandscan的测试还需要补充哪些
我是认为,一个实现就能把这些全部情况解决掉的。比如说没有 Order By 和 Order By 里面的列不符合前缀原则,是等价的。
所有的一切都可以归结为:
- 初始化的时候,根据 Order By 和 Distinct 列,读取第一批数据。那么没有 Order By 和 Order By 里面的列不符合前缀原则,就是全部取过来
- 每次的时候,先看堆里面还有没有数据,没有的话就再次取一批数据,如果已经取完了,就说明没了。
所以一切的难点就在:我要有一个方法,根据 Order By和 Distinct 的列,来读取一批数据。至于这一批数据,是全部数据还是部分数据,就是看情况了。
我举一个例子,假如说现在有一个 DISCTINCT A, B, C 的查询。
那么:
- 如果完全没有 Order By,那么就需要全量取出来在去重;
- 有 Order By, Order By A 这种情况,那么每次取数据就是取 A 为固定值的时候,对应的数据
- 有 Order By,Order By D, A 这种,不符合前缀原则,所以还是要全量取出来。Order By D, E, A 也是如此...
- 有 Order By,但是 Order By 完全不包含 ABC 中的任何一列,全量取
- 有 Order By,Order By A, D, B,那么只能使用前缀 A
- 有 Order By,Order By A B C D,那么只能使用 A,B,C,每次需要取一批数据
我举一个例子,假如说现在有一个 DISCTINCT A, B, C 的查询。
那么:
- 如果完全没有 Order By,那么就需要全量取出来在去重;
- 有 Order By, Order By A 这种情况,那么每次取数据就是取 A 为固定值的时候,对应的数据
- 有 Order By,Order By D, A 这种,不符合前缀原则,所以还是要全量取出来。Order By D, E, A 也是如此...
- 有 Order By,但是 Order By 完全不包含 ABC 中的任何一列,全量取
- 有 Order By,Order By A, D, B,那么只能使用前缀 A
- 有 Order By,Order By A B C D,那么只能使用 A,B,C,每次需要取一批数据
使用distinct的时候好像就不会有其他列了,写distinct的时候只能写在distinct之后。表示多个列去重,又因为order by 的字段需要放到 select 列表中。所以我觉得没有什么前缀问题了。
懂你的意思了,我应该是搞错了一个东西
按照你的想法来
你觉得有必要把没有orderby的情况加进来吗?
Codecov Report
Merging #206 (2c9776b) into dev (d918cee) will decrease coverage by
1.09%
. The diff coverage is73.91%
.
@@ Coverage Diff @@
## dev #206 +/- ##
==========================================
- Coverage 85.65% 84.56% -1.09%
==========================================
Files 48 50 +2
Lines 3653 3907 +254
==========================================
+ Hits 3129 3304 +175
- Misses 415 482 +67
- Partials 109 121 +12
Impacted Files | Coverage Δ | |
---|---|---|
internal/merger/utils/compare.go | 0.00% <0.00%> (ø) |
|
internal/merger/sortmerger/merger.go | 89.15% <80.95%> (-0.71%) |
:arrow_down: |
internal/merger/sortmerger/distinctMerger.go | 83.75% <83.75%> (ø) |
|
internal/merger/sortmerger/heap.go | 100.00% <100.00%> (+1.66%) |
:arrow_up: |
:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more
你觉得有必要把没有orderby的情况加进来吗?
之前没注意到,我是觉得可以一个算法解决掉的
已在 #224 实现(借鉴了本PR的代码,已添加合作者), 故关闭此PR