use of com.pingcap.tikv.types.DataType in project tispark by pingcap.
the class CoprocessorIterator method getTiChunkIterator.
/**
* Build a DAGIterator from TiDAGRequest and region tasks to get rows
*
* <p>When we are preforming a scan request using coveringIndex, {@link
* com.pingcap.tidb.tipb.IndexScan} should be used to read index rows. In other circumstances,
* {@link com.pingcap.tidb.tipb.TableScan} is used to scan table rows.
*
* @param req TiDAGRequest built
* @param regionTasks a list or RegionTask each contains a task on a single region
* @param session TiSession
* @return a DAGIterator to be processed
*/
public static CoprocessorIterator<TiChunk> getTiChunkIterator(TiDAGRequest req, List<RegionTask> regionTasks, TiSession session, int numOfRows) {
TiDAGRequest dagRequest = req.copy();
return new DAGIterator<TiChunk>(dagRequest.buildTableScan(), regionTasks, session, SchemaInfer.create(dagRequest), dagRequest.getPushDownType(), dagRequest.getStoreType(), dagRequest.getStartTs().getVersion()) {
@Override
public TiChunk next() {
DataType[] dataTypes = this.schemaInfer.getTypes().toArray(new DataType[0]);
// TODO tiColumnarBatch is meant to be reused in the entire data loading process.
if (this.encodeType == EncodeType.TypeDefault) {
Row[] rows = new Row[numOfRows];
int count = 0;
for (int i = 0; i < rows.length && hasNext(); i++) {
rows[i] = rowReader.readRow(dataTypes);
count += 1;
}
TiRowColumnVector[] columnarVectors = new TiRowColumnVector[dataTypes.length];
for (int i = 0; i < dataTypes.length; i++) {
columnarVectors[i] = new TiRowColumnVector(dataTypes[i], i, rows, count);
}
return new TiChunk(columnarVectors);
} else if (this.encodeType == EncodeType.TypeChunk) {
TiColumnVector[] columnarVectors = new TiColumnVector[dataTypes.length];
List<List<TiChunkColumnVector>> childColumnVectors = new ArrayList<>();
for (int i = 0; i < dataTypes.length; i++) {
childColumnVectors.add(new ArrayList<>());
}
int count = 0;
// TODO(Zhexuan Yang) we need control memory limit in case of out of memory error
while (count < numOfRows && hasNext()) {
for (int i = 0; i < dataTypes.length; i++) {
childColumnVectors.get(i).add(dataTypes[i].decodeChunkColumn(dataInput));
}
int size = childColumnVectors.get(0).size();
count += childColumnVectors.get(0).get(size - 1).numOfRows();
// left data should be trashed.
dataInput = new CodecDataInput(new byte[0]);
}
for (int i = 0; i < dataTypes.length; i++) {
columnarVectors[i] = new BatchedTiChunkColumnVector(childColumnVectors.get(i), count);
}
return new TiChunk(columnarVectors);
} else {
// reading column count
long colCount = IntegerCodec.readUVarLong(dataInput);
long numOfRows = IntegerCodec.readUVarLong(dataInput);
TiColumnVector[] columnVectors = new TiColumnVector[(int) colCount];
for (int columnIdx = 0; columnIdx < colCount; columnIdx++) {
// reading column name
long length = IntegerCodec.readUVarLong(dataInput);
for (int i = 0; i < length; i++) {
dataInput.readByte();
}
// reading type name
length = IntegerCodec.readUVarLong(dataInput);
byte[] utf8Bytes = new byte[(int) length];
for (int i = 0; i < length; i++) {
utf8Bytes[i] = dataInput.readByte();
}
String typeName = new String(utf8Bytes, StandardCharsets.UTF_8);
CHType type = CHTypeMapping.parseType(typeName);
columnVectors[columnIdx] = type.decode(dataInput, (int) numOfRows);
// TODO this is workaround to bybass nullable type
}
dataInput = new CodecDataInput(new byte[0]);
return new TiChunk(columnVectors);
}
}
};
}
use of com.pingcap.tikv.types.DataType in project tispark by pingcap.
the class TiKVScanAnalyzerTest method createTableWithPrefix.
private static TiTableInfo createTableWithPrefix() {
InternalTypeHolder holder = new InternalTypeHolder(MySQLType.TypeVarchar.getTypeCode(), 0, // indicating a prefix type
3, 0, "", "", ImmutableList.of());
DataType typePrefix = DataTypeFactory.of(holder);
return new MetaUtils.TableBuilder().name("testTable").addColumn("c1", IntegerType.INT, true).addColumn("c2", typePrefix).addColumn("c3", StringType.VARCHAR).addColumn("c4", IntegerType.INT).appendIndex("testIndex", ImmutableList.of("c1", "c2", "c3"), false).setPkHandle(true).build();
}
use of com.pingcap.tikv.types.DataType in project tispark by pingcap.
the class ChunkIteratorTest method chunkTest.
@Test
public void chunkTest() {
ChunkIterator<ByteString> chunkIterator = ChunkIterator.getRawBytesChunkIterator(chunks);
DataType bytes = StringType.VARCHAR;
DataType ints = IntegerType.INT;
Row row = ObjectRowImpl.create(6);
CodecDataInput cdi = new CodecDataInput(chunkIterator.next());
setValueToRow(cdi, ints, 0, row);
setValueToRow(cdi, bytes, 1, row);
cdi = new CodecDataInput(chunkIterator.next());
setValueToRow(cdi, ints, 2, row);
setValueToRow(cdi, bytes, 3, row);
cdi = new CodecDataInput(chunkIterator.next());
setValueToRow(cdi, ints, 4, row);
setValueToRow(cdi, bytes, 5, row);
assertEquals(row.getLong(0), 1);
assertEquals(row.getString(1), "a");
assertEquals(row.getLong(2), 2);
assertEquals(row.getString(3), "b");
assertEquals(row.getLong(4), 3);
assertEquals(row.getString(5), "c");
}
use of com.pingcap.tikv.types.DataType in project tispark by pingcap.
the class SchemaInferTest method simpleSelectSchemaInferTest.
@Test
public void simpleSelectSchemaInferTest() {
// select name from t1;
TiDAGRequest tiDAGRequest = new TiDAGRequest(TiDAGRequest.PushDownType.NORMAL);
tiDAGRequest.addRequiredColumn(name);
tiDAGRequest.setTableInfo(table);
tiDAGRequest.setStartTs(ts);
List<DataType> dataTypes = SchemaInfer.create(tiDAGRequest).getTypes();
assertEquals(1, dataTypes.size());
assertEquals(StringType.VARCHAR.getClass(), dataTypes.get(0).getClass());
}
use of com.pingcap.tikv.types.DataType in project tispark by pingcap.
the class ProtoConverter method visit.
@Override
protected Expr visit(Constant node, Object context) {
Expr.Builder builder = Expr.newBuilder();
DataType type = node.getDataType();
if (node.getValue() == null) {
builder.setTp(ExprType.Null);
} else {
// can mark it cannot be pushed down to coprocessor.
if (node.isOverflowed()) {
throw new UnsupportedOperationException("overflowed value cannot be pushed down to coprocessor");
}
builder.setTp(type.getProtoExprType());
CodecDataOutput cdo = new CodecDataOutput();
type.encode(cdo, EncodeType.PROTO, node.getValue());
builder.setVal(cdo.toByteString());
builder.setFieldType(toPBFieldType(getType(node)));
}
return builder.build();
}
Aggregations