Search in sources :

Example 31 with MalformedQueryException

use of org.eclipse.rdf4j.query.MalformedQueryException in project rdf4j by eclipse.

the class PrefixDeclProcessor method process.

/**
 * Processes prefix declarations in queries. This method collects all prefixes that are declared in the
 * supplied query, verifies that prefixes are not redefined and replaces any {@link ASTQName} nodes in the
 * query with equivalent {@link ASTIRI} nodes.
 *
 * @param qc
 *        The query that needs to be processed.
 * @return A map containing the prefixes that are declared in the query (key) and the namespace they map
 *         to (value).
 * @throws MalformedQueryException
 *         If the query contains redefined prefixes or qnames that use undefined prefixes.
 */
public static Map<String, String> process(ASTOperationContainer qc) throws MalformedQueryException {
    List<ASTPrefixDecl> prefixDeclList = qc.getPrefixDeclList();
    // Build a prefix --> IRI map
    Map<String, String> prefixMap = new LinkedHashMap<String, String>();
    for (ASTPrefixDecl prefixDecl : prefixDeclList) {
        String prefix = prefixDecl.getPrefix();
        String iri = prefixDecl.getIRI().getValue();
        if (prefixMap.containsKey(prefix)) {
            throw new MalformedQueryException("Multiple prefix declarations for prefix '" + prefix + "'");
        }
        prefixMap.put(prefix, iri);
    }
    // insert some default prefixes (if not explicitly defined in the query)
    final int defaultPrefixesAdded = insertDefaultPrefix(prefixMap, "rdf", RDF.NAMESPACE) + insertDefaultPrefix(prefixMap, "rdfs", RDFS.NAMESPACE) + insertDefaultPrefix(prefixMap, "sesame", SESAME.NAMESPACE) + insertDefaultPrefix(prefixMap, "owl", OWL.NAMESPACE) + insertDefaultPrefix(prefixMap, "xsd", XMLSchema.NAMESPACE) + insertDefaultPrefix(prefixMap, "fn", FN.NAMESPACE);
    ASTUnparsedQuadDataBlock dataBlock = null;
    if (qc.getOperation() instanceof ASTInsertData) {
        ASTInsertData insertData = (ASTInsertData) qc.getOperation();
        dataBlock = insertData.jjtGetChild(ASTUnparsedQuadDataBlock.class);
    } else if (qc.getOperation() instanceof ASTDeleteData) {
        ASTDeleteData deleteData = (ASTDeleteData) qc.getOperation();
        dataBlock = deleteData.jjtGetChild(ASTUnparsedQuadDataBlock.class);
    }
    if (dataBlock != null) {
        String prefixes = createPrefixesInSPARQLFormat(prefixMap);
        dataBlock.setAddedDefaultPrefixes(defaultPrefixesAdded);
        // TODO optimize string concat?
        dataBlock.setDataBlock(prefixes + dataBlock.getDataBlock());
    } else {
        QNameProcessor visitor = new QNameProcessor(prefixMap);
        try {
            qc.jjtAccept(visitor, null);
        } catch (VisitorException e) {
            throw new MalformedQueryException(e);
        }
    }
    return prefixMap;
}
Also used : ASTPrefixDecl(org.eclipse.rdf4j.query.parser.sparql.ast.ASTPrefixDecl) ASTDeleteData(org.eclipse.rdf4j.query.parser.sparql.ast.ASTDeleteData) MalformedQueryException(org.eclipse.rdf4j.query.MalformedQueryException) ASTUnparsedQuadDataBlock(org.eclipse.rdf4j.query.parser.sparql.ast.ASTUnparsedQuadDataBlock) VisitorException(org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException) ASTInsertData(org.eclipse.rdf4j.query.parser.sparql.ast.ASTInsertData) LinkedHashMap(java.util.LinkedHashMap)

Example 32 with MalformedQueryException

use of org.eclipse.rdf4j.query.MalformedQueryException in project rdf4j by eclipse.

the class SPARQLParser method parseUpdate.

