blob: 2d08a714182c7c48b4a10be2a3c71ce9aeb8ab09 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.algebra.optimize;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.TransformCopy ;
import org.apache.jena.sparql.algebra.op.OpPath ;
import org.apache.jena.sparql.core.PathBlock ;
import org.apache.jena.sparql.path.PathCompiler ;
import org.apache.jena.sparql.path.PathLib ;
/**
* Perform the equivalent of the transactions in the SPARQL 1.1 spec. ARQ
* regards path transformation as an optimization. ARQ does not execute the
* exact transformation as per spec as there are better ways to do it for ARQ.
* For example,
* <ul>
* <li>Path seq {@literal ->} BGPs or a (sequence)
* <li>"|" is not expanded into a union.
* </ul>
*/
public class TransformPathFlattern extends TransformCopy
{
// This transform is also used so programmatically built queries also get converted.
// Need previous BGP for merging? Do as a separate pass (sequence, BGP collapse)
private PathCompiler pathCompiler ;
public TransformPathFlattern() { this(new PathCompiler()) ; }
public TransformPathFlattern(PathCompiler pathCompiler)
{
this.pathCompiler = pathCompiler ;
}
@Override
public Op transform(OpPath opPath)
{
// Flatten down to triples where possible.
PathBlock pattern = pathCompiler.reduce(opPath.getTriplePath()) ;
// Any generated paths of exactly one to triple; convert to Op.
return PathLib.pathToTriples(pattern) ;
}
}