private Query prepareQuery()

in modules/spring-data-ext/spring-data/src/main/java/org/apache/ignite/springdata/repository/query/IgniteRepositoryQuery.java [715:841]


    private Query prepareQuery(IgniteQuery qry, DynamicQueryConfig config, ReturnStrategy returnStgy, Object[] values) {
        Object[] parameters = values;

        String qryStr = qry.qryStr();

        Query gry;

        checkRequiredPageable(returnStgy, values);

        if (!qry.isTextQuery()) {
            boolean isParamDependent;

            if (!qry.isAutogenerated()) {
                StringQuery squery = new ExpressionBasedStringQuery(qryStr, metadata, expressionParser);
                qryStr = 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:
                    qryStr = IgniteQueryGenerator
                        .addSorting(new StringBuilder(qryStr), (Sort)values[values.length - 1])
                        .toString();
                    if (qry.isAutogenerated())
                        parameters = Arrays.copyOfRange(parameters, 0, values.length - 1);
                    break;
                case PAGINATION:
                    qryStr = IgniteQueryGenerator
                        .addPaging(new StringBuilder(qryStr), (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(
                    qryStr,
                    parameters
                );

                qryStr = parseRes.get1();

                parameters = parseRes.get2();
            }

            if (qry.isFieldQuery()) {
                SqlFieldsQuery sqlFieldsQry = new SqlFieldsQuery(qryStr);
                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);

                gry = sqlFieldsQry;
            }
            else {
                SqlQuery sqlQry = new SqlQuery(type, qryStr);
                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);

                gry = sqlQry;
            }
        }
        else {
            int pageSize = -1;

            switch (qry.options()) {
                case PAGINATION:
                    pageSize = ((Pageable)parameters[parameters.length - 1]).getPageSize();
                    break;
            }

            // check if qryStr contains SpEL template expressions and evaluate them if any
            if (qryStr.contains("#{")) {
                EvaluationContext qryEvalCtx = queryMethodEvaluationContextProvider
                    .getEvaluationContext(getQueryMethod().getParameters(),
                        values);

                Object eval = expressionParser.parseExpression(qryStr, ParserContext.TEMPLATE_EXPRESSION)
                    .getValue(qryEvalCtx);

                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: " + qryStr);
                }
                qryStr = (String)eval;
            }

            TextQuery textQry = new TextQuery(type, qryStr, config.limit());

            textQry.setLocal(config.local());

            if (pageSize > -1)
                textQry.setPageSize(pageSize);

            gry = textQry;
        }
        return gry;
    }