/*******************************************************************************
* Copyright (c) 2010 Fraunhofer IWU and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.em.results;
import java.util.HashMap;
import java.util.Map;
import net.enilink.commons.iterator.IExtendedIterator;
import net.enilink.komma.em.internal.query.QueryBase;
import net.enilink.komma.query.SparqlBuilder;
import net.enilink.komma.core.IEntityManager;
import net.enilink.komma.core.IQuery;
import net.enilink.komma.core.IResultDescriptor;
public class ResultDescriptor<R> extends QueryBase<IResultDescriptor<R>>
implements IResultDescriptor<R> {
protected boolean includeInferred;
protected Map<String, Object> parameters;
protected IExtendedIterator<R> results;
protected String property;
protected String parameterVariable;
protected String resultVariable;
protected String sparql;
protected SparqlBuilder sparqlBuilder;
public ResultDescriptor(String sparql) {
this.sparql = sparql;
}
public ResultDescriptor(String sparql, String property,
String resultVariable, String parameterVariable) {
this.sparql = sparql;
this.property = property;
this.resultVariable = resultVariable;
this.parameterVariable = parameterVariable;
}
@Override
public <T> IResultDescriptor<T> bindResultType(Class<T> resultType,
Class<?>... resultTypes) {
return super.<IResultDescriptor<T>> doBindResultType(resultType,
resultTypes);
}
@SuppressWarnings("unchecked")
public IExtendedIterator<R> evaluate(IEntityManager manager) {
if (results == null) {
String sparql = toQueryString();
IQuery<?> query = manager.createQuery(sparql, getIncludeInferred());
((QueryBase<?>) query).initializeFrom(this);
if (parameters != null) {
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
}
results = (IExtendedIterator<R>) query.evaluate();
}
return results;
}
@Override
public boolean getIncludeInferred() {
return includeInferred;
}
public String getParameterVariable() {
return parameterVariable;
}
public String getProperty() {
return property;
}
public String getResultVariable() {
return resultVariable;
}
public String toQueryString() {
if (sparqlBuilder != null) {
return sparqlBuilder.toString();
}
return sparql;
}
protected SparqlBuilder getSparqlBuilder() {
if (sparqlBuilder == null) {
sparqlBuilder = new SparqlBuilder(sparql);
}
return sparqlBuilder;
}
@Override
public IResultDescriptor<R> prefetch(IResultDescriptor<?> descriptor) {
if (descriptor.getProperty() == null) {
throw new IllegalArgumentException(
"Iterator has an invalid property.");
}
return prefetch(descriptor.getProperty(), descriptor);
}
@Override
public IResultDescriptor<R> prefetch(String property,
IResultDescriptor<?> descriptor) {
if (descriptor instanceof ResultDescriptor<?>
&& ((ResultDescriptor<?>) descriptor).sparqlBuilder != null) {
getSparqlBuilder().optional(property,
descriptor.getResultVariable(),
descriptor.getParameterVariable(),
((ResultDescriptor<?>) descriptor).sparqlBuilder);
} else {
getSparqlBuilder().optional(property,
descriptor.getResultVariable(),
descriptor.getParameterVariable(),
descriptor.toQueryString());
}
return this;
}
public IResultDescriptor<R> prefetchTypes() {
getSparqlBuilder().fetchTypes();
return this;
}
@Override
public <T> IResultDescriptor<T> restrictResultType(Class<T> resultType,
Class<?>... resultTypes) {
return super.<IResultDescriptor<T>> doRestrictResultType(resultType,
resultTypes);
}
@Override
public IResultDescriptor<R> setFirstResult(int startPosition) {
return super.setFirstResult(startPosition);
}
@Override
public IResultDescriptor<R> setIncludeInferred(boolean include) {
this.includeInferred = include;
return this;
}
@Override
public IResultDescriptor<R> setParameter(String name, Object value) {
if (parameters == null) {
parameters = new HashMap<String, Object>();
}
parameters.put(name, value);
return this;
}
}