From commits-return-5187-archive-asf-public=cust-asf.ponee.io@clerezza.apache.org Wed Nov 14 04:04:11 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 4B84518067C for ; Wed, 14 Nov 2018 04:04:09 +0100 (CET) Received: (qmail 20794 invoked by uid 500); 14 Nov 2018 03:04:08 -0000 Mailing-List: contact commits-help@clerezza.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@clerezza.apache.org Delivered-To: mailing list commits@clerezza.apache.org Received: (qmail 20657 invoked by uid 99); 14 Nov 2018 03:04:07 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 14 Nov 2018 03:04:07 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 4D619E12BB; Wed, 14 Nov 2018 03:04:05 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hasan@apache.org To: commits@clerezza.apache.org Date: Wed, 14 Nov 2018 03:04:06 -0000 Message-Id: <6ffdd6738ed34e0b8baa99a40d1de29c@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [2/6] clerezza git commit: CLEREZZA-1026: Introduce GraphStore to remove dependency to TcProvider and refactor sparql http://git-wip-us.apache.org/repos/asf/clerezza/blob/eec0ac73/sparql/src/main/javacc/org/apache/clerezza/sparql/JavaCCGeneratedSparqlPreParser.jj ---------------------------------------------------------------------- diff --git a/sparql/src/main/javacc/org/apache/clerezza/sparql/JavaCCGeneratedSparqlPreParser.jj b/sparql/src/main/javacc/org/apache/clerezza/sparql/JavaCCGeneratedSparqlPreParser.jj new file mode 100644 index 0000000..8c145ed --- /dev/null +++ b/sparql/src/main/javacc/org/apache/clerezza/sparql/JavaCCGeneratedSparqlPreParser.jj @@ -0,0 +1,2557 @@ +/* + * 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. + */ +options +{ + STATIC=false; + UNICODE_INPUT=true; + IGNORE_CASE=false; + JAVA_UNICODE_ESCAPE=false; + DEBUG_PARSER=false; + JDK_VERSION="1.6"; +} + +PARSER_BEGIN(JavaCCGeneratedSparqlPreParser) + +package org.apache.clerezza.sparql; + +import org.apache.clerezza.api.BlankNode; +import org.apache.clerezza.api.impl.literal.LiteralFactory; +import org.apache.clerezza.api.impl.literal.PlainLiteralImpl; +import org.apache.clerezza.api.impl.literal.TypedLiteralImpl; +import org.apache.clerezza.api.IRI; +import org.apache.clerezza.api.Language; +import org.apache.clerezza.api.Literal; +import org.apache.clerezza.api.RDFTerm; +import org.apache.clerezza.sparql.query.AlternativeGraphPattern; +import org.apache.clerezza.sparql.query.BinaryOperation; +import org.apache.clerezza.sparql.query.BinaryPropertyPathOperation; +import org.apache.clerezza.sparql.query.BuiltInCall; +import org.apache.clerezza.sparql.query.Expression; +import org.apache.clerezza.sparql.query.FunctionCall; +import org.apache.clerezza.sparql.query.GroupGraphPattern; +import org.apache.clerezza.sparql.query.InlineData; +import org.apache.clerezza.sparql.query.LiteralExpression; +import org.apache.clerezza.sparql.query.PatternExistenceCondition; +import org.apache.clerezza.sparql.query.PredicatePath; +import org.apache.clerezza.sparql.query.PropertyPathExpressionOrVariable; +import org.apache.clerezza.sparql.query.PropertyPathExpression; +import org.apache.clerezza.sparql.query.PropertyPathPattern; +import org.apache.clerezza.sparql.query.PropertySet; +import org.apache.clerezza.sparql.query.Query; +import org.apache.clerezza.sparql.query.ResourceOrVariable; +import org.apache.clerezza.sparql.query.RhsListBinaryOperation; +import org.apache.clerezza.sparql.query.SelectQuery; +import org.apache.clerezza.sparql.query.SparqlUnit; +import org.apache.clerezza.sparql.query.TriplePattern; +import org.apache.clerezza.sparql.query.UnaryOperation; +import org.apache.clerezza.sparql.query.UnaryPropertyPathOperation; +import org.apache.clerezza.sparql.query.UriRefExpression; +import org.apache.clerezza.sparql.query.UriRefOrVariable; +import org.apache.clerezza.sparql.query.Variable; +import org.apache.clerezza.sparql.query.impl.SimpleAlternativeGraphPattern; +import org.apache.clerezza.sparql.query.impl.SimpleAskQuery; +import org.apache.clerezza.sparql.query.impl.SimpleConstructQuery; +import org.apache.clerezza.sparql.query.impl.SimpleDataSet; +import org.apache.clerezza.sparql.query.impl.SimpleDescribeQuery; +import org.apache.clerezza.sparql.query.impl.SimpleGraphGraphPattern; +import org.apache.clerezza.sparql.query.impl.SimpleGroupGraphPattern; +import org.apache.clerezza.sparql.query.impl.SimpleInlineData; +import org.apache.clerezza.sparql.query.impl.SimpleOrderCondition; +import org.apache.clerezza.sparql.query.impl.SimplePropertyPathPattern; +import org.apache.clerezza.sparql.query.impl.SimpleQuery; +import org.apache.clerezza.sparql.query.impl.SimpleQueryWithSolutionModifier; +import org.apache.clerezza.sparql.query.impl.SimpleSelectQuery; +import org.apache.clerezza.sparql.query.impl.SimpleServiceGraphPattern; +import org.apache.clerezza.sparql.query.impl.SimpleSparqlUnit; +import org.apache.clerezza.sparql.query.impl.SimpleTriplePattern; +import org.apache.clerezza.sparql.update.Update; +import org.apache.clerezza.sparql.update.UpdateOperation; +import org.apache.clerezza.sparql.update.UpdateOperation.GraphSpec; +import org.apache.clerezza.sparql.update.impl.AddOperation; +import org.apache.clerezza.sparql.update.impl.ClearOperation; +import org.apache.clerezza.sparql.update.impl.ClearOrDropOperation; +import org.apache.clerezza.sparql.update.impl.CopyOperation; +import org.apache.clerezza.sparql.update.impl.CreateOperation; +import org.apache.clerezza.sparql.update.impl.DeleteDataOperation; +import org.apache.clerezza.sparql.update.impl.DeleteWhereOperation; +import org.apache.clerezza.sparql.update.impl.DropOperation; +import org.apache.clerezza.sparql.update.impl.InsertDataOperation; +import org.apache.clerezza.sparql.update.impl.LoadOperation; +import org.apache.clerezza.sparql.update.impl.ModifyOperation; +import org.apache.clerezza.sparql.update.impl.MoveOperation; +import org.apache.clerezza.sparql.update.impl.SimpleUpdate; +import org.apache.clerezza.sparql.update.impl.SimpleUpdateOperation; +import org.apache.clerezza.sparql.update.impl.UpdateOperationWithQuads; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.Set; + +/** + * + * Credits: Fedora Commons, Inc. + * - for initial grammar of this file (available in mulgara project). + * Modified by: Hasan + */ +class JavaCCGeneratedSparqlPreParser { + + private static final IRI RDF_TYPE = + new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); + private static final IRI RDF_FIRST = + new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#first"); + private static final IRI RDF_REST = + new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"); + private static final IRI RDF_NIL = + new IRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"); + + /** A RegEx pattern for separating out a namespace from a prefixed name. */ + private static final Pattern pfxNamePattern = Pattern.compile("([^:]*):(.*)"); + + private String base; + private Map prefixes; + private Map bNodes; + private int count; + + private class GraphRefAllSpec { + GraphSpec graphSpec; + IRI graph; + public void setGraphSpec(GraphSpec graphSpec) { + this.graphSpec = graphSpec; + } + public GraphSpec getGraphSpec() { + return this.graphSpec; + } + public void setGraph(IRI graph){ + this.graph = graph; + } + public IRI getGraph() { + return this.graph; + } + } + + void initialize() { + base = null; + prefixes = new HashMap(); + bNodes = new HashMap(); + count = 0; + } + + SparqlUnit parse() throws ParseException { + SparqlUnit sparqlUnit; + initialize(); + sparqlUnit = this.SparqlUnit(); + return sparqlUnit; + } + + Query parseQuery() throws ParseException { + Query query; + initialize(); + query = this.QueryUnit(); + return query; + } + + Update parseUpdate() throws ParseException { + Update update; + initialize(); + update = this.UpdateUnit(); + return update; + } + + private static String unquote(String s) { + return s.substring(1, s.length() - 1); + } + + private static String unTripleQuote(String s) { + return s.substring(3, s.length() - 3); + } + + private Variable createVariable(String name) { + name = name.substring(1); + Variable v = new Variable(name); + return v; + } + + private void addPropertyPathPatterns(Set propertyPathPatterns, + ResourceOrVariable subject, + PropertyPathExpressionOrVariable propertyPathExpression, + Set objects) { + + for (ResourceOrVariable object : objects) { + propertyPathPatterns.add( + new SimplePropertyPathPattern(subject, propertyPathExpression, object)); + } + } + + // nodes contain at least one element + private ResourceOrVariable addPropertyPathPatterns(Set propertyPathPatterns, + List nodes) { + + ResourceOrVariable head = null; + PropertyPathExpressionOrVariable rdfFirst = new PropertyPathExpressionOrVariable(new PredicatePath(RDF_FIRST)); + PropertyPathExpressionOrVariable rdfRest = new PropertyPathExpressionOrVariable(new PredicatePath(RDF_REST)); + UriRefOrVariable rdfNil = new UriRefOrVariable(RDF_NIL); + + ResourceOrVariable prevSubject = null; + for (ResourceOrVariable node : nodes) { + ResourceOrVariable currentSubject = getNewBNode(); + if (prevSubject != null) { + propertyPathPatterns.add( + new SimplePropertyPathPattern(prevSubject, rdfRest, currentSubject)); + } else { + head = currentSubject; + } + propertyPathPatterns.add( + new SimplePropertyPathPattern(currentSubject, rdfFirst, node)); + prevSubject = currentSubject; + } + if (prevSubject != null) { + propertyPathPatterns.add( + new SimplePropertyPathPattern(prevSubject, rdfRest, rdfNil)); + } + return head; + } + + private void addTriplePatterns(Set triplePatterns, + ResourceOrVariable subject, + UriRefOrVariable predicate, + Set objects) { + + for (ResourceOrVariable object : objects) { + triplePatterns.add( + new SimpleTriplePattern(subject, predicate, object)); + } + } + + // nodes contain at least one element + private ResourceOrVariable addTriplePatterns( + Set triplePatterns, + List nodes) { + + ResourceOrVariable head = null; + UriRefOrVariable rdfFirst = new UriRefOrVariable(RDF_FIRST); + UriRefOrVariable rdfRest = new UriRefOrVariable(RDF_REST); + UriRefOrVariable rdfNil = new UriRefOrVariable(RDF_NIL); + + ResourceOrVariable prevSubject = null; + for (ResourceOrVariable node : nodes) { + ResourceOrVariable currentSubject = getNewBNode(); + if (prevSubject != null) { + triplePatterns.add( + new SimpleTriplePattern(prevSubject, rdfRest, currentSubject)); + } else { + head = currentSubject; + } + triplePatterns.add( + new SimpleTriplePattern(currentSubject, rdfFirst, node)); + prevSubject = currentSubject; + } + if (prevSubject != null) { + triplePatterns.add( + new SimpleTriplePattern(prevSubject, rdfRest, rdfNil)); + } + return head; + } + + private ResourceOrVariable getNewBNode() { + ResourceOrVariable bNode = new ResourceOrVariable(new BlankNode()); + bNodes.put("*" + count++, bNode); + return bNode; + } + + private ResourceOrVariable getBNode(String label) { + ResourceOrVariable bNode = bNodes.get(label); + if (bNode == null) { + bNode = new ResourceOrVariable(new BlankNode()); + bNodes.put(label, bNode); + } + return bNode; + } + + private IRI createUriRef(String r) throws ParseException { + // Create an IRI directly if the string does not start with a prefix + Matcher m = pfxNamePattern.matcher(r); + if (!m.matches()) { + // either a normal IRI, or one with a BASE + return isRelative(r) ? new IRI(base + r) : new IRI(r); + } + // extract the prefix, and attempt to convert to a URI before creating the reference + String ns = prefixes.get(m.group(1)); + return ns == null ? new IRI(r) : new IRI(ns + m.group(2)); + } + + /** + * Tests if the string for a URI is relative or absolute. The test is based on a scheme existing + * in the string, which in turn expects a : character to follow it. If there is no colon, then + * it is presumed to be relative. Otherwise, if there are special characters preceding the first + * colon these are presumed to not be in a scheme. + * @param u A string for a URI. + * @return true if the URI appears to be relative, false otherwise. + */ + private static boolean isRelative(String u) { + int colon = u.indexOf(':'); + if (colon < 0) { + return true; + } + for (int c = 0; c < colon; c++) { + // if there a non-alphanum characters then this is not a scheme, so the URI is relative + if (!Character.isLetterOrDigit(u.charAt(c))) { + return true; + } + } + // found a (probably) valid scheme, so the URI is absolute + return false; + } +} +PARSER_END(JavaCCGeneratedSparqlPreParser) + +SKIP : +{ + "\t" | "\n" | "\r" | "\f" | " " +} + +MORE : +{ + "#" : IN_COMMENT +} + + +SPECIAL_TOKEN : +{ + : DEFAULT +} + +TOKEN [IGNORE_CASE] : +{ + < SELECT : "SELECT" > +| < BASE : "BASE" > +| < ORDER : "ORDER" > +| < BY : "BY" > +| < FROM : "FROM" > +| < GRAPH : "GRAPH" > +| < PREFIX : "PREFIX" > +| < CONSTRUCT : "CONSTRUCT" > +| < LIMIT : "LIMIT" > +| < NAMED : "NAMED" > +| < OPTIONAL : "OPTIONAL" > +| < DESCRIBE : "DESCRIBE" > +| < OFFSET : "OFFSET" > +| < WHERE : "WHERE" > +| < UNION : "UNION" > +| < ASK : "ASK" > +| < DISTINCT : "DISTINCT" > +| < FILTER : "FILTER" > +| < REDUCED : "REDUCED" > +| < GROUP_CONCAT : "GROUP_CONCAT" > +| < BOUND : "bound" > +| < TRUE : "TRUE" > +| < FALSE : "FALSE" > +| < VALUES : "VALUES" > +| < UNDEF : "UNDEF" > +| < AS : "AS" > +| < BIND : "BIND" > +| < MINUS : "MINUS" > +| < SERVICE : "SERVICE" > +| < GROUP : "GROUP" > +| < HAVING : "HAVING" > +| < LOAD : "LOAD" > +| < SILENT : "SILENT" > +| < INTO : "INTO" > +| < CLEAR : "CLEAR" > +| < DROP : "DROP" > +| < CREATE : "CREATE" > +| < ADD : "ADD" > +| < TO : "TO" > +| < MOVE : "MOVE" > +| < COPY : "COPY" > +| < INSERT : "INSERT" > +| < DELETE : "DELETE" > +| < DATA : "DATA" > +| < WITH : "WITH" > +| < USING : "USING" > +| < DEFAULT_T : "DEFAULT" > +| < ALL : "ALL" > +| < IN : "IN" > +| < NOT : "NOT" > +| < EXISTS : "EXISTS" > +| < BNODE : "BNODE" > +| < RAND : "RAND" > +| < CONCAT : "CONCAT" > +| < NOW : "NOW" > +| < UUID : "UUID" > +| < STRUUID : "STRUUID" > +| < COALESCE : "COALESCE" > +| < SEPARATOR : "SEPARATOR" > +} + +/* SparqlUnit ::= Prologue ( Query | Update ) */ +private SparqlUnit SparqlUnit() : { + Query query; + Update update; } { + + Prologue() + ( + query=QueryUnit() { + return new SimpleSparqlUnit(query); } + | + update=UpdateUnit() { + return new SimpleSparqlUnit(update); } + ) +} + +/* [1] QueryUnit ::= Query */ +private Query QueryUnit() : { + Query query; } { + + query=Query() { + return query; } +} + +/* [2] Query ::= Prologue ( SelectQuery | ConstructQuery | DescribeQuery | AskQuery ) ValuesClause */ +/* [2] Query ::= ( SelectQuery | ConstructQuery | DescribeQuery | AskQuery ) ValuesClause */ +private Query Query() : { + Query query; } { + ( + query = SelectQuery() + | + query = ConstructQuery() + | + query = DescribeQuery() + | + query = AskQuery() + ) { + return query; + } +} + +/* [3] UpdateUnit ::= Update */ +private Update UpdateUnit() : { + Update update = new SimpleUpdate(); } { + Update(update) { + return update; } +} + +/* [4] Prologue ::= ( BaseDecl | PrefixDecl )* */ +private void Prologue() : {} { + ( BaseDecl() | PrefixDecl() )* +} + +/* [5] BaseDecl ::= 'BASE' IRIREF */ +private void BaseDecl() : { + Token iriRef; } { + + iriRef= { base = unquote(iriRef.image); } +} + +/* [6] PrefixDecl ::= 'PREFIX' PNAME_NS IRIREF */ +private void PrefixDecl() : { + Token ns, iriRef; } { + + ns= iriRef= { + String pfx = ns.image; + prefixes.put(pfx.substring(0, pfx.length() - 1), unquote(iriRef.image)); } +} + +/* [7] SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier */ +private Query SelectQuery() : { + Query query; } { + query = SelectClause() + ( DatasetClause(query) )* + WhereClause(query) + SolutionModifier(query) { + return query; } +} + +/* [8] SubSelect ::= SelectClause WhereClause SolutionModifier ValuesClause */ +private Query SubSelect() : { + Query query; } { + query = SelectClause() + WhereClause(query) + SolutionModifier(query) + ValuesClause(query) { + return query; } +} + +/* [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' ) */ +private Query SelectClause() : { + Query query; + Variable v; + Expression e; } { + +