use of org.eclipse.rdf4j.query.algebra.Projection in project rdf4j by eclipse.
the class SPARQLParserTest method testParsedTupleQueryRootNode.
@Test
public void testParsedTupleQueryRootNode() throws Exception {
StringBuilder qb = new StringBuilder();
qb.append("SELECT * {?a <foo:bar> \"test\"}");
ParsedTupleQuery q = (ParsedTupleQuery) parser.parseQuery(qb.toString(), null);
TupleExpr te = q.getTupleExpr();
assertNotNull(te);
assertTrue(te instanceof Projection);
assertNull(te.getParentNode());
}
use of org.eclipse.rdf4j.query.algebra.Projection in project rdf4j by eclipse.
the class TupleExprBuilder method handlePathModifiers.
private TupleExpr handlePathModifiers(Scope scope, Var subjVar, TupleExpr te, Var endVar, Var contextVar, long lowerBound, long upperBound) throws VisitorException {
TupleExpr result = te;
if (lowerBound >= 0L) {
if (lowerBound < upperBound) {
if (upperBound < Long.MAX_VALUE) {
// upperbound is fixed-length
// create set of unions for all path lengths between lower
// and upper bound.
Union union = new Union();
Union currentUnion = union;
for (long length = lowerBound; length < upperBound; length++) {
TupleExpr path = createPath(scope, subjVar, te, endVar, contextVar, length);
currentUnion.setLeftArg(path);
if (length == upperBound - 1) {
path = createPath(scope, subjVar, te, endVar, contextVar, length + 1);
currentUnion.setRightArg(path);
} else {
Union nextUnion = new Union();
currentUnion.setRightArg(nextUnion);
currentUnion = nextUnion;
}
}
ProjectionElemList pelist = new ProjectionElemList();
for (String name : union.getAssuredBindingNames()) {
ProjectionElem pe = new ProjectionElem(name);
pelist.addElement(pe);
}
result = new Distinct(new Projection(union, pelist, false));
} else {
// upperbound is abitrary-length
result = new ArbitraryLengthPath(scope, subjVar, te, endVar, contextVar, lowerBound);
}
} else {
// create single path of fixed length.
TupleExpr path = createPath(scope, subjVar, te, endVar, contextVar, lowerBound);
result = path;
}
}
return result;
}
use of org.eclipse.rdf4j.query.algebra.Projection in project rdf4j by eclipse.
the class ConstructorBuilder method buildConstructor.
private TupleExpr buildConstructor(TupleExpr bodyExpr, TupleExpr constructExpr, boolean explicitConstructor, boolean distinct, boolean reduced) {
TupleExpr result = bodyExpr;
// Retrieve all StatementPattern's from the construct expression
List<StatementPattern> statementPatterns = StatementPatternCollector.process(constructExpr);
Set<Var> constructVars = getConstructVars(statementPatterns);
// Finally, the spo-bindings are again filtered for duplicates.
if (distinct || reduced) {
// Create projection that removes all bindings that are not used in the
// constructor
ProjectionElemList projElemList = new ProjectionElemList();
for (Var var : constructVars) {
// the distinct
if (!var.isAnonymous() && !var.hasValue()) {
projElemList.addElement(new ProjectionElem(var.getName()));
}
}
result = new Projection(result, projElemList);
// Filter the duplicates from these projected bindings
if (distinct) {
result = new Distinct(result);
} else {
result = new Reduced(result);
}
}
// Create BNodeGenerator's for all anonymous variables
Map<Var, ExtensionElem> extElemMap = new HashMap<Var, ExtensionElem>();
for (Var var : constructVars) {
if (var.isAnonymous() && !extElemMap.containsKey(var)) {
ValueExpr valueExpr = null;
if (var.hasValue()) {
valueExpr = new ValueConstant(var.getValue());
} else if (explicitConstructor) {
// only generate bnodes in case of an explicit constructor
valueExpr = new BNodeGenerator();
}
if (valueExpr != null) {
extElemMap.put(var, new ExtensionElem(valueExpr, var.getName()));
}
}
}
if (!extElemMap.isEmpty()) {
result = new Extension(result, extElemMap.values());
}
// Create a Projection for each StatementPattern in the constructor
List<ProjectionElemList> projections = new ArrayList<ProjectionElemList>();
for (StatementPattern sp : statementPatterns) {
ProjectionElemList projElemList = new ProjectionElemList();
projElemList.addElement(new ProjectionElem(sp.getSubjectVar().getName(), "subject"));
projElemList.addElement(new ProjectionElem(sp.getPredicateVar().getName(), "predicate"));
projElemList.addElement(new ProjectionElem(sp.getObjectVar().getName(), "object"));
projections.add(projElemList);
}
if (projections.size() == 1) {
result = new Projection(result, projections.get(0));
// Note: no need to apply the second duplicate elimination step if
// there's just one projection
} else if (projections.size() > 1) {
result = new MultiProjection(result, projections);
if (distinct) {
// Add another distinct to filter duplicate statements
result = new Distinct(result);
} else if (reduced) {
result = new Reduced(result);
}
} else {
// Empty constructor
result = new EmptySet();
}
return result;
}
use of org.eclipse.rdf4j.query.algebra.Projection in project rdf4j by eclipse.
the class QueryModelBuilder method visit.
@Override
public TupleExpr visit(ASTSelect node, Object data) throws VisitorException {
TupleExpr result = (TupleExpr) data;
Extension extension = new Extension();
ProjectionElemList projElemList = new ProjectionElemList();
for (ASTProjectionElem projElemNode : node.getProjectionElemList()) {
ValueExpr valueExpr = (ValueExpr) projElemNode.getValueExpr().jjtAccept(this, null);
String alias = projElemNode.getAlias();
if (alias != null) {
// aliased projection element
extension.addElement(new ExtensionElem(valueExpr, alias));
projElemList.addElement(new ProjectionElem(alias));
} else if (valueExpr instanceof Var) {
// unaliased variable
Var projVar = (Var) valueExpr;
projElemList.addElement(new ProjectionElem(projVar.getName()));
} else {
throw new IllegalStateException("required alias for non-Var projection elements not found");
}
}
if (!extension.getElements().isEmpty()) {
extension.setArg(result);
result = extension;
}
result = new Projection(result, projElemList);
if (node.isDistinct()) {
result = new Distinct(result);
} else if (node.isReduced()) {
result = new Reduced(result);
}
return result;
}
use of org.eclipse.rdf4j.query.algebra.Projection in project rdf4j by eclipse.
the class TupleExprs method containsSubquery.
/**
* Verifies if the supplied {@link TupleExpr} contains a {@link Projection} with the subquery flag set to
* true (default). If the supplied TupleExpr is a {@link Join} or contains a {@link Join}, projections
* inside that Join's arguments will not be taken into account.
*
* @param t
* a tuple expression.
* @return <code>true</code> if the TupleExpr contains a subquery projection (outside of a Join),
* <code>false</code> otherwise.
*/
public static boolean containsSubquery(TupleExpr t) {
Deque<TupleExpr> queue = new ArrayDeque<>();
queue.add(t);
while (!queue.isEmpty()) {
TupleExpr n = queue.removeFirst();
if (n instanceof Projection && ((Projection) n).isSubquery()) {
return true;
} else if (n instanceof Join) {
// taken into account
return false;
} else {
queue.addAll(getChildren(n));
}
}
return false;
}
Aggregations