use of io.mycat.memory.unsafe.row.BufferHolder in project Mycat-Server by MyCATApache.
the class TestSorter method runSorter.
public void runSorter(MyCatMemory myCatMemory, MemoryManager memoryManager, MycatPropertyConf conf) throws NoSuchFieldException, IllegalAccessException, IOException {
DataNodeMemoryManager dataNodeMemoryManager = new DataNodeMemoryManager(memoryManager, Thread.currentThread().getId());
/**
* 1.schema ,模拟一个field字段值
*
*/
int fieldCount = 3;
ColMeta colMeta = null;
Map<String, ColMeta> colMetaMap = new HashMap<String, ColMeta>(fieldCount);
colMeta = new ColMeta(0, ColMeta.COL_TYPE_STRING);
colMetaMap.put("id", colMeta);
colMeta = new ColMeta(1, ColMeta.COL_TYPE_STRING);
colMetaMap.put("name", colMeta);
colMeta = new ColMeta(2, ColMeta.COL_TYPE_STRING);
colMetaMap.put("age", colMeta);
OrderCol[] orderCols = new OrderCol[1];
OrderCol orderCol = new OrderCol(colMetaMap.get("id"), OrderCol.COL_ORDER_TYPE_ASC);
orderCols[0] = orderCol;
/**
* 2 .PrefixComputer
*/
StructType schema = new StructType(colMetaMap, fieldCount);
schema.setOrderCols(orderCols);
UnsafeExternalRowSorter.PrefixComputer prefixComputer = new RowPrefixComputer(schema);
/**
* 3 .PrefixComparator 默认是ASC,可以选择DESC
*/
final PrefixComparator prefixComparator = PrefixComparators.LONG;
UnsafeExternalRowSorter sorter = new UnsafeExternalRowSorter(dataNodeMemoryManager, myCatMemory, schema, prefixComparator, prefixComputer, conf.getSizeAsBytes("mycat.buffer.pageSize", "1m"), true, /**使用基数排序?true or false*/
true);
UnsafeRow unsafeRow;
BufferHolder bufferHolder;
UnsafeRowWriter unsafeRowWriter;
String line = "testUnsafeRow";
final Random rand = new Random(42);
for (int i = 0; i < TEST_SIZE; i++) {
unsafeRow = new UnsafeRow(3);
bufferHolder = new BufferHolder(unsafeRow);
unsafeRowWriter = new UnsafeRowWriter(bufferHolder, 3);
bufferHolder.reset();
String key = getRandomString(rand.nextInt(300) + 100);
unsafeRowWriter.write(0, key.getBytes());
unsafeRowWriter.write(1, line.getBytes());
unsafeRowWriter.write(2, ("35" + 1).getBytes());
unsafeRow.setTotalSize(bufferHolder.totalSize());
sorter.insertRow(unsafeRow);
}
Iterator<UnsafeRow> iter = sorter.sort();
UnsafeRow row = null;
int indexprint = 0;
while (iter.hasNext()) {
row = iter.next();
indexprint++;
}
sorter.cleanupResources();
countDownLatch.countDown();
System.out.println("Thread ID :" + Thread.currentThread().getId() + "Index : " + indexprint);
}
use of io.mycat.memory.unsafe.row.BufferHolder in project Mycat-Server by MyCATApache.
the class UnsafeRowGrouper method getAllBinaryRow.
public UnsafeRow getAllBinaryRow(UnsafeRow row) throws UnsupportedEncodingException {
UnsafeRow value = new UnsafeRow(this.valuefieldCount);
bufferHolder = new BufferHolder(value, 0);
unsafeRowWriter = new UnsafeRowWriter(bufferHolder, this.valuefieldCount);
bufferHolder.reset();
ColMeta curColMeta = null;
for (Map.Entry<String, ColMeta> fieldEntry : columToIndx.entrySet()) {
curColMeta = fieldEntry.getValue();
if (!row.isNullAt(curColMeta.colIndex)) {
switch(curColMeta.colType) {
case ColMeta.COL_TYPE_BIT:
unsafeRowWriter.write(curColMeta.colIndex, row.getByte(curColMeta.colIndex));
break;
case ColMeta.COL_TYPE_INT:
case ColMeta.COL_TYPE_LONG:
case ColMeta.COL_TYPE_INT24:
unsafeRowWriter.write(curColMeta.colIndex, BytesTools.int2Bytes(row.getInt(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_SHORT:
unsafeRowWriter.write(curColMeta.colIndex, BytesTools.short2Bytes(row.getShort(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_LONGLONG:
unsafeRowWriter.write(curColMeta.colIndex, BytesTools.long2Bytes(row.getLong(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_FLOAT:
unsafeRowWriter.write(curColMeta.colIndex, BytesTools.float2Bytes(row.getFloat(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_DOUBLE:
unsafeRowWriter.write(curColMeta.colIndex, BytesTools.double2Bytes(row.getDouble(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_NEWDECIMAL:
int scale = curColMeta.decimals;
BigDecimal decimalVal = row.getDecimal(curColMeta.colIndex, scale);
unsafeRowWriter.write(curColMeta.colIndex, decimalVal.toString().getBytes());
break;
default:
unsafeRowWriter.write(curColMeta.colIndex, row.getBinary(curColMeta.colIndex));
break;
}
} else {
unsafeRowWriter.setNullAt(curColMeta.colIndex);
}
}
value.setTotalSize(bufferHolder.totalSize());
return value;
}
use of io.mycat.memory.unsafe.row.BufferHolder in project Mycat-Server by MyCATApache.
the class UnsafeRowGrouper method initGroupKey.
private void initGroupKey() {
/**
* 构造groupKey
*/
Map<String, ColMeta> groupcolMetaMap = new HashMap<String, ColMeta>(this.groupKeyfieldCount);
groupKey = new UnsafeRow(this.groupKeyfieldCount);
bufferHolder = new BufferHolder(groupKey, 0);
unsafeRowWriter = new UnsafeRowWriter(bufferHolder, this.groupKeyfieldCount);
bufferHolder.reset();
ColMeta curColMeta = null;
for (int i = 0; i < this.groupKeyfieldCount; i++) {
curColMeta = this.columToIndx.get(sortColumnsByIndex[i].toUpperCase());
groupcolMetaMap.put(sortColumnsByIndex[i], curColMeta);
switch(curColMeta.colType) {
case ColMeta.COL_TYPE_BIT:
groupKey.setByte(i, (byte) 0);
break;
case ColMeta.COL_TYPE_INT:
case ColMeta.COL_TYPE_INT24:
case ColMeta.COL_TYPE_LONG:
groupKey.setInt(i, 0);
break;
case ColMeta.COL_TYPE_SHORT:
groupKey.setShort(i, (short) 0);
break;
case ColMeta.COL_TYPE_FLOAT:
groupKey.setFloat(i, 0);
break;
case ColMeta.COL_TYPE_DOUBLE:
groupKey.setDouble(i, 0);
break;
case ColMeta.COL_TYPE_NEWDECIMAL:
// groupKey.setDouble(i, 0);
unsafeRowWriter.write(i, new BigDecimal(0L));
break;
case ColMeta.COL_TYPE_LONGLONG:
groupKey.setLong(i, 0);
break;
default:
unsafeRowWriter.write(i, "init".getBytes());
break;
}
}
groupKey.setTotalSize(bufferHolder.totalSize());
groupKeySchema = new StructType(groupcolMetaMap, this.groupKeyfieldCount);
groupKeySchema.setOrderCols(null);
}
use of io.mycat.memory.unsafe.row.BufferHolder in project Mycat-Server by MyCATApache.
the class UnsafeRowGrouper method getValue.
/**
* 构造value
*/
private UnsafeRow getValue(UnsafeRow row) throws UnsupportedEncodingException {
UnsafeRow value = new UnsafeRow(this.valuefieldCount);
bufferHolder = new BufferHolder(value, 0);
unsafeRowWriter = new UnsafeRowWriter(bufferHolder, this.valuefieldCount);
bufferHolder.reset();
ColMeta curColMeta = null;
for (Map.Entry<String, ColMeta> fieldEntry : columToIndx.entrySet()) {
curColMeta = fieldEntry.getValue();
if (!row.isNullAt(curColMeta.colIndex)) {
switch(curColMeta.colType) {
case ColMeta.COL_TYPE_BIT:
value.setByte(curColMeta.colIndex, row.getByte(curColMeta.colIndex));
break;
case ColMeta.COL_TYPE_INT:
case ColMeta.COL_TYPE_LONG:
case ColMeta.COL_TYPE_INT24:
value.setInt(curColMeta.colIndex, BytesTools.getInt(row.getBinary(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_SHORT:
value.setShort(curColMeta.colIndex, BytesTools.getShort(row.getBinary(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_LONGLONG:
value.setLong(curColMeta.colIndex, BytesTools.getLong(row.getBinary(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_FLOAT:
value.setFloat(curColMeta.colIndex, BytesTools.getFloat(row.getBinary(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_DOUBLE:
value.setDouble(curColMeta.colIndex, BytesTools.getDouble(row.getBinary(curColMeta.colIndex)));
break;
case ColMeta.COL_TYPE_NEWDECIMAL:
// value.setDouble(curColMeta.colIndex, BytesTools.getDouble(row.getBinary(curColMeta.colIndex)));
unsafeRowWriter.write(curColMeta.colIndex, new BigDecimal(new String(row.getBinary(curColMeta.colIndex))));
break;
default:
unsafeRowWriter.write(curColMeta.colIndex, row.getBinary(curColMeta.colIndex));
break;
}
} else {
switch(curColMeta.colType) {
case ColMeta.COL_TYPE_NEWDECIMAL:
BigDecimal nullDecimal = null;
unsafeRowWriter.write(curColMeta.colIndex, nullDecimal);
break;
default:
value.setNullAt(curColMeta.colIndex);
break;
}
}
}
value.setTotalSize(bufferHolder.totalSize());
return value;
}
use of io.mycat.memory.unsafe.row.BufferHolder in project Mycat-Server by MyCATApache.
the class UnsafeRowGrouper method initEmptyValueKey.
private void initEmptyValueKey() {
/**
* 构造valuerow
*/
emptyAggregationBuffer = new UnsafeRow(this.valuefieldCount);
bufferHolder = new BufferHolder(emptyAggregationBuffer, 0);
unsafeRowWriter = new UnsafeRowWriter(bufferHolder, this.valuefieldCount);
bufferHolder.reset();
ColMeta curColMeta = null;
for (Map.Entry<String, ColMeta> fieldEntry : columToIndx.entrySet()) {
curColMeta = fieldEntry.getValue();
switch(curColMeta.colType) {
case ColMeta.COL_TYPE_BIT:
emptyAggregationBuffer.setByte(curColMeta.colIndex, (byte) 0);
break;
case ColMeta.COL_TYPE_INT:
case ColMeta.COL_TYPE_INT24:
case ColMeta.COL_TYPE_LONG:
emptyAggregationBuffer.setInt(curColMeta.colIndex, 0);
break;
case ColMeta.COL_TYPE_SHORT:
emptyAggregationBuffer.setShort(curColMeta.colIndex, (short) 0);
break;
case ColMeta.COL_TYPE_LONGLONG:
emptyAggregationBuffer.setLong(curColMeta.colIndex, 0);
break;
case ColMeta.COL_TYPE_FLOAT:
emptyAggregationBuffer.setFloat(curColMeta.colIndex, 0);
break;
case ColMeta.COL_TYPE_DOUBLE:
emptyAggregationBuffer.setDouble(curColMeta.colIndex, 0);
break;
case ColMeta.COL_TYPE_NEWDECIMAL:
// emptyAggregationBuffer.setDouble(curColMeta.colIndex, 0);
unsafeRowWriter.write(curColMeta.colIndex, new BigDecimal(0L));
break;
default:
unsafeRowWriter.write(curColMeta.colIndex, "init".getBytes());
break;
}
}
emptyAggregationBuffer.setTotalSize(bufferHolder.totalSize());
aggBufferSchema = new StructType(columToIndx, this.valuefieldCount);
aggBufferSchema.setOrderCols(null);
}
Aggregations