Search in sources :

Example 11 with StructType

use of io.mycat.memory.unsafe.row.StructType in project Mycat_plus by coderczp.

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);
}
Also used : ColMeta(io.mycat.sqlengine.mpp.ColMeta) StructType(io.mycat.memory.unsafe.row.StructType) DataNodeMemoryManager(io.mycat.memory.unsafe.memory.mm.DataNodeMemoryManager) UnsafeRowWriter(io.mycat.memory.unsafe.row.UnsafeRowWriter) UnsafeRow(io.mycat.memory.unsafe.row.UnsafeRow) BufferHolder(io.mycat.memory.unsafe.row.BufferHolder) OrderCol(io.mycat.sqlengine.mpp.OrderCol)

Example 12 with StructType

use of io.mycat.memory.unsafe.row.StructType in project Mycat_plus by coderczp.

the class DataNodeMergeManager method onRowMetaData.

public void onRowMetaData(Map<String, ColMeta> columToIndx, int fieldCount) throws IOException {
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("field metadata keys:{}", columToIndx.keySet());
        LOGGER.debug("field metadata values:", columToIndx.values());
    }
    OrderCol[] orderCols = null;
    StructType schema = null;
    UnsafeExternalRowSorter.PrefixComputer prefixComputer = null;
    PrefixComparator prefixComparator = null;
    DataNodeMemoryManager dataNodeMemoryManager = null;
    UnsafeExternalRowSorter sorter = null;
    int[] groupColumnIndexs = null;
    this.fieldCount = fieldCount;
    if (rrs.getGroupByCols() != null) {
        groupColumnIndexs = toColumnIndex(rrs.getGroupByCols(), columToIndx);
        if (LOGGER.isDebugEnabled()) {
            for (int i = 0; i < rrs.getGroupByCols().length; i++) {
                LOGGER.debug("groupColumnIndexs:" + rrs.getGroupByCols()[i]);
            }
        }
    }
    if (rrs.getHavingCols() != null) {
        ColMeta colMeta = columToIndx.get(rrs.getHavingCols().getLeft().toUpperCase());
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("getHavingCols:" + rrs.getHavingCols().toString());
        }
        /**
         * mycat 中将 sql: select avg(xxx) from t
         * 重写 为 select sum(xxx) AS AVG[0~9]SUM,count(xxx) AS AVG[0~9]COUNT from t
         *  或者 select avg(xxx)  AS xxx from t
         *  select sum(xxx) AS xxxSUM,count(xxx) AS xxxCOUNT from t
         */
        if (colMeta == null) {
            for (String key : columToIndx.keySet()) {
                if (key.toUpperCase().endsWith("SUM")) {
                    colMeta = columToIndx.get(key);
                    break;
                }
            }
        }
        if (colMeta != null) {
            rrs.getHavingCols().setColMeta(colMeta);
        }
    }
    if (rrs.isHasAggrColumn()) {
        List<MergeCol> mergCols = new LinkedList<MergeCol>();
        Map<String, Integer> mergeColsMap = rrs.getMergeCols();
        if (mergeColsMap != null) {
            if (LOGGER.isDebugEnabled() && rrs.getMergeCols() != null) {
                LOGGER.debug("isHasAggrColumn:" + rrs.getMergeCols().toString());
            }
            for (Map.Entry<String, Integer> mergEntry : mergeColsMap.entrySet()) {
                String colName = mergEntry.getKey().toUpperCase();
                int type = mergEntry.getValue();
                if (MergeCol.MERGE_AVG == type) {
                    ColMeta sumColMeta = columToIndx.get(colName + "SUM");
                    ColMeta countColMeta = columToIndx.get(colName + "COUNT");
                    if (sumColMeta != null && countColMeta != null) {
                        ColMeta colMeta = new ColMeta(sumColMeta.colIndex, countColMeta.colIndex, sumColMeta.getColType());
                        mergCols.add(new MergeCol(colMeta, mergEntry.getValue()));
                    }
                } else {
                    ColMeta colMeta = columToIndx.get(colName);
                    mergCols.add(new MergeCol(colMeta, mergEntry.getValue()));
                }
            }
        }
        // add no alias merg column
        for (Map.Entry<String, ColMeta> fieldEntry : columToIndx.entrySet()) {
            String colName = fieldEntry.getKey();
            int result = MergeCol.tryParseAggCol(colName);
            if (result != MergeCol.MERGE_UNSUPPORT && result != MergeCol.MERGE_NOMERGE) {
                mergCols.add(new MergeCol(fieldEntry.getValue(), result));
            }
        }
        /**
         * Group操作
         */
        MergeCol[] mergColsArrays = mergCols.toArray(new MergeCol[mergCols.size()]);
        unsafeRowGrouper = new UnsafeRowGrouper(columToIndx, rrs.getGroupByCols(), mergColsArrays, rrs.getHavingCols());
        if (mergColsArrays != null && mergColsArrays.length > 0) {
            mergeColsIndex = new int[mergColsArrays.length];
            for (int i = 0; i < mergColsArrays.length; i++) {
                mergeColsIndex[i] = mergColsArrays[i].colMeta.colIndex;
            }
            Arrays.sort(mergeColsIndex);
        }
    }
    if (rrs.getOrderByCols() != null) {
        LinkedHashMap<String, Integer> orders = rrs.getOrderByCols();
        orderCols = new OrderCol[orders.size()];
        int i = 0;
        for (Map.Entry<String, Integer> entry : orders.entrySet()) {
            String key = StringUtil.removeBackquote(entry.getKey().toUpperCase());
            ColMeta colMeta = columToIndx.get(key);
            if (colMeta == null) {
                throw new IllegalArgumentException("all columns in order by clause should be in the selected column list!" + entry.getKey());
            }
            orderCols[i++] = new OrderCol(colMeta, entry.getValue());
        }
        /**
         * 构造全局排序器
         */
        schema = new StructType(columToIndx, fieldCount);
        schema.setOrderCols(orderCols);
        prefixComputer = new RowPrefixComputer(schema);
        // if(orderCols.length>0
        // && orderCols[0].getOrderType()
        // == OrderCol.COL_ORDER_TYPE_ASC){
        // prefixComparator = PrefixComparators.LONG;
        // }else {
        // prefixComparator = PrefixComparators.LONG_DESC;
        // }
        prefixComparator = getPrefixComparator(orderCols);
        dataNodeMemoryManager = new DataNodeMemoryManager(memoryManager, Thread.currentThread().getId());
        /**
         * 默认排序,只是将数据连续存储到内存中即可。
         */
        globalSorter = new UnsafeExternalRowSorter(dataNodeMemoryManager, myCatMemory, schema, prefixComparator, prefixComputer, conf.getSizeAsBytes("mycat.buffer.pageSize", "32k"), false, /**
         *是否使用基数排序
         */
        true);
    }
    if (conf.getBoolean("mycat.stream.output.result", false) && globalSorter == null && unsafeRowGrouper == null) {
        setStreamOutputResult(true);
    } else {
        /**
         * 1.schema
         */
        schema = new StructType(columToIndx, fieldCount);
        schema.setOrderCols(orderCols);
        /**
         * 2 .PrefixComputer
         */
        prefixComputer = new RowPrefixComputer(schema);
        /**
         * 3 .PrefixComparator 默认是ASC,可以选择DESC
         */
        prefixComparator = PrefixComparators.LONG;
        dataNodeMemoryManager = new DataNodeMemoryManager(memoryManager, Thread.currentThread().getId());
        globalMergeResult = new UnsafeExternalRowSorter(dataNodeMemoryManager, myCatMemory, schema, prefixComparator, prefixComputer, conf.getSizeAsBytes("mycat.buffer.pageSize", "32k"), false, /**
         *是否使用基数排序
         */
        false);
    }
}
Also used : PrefixComparator(io.mycat.memory.unsafe.utils.sort.PrefixComparator) UnsafeExternalRowSorter(io.mycat.memory.unsafe.utils.sort.UnsafeExternalRowSorter) StructType(io.mycat.memory.unsafe.row.StructType) DataNodeMemoryManager(io.mycat.memory.unsafe.memory.mm.DataNodeMemoryManager) LinkedList(java.util.LinkedList) RowPrefixComputer(io.mycat.memory.unsafe.utils.sort.RowPrefixComputer) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 13 with StructType

