/** * 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 tdb ; import org.apache.jena.atlas.io.IndentedWriter ; import org.apache.jena.atlas.lib.FileOps ; import org.apache.jena.atlas.logging.LogCtl ; import org.apache.jena.graph.Triple ; import org.apache.jena.shared.PrefixMapping ; import org.apache.jena.sparql.algebra.Op ; import org.apache.jena.sparql.algebra.op.OpBGP ; import org.apache.jena.sparql.algebra.op.OpQuadPattern ; import org.apache.jena.sparql.core.BasicPattern ; import org.apache.jena.sparql.engine.optimizer.StatsMatcher ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderLib ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformationSubstitution ; import org.apache.jena.sparql.serializer.SerializationContext ; import org.apache.jena.sparql.sse.SSE ; import org.apache.jena.sparql.sse.writers.WriterNode ; import org.apache.jena.tdb.sys.Names ; public class tdbreorder { public static void main(String... args) { if ( args.length != 2 ) { System.err.println("Usage: PATTERN STATS") ; System.exit(1) ; } LogCtl.enable(StatsMatcher.class) ; LogCtl.enable(ReorderTransformationSubstitution.class) ; if ( args.length != 2 ) { System.err.println("Usage: op stats") ; System.exit(1) ; } String pattern = args[0] ; String statsFile = args[1] ; Op op = SSE.readOp(pattern) ; BasicPattern bgp ; if ( op instanceof OpQuadPattern ) { bgp = ((OpQuadPattern)op).getBasicPattern() ; } else if ( op instanceof OpBGP ) { bgp = ((OpBGP)op).getPattern() ; } else { System.err.println("Not a quad or triple pattern") ; System.exit(2) ; bgp = null ; } ReorderTransformation reorder = chooseReorder(statsFile) ; // ReorderTransformation reorder = ReorderLib.fixed() ; BasicPattern bgp2 = reorder.reorder(bgp) ; System.out.println() ; print(bgp) ; System.out.println() ; System.out.println(" ======== >>>>>>>>") ; print(bgp2) ; System.out.println() ; } private static void print(BasicPattern bgp) { IndentedWriter out = IndentedWriter.stdout ; PrefixMapping pmap = SSE.getPrefixMapWrite() ; SerializationContext sCxt = SSE.sCxt(pmap) ; boolean first = true ; for ( Triple t : bgp ) { if ( !first ) out.print("\n") ; else first = false ; // Adds (triple ...) // SSE.write(buff.getIndentedWriter(), t) ; out.print("(") ; WriterNode.outputPlain(out, t, sCxt) ; out.print(")") ; } out.flush() ; } private static ReorderTransformation chooseReorder(String filename) { if ( filename.equals(Names.optFixed) ) return ReorderLib.fixed() ; if ( filename.equals(Names.optNone) ) return ReorderLib.identity() ; if ( FileOps.exists(filename) ) return ReorderLib.weighted(filename) ; else throw new RuntimeException("No such file: " + filename) ; } }