use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class GroupByKeyPlan method execute.
@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
List<Field> fields = schema().getFields();
InnerType[] innerTypes = schema().getFields().stream().map(i -> InnerType.from(i.getType())).toArray(n -> new InnerType[n]);
Map map = MapFactory.createMap(innerTypes);
RecordSink[] recordSinks = new RecordSink[groupByKeys.length];
int groupIndex = 0;
for (GroupKeys groupByKey : groupByKeys) {
IntInnerType[] intPairs = new IntInnerType[groupByKey.getKeys().length];
int[] keys = groupByKey.getKeys();
int index = 0;
for (int key : keys) {
Field field = fields.get(key);
intPairs[index] = IntInnerType.of(index, InnerType.from(field.getType()));
index++;
}
recordSinks[groupIndex] = RecordSinkFactory.INSTANCE.buildRecordSink(intPairs);
groupIndex++;
}
return inputPlan.execute(rootContext).flatMap(new Function<VectorSchemaRoot, ObservableSource<? extends VectorSchemaRoot>>() {
@Override
public ObservableSource<? extends VectorSchemaRoot> apply(VectorSchemaRoot input) throws Throwable {
int rowCount = input.getRowCount();
VectorBatchRecord record = new VectorBatchRecord(input);
VectorSchemaRoot output = rootContext.getVectorSchemaRoot(schema, rowCount * recordSinks.length);
int outputRowId = 0;
for (int i = 0; i < recordSinks.length; i++) {
RecordSink recordSink = recordSinks[i];
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);
inputPlan.eachFree(input);
return Observable.fromArray(output);
}
}).doOnComplete(new Action() {
@Override
public void run() throws Throwable {
map.close();
}
});
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class HeapTopNPlan method execute.
@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
Comparator<Record> recordComparator;
if (physicalSortProperties.size() == 1) {
recordComparator = physicalSortProperties.get(0).evaluateToSortComparator();
} else {
recordComparator = physicalSortProperties.get(0).evaluateToSortComparator();
for (PhysicalSortProperty physicalSortProperty : physicalSortProperties.subList(1, physicalSortProperties.size())) {
recordComparator = recordComparator.thenComparing(physicalSortProperty.evaluateToSortComparator());
}
}
OutputLinq4jPhysicalPlan midPlan = OutputLinq4jPhysicalPlan.create(input);
Observable<Object[]> observable = midPlan.executeToObject(rootContext);
@NonNull Iterable<Record> objects = MycatRxJavaUtl.blockingIterable(observable.map(i -> RecordImpl.create(i)));
Enumerable<Record> records = EnumerableDefaults.orderBy(Linq4j.asEnumerable(objects), i -> i, recordComparator, offset.getInt(null), fetch.getInt(null));
return InputRecordPhysicalPlan.create(schema(), Observable.fromIterable(records)).execute(rootContext);
}
use of io.ordinate.engine.record.RootContext in project Mycat2 by MyCATApache.
the class OutputLinq4jPhysicalPlan method executeToObject.
public Observable<Object[]> executeToObject(RootContext rootContext) {
return input.execute(rootContext).flatMap(c -> {
int rowCount = c.getRowCount();
int columnCount = c.getFieldVectors().size();
Object[][] array = IntStream.range(0, rowCount).mapToObj(i -> new Object[columnCount]).toArray(n -> new Object[rowCount][]);
for (int columnId = 0; columnId < columnCount; columnId++) {
FieldVector vector = c.getVector(columnId);
for (int rowId = 0; rowId < rowCount; rowId++) {
Object object = vector.getObject(rowId);
array[rowId][columnId] = object;
}
}
return Observable.fromArray(array);
});
}
Aggregations