Search in sources :

Example 6 with Projection

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());
}
Also used : Projection(org.eclipse.rdf4j.query.algebra.Projection) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) ParsedTupleQuery(org.eclipse.rdf4j.query.parser.ParsedTupleQuery) Test(org.junit.Test)

Example 7 with Projection

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;
}
Also used : ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList) Distinct(org.eclipse.rdf4j.query.algebra.Distinct) Projection(org.eclipse.rdf4j.query.algebra.Projection) MultiProjection(org.eclipse.rdf4j.query.algebra.MultiProjection) ArbitraryLengthPath(org.eclipse.rdf4j.query.algebra.ArbitraryLengthPath) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) Union(org.eclipse.rdf4j.query.algebra.Union) ProjectionElem(org.eclipse.rdf4j.query.algebra.ProjectionElem)

Example 8 with Projection

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;
}
Also used : ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList) ValueExpr(org.eclipse.rdf4j.query.algebra.ValueExpr) HashMap(java.util.HashMap) Var(org.eclipse.rdf4j.query.algebra.Var) EmptySet(org.eclipse.rdf4j.query.algebra.EmptySet) ArrayList(java.util.ArrayList) Projection(org.eclipse.rdf4j.query.algebra.Projection) MultiProjection(org.eclipse.rdf4j.query.algebra.MultiProjection) ExtensionElem(org.eclipse.rdf4j.query.algebra.ExtensionElem) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) Reduced(org.eclipse.rdf4j.query.algebra.Reduced) Extension(org.eclipse.rdf4j.query.algebra.Extension) StatementPattern(org.eclipse.rdf4j.query.algebra.StatementPattern) Distinct(org.eclipse.rdf4j.query.algebra.Distinct) BNodeGenerator(org.eclipse.rdf4j.query.algebra.BNodeGenerator) ValueConstant(org.eclipse.rdf4j.query.algebra.ValueConstant) MultiProjection(org.eclipse.rdf4j.query.algebra.MultiProjection) ProjectionElem(org.eclipse.rdf4j.query.algebra.ProjectionElem)

Example 9 with Projection

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;
}
Also used : ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList) ValueExpr(org.eclipse.rdf4j.query.algebra.ValueExpr) ASTValueExpr(org.eclipse.rdf4j.query.parser.serql.ast.ASTValueExpr) ASTVar(org.eclipse.rdf4j.query.parser.serql.ast.ASTVar) Var(org.eclipse.rdf4j.query.algebra.Var) ExtensionElem(org.eclipse.rdf4j.query.algebra.ExtensionElem) Projection(org.eclipse.rdf4j.query.algebra.Projection) ASTString(org.eclipse.rdf4j.query.parser.serql.ast.ASTString) ASTProjectionElem(org.eclipse.rdf4j.query.parser.serql.ast.ASTProjectionElem) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) Reduced(org.eclipse.rdf4j.query.algebra.Reduced) Extension(org.eclipse.rdf4j.query.algebra.Extension) Distinct(org.eclipse.rdf4j.query.algebra.Distinct) ProjectionElem(org.eclipse.rdf4j.query.algebra.ProjectionElem) ASTProjectionElem(org.eclipse.rdf4j.query.parser.serql.ast.ASTProjectionElem)

Example 10 with Projection

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;
}
Also used : Projection(org.eclipse.rdf4j.query.algebra.Projection) Join(org.eclipse.rdf4j.query.algebra.Join) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) ArrayDeque(java.util.ArrayDeque)

Aggregations

Projection (org.eclipse.rdf4j.query.algebra.Projection)14 TupleExpr (org.eclipse.rdf4j.query.algebra.TupleExpr)13 ProjectionElem (org.eclipse.rdf4j.query.algebra.ProjectionElem)9 ProjectionElemList (org.eclipse.rdf4j.query.algebra.ProjectionElemList)9 Extension (org.eclipse.rdf4j.query.algebra.Extension)8 MultiProjection (org.eclipse.rdf4j.query.algebra.MultiProjection)7 ExtensionElem (org.eclipse.rdf4j.query.algebra.ExtensionElem)6 ValueExpr (org.eclipse.rdf4j.query.algebra.ValueExpr)6 Var (org.eclipse.rdf4j.query.algebra.Var)6 Distinct (org.eclipse.rdf4j.query.algebra.Distinct)5 Reduced (org.eclipse.rdf4j.query.algebra.Reduced)5 ArrayList (java.util.ArrayList)4 Test (org.junit.Test)4 BNodeGenerator (org.eclipse.rdf4j.query.algebra.BNodeGenerator)3 EmptySet (org.eclipse.rdf4j.query.algebra.EmptySet)3 StatementPattern (org.eclipse.rdf4j.query.algebra.StatementPattern)3 ValueConstant (org.eclipse.rdf4j.query.algebra.ValueConstant)3 ArrayDeque (java.util.ArrayDeque)2 HashMap (java.util.HashMap)2 Join (org.eclipse.rdf4j.query.algebra.Join)2