看看官方归并文档: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取值我就不讲了。