/*******************************************************************************
* Copyright (c) 2009, 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.internal.rdf4j;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.query.BooleanQuery;
import org.eclipse.rdf4j.query.GraphQuery;
import org.eclipse.rdf4j.query.Query;
import org.eclipse.rdf4j.query.TupleQuery;
import com.google.inject.Inject;
import com.google.inject.Injector;
import net.enilink.commons.iterator.IExtendedIterator;
import net.enilink.komma.core.IValue;
import net.enilink.komma.core.KommaException;
import net.enilink.komma.core.Properties;
import net.enilink.komma.dm.IDataManagerQuery;
import net.enilink.komma.internal.rdf4j.result.RDF4JBooleanResult;
import net.enilink.komma.internal.rdf4j.result.RDF4JGraphResult;
import net.enilink.komma.internal.rdf4j.result.RDF4JTupleResult;
import net.enilink.komma.rdf4j.RDF4JValueConverter;
/**
* Implements {@link IDataManagerQuery} for {@link RDF4JRepositoryDataManager}.
*/
public class RDF4JQuery<R> implements IDataManagerQuery<R> {
protected static Set<String> supportedProperties = new HashSet<>(
Arrays.asList(Properties.TIMEOUT));
protected Map<String, Object> properties;
@Inject
Injector injector;
protected Query query;
@Inject
RDF4JValueConverter valueConverter;
public RDF4JQuery(Query query) {
this.query = query;
}
@SuppressWarnings({ "unchecked", "resource" })
@Override
public IExtendedIterator<R> evaluate() {
try {
IExtendedIterator<R> convertedResult;
if (query instanceof TupleQuery) {
convertedResult = (IExtendedIterator<R>) new RDF4JTupleResult(
((TupleQuery) query).evaluate());
} else if (query instanceof GraphQuery) {
convertedResult = (IExtendedIterator<R>) new RDF4JGraphResult(
((GraphQuery) query).evaluate());
} else {
convertedResult = (IExtendedIterator<R>) new RDF4JBooleanResult(
((BooleanQuery) query).evaluate());
}
injector.injectMembers(convertedResult);
return convertedResult;
} catch (Exception e) {
throw new KommaException(e);
}
}
@Override
public Map<String, Object> getProperties() {
return properties == null ? Collections.<String, Object> emptyMap()
: Collections.unmodifiableMap(properties);
}
@Override
public Set<String> getSupportedProperties() {
return supportedProperties;
}
@Override
public IDataManagerQuery<R> setParameter(String name, IValue value) {
Value boundValue = valueConverter.toRdf4j(value);
if (boundValue == null) {
query.removeBinding(name);
} else {
query.setBinding(name, boundValue);
}
return this;
}
protected Map<String, Object> ensureProperties() {
if (properties == null) {
properties = new HashMap<>();
}
return properties;
}
@Override
public IDataManagerQuery<R> setProperty(String propertyName, Object value) {
switch (propertyName) {
case Properties.TIMEOUT:
if (value instanceof Number) {
long timeout = ((Number) value).longValue();
query.setMaxExecutionTime(timeout <= 0 ? 0 : (int) (timeout / 1000));
ensureProperties().put(propertyName, value);
} else
throw new IllegalArgumentException("Illegal argument '" + value
+ "' for property " + Properties.TIMEOUT);
}
return this;
}
}