sharding-jdbc归并排序

看看官方归并文档:https://shardingsphere.apache.org/document/legacy/4.x/document/cn/features/sharding/principle/merge/

我就拿order by o.user_id desc 举例子,看看源码的实现流程

SELECT o.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id and o.user_id IN    (    ? , ?,?,? ,?   ) order by o.user_id desc 

我们选择的合并方式是OrderByStreamMergedResult

OrderByStreamMergedResult维护着结果集数组 List<QueryResult> queryResults

循环遍历结果集数组,将每个结果集数组第一条数据orderByValue加入orderByValuesQueue队列

我们看看orderByValue.next()方法

OrderByValue对象维护orderValues数组,因为我们按照order by o.user_id来排序, 取出user_id的值,放入orderValues数组中。

重写了compareTo方法,比较orderValues的值

PriorityQueue  orderByValuesQueue队列排序好

PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。

设置QueryResultcurrent    orderByValuesQueue的第一个queryResult


现在开始取数据了,我们看看OrderByStreamMergedResultnext方法,弹出最大对应的OrderByValue

取出下一个元素, queryResult.next(),如果存在,重新设置,重新加入orderByValuesQueue进行排序,排序完之后设置当前为第一个queryResult。

怎么从queryResult取值我就不讲了。


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容