use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class CsvScanTest method baseTest.
// @Test
@SneakyThrows
public void baseTest() {
Path path = Paths.get("D:\\testcsv.csv");
//
// CsvWriter writer = new CsvWriter(path.toFile(), new CsvWriterSettings());
// for (int i = 0; i < 800_0000; i++) {
// writer.writeRow(Arrays.asList(i,i));
// }
// writer.close();
StopWatch stopWatch = new StopWatch();
ExecuteCompiler executeCompiler = new ExecuteCompiler();
CsvScanPlan csvScan = new ValuesCsvScanPlan(path.toString(), SchemaBuilder.ofArrowType(ArrowTypes.INT64_TYPE, ArrowTypes.STRING_TYPE).toArrow(), executeCompiler.createRootContext());
Function column = executeCompiler.column(0, csvScan.schema());
Function add = executeCompiler.call("+", Arrays.asList(column, column));
RootContext rootContext = executeCompiler.createRootContext();
PhysicalPlan projection = executeCompiler.project(csvScan, Arrays.asList(add));
for (int i = 0; i < 100; i++) {
stopWatch.reset();
stopWatch.start();
Observable<VectorSchemaRoot> execute = projection.execute(rootContext);
AtomicLong count = new AtomicLong(0);
execute.blockingLatest().forEach(c -> {
count.getAndAdd(c.getRowCount());
c.close();
});
stopWatch.stop();
System.out.println("count:" + count);
Duration duration = Duration.ofMillis(stopWatch.getTime());
System.out.println(duration.getSeconds());
System.out.println(stopWatch.toString());
}
//
// Thread.sleep(100000000);
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class ExecutorProviderImpl method prepare.
@Override
public PrepareExecutor prepare(Plan plan) {
CodeExecuterContext codeExecuterContext = plan.getCodeExecuterContext();
PrepareExecutor bindable = codeExecuterContext.bindable;
if (bindable != null)
return bindable;
try {
return codeExecuterContext.bindable = PrepareExecutor.of((newMycatDataContext, mycatRowMetaData) -> {
DrdsSqlWithParams drdsSql = newMycatDataContext.getDrdsSql();
CalciteCompiler mycatCalciteCompiler = new CalciteCompiler();
PhysicalPlan factory = mycatCalciteCompiler.convert(plan.getMycatRel());
factory = fixCast(factory);
RexConverter rexConverter = mycatCalciteCompiler.getRexConverter();
Map<Integer, IndexedParameterLinkFunction> indexedMap = rexConverter.getIndexedParameterLinkFunctionMap();
List<Object> params = drdsSql.getParams();
if (!indexedMap.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
Object o = params.get(i);
IndexedParameterLinkFunction indexedParameterLinkFunction = indexedMap.get(i);
if (indexedParameterLinkFunction != null) {
BindVariable base = (BindVariable) indexedParameterLinkFunction.getBase();
base.setObject(o);
}
}
}
List<SessionVariable> sessionMap = rexConverter.getSessionVariableFunctionMap();
for (SessionVariable sessionVariable : sessionMap) {
sessionVariable.setSession(newMycatDataContext.getContext());
}
AsyncMycatDataContextImpl.SqlMycatDataContextImpl sqlMycatDataContext = new AsyncMycatDataContextImpl.SqlMycatDataContextImpl(newMycatDataContext.getContext(), plan.getCodeExecuterContext(), drdsSql);
RootContext rootContext = new RootContext(sqlMycatDataContext);
Observable<VectorSchemaRoot> schemaRootObservable = factory.execute(rootContext);
return PrepareExecutor.ArrowObservable.of(mycatRowMetaData, schemaRootObservable);
}, getArrayBindable(codeExecuterContext));
} catch (Exception exception) {
LOGGER.error("", exception);
}
return null;
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class LimitPlan method execute.
@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
MutableLong offsetBox = new MutableLong(offsetExpr.getInt(null));
MutableLong fetchBox = new MutableLong(fetchExpr.getInt(null));
Observable<VectorSchemaRoot> observable = input.execute(rootContext).subscribeOn(Schedulers.single());
if (offsetBox.longValue() > 0) {
observable = observable.map(root -> {
long offset = offsetBox.longValue();
if (offset == 0) {
return root;
}
if (offset > 0) {
if (root.getRowCount() > offset) {
try {
return root.slice((int) offset);
} finally {
offsetBox.setValue(0);
}
}
offsetBox.subtract(root.getRowCount());
root.clear();
return root;
}
throw new IllegalArgumentException();
});
}
if (fetchBox.longValue() > 0) {
observable = observable.map(root -> {
long fetch = fetchBox.longValue();
if (fetch == 0) {
root.clear();
return root;
}
int rowCount = root.getRowCount();
if (fetch > 0) {
if (fetch > rowCount) {
fetchBox.subtract(rowCount);
return root;
}
fetchBox.setValue(0);
return root.slice(0, (int) fetch);
}
throw new IllegalArgumentException();
});
}
return observable;
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class MycatViewPlan method execute.
@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
RootAllocator rootAllocator = new RootAllocator();
NewMycatDataContext context = (NewMycatDataContext) rootContext.getContext();
DrdsSqlWithParams drdsSql = context.getDrdsSql();
MycatView view = (MycatView) mycatView;
CopyMycatRowMetaData rowMetaData = new CopyMycatRowMetaData(new CalciteRowMetaData(view.getRowType().getFieldList()));
MycatRelDatasourceSourceInfo mycatRelDatasourceSourceInfo = new MycatRelDatasourceSourceInfo(rowMetaData, view.getSQLTemplate(DrdsSql.isForUpdate(drdsSql.getParameterizedStatement())), view);
SqlNode sqlTemplate = mycatRelDatasourceSourceInfo.getSqlTemplate();
List<PartitionGroup> partitionGroups = AsyncMycatDataContextImpl.getSqlMap(Collections.emptyMap(), view, drdsSql, drdsSql.getHintDataNodeFilter());
ImmutableMultimap<String, SqlString> stringSqlStringImmutableMultimap = view.apply(-1, sqlTemplate, partitionGroups, drdsSql.getParams());
List<Observable<VectorSchemaRoot>> observableList = new ArrayList<>();
for (Map.Entry<String, SqlString> entry : stringSqlStringImmutableMultimap.entries()) {
String key = entry.getKey();
SqlString sqlString = entry.getValue();
observableList.add(Observable.create(emitter -> {
Future<NewMycatConnection> connectionFuture = context.getConnection(context.getContext().resolveDatasourceTargetName(key));
Future<Observable<VectorSchemaRoot>> observableFuture = connectionFuture.map(connection -> {
Observable<VectorSchemaRoot> observable = connection.prepareQuery(sqlString.getSql(), MycatPreparedStatementUtil.extractParams(drdsSql.getParams(), sqlString.getDynamicParameters()), MycatRelDataType.getMycatRelType(MycatViewPlan.this.schema()), rootAllocator);
return observable.doOnComplete(() -> context.recycleConnection(context.getContext().resolveDatasourceTargetName(key), Future.succeededFuture(connection)));
});
observableFuture.onFailure(event -> emitter.tryOnError(event));
observableFuture.onSuccess(event -> {
event = event.doOnComplete(() -> emitter.onComplete());
event = event.doOnError(throwable -> emitter.tryOnError(throwable));
event.forEach(vectorSchemaRoot -> emitter.onNext(vectorSchemaRoot));
});
}));
}
return Observable.fromIterable(observableList).flatMap(i -> i);
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class DistinctPlan method execute.
@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
// DistinctContext distinctContext = new DistinctContext();
IntInnerType[] intPairs = getIntTypes();
Map map = MapFactory.createMap(intPairs);
RecordSink recordSink = RecordSinkFactory.INSTANCE.buildRecordSink(intPairs);
return input.execute(rootContext).flatMap(input -> {
int rowCount = input.getRowCount();
int columnCount = input.getFieldVectors().size();
VectorSchemaRoot output = rootContext.getVectorSchemaRoot(schema(), rowCount);
VectorBatchRecord record = new VectorBatchRecord(input);
int outputRowId = 0;
for (int rowId = 0; rowId < rowCount; rowId++) {
record.setPosition(rowId);
MapKey key = map.withKey();
RecordSetter recordSinkSPI = RecordSinkFactory.INSTANCE.getRecordSinkSPI(key);
recordSink.copy(record, recordSinkSPI);
if (key.create()) {
recordSink.copy(record, outputRowId, output);
outputRowId++;
// output
} else {
// skip
}
}
if (outputRowId == 0) {
output.close();
return Observable.empty();
}
output.setRowCount(outputRowId);
return Observable.fromArray(output);
}).doOnComplete(new Action() {
@Override
public void run() throws Throwable {
map.close();
}
});
}
Aggregations