/* * 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.util; import org.apache.jena.atlas.io.IndentedLineBuffer ; import org.apache.jena.query.Query ; import org.apache.jena.query.QueryException ; import org.apache.jena.query.QueryFactory ; import org.apache.jena.sparql.algebra.Algebra ; import org.apache.jena.sparql.algebra.Op ; import org.apache.jena.sparql.core.QueryCheckException ; import org.apache.jena.sparql.lang.SPARQLParserRegistry ; import org.apache.jena.sparql.sse.SSE ; import org.apache.jena.sparql.sse.SSEParseException ; import org.apache.jena.sparql.sse.WriterSSE ; import org.apache.jena.sparql.sse.builders.BuildException ; public class QueryUtils { public static void checkQuery(Query query, boolean optimizeAlgebra) { checkParse(query) ; checkOp(query, optimizeAlgebra) ; } public static void checkOp(Query query, boolean optimizeAlgebra) { IndentedLineBuffer buff = new IndentedLineBuffer() ; Op op = Algebra.compile(query) ; if ( optimizeAlgebra ) op = Algebra.optimize(op) ; WriterSSE.out(buff, op, query) ; String str = buff.toString() ; try { Op op2 = SSE.parseOp(str) ; if ( op.hashCode() != op2.hashCode() ) { op.hashCode() ; op2.hashCode() ; dump(op, op2) ; throw new QueryCheckException("reparsed algebra expression hashCode does not equal algebra from query") ; } if ( ! op.equals(op2) ) { dump(op, op2) ; throw new QueryCheckException("reparsed algebra expression does not equal query algebra") ; } } catch (SSEParseException | BuildException ex) { System.err.println(str); throw ex ; } // Breakpoint } private static void dump(Op op, Op op2) { System.err.println("***********") ; System.err.println(op) ; System.err.println(op2) ; System.err.println("***********") ; } public static void checkParse(Query query) { if ( ! SPARQLParserRegistry.get().containsFactory(query.getSyntax()) ) return ; IndentedLineBuffer buff = new IndentedLineBuffer() ; query.serialize(buff, query.getSyntax()) ; String tmp = buff.toString() ; Query query2 = null ; try { String baseURI = null ; if ( ! query.explicitlySetBaseURI() ) // Not in query - use the same one (e.g. file read from) . baseURI = query.getBaseURI() ; query2 = QueryFactory.create(tmp, baseURI, query.getSyntax()) ; if ( query2 == null ) return ; } catch (UnsupportedOperationException ex) { // No parser after all. return ; } catch (QueryException ex) { System.err.println(tmp) ; throw new QueryCheckException("could not parse output query", ex) ; } if ( query.hashCode() != query2.hashCode() ) throw new QueryCheckException("reparsed query hashCode does not equal parsed input query \nQuery (hashCode: " + query.hashCode() + ")=\n" + query + "\n\nQuery2 (hashCode: " + query2.hashCode() + ")=\n" + query2) ; if ( ! query.equals(query2) ) throw new QueryCheckException("reparsed output does not equal parsed input") ; } }