/**
 * 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) ;
    }
}
