use of org.apache.ignite.internal.sql.engine.SqlCursor in project ignite-3 by apache.
the class ExecutionServiceImpl method mapAndExecutePlan.
private SqlCursor<List<?>> mapAndExecutePlan(RootQuery<RowT> qry, MultiStepPlan plan) {
qry.mapping();
plan.init(mappingSrvc, new MappingQueryContext(locNodeId, topologyVersion()));
List<Fragment> fragments = plan.fragments();
// Local execution
Fragment fragment = first(fragments);
if (IgniteUtils.assertionsEnabled()) {
assert fragment != null;
FragmentMapping mapping = plan.mapping(fragment);
assert mapping != null;
List<String> nodes = mapping.nodeIds();
assert nodes != null && nodes.size() == 1 && first(nodes).equals(locNodeId);
}
FragmentDescription fragmentDesc = new FragmentDescription(fragment.fragmentId(), plan.mapping(fragment), plan.target(fragment), plan.remotes(fragment));
ExecutionContext<RowT> ectx = new ExecutionContext<>(qry.context(), taskExecutor, qry.id(), locNodeId, locNodeId, topologyVersion(), fragmentDesc, handler, Commons.parametersMap(qry.parameters()));
Node<RowT> node = new LogicalRelImplementor<>(ectx, affSrvc, mailboxRegistry, exchangeSrvc).go(fragment.root());
qry.run(ectx, plan, node);
// start remote execution
for (int i = 1; i < fragments.size(); i++) {
fragment = fragments.get(i);
fragmentDesc = new FragmentDescription(fragment.fragmentId(), plan.mapping(fragment), plan.target(fragment), plan.remotes(fragment));
Throwable ex = null;
for (String nodeId : fragmentDesc.nodeIds()) {
if (ex != null) {
qry.onResponse(nodeId, fragment.fragmentId(), ex);
} else {
try {
QueryStartRequest req = FACTORY.queryStartRequest().queryId(qry.id()).fragmentId(fragment.fragmentId()).schema(qry.context().schemaName()).root(fragment.serialized()).topologyVersion(ectx.topologyVersion()).fragmentDescription(fragmentDesc).parameters(qry.parameters()).build();
msgSrvc.send(nodeId, req);
} catch (Throwable e) {
qry.onResponse(nodeId, fragment.fragmentId(), ex = e);
}
}
}
}
return Commons.createCursor(new TransformingIterator<>(iteratorsHolder.iterator(qry.iterator()), row -> {
int rowSize = ectx.rowHandler().columnCount(row);
List<Object> res = new ArrayList<>(rowSize);
for (int i = 0; i < rowSize; i++) {
res.add(ectx.rowHandler().get(i, row));
}
return res;
}), plan);
}
use of org.apache.ignite.internal.sql.engine.SqlCursor in project ignite-3 by apache.
the class QueryChecker method check.
/**
* Run checks.
*/
public void check() {
// Check plan.
QueryProcessor qryProc = getEngine();
List<SqlCursor<List<?>>> explainCursors = qryProc.query("PUBLIC", "EXPLAIN PLAN FOR " + qry);
Cursor<List<?>> explainCursor = explainCursors.get(0);
List<List<?>> explainRes = getAllFromCursor(explainCursor);
String actualPlan = (String) explainRes.get(0).get(0);
if (!CollectionUtils.nullOrEmpty(planMatchers)) {
for (Matcher<String> matcher : planMatchers) {
assertThat("Invalid plan:\n" + actualPlan, actualPlan, matcher);
}
}
if (exactPlan != null) {
assertEquals(exactPlan, actualPlan);
}
// Check result.
List<SqlCursor<List<?>>> cursors = qryProc.query("PUBLIC", qry, params);
SqlCursor<List<?>> cur = cursors.get(0);
if (expectedColumnNames != null) {
List<String> colNames = cur.metadata().fields().stream().map(ResultFieldMetadata::name).collect(Collectors.toList());
assertThat("Column names don't match", colNames, equalTo(expectedColumnNames));
}
if (expectedColumnTypes != null) {
List<Type> colNames = cur.metadata().fields().stream().map(ResultFieldMetadata::type).map(Commons::nativeTypeToClass).collect(Collectors.toList());
assertThat("Column types don't match", colNames, equalTo(expectedColumnTypes));
}
List<List<?>> res = CursorUtils.getAllFromCursor(cur);
if (expectedResult != null) {
if (!ordered) {
// Avoid arbitrary order.
res.sort(new ListComparator());
expectedResult.sort(new ListComparator());
}
assertEqualsCollections(expectedResult, res);
}
}
use of org.apache.ignite.internal.sql.engine.SqlCursor in project ignite-3 by apache.
the class JdbcQueryEventHandlerImpl method queryAsync.
/**
* {@inheritDoc}
*/
@Override
public CompletableFuture<QueryExecuteResult> queryAsync(QueryExecuteRequest req) {
if (req.pageSize() <= 0) {
return CompletableFuture.completedFuture(new QueryExecuteResult(Response.STATUS_FAILED, "Invalid fetch size : [fetchSize=" + req.pageSize() + ']'));
}
List<SqlCursor<List<?>>> cursors;
try {
QueryContext context = createQueryContext(req.getStmtType());
List<SqlCursor<List<?>>> queryCursors = processor.query(context, req.schemaName(), req.sqlQuery(), req.arguments() == null ? OBJECT_EMPTY_ARRAY : req.arguments());
cursors = queryCursors.stream().map(cursor -> new JdbcQueryCursor<>(req.maxRows(), cursor)).collect(Collectors.toList());
} catch (Exception e) {
StringWriter sw = getWriterWithStackTrace(e);
return CompletableFuture.completedFuture(new QueryExecuteResult(Response.STATUS_FAILED, "Exception while executing query " + req.sqlQuery() + ". Error message: " + sw));
}
if (cursors.isEmpty()) {
return CompletableFuture.completedFuture(new QueryExecuteResult(Response.STATUS_FAILED, "At least one cursor is expected for query " + req.sqlQuery()));
}
List<QuerySingleResult> results = new ArrayList<>();
try {
for (SqlCursor<List<?>> cur : cursors) {
QuerySingleResult res = createJdbcResult(cur, req);
results.add(res);
}
} catch (Exception ex) {
StringWriter sw = getWriterWithStackTrace(ex);
return CompletableFuture.completedFuture(new QueryExecuteResult(Response.STATUS_FAILED, "Failed to fetch results for query " + req.sqlQuery() + ". Error message: " + sw));
}
return CompletableFuture.completedFuture(new QueryExecuteResult(results));
}
Aggregations