package io.mycat.sqlengine.tmp;
import io.mycat.server.packet.RowDataPacket;
import io.mycat.sqlengine.mpp.OrderCol;
import io.mycat.sqlengine.mpp.RowDataPacketSorter;
import java.util.List;
/**
*
* @author coderczp-2014-12-8
*/
public class RowDataSorter extends RowDataPacketSorter {
// 记录总数(=offset+limit)
private volatile int total;
// 查询的记录数(=limit)
private volatile int size;
// 堆
private volatile HeapItf heap;
// 多列比较器
private volatile RowDataCmp cmp;
// 是否执行过buildHeap
private volatile boolean hasBuild;
public RowDataSorter(OrderCol[] orderCols) {
super(orderCols);
this.cmp = new RowDataCmp(orderCols);
}
public synchronized void setLimit(int start, int size) {
// 容错处理
if (start < 0) {
start = 0;
}
if (size <= 0) {
this.total = this.size = Integer.MAX_VALUE;
} else {
this.total = start + size;
this.size = size;
}
// 统一采用顺序,order by 条件交给比较器去处理
this.heap = new MaxHeap(cmp, total);
}
@Override
public synchronized boolean addRow(RowDataPacket row) {
if (heap.getData().size() < total) {
heap.add(row);
return true;
}
// 堆已满,构建最大堆,并执行淘汰元素逻辑
if (heap.getData().size() == total && !hasBuild) {
heap.buildHeap();
hasBuild = true;
}
return heap.addIfRequired(row);
}
@Override
public List<RowDataPacket> getSortedResult() {
final List<RowDataPacket> data = heap.getData();
int size = data.size();
if (size < 2) {
return data;
} else {
// 构建最大堆并排序
if (!hasBuild) {
heap.buildHeap();
}
heap.heapSort(this.size);
return heap.getData();
}
}
public RowDataCmp getCmp() {
return cmp;
}
}