use of io.mycat.memory.unsafe.row.StructType in project Mycat_plus by coderczp.

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);
}
Also used : StructType(io.mycat.memory.unsafe.row.StructType) UnsafeRowWriter(io.mycat.memory.unsafe.row.UnsafeRowWriter) UnsafeRow(io.mycat.memory.unsafe.row.UnsafeRow) BufferHolder(io.mycat.memory.unsafe.row.BufferHolder) BigDecimal(java.math.BigDecimal)

Example 14 with StructType

use of io.mycat.memory.unsafe.row.StructType in project Mycat-Server by MyCATApache.

the class UnsafeFixedWidthAggregationMapSuite method testWithMemoryLeakDetection.

@Test
public void testWithMemoryLeakDetection() throws IOException, NoSuchFieldException, IllegalAccessException {
    MyCatMemory myCatMemory = new MyCatMemory();
    MemoryManager memoryManager = myCatMemory.getResultMergeMemoryManager();
    DataNodeMemoryManager dataNodeMemoryManager = new DataNodeMemoryManager(memoryManager, Thread.currentThread().getId());
    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_DESC);
    orderCols[0] = orderCol;
    groupKeySchema = new StructType(colMetaMap, fieldCount);
    groupKeySchema.setOrderCols(orderCols);
    fieldCount = 3;
    colMeta = null;
    colMetaMap = new HashMap<String, ColMeta>(fieldCount);
    colMeta = new ColMeta(0, ColMeta.COL_TYPE_LONGLONG);
    colMetaMap.put("age", colMeta);
    colMeta = new ColMeta(1, ColMeta.COL_TYPE_LONGLONG);
    colMetaMap.put("age1", colMeta);
    colMeta = new ColMeta(2, ColMeta.COL_TYPE_STRING);
    colMetaMap.put("name", colMeta);
    orderCols = new OrderCol[1];
    orderCol = new OrderCol(colMetaMap.get("id"), OrderCol.COL_ORDER_TYPE_DESC);
    orderCols[0] = orderCol;
    aggBufferSchema = new StructType(colMetaMap, fieldCount);
    aggBufferSchema.setOrderCols(orderCols);
    /**
     * value
     */
    BufferHolder bufferHolder;
    emptyAggregationBuffer = new UnsafeRow(3);
    bufferHolder = new BufferHolder(emptyAggregationBuffer, 0);
    UnsafeRowWriter unsafeRowWriter = new UnsafeRowWriter(bufferHolder, 3);
    bufferHolder.reset();
    String value = "ok,hello";
    emptyAggregationBuffer.setLong(0, 0);
    emptyAggregationBuffer.setLong(1, 0);
    unsafeRowWriter.write(2, value.getBytes());
    emptyAggregationBuffer.setTotalSize(bufferHolder.totalSize());
    UnsafeFixedWidthAggregationMap map = new UnsafeFixedWidthAggregationMap(emptyAggregationBuffer, aggBufferSchema, groupKeySchema, dataNodeMemoryManager, 2 * 1024, PAGE_SIZE_BYTES, false);
    int i;
    List<UnsafeRow> rows = new ArrayList<UnsafeRow>();
    for (i = 0; i < 1000; i++) {
        String line = "testUnsafeRow" + i;
        /**
         * key
         */
        UnsafeRow groupKey = new UnsafeRow(3);
        bufferHolder = new BufferHolder(groupKey, 0);
        unsafeRowWriter = new UnsafeRowWriter(bufferHolder, 3);
        bufferHolder.reset();
        final byte[] key = getRandomByteArray(rand.nextInt(8));
        String age = "5" + i;
        unsafeRowWriter.write(0, key);
        unsafeRowWriter.write(1, line.getBytes());
        unsafeRowWriter.write(2, age.getBytes());
        groupKey.setTotalSize(bufferHolder.totalSize());
        map.getAggregationBuffer(groupKey);
        rows.add(groupKey);
    }
    Assert.assertEquals(i, rows.size());
    UnsafeRow row = rows.get(12);
    UnsafeRow rs = map.getAggregationBuffer(row);
    rs.setLong(0, 12);
    rs = map.getAggregationBuffer(row);
    Assert.assertEquals(12, rs.getLong(0));
    map.free();
}
Also used : ColMeta(io.mycat.sqlengine.mpp.ColMeta) StructType(io.mycat.memory.unsafe.row.StructType) DataNodeMemoryManager(io.mycat.memory.unsafe.memory.mm.DataNodeMemoryManager) UnsafeRowWriter(io.mycat.memory.unsafe.row.UnsafeRowWriter) DataNodeMemoryManager(io.mycat.memory.unsafe.memory.mm.DataNodeMemoryManager) MemoryManager(io.mycat.memory.unsafe.memory.mm.MemoryManager) UnsafeRow(io.mycat.memory.unsafe.row.UnsafeRow) BufferHolder(io.mycat.memory.unsafe.row.BufferHolder) OrderCol(io.mycat.sqlengine.mpp.OrderCol) MyCatMemory(io.mycat.memory.MyCatMemory) Test(org.junit.Test)

