package org.infinispan.query.dsl.embedded.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.infinispan.objectfilter.impl.syntax.parser.IckleParsingResult;
import org.infinispan.query.dsl.Query;
import org.infinispan.query.dsl.QueryFactory;
import org.infinispan.query.dsl.impl.BaseQuery;
import org.infinispan.query.dsl.impl.logging.Log;
import org.jboss.logging.Logger;
/**
* @author anistor@redhat.com
* @since 8.0
*/
final class DelegatingQuery<TypeMetadata> extends BaseQuery {
private static final Log log = Logger.getMessageLogger(Log.class, DelegatingQuery.class.getName());
private final QueryEngine<TypeMetadata> queryEngine;
private final IckleParsingResult<TypeMetadata> parsingResult;
/**
* The actual query object to which execution will be delegated.
*/
private BaseQuery query;
DelegatingQuery(QueryEngine<TypeMetadata> queryEngine, QueryFactory queryFactory, String queryString) {
super(queryFactory, queryString);
this.queryEngine = queryEngine;
// parse and validate early
parsingResult = queryEngine.parse(queryString);
if (!parsingResult.getParameterNames().isEmpty()) {
namedParameters = new HashMap<>(parsingResult.getParameterNames().size());
for (String paramName : parsingResult.getParameterNames()) {
namedParameters.put(paramName, null);
}
}
}
DelegatingQuery(QueryEngine<TypeMetadata> queryEngine, QueryFactory queryFactory, String queryString,
Map<String, Object> namedParameters, String[] projection, long startOffset, int maxResults) {
super(queryFactory, queryString, namedParameters, projection, startOffset, maxResults);
this.queryEngine = queryEngine;
// parse and validate early
parsingResult = queryEngine.parse(queryString);
if (namedParameters != null) {
List<String> unknownParams = null;
for (String paramName : namedParameters.keySet()) {
if (paramName == null || paramName.isEmpty()) {
throw log.parameterNameCannotBeNulOrEmpty();
}
if (!parsingResult.getParameterNames().contains(paramName)) {
if (unknownParams == null) {
unknownParams = new ArrayList<>();
}
unknownParams.add(paramName);
}
}
if (unknownParams != null) {
throw log.parametersNotFound(unknownParams.toString());
}
}
}
@Override
public String[] getProjection() {
return parsingResult.getProjections();
}
@Override
public void resetQuery() {
if (query != null) {
// reset the delegate but do not discard it!
query.resetQuery();
}
}
private Query createQuery() {
// the query is created first time only
if (query == null) {
query = queryEngine.buildQuery(queryFactory, parsingResult, namedParameters, startOffset, maxResults);
}
return query;
}
@Override
public <T> List<T> list() {
return createQuery().list();
}
@Override
public int getResultSize() {
return createQuery().getResultSize();
}
@Override
public String toString() {
return "DelegatingQuery{" +
"queryString=" + queryString +
", namedParameters=" + namedParameters +
", projection=" + Arrays.toString(projection) +
", startOffset=" + startOffset +
", maxResults=" + maxResults +
'}';
}
}