in modules/spring-data-ext/spring-data/src/main/java/org/apache/ignite/springdata/repository/query/IgniteRepositoryQuery.java [535:646]
private Object transformQueryCursor(IgniteQuery qry,
ReturnStrategy returnStgy,
Object[] prmtrs,
QueryCursor qryCursor) {
final Class<?> retCls;
if (hasProjection) {
if (hasDynamicProjection)
retCls = (Class<?>)prmtrs[dynamicProjectionIndex];
else
retCls = returnedDomainClass;
}
else
retCls = returnedDomainClass;
if (qry.isFieldQuery()) {
// take control over single primite result from queries, i.e. DELETE, SELECT COUNT, UPDATE ...
boolean singlePrimitiveResult = isPrimitiveOrWrapper(retCls);
FieldsQueryCursor<?> fieldQryCur = (FieldsQueryCursor<?>)qryCursor;
Function<List<?>, ?> cWrapperTransformFunction = null;
if (type.equals(retCls))
cWrapperTransformFunction = row -> rowToEntity(row, fieldQryCur);
else {
if (hasProjection || singlePrimitiveResult) {
if (singlePrimitiveResult)
cWrapperTransformFunction = row -> row.get(0);
else {
// Map row -> projection class
cWrapperTransformFunction = row -> factory
.createProjection(retCls, rowToMap(row, fieldQryCur));
}
}
else
cWrapperTransformFunction = row -> rowToMap(row, fieldQryCur);
}
QueryCursorWrapper<?, ?> cWrapper = new QueryCursorWrapper<>((QueryCursor<List<?>>)qryCursor,
cWrapperTransformFunction);
switch (returnStgy) {
case PAGE_OF_VALUES:
return new PageImpl(cWrapper.getAll(), (Pageable)prmtrs[prmtrs.length - 1], 0);
case LIST_OF_VALUES:
return cWrapper.getAll();
case STREAM_OF_VALUES:
return cWrapper.stream();
case ONE_VALUE:
Iterator<?> iter = cWrapper.iterator();
if (iter.hasNext()) {
Object resp = iter.next();
U.closeQuiet(cWrapper);
return resp;
}
return null;
case SLICE_OF_VALUES:
return new SliceImpl(cWrapper.getAll(), (Pageable)prmtrs[prmtrs.length - 1], true);
case SLICE_OF_LISTS:
return new SliceImpl(qryCursor.getAll(), (Pageable)prmtrs[prmtrs.length - 1], true);
case LIST_OF_LISTS:
return qryCursor.getAll();
default:
throw new IllegalStateException();
}
}
else {
Function<Cache.Entry<?, ?>, ?> cWrapperTransformFunction;
if (hasProjection && !type.equals(retCls))
cWrapperTransformFunction = row -> factory.createProjection(retCls, row.getValue());
else
cWrapperTransformFunction = Cache.Entry::getValue;
QueryCursorWrapper<Cache.Entry<?, ?>, ?> cWrapper = new QueryCursorWrapper<>(
(QueryCursor<Cache.Entry<?, ?>>)qryCursor, cWrapperTransformFunction);
switch (returnStgy) {
case PAGE_OF_VALUES:
return new PageImpl(cWrapper.getAll(), (Pageable)prmtrs[prmtrs.length - 1], 0);
case LIST_OF_VALUES:
return cWrapper.getAll();
case STREAM_OF_VALUES:
return cWrapper.stream();
case ONE_VALUE:
Iterator<?> iter1 = cWrapper.iterator();
if (iter1.hasNext()) {
Object resp = iter1.next();
U.closeQuiet(cWrapper);
return resp;
}
return null;
case CACHE_ENTRY:
Iterator<?> iter2 = qryCursor.iterator();
if (iter2.hasNext()) {
Object resp2 = iter2.next();
U.closeQuiet(qryCursor);
return resp2;
}
return null;
case SLICE_OF_VALUES:
return new SliceImpl(cWrapper.getAll(), (Pageable)prmtrs[prmtrs.length - 1], true);
case SLICE_OF_CACHE_ENTRIES:
return new SliceImpl(qryCursor.getAll(), (Pageable)prmtrs[prmtrs.length - 1], true);
case LIST_OF_CACHE_ENTRIES:
return qryCursor.getAll();
default:
throw new IllegalStateException();
}
}
}