in modules/spring-data-ext/spring-data/src/main/java/org/apache/ignite/springdata/repository/query/IgniteRepositoryQuery.java [721:847]
private Query prepareQuery(IgniteQuery qry, DynamicQueryConfig config, ReturnStrategy returnStgy, Object[] values) {
Object[] parameters = values;
String queryString = qry.qryStr();
Query query;
checkRequiredPageable(returnStgy, values);
if (!qry.isTextQuery()) {
boolean isParamDependent;
if (!qry.isAutogenerated()) {
StringQuery squery = new ExpressionBasedStringQuery(queryString, metadata, expressionParser);
queryString = squery.getQueryString();
parameters = extractBindableValues(parameters, getQueryMethod().getParameters(),
squery.getParameterBindings());
isParamDependent = isParameterDependent(squery);
}
else {
// remove dynamic projection from parameters
if (hasDynamicProjection)
parameters = ArrayUtils.remove(parameters, dynamicProjectionIndex);
isParamDependent = qry.isParameterDependent();
}
switch (qry.options()) {
case SORTING:
queryString = IgniteQueryGenerator
.addSorting(new StringBuilder(queryString), (Sort)values[values.length - 1])
.toString();
if (qry.isAutogenerated())
parameters = Arrays.copyOfRange(parameters, 0, values.length - 1);
break;
case PAGINATION:
queryString = IgniteQueryGenerator
.addPaging(new StringBuilder(queryString), (Pageable)values[values.length - 1])
.toString();
if (qry.isAutogenerated())
parameters = Arrays.copyOfRange(parameters, 0, values.length - 1);
break;
default:
}
if (isParamDependent) {
T2<String, Object[]> parseRes = ParameterBindingParser.INSTANCE.processParameterDependentClauses(
queryString,
parameters
);
queryString = parseRes.get1();
parameters = parseRes.get2();
}
if (qry.isFieldQuery()) {
SqlFieldsQuery sqlFieldsQry = new SqlFieldsQuery(queryString);
sqlFieldsQry.setArgs(parameters);
sqlFieldsQry.setCollocated(config.collocated());
sqlFieldsQry.setDistributedJoins(config.distributedJoins());
sqlFieldsQry.setEnforceJoinOrder(config.enforceJoinOrder());
sqlFieldsQry.setLazy(config.lazy());
sqlFieldsQry.setLocal(config.local());
if (config.parts() != null && config.parts().length > 0)
sqlFieldsQry.setPartitions(config.parts());
sqlFieldsQry.setTimeout(config.timeout(), TimeUnit.MILLISECONDS);
query = sqlFieldsQry;
}
else {
SqlQuery sqlQry = new SqlQuery(type, queryString);
sqlQry.setArgs(parameters);
sqlQry.setDistributedJoins(config.distributedJoins());
sqlQry.setLocal(config.local());
if (config.parts() != null && config.parts().length > 0)
sqlQry.setPartitions(config.parts());
sqlQry.setTimeout(config.timeout(), TimeUnit.MILLISECONDS);
query = sqlQry;
}
}
else {
int pageSize = -1;
switch (qry.options()) {
case PAGINATION:
pageSize = ((Pageable)parameters[parameters.length - 1]).getPageSize();
break;
}
// check if queryString contains SpEL template expressions and evaluate them if any
if (queryString.contains("#{")) {
EvaluationContext queryEvalContext = queryMethodEvaluationContextProvider
.getEvaluationContext(getQueryMethod().getParameters(),
values);
Object eval = expressionParser.parseExpression(queryString, ParserContext.TEMPLATE_EXPRESSION)
.getValue(queryEvalContext);
if (!(eval instanceof String)) {
throw new IllegalStateException(
"TextQuery with SpEL expressions must produce a String response, but found " + eval.getClass()
.getName()
+ ". Please, check your expression: " + queryString);
}
queryString = (String)eval;
}
TextQuery textQuery = new TextQuery(type, queryString, config.limit());
textQuery.setLocal(config.local());
if (pageSize > -1)
textQuery.setPageSize(pageSize);
query = textQuery;
}
return query;
}