@Override
public ParsedUpdate parseUpdate(String updateStr, String baseURI) throws MalformedQueryException {
    try {
        ParsedUpdate update = new ParsedUpdate(updateStr);
        ASTUpdateSequence updateSequence = SyntaxTreeBuilder.parseUpdateSequence(updateStr);
        List<ASTUpdateContainer> updateOperations = updateSequence.getUpdateContainers();
        List<ASTPrefixDecl> sharedPrefixDeclarations = null;
        Node node = updateSequence.jjtGetChild(0);
        Set<String> globalUsedBNodeIds = new HashSet<String>();
        for (int i = 0; i < updateOperations.size(); i++) {
            ASTUpdateContainer uc = updateOperations.get(i);
            if (uc.jjtGetNumChildren() == 0 && i > 0 && i < updateOperations.size() - 1) {
                // empty update in the middle of the sequence
                throw new MalformedQueryException("empty update in sequence not allowed");
            }
            StringEscapesProcessor.process(uc);
            BaseDeclProcessor.process(uc, baseURI);
            WildcardProjectionProcessor.process(uc);
            if (uc.getBaseDecl() != null) {
                baseURI = uc.getBaseDecl().getIRI();
            }
            // do a special dance to handle prefix declarations in sequences: if
            // the current
            // operation has its own prefix declarations, use those. Otherwise,
            // try and use
            // prefix declarations from a previous operation in this sequence.
            List<ASTPrefixDecl> prefixDeclList = uc.getPrefixDeclList();
            if (prefixDeclList == null || prefixDeclList.size() == 0) {
                if (sharedPrefixDeclarations != null) {
                    for (ASTPrefixDecl prefixDecl : sharedPrefixDeclarations) {
                        uc.jjtAppendChild(prefixDecl);
                    }
                }
            } else {
                sharedPrefixDeclarations = prefixDeclList;
            }
            PrefixDeclProcessor.process(uc);
            Set<String> usedBNodeIds = BlankNodeVarProcessor.process(uc);
            if (uc.getUpdate() instanceof ASTInsertData || uc.getUpdate() instanceof ASTInsertData) {
                if (Collections.disjoint(usedBNodeIds, globalUsedBNodeIds)) {
                    globalUsedBNodeIds.addAll(usedBNodeIds);
                } else {
                    throw new MalformedQueryException("blank node identifier may not be shared across INSERT/DELETE DATA operations");
                }
            }
            UpdateExprBuilder updateExprBuilder = new UpdateExprBuilder(SimpleValueFactory.getInstance());
            ASTUpdate updateNode = uc.getUpdate();
            if (updateNode != null) {
                UpdateExpr updateExpr = (UpdateExpr) updateNode.jjtAccept(updateExprBuilder, null);
                // add individual update expression to ParsedUpdate sequence
                // container
                update.addUpdateExpr(updateExpr);
                // associate updateExpr with the correct dataset (if any)
                Dataset dataset = DatasetDeclProcessor.process(uc);
                update.map(updateExpr, dataset);
            }
        }
        return update;
    } catch (ParseException e) {
        throw new MalformedQueryException(e.getMessage(), e);
    } catch (TokenMgrError e) {
        throw new MalformedQueryException(e.getMessage(), e);
    } catch (VisitorException e) {
        throw new MalformedQueryException(e.getMessage(), e);
    }
}
Also used : Dataset(org.eclipse.rdf4j.query.Dataset) Node(org.eclipse.rdf4j.query.parser.sparql.ast.Node) TokenMgrError(org.eclipse.rdf4j.query.parser.sparql.ast.TokenMgrError) ASTUpdateSequence(org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdateSequence) ASTInsertData(org.eclipse.rdf4j.query.parser.sparql.ast.ASTInsertData) ASTPrefixDecl(org.eclipse.rdf4j.query.parser.sparql.ast.ASTPrefixDecl) ParsedUpdate(org.eclipse.rdf4j.query.parser.ParsedUpdate) MalformedQueryException(org.eclipse.rdf4j.query.MalformedQueryException) ASTUpdate(org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdate) UpdateExpr(org.eclipse.rdf4j.query.algebra.UpdateExpr) ParseException(org.eclipse.rdf4j.query.parser.sparql.ast.ParseException) VisitorException(org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException) ASTUpdateContainer(org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdateContainer) HashSet(java.util.HashSet)

Example 33 with MalformedQueryException

