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