Search in sources :

Example 1 with ContextItemExpression

use of net.sf.saxon.expr.ContextItemExpression in project teiid by teiid.

the class SaxonXQueryExpression method projectColumns.

private PathMapRoot projectColumns(PathMapRoot parentRoot, List<XMLTable.XMLColumn> columns, PathMapNode finalNode, AnalysisRecord record) {
    for (XMLColumn xmlColumn : columns) {
        if (xmlColumn.isOrdinal()) {
            continue;
        }
        Expression internalExpression = xmlColumn.getPathExpression().getInternalExpression();
        PathMap subMap = new PathMap(internalExpression);
        PathMapRoot subContextRoot = null;
        for (PathMapRoot root : subMap.getPathMapRoots()) {
            if (root.getRootExpression() instanceof ContextItemExpression || root.getRootExpression() instanceof RootExpression) {
                if (subContextRoot != null) {
                    if (record.recordAnnotations()) {
                        // $NON-NLS-1$ //$NON-NLS-2$
                        record.addAnnotation(XQUERY_PLANNING, "Multiple context items exist in column path " + xmlColumn.getPath(), "Document projection will not be used", Priority.MEDIUM);
                    }
                    return null;
                }
                subContextRoot = root;
            }
        }
        // special case for handling '.', which the pathmap logic doesn't consider as a root
        if (internalExpression instanceof ContextItemExpression) {
            addReturnedArcs(xmlColumn, finalNode);
        }
        if (subContextRoot == null) {
            continue;
        }
        for (PathMapArc arc : subContextRoot.getArcs()) {
            if (streamingPath != null && !validateColumnForStreaming(record, xmlColumn, arc)) {
                streamingPath = null;
            }
            finalNode.createArc(arc.getAxis(), arc.getNodeTest(), arc.getTarget());
        }
        HashSet<PathMapNode> subFinalNodes = new HashSet<PathMapNode>();
        getReturnableNodes(subContextRoot, subFinalNodes);
        for (PathMapNode subNode : subFinalNodes) {
            addReturnedArcs(xmlColumn, subNode);
        }
    }
    // Workaround to rerun the reduction algorithm - by making a copy of the old version
    PathMap newMap = new PathMap(DUMMY_EXPRESSION);
    PathMapRoot newRoot = newMap.makeNewRoot(parentRoot.getRootExpression());
    if (parentRoot.isAtomized()) {
        newRoot.setAtomized();
    }
    if (parentRoot.isReturnable()) {
        newRoot.setReturnable(true);
    }
    if (parentRoot.hasUnknownDependencies()) {
        newRoot.setHasUnknownDependencies();
    }
    for (PathMapArc arc : parentRoot.getArcs()) {
        newRoot.createArc(arc.getAxis(), arc.getNodeTest(), arc.getTarget());
    }
    return newMap.reduceToDownwardsAxes(newRoot);
}
Also used : XMLColumn(org.teiid.query.sql.lang.XMLTable.XMLColumn) PathMapNode(net.sf.saxon.expr.parser.PathMap.PathMapNode) ContextItemExpression(net.sf.saxon.expr.ContextItemExpression) XQueryExpression(net.sf.saxon.query.XQueryExpression) Expression(net.sf.saxon.expr.Expression) XPathExpression(net.sf.saxon.sxpath.XPathExpression) RootExpression(net.sf.saxon.expr.RootExpression) RootExpression(net.sf.saxon.expr.RootExpression) PathMapRoot(net.sf.saxon.expr.parser.PathMap.PathMapRoot) PathMapArc(net.sf.saxon.expr.parser.PathMap.PathMapArc) PathMap(net.sf.saxon.expr.parser.PathMap) ContextItemExpression(net.sf.saxon.expr.ContextItemExpression) HashSet(java.util.HashSet)

Aggregations

HashSet (java.util.HashSet)1 ContextItemExpression (net.sf.saxon.expr.ContextItemExpression)1 Expression (net.sf.saxon.expr.Expression)1 RootExpression (net.sf.saxon.expr.RootExpression)1 PathMap (net.sf.saxon.expr.parser.PathMap)1 PathMapArc (net.sf.saxon.expr.parser.PathMap.PathMapArc)1 PathMapNode (net.sf.saxon.expr.parser.PathMap.PathMapNode)1 PathMapRoot (net.sf.saxon.expr.parser.PathMap.PathMapRoot)1 XQueryExpression (net.sf.saxon.query.XQueryExpression)1 XPathExpression (net.sf.saxon.sxpath.XPathExpression)1 XMLColumn (org.teiid.query.sql.lang.XMLTable.XMLColumn)1