use of org.eclipse.rdf4j.query.MalformedQueryException in project rdf4j by eclipse.

the class WildcardProjectionProcessor method process.

public static void process(ASTOperationContainer container) throws MalformedQueryException {
    ASTOperation operation = container.getOperation();
    // scan for nested SELECT clauses in the operation's WHERE clause
    if (operation != null) {
        ASTWhereClause whereClause = operation.getWhereClause();
        // DESCRIBE queries and certain update operations can be without a WHERE clause
        if (whereClause != null) {
            SelectClauseCollector collector = new SelectClauseCollector();
            try {
                whereClause.jjtAccept(collector, null);
                Set<ASTSelect> selectClauses = collector.getSelectClauses();
                for (ASTSelect selectClause : selectClauses) {
                    if (selectClause.isWildcard()) {
                        ASTSelectQuery q = (ASTSelectQuery) selectClause.jjtGetParent();
                        addQueryVars(q.getWhereClause(), selectClause);
                        selectClause.setWildcard(false);
                    }
                }
            } catch (VisitorException e) {
                throw new MalformedQueryException(e);
            }
        }
    }
    if (operation instanceof ASTSelectQuery) {
        // check for wildcard in upper SELECT query
        ASTSelectQuery selectQuery = (ASTSelectQuery) operation;
        ASTSelect selectClause = selectQuery.getSelect();
        if (selectClause.isWildcard()) {
            addQueryVars(selectQuery.getWhereClause(), selectClause);
            selectClause.setWildcard(false);
        }
    } else if (operation instanceof ASTDescribeQuery) {
        // check for possible wildcard in DESCRIBE query
        ASTDescribeQuery describeQuery = (ASTDescribeQuery) operation;
        ASTDescribe describeClause = describeQuery.getDescribe();
        if (describeClause.isWildcard()) {
            addQueryVars(describeQuery.getWhereClause(), describeClause);
            describeClause.setWildcard(false);
        }
    }
}
Also used : ASTOperation(org.eclipse.rdf4j.query.parser.sparql.ast.ASTOperation) ASTWhereClause(org.eclipse.rdf4j.query.parser.sparql.ast.ASTWhereClause) MalformedQueryException(org.eclipse.rdf4j.query.MalformedQueryException) ASTSelectQuery(org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelectQuery) VisitorException(org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException) ASTDescribeQuery(org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribeQuery) ASTDescribe(org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribe) ASTSelect(org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelect)

Aggregations

MalformedQueryException (org.eclipse.rdf4j.query.MalformedQueryException)33 RepositoryException (org.eclipse.rdf4j.repository.RepositoryException)20 QueryEvaluationException (org.eclipse.rdf4j.query.QueryEvaluationException)9 IOException (java.io.IOException)6 TupleQuery (org.eclipse.rdf4j.query.TupleQuery)5 TupleQueryResult (org.eclipse.rdf4j.query.TupleQueryResult)5 VisitorException (org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException)5 HttpGet (org.apache.http.client.methods.HttpGet)4 QueryInterruptedException (org.eclipse.rdf4j.query.QueryInterruptedException)4 UnsupportedQueryLanguageException (org.eclipse.rdf4j.query.UnsupportedQueryLanguageException)4 UpdateExecutionException (org.eclipse.rdf4j.query.UpdateExecutionException)4 ExceptionConvertingIteration (org.eclipse.rdf4j.common.iteration.ExceptionConvertingIteration)3 SPARQLProtocolSession (org.eclipse.rdf4j.http.client.SPARQLProtocolSession)3 Binding (org.eclipse.rdf4j.query.Binding)3 TupleExpr (org.eclipse.rdf4j.query.algebra.TupleExpr)3 ParsedUpdate (org.eclipse.rdf4j.query.parser.ParsedUpdate)3 ASTInsertData (org.eclipse.rdf4j.query.parser.sparql.ast.ASTInsertData)3 UnknownTransactionStateException (org.eclipse.rdf4j.repository.UnknownTransactionStateException)3 RDFHandlerException (org.eclipse.rdf4j.rio.RDFHandlerException)3 RDFParseException (org.eclipse.rdf4j.rio.RDFParseException)3