Aggregations

StructType (io.mycat.memory.unsafe.row.StructType)14 BufferHolder (io.mycat.memory.unsafe.row.BufferHolder)12 UnsafeRow (io.mycat.memory.unsafe.row.UnsafeRow)12 UnsafeRowWriter (io.mycat.memory.unsafe.row.UnsafeRowWriter)12 DataNodeMemoryManager (io.mycat.memory.unsafe.memory.mm.DataNodeMemoryManager)10 ColMeta (io.mycat.sqlengine.mpp.ColMeta)8 OrderCol (io.mycat.sqlengine.mpp.OrderCol)8 MyCatMemory (io.mycat.memory.MyCatMemory)6 MemoryManager (io.mycat.memory.unsafe.memory.mm.MemoryManager)6 Test (org.junit.Test)6 PrefixComparator (io.mycat.memory.unsafe.utils.sort.PrefixComparator)4 RowPrefixComputer (io.mycat.memory.unsafe.utils.sort.RowPrefixComputer)4 UnsafeExternalRowSorter (io.mycat.memory.unsafe.utils.sort.UnsafeExternalRowSorter)4 BigDecimal (java.math.BigDecimal)4 UnsafeFixedWidthAggregationMap (io.mycat.memory.unsafe.map.UnsafeFixedWidthAggregationMap)2 DataNodeDiskManager (io.mycat.memory.unsafe.storage.DataNodeDiskManager)2 SerializerManager (io.mycat.memory.unsafe.storage.SerializerManager)2 MycatPropertyConf (io.mycat.memory.unsafe.utils.MycatPropertyConf)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2