/* * 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 arq; import java.io.PrintStream ; import java.util.Iterator ; import arq.cmdline.CmdARQ ; import arq.cmdline.ModEngine ; import arq.cmdline.ModQueryIn ; import arq.cmdline.ModQueryOut ; import jena.cmd.ArgDecl; import jena.cmd.CmdException; import org.apache.jena.atlas.lib.Lib ; import org.apache.jena.atlas.logging.LogCtl ; import org.apache.jena.query.* ; import org.apache.jena.shared.JenaException ; import org.apache.jena.sparql.ARQInternalErrorException ; import org.apache.jena.sparql.core.QueryCheckException ; import org.apache.jena.sparql.expr.E_Function ; import org.apache.jena.sparql.lang.ParserBase ; import org.apache.jena.sparql.resultset.ResultSetException ; import org.apache.jena.sparql.util.QueryOutputUtils ; import org.apache.jena.sparql.util.QueryUtils ; /** A program to parse and print a query. */ public class qparse extends CmdARQ { protected ModQueryIn modQuery = new ModQueryIn(Syntax.syntaxSPARQL_11) ; protected ModQueryOut modOutput = new ModQueryOut() ; protected ModEngine modEngine = new ModEngine() ; protected final ArgDecl argDeclPrint = new ArgDecl(ArgDecl.HasValue, "print") ; protected final ArgDecl argDeclOpt = new ArgDecl(ArgDecl.NoValue, "opt", "optimize") ; protected final ArgDecl argDeclExplain = new ArgDecl(ArgDecl.NoValue, "explain") ; protected final ArgDecl argDeclFixup = new ArgDecl(ArgDecl.NoValue, "fixup") ; protected boolean printNone = false ; protected boolean printQuery = false ; protected boolean printOp = false ; protected boolean printOpt = false ; protected boolean printQuad = false ; protected boolean printQuadOpt = false ; protected boolean printPlan = false ; public static void main(String... argv) { new qparse(argv).mainRun() ; } public qparse(String[] argv) { super(argv) ; super.addModule(modQuery) ; super.addModule(modOutput) ; super.addModule(modEngine) ; super.getUsage().startCategory(null) ; super.add(argDeclPrint, "--print", "Print in various forms [query, op, quad, plan]") ; super.add(argDeclExplain, "--explain", "Print with algebra-level optimization") ; super.add(argDeclOpt, "--opt", "[deprecated]") ; super.add(argDeclFixup, "--fixup", "Convert undeclared prefix names to URIs") ; // Switch off function build warnings. E_Function.WarnOnUnknownFunction = false ; } @Override protected void processModulesAndArgs() { super.processModulesAndArgs() ; if ( contains(argDeclOpt) ) printOpt = true ; if ( contains(argDeclExplain) ) { printQuery = true ; printOpt = true ; } if ( contains(argDeclFixup) ) { // Fixup undeclared prefix names. ARQ.set(ARQ.fixupUndefinedPrefixes, true); } for ( String arg : getValues( argDeclPrint ) ) { if ( arg.equalsIgnoreCase( "query" ) ) { printQuery = true; } else if ( arg.equalsIgnoreCase( "op" ) || arg.equalsIgnoreCase( "alg" ) || arg.equalsIgnoreCase( "algebra" ) ) { printOp = true; } else if ( arg.equalsIgnoreCase( "quad" ) ) { printQuad = true; } else if ( arg.equalsIgnoreCase( "quads" ) ) { printQuad = true; } else if ( arg.equalsIgnoreCase( "plan" ) ) { printPlan = true; } else if ( arg.equalsIgnoreCase( "opt" ) ) { printOpt = true; } else if ( arg.equalsIgnoreCase( "optquad" ) ) { printQuadOpt = true; } else if ( arg.equalsIgnoreCase( "quadopt" ) ) { printQuadOpt = true; } else if ( arg.equalsIgnoreCase( "none" ) ) { printNone = true; } else { throw new CmdException( "Not a recognized print form: " + arg + " : Choices are: query, op, quad, opt, optquad" ); } } if ( ! printQuery && ! printOp && ! printQuad && ! printPlan && ! printOpt && ! printQuadOpt && ! printNone ) printQuery = true ; } static String usage = qparse.class.getName()+" [--in syntax] [--out syntax] [--print=FORM] [\"query\"] | --query <file>" ; @Override protected String getSummary() { return usage ; } static final String divider = "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" ; //static final String divider = "" ; boolean needDivider = false ; private void divider() { if ( needDivider ) System.out.println(divider) ; needDivider = true ; } @Override protected void exec() { try{ Query query = modQuery.getQuery() ; try { LogCtl.disable(ParserBase.ParserLoggerName) ; QueryUtils.checkQuery(query, true) ; } catch (QueryCheckException ex) { System.err.println() ; System.err.println("**** Check failure: "+ex.getMessage()) ; if ( ex.getCause() != null ) ex.getCause().printStackTrace(System.err) ; } finally { LogCtl.setLevel(ParserBase.ParserLoggerName, "INFO") ; } // Print the query out in some syntax if ( printQuery ) { divider() ; modOutput.output(query) ; } // Print internal forms. if ( printOp ) { divider() ; modOutput.outputOp(query, false) ; } if ( printQuad ) { divider() ; modOutput.outputQuad(query, false) ; } if ( printOpt ) { divider() ; modOutput.outputOp(query, true) ; } if ( printQuadOpt ) { divider() ; modOutput.outputQuad(query, true) ; } if ( printPlan ) { divider() ; // This forces internal query initialization - must be after QueryUtils.checkQuery QueryExecution qExec = QueryExecutionFactory.create(query, DatasetFactory.createGeneral()) ; QueryOutputUtils.printPlan(query, qExec) ; } } catch (ARQInternalErrorException intEx) { System.err.println(intEx.getMessage()) ; if ( intEx.getCause() != null ) { System.err.println("Cause:") ; intEx.getCause().printStackTrace(System.err) ; System.err.println() ; } intEx.printStackTrace(System.err) ; } catch (ResultSetException ex) { System.err.println(ex.getMessage()) ; ex.printStackTrace(System.err) ; } catch (QueryException qEx) { //System.err.println(qEx.getMessage()) ; throw new CmdException("Query Exeception", qEx) ; } catch (JenaException ex) { ex.printStackTrace() ; throw ex ; } catch (CmdException ex) { throw ex ; } catch (Exception ex) { throw new CmdException("Exception", ex) ; } } @Override protected String getCommandName() { return Lib.className(this) ; } // static String usage = qparse.class.getName()+ // " [--in syntax] [--out syntax] [\"query\" | --query <file>\n"+ // " where syntax is one of ARQ, SPARQL\n" + // "Other options: \n"+ // " --num on|off Line number ('on' by default)\n"+ // " -n Same as --num=off\n"+ // " --base URI Set the base URI for resolving relative URIs\n"+ // " --plain No pretty printing\n"+ // " --parse Parse only - don't print\n"+ // " ---planning Turn planning on/off\n"+ // " --show X Show internal structure (X = query or plan)\n" ; static void writeSyntaxes(String msg, PrintStream out) { if ( msg != null ) out.println(msg) ; for ( Iterator<String> iter = Syntax.querySyntaxNames.keys() ; iter.hasNext() ; ) { String k = iter.next() ; Syntax v = Syntax.lookup(k) ; k = padOut(k,10) ; out.println(" "+k+" "+v) ; } } // printf ... java 1.5 .. mutter,mutter static String padOut(String x, int len) { StringBuilder r = new StringBuilder(x) ; for ( int i = x.length() ; i <= len ; i++ ) r.append(" ") ; return r.toString() ; } }