You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by ha...@apache.org on 2013/08/23 21:29:06 UTC

svn commit: r1516993 [2/2] - in /clerezza/trunk/rdf.core/src: main/java/org/apache/clerezza/rdf/core/sparql/ main/java/org/apache/clerezza/rdf/core/sparql/query/ main/java/org/apache/clerezza/rdf/core/sparql/query/impl/ main/javacc/org/apache/clerezza/...

Modified: clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj?rev=1516993&r1=1516992&r2=1516993&view=diff
==============================================================================
--- clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj (original)
+++ clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj Fri Aug 23 19:29:05 2013
@@ -49,18 +49,26 @@ import org.apache.clerezza.rdf.core.impl
 import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
 import org.apache.clerezza.rdf.core.sparql.query.AlternativeGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.BinaryOperation;
+import org.apache.clerezza.rdf.core.sparql.query.BinaryPropertyPathOperation;
 import org.apache.clerezza.rdf.core.sparql.query.BuiltInCall;
 import org.apache.clerezza.rdf.core.sparql.query.Expression;
 import org.apache.clerezza.rdf.core.sparql.query.FunctionCall;
 import org.apache.clerezza.rdf.core.sparql.query.GroupGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.InlineData;
 import org.apache.clerezza.rdf.core.sparql.query.LiteralExpression;
+import org.apache.clerezza.rdf.core.sparql.query.PredicatePath;
+import org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpressionOrVariable;
+import org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpression;
+import org.apache.clerezza.rdf.core.sparql.query.PropertyPathPattern;
+import org.apache.clerezza.rdf.core.sparql.query.PropertySet;
 import org.apache.clerezza.rdf.core.sparql.query.Query;
 import org.apache.clerezza.rdf.core.sparql.query.ResourceOrVariable;
 import org.apache.clerezza.rdf.core.sparql.query.RhsListBinaryOperation;
+import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
 import org.apache.clerezza.rdf.core.sparql.query.SparqlUnit;
 import org.apache.clerezza.rdf.core.sparql.query.TriplePattern;
 import org.apache.clerezza.rdf.core.sparql.query.UnaryOperation;
+import org.apache.clerezza.rdf.core.sparql.query.UnaryPropertyPathOperation;
 import org.apache.clerezza.rdf.core.sparql.query.UriRefExpression;
 import org.apache.clerezza.rdf.core.sparql.query.UriRefOrVariable;
 import org.apache.clerezza.rdf.core.sparql.query.Variable;
@@ -72,9 +80,11 @@ import org.apache.clerezza.rdf.core.spar
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleGroupGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleInlineData;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleOrderCondition;
+import org.apache.clerezza.rdf.core.sparql.query.impl.SimplePropertyPathPattern;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQuery;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQueryWithSolutionModifier;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSelectQuery;
+import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleServiceGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSparqlUnit;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleTriplePattern;
 import org.apache.clerezza.rdf.core.sparql.update.Update;
@@ -168,6 +178,46 @@ class JavaCCGeneratedSparqlPreParser {
         return v;
     }
 
+    private void addPropertyPathPatterns(Set<PropertyPathPattern> propertyPathPatterns,
+            ResourceOrVariable subject,
+            PropertyPathExpressionOrVariable propertyPathExpression,
+            Set<ResourceOrVariable> objects) {
+
+        for (ResourceOrVariable object : objects) {
+            propertyPathPatterns.add(
+                new SimplePropertyPathPattern(subject, propertyPathExpression, object));
+        }
+    }
+
+    // nodes contain at least one element
+    private ResourceOrVariable addPropertyPathPatterns(Set<PropertyPathPattern> propertyPathPatterns,
+            List<ResourceOrVariable> 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<TriplePattern> triplePatterns,
             ResourceOrVariable subject,
             UriRefOrVariable predicate,
@@ -305,6 +355,9 @@ TOKEN [IGNORE_CASE] :
 |   < VALUES : "VALUES" >
 |   < UNDEF : "UNDEF" >
 |   < AS : "AS" >
+|   < BIND : "BIND" >
+|   < MINUS : "MINUS" >
+|   < SERVICE : "SERVICE" >
 |   < GROUP : "GROUP" >
 |   < HAVING : "HAVING" >
 |   < LOAD : "LOAD" >
@@ -409,11 +462,21 @@ private void PrefixDecl() : {
 private Query SelectQuery() : {
     Query query; } {
     query = SelectClause()
-    ( DatasetClause(query) )* {
+    ( 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() : {
@@ -455,18 +518,30 @@ private Query SelectClause() : {
 /* [10]    ConstructQuery ::= 'CONSTRUCT' ( ConstructTemplate DatasetClause* WhereClause SolutionModifier | DatasetClause* 'WHERE' '{' TriplesTemplate? '}' SolutionModifier ) */
 private Query ConstructQuery() : {
     Query query;
-    Set<TriplePattern> triplePatterns = null; } {
+    Set<TriplePattern> triplePatterns = null;
+    GroupGraphPattern queryPattern; } {
 
     <CONSTRUCT>
     (
         triplePatterns=ConstructTemplate() {
         query = new SimpleConstructQuery(triplePatterns); }
         ( DatasetClause(query) )*
+        WhereClause(query)
     |
         {
         query = new SimpleConstructQuery(triplePatterns); }
         ( DatasetClause(query) )*
-    ) {
+        <WHERE>
+        "{" {
+        queryPattern = new SimpleGroupGraphPattern(); }
+        (
+            triplePatterns=TriplesTemplate()
+        )? {
+        ((SimpleGroupGraphPattern) queryPattern).addTriplePatterns(triplePatterns); }
+        "}" {
+        ((SimpleQuery) query).setQueryPattern(queryPattern); }
+    )
+    SolutionModifier(query) {
     return query; }
 }
 
@@ -484,7 +559,9 @@ private Query DescribeQuery() : {
         "*" {
             ((SimpleDescribeQuery) query).setDescribeAll(); }
     )
-    ( DatasetClause(query) )* {
+    ( DatasetClause(query) )*
+    ( WhereClause(query) )?
+    SolutionModifier(query) {
     return query; }
 }
 
@@ -494,7 +571,9 @@ private Query AskQuery() : {
 
     <ASK> {
     query = new SimpleAskQuery(); }
-    ( DatasetClause(query) )* {
+    ( DatasetClause(query) )*
+    WhereClause(query)
+    SolutionModifier(query) {
     return query; }
 }
 
@@ -527,20 +606,117 @@ private UriRef SourceSelector() : {
     return graph; }
 }
 
-/*
-[17] WhereClause ::= 'WHERE'? GroupGraphPattern
-[18] SolutionModifier ::= GroupClause? HavingClause? OrderClause? LimitOffsetClauses?
-[19] GroupClause ::= 'GROUP' 'BY' GroupCondition+
-[20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var
-[21] HavingClause ::= 'HAVING' HavingCondition+
-[22] HavingCondition ::= Constraint
-[23] OrderClause ::= 'ORDER' 'BY' OrderCondition+
-[24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var )
-[25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause?
-[26] LimitClause ::= 'LIMIT' INTEGER
-[27] OffsetClause ::= 'OFFSET' INTEGER
-[28] ValuesClause ::= ( 'VALUES' DataBlock )?
-*/
+/* [17]    WhereClause ::= 'WHERE'? GroupGraphPattern */
+private void WhereClause(Query query) : {
+    GroupGraphPattern queryPattern; } {
+
+    (<WHERE>)?
+    queryPattern=GroupGraphPattern() {
+    ((SimpleQuery) query).setQueryPattern(queryPattern); }
+}
+
+/* [18] SolutionModifier ::= GroupClause? HavingClause? OrderClause? LimitOffsetClauses? */
+private void SolutionModifier(Query query) : {} {
+    ( GroupClause(query) )?
+    ( HavingClause(query) )?
+    ( OrderClause(query) )?
+    ( LimitOffsetClauses(query) )?
+}
+
+/* [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+ */
+private void GroupClause(Query query) : {} {
+    <GROUP> <BY> ( GroupCondition(query) )+
+}
+
+/* [20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var */
+private void GroupCondition(Query query) : {
+    Expression e;
+    Variable v; } {
+    (
+        e=BuiltInCall()
+    |
+        e=FunctionCall()
+    |
+        (
+            "("
+            e=Expression()
+            (
+                <AS>
+                v=Var() {
+                v.setBoundExpression(e);
+                e = v; }
+            )?
+            ")"
+        )
+    |
+        e=Var()
+    ) {
+    ((SimpleQueryWithSolutionModifier) query).addGroupCondition(e); }
+}
+
+/* [21] HavingClause ::= 'HAVING' HavingCondition+ */
+private void HavingClause(Query query) : {} {
+    <HAVING> ( HavingCondition(query) )+
+}
+
+/* [22] HavingCondition ::= Constraint */
+private void HavingCondition(Query query) : {
+    Expression c; } {
+
+    c=Constraint() {
+    ((SimpleQueryWithSolutionModifier) query).addHavingCondition(c); }
+}
+
+/* [23] OrderClause ::= 'ORDER' 'BY' OrderCondition+ */
+private void OrderClause(Query query) : {} {
+    <ORDER> <BY> ( OrderCondition(query) )+
+}
+
+/* [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var ) */
+private void OrderCondition(Query query) : {
+    boolean asc = true;
+    Expression e; } {
+
+    (
+        ( ( "ASC" | "DESC" { asc = false; } ) e=BrackettedExpression() )
+    |
+        ( e=Constraint() | e=Var() )
+    ) {
+    ((SimpleQueryWithSolutionModifier) query).addOrderCondition(new SimpleOrderCondition(e, asc)); }
+}
+
+/* [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause? */
+private void LimitOffsetClauses(Query query) : {} {
+    ( LimitClause(query) (OffsetClause(query))? )
+    |
+    ( OffsetClause(query) (LimitClause(query))? )
+}
+
+/* [26] LimitClause ::= 'LIMIT' INTEGER */
+private void LimitClause(Query query) : {
+    Token t; } {
+
+    <LIMIT> t=<INTEGER> {
+    ((SimpleQueryWithSolutionModifier) query).setLimit(Integer.parseInt(t.image)); }
+}
+
+/* [27] OffsetClause ::= 'OFFSET' INTEGER */
+private void OffsetClause(Query query) : {
+    Token t; } {
+
+    <OFFSET> t=<INTEGER> {
+    ((SimpleQueryWithSolutionModifier) query).setOffset(Integer.parseInt(t.image)); }
+}
+
+/* [28] ValuesClause ::= ( 'VALUES' DataBlock )? */
+private void ValuesClause(Query query) : {
+    InlineData data; } {
+    (
+        <VALUES>
+        data=DataBlock() {
+        ((SimpleQuery) query).setInlineData(data); }
+    )?
+}
 
 /* [29]    Update ::= Prologue ( Update1 ( ';' Update )? )? */
 private void Update(Update update) : {} {
@@ -565,8 +741,7 @@ private void Update1(Update update) : {
     ) {
     if (updateOperation != null) {
         update.addOperation(updateOperation);
-    }
-    }
+    } }
 }
 
 /* [31]    Load ::= 'LOAD' 'SILENT'? iri ( 'INTO' GraphRef )? */
@@ -580,8 +755,7 @@ private UpdateOperation Load() : {
         operation.setSilent(true); }
     )?
     uriRef = Iri() {
-        operation.setSource(uriRef);
-    }
+    operation.setSource(uriRef); }
     (
         <INTO>
         uriRef = GraphRef() {
@@ -657,26 +831,282 @@ private GraphRefAllSpec GraphRefAll() : 
 /* [49]    QuadData ::= '{' Quads '}' */
 /* [50]    Quads ::= TriplesTemplate? ( QuadsNotTriples '.'? TriplesTemplate? )* */
 /* [51]    QuadsNotTriples ::= 'GRAPH' VarOrIri '{' TriplesTemplate? '}' */
+
 /* [52]    TriplesTemplate ::= TriplesSameSubject ( '.' TriplesTemplate? )? */
+private Set<TriplePattern> TriplesTemplate() : {
+    Set<TriplePattern> triplePatterns, t; } {
+
+    triplePatterns=TriplesSameSubject()
+    (
+        "."
+        (
+            t=TriplesTemplate() {
+            triplePatterns.addAll(t); }
+        )?
+    )? {
+    return triplePatterns; }
+}
 
 /* [53]    GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub ) '}' */
+private GroupGraphPattern GroupGraphPattern() : {
+    Query query;
+    GroupGraphPattern groupGraphPattern = new SimpleGroupGraphPattern(); } {
+    "{"
+    (
+        query = SubSelect() {
+        groupGraphPattern.setSubSelect((SelectQuery) query); }
+    |
+        GroupGraphPatternSub(groupGraphPattern)
+    )
+    "}" {
+    return groupGraphPattern; }
+}
+
 /* [54]    GroupGraphPatternSub ::= TriplesBlock? ( GraphPatternNotTriples '.'? TriplesBlock? )* */
+private void GroupGraphPatternSub(GroupGraphPattern groupGraphPattern) : {} {
+    ( TriplesBlock(groupGraphPattern) )?
+    (
+        GraphPatternNotTriples(groupGraphPattern)
+        (".")?
+        ( TriplesBlock(groupGraphPattern) )?
+    )*
+}
+
 /* [55]    TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock? )? */
+private void TriplesBlock(GroupGraphPattern groupGraphPattern) : {
+    Set<PropertyPathPattern> propertyPathPatterns; } {
+
+    propertyPathPatterns=TriplesSameSubjectPath() {
+    ((SimpleGroupGraphPattern) groupGraphPattern).addPropertyPathPatterns(propertyPathPatterns); }
+    (
+        "." ( TriplesBlock(groupGraphPattern) )?
+    )?
+}
+
 /* [56]    GraphPatternNotTriples ::= GroupOrUnionGraphPattern | OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern | ServiceGraphPattern | Filter | Bind | InlineData */
+private void GraphPatternNotTriples(GroupGraphPattern groupGraphPattern) : {
+    Expression constraint;
+    Variable v; } {
+    (
+        GroupOrUnionGraphPattern(groupGraphPattern)
+    |
+        OptionalGraphPattern(groupGraphPattern)
+    |
+        MinusGraphPattern(groupGraphPattern)
+    |
+        GraphGraphPattern(groupGraphPattern)
+    |
+        ServiceGraphPattern(groupGraphPattern)
+    |
+        constraint=Filter() {
+        ((SimpleGroupGraphPattern) groupGraphPattern).addConstraint(constraint); }
+    |
+        v=Bind() {
+        // We should either store this binding in the respective variable in SelectQuery
+        // or we extend the BasicGraphPattern to store such binding.
+        // If we store the binding in the respective variable in SelectQuery, a serializer
+        // won't be able to determine whether a binding is defined by the BIND keyword or
+        // by an expression in the SELECT clause.
+        // The pre parser needs only to consume tokens, thus may ignore this binding.
+
+        // The use of BIND ends the preceding basic graph pattern, thus ...
+        ((SimpleGroupGraphPattern) groupGraphPattern).endLastBasicGraphPattern(); }
+    |
+        InlineData(groupGraphPattern)
+    )
+}
+
 /* [57]    OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern */
+private void OptionalGraphPattern(GroupGraphPattern groupGraphPattern) : {
+    GroupGraphPattern optional; } {
+
+    <OPTIONAL>
+    optional=GroupGraphPattern() {
+    ((SimpleGroupGraphPattern) groupGraphPattern).addOptionalGraphPattern(optional); }
+}
+
 /* [58]    GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern */
+private void GraphGraphPattern(GroupGraphPattern groupGraphPattern) : {
+    UriRefOrVariable graph;
+    GroupGraphPattern g; } {
+
+    <GRAPH>
+    graph=VarOrIri()
+    g=GroupGraphPattern() {
+    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(new SimpleGraphGraphPattern(graph, g)); }
+}
+
 /* [59]    ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri GroupGraphPattern */
+private void ServiceGraphPattern(GroupGraphPattern groupGraphPattern) : {
+    UriRefOrVariable service;
+    GroupGraphPattern g;
+    boolean silent = false; } {
+
+    <SERVICE>
+    (
+        <SILENT> {
+        silent = true; }
+    )?
+    service=VarOrIri()
+    g=GroupGraphPattern() {
+    SimpleServiceGraphPattern simpleServiceGraphPattern;
+    simpleServiceGraphPattern = new SimpleServiceGraphPattern(service, g);
+    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(simpleServiceGraphPattern);
+    if (silent) {
+        simpleServiceGraphPattern.setSilent(true);
+    } }
+}
+
 /* [60]    Bind ::= 'BIND' '(' Expression 'AS' Var ')' */
+private Variable Bind() : {
+    Variable v;
+    Expression e; } {
+
+    <BIND>
+    "("
+    e=Expression()
+    <AS>
+    v=Var() {
+    v.setBoundExpression(e); }
+    ")" {
+    return v; }
+}
+
 /* [61]    InlineData ::= 'VALUES' DataBlock */
+private void InlineData(GroupGraphPattern groupGraphPattern) : {
+    InlineData data; } {
+
+    <VALUES>
+    data=DataBlock() {
+    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(data); }
+}
+
 /* [62]    DataBlock ::= InlineDataOneVar | InlineDataFull */
+private InlineData DataBlock() : {
+    InlineData inlineData = new SimpleInlineData(); } {
+
+    (
+        InlineDataOneVar(inlineData)
+    |
+        InlineDataFull(inlineData)
+    ) {
+    return inlineData; }
+}
+
 /* [63]    InlineDataOneVar ::= Var '{' DataBlockValue* '}' */
+private void InlineDataOneVar(InlineData inlineData) : {
+    Variable var;
+    Resource val; } {
+
+    var=Var() {
+    ((SimpleInlineData) inlineData).addVariable(var); }
+    "{"
+    (
+        val=DataBlockValue() {
+        List<Resource> values = new ArrayList<Resource>();
+        values.add(val);
+        ((SimpleInlineData) inlineData).addValues(values); }
+    )*
+    "}"
+}
+
 /* [64]    InlineDataFull ::= ( NIL | '(' Var* ')' ) '{' ( '(' DataBlockValue* ')' | NIL )* '}' */
-/* [65]    DataBlockValue ::= iri |    RDFLiteral |    NumericLiteral |    BooleanLiteral |    'UNDEF' */
+private void InlineDataFull(InlineData inlineData) : {
+    Variable var;
+    Resource val; } {
+    (
+        <NIL>
+    |
+        "("
+        (
+            var=Var() {
+            ((SimpleInlineData) inlineData).addVariable(var); }
+        )*
+        
+        ")"
+    )
+    "{"
+    (
+        (
+            "(" {
+            List<Resource> values = new ArrayList<Resource>(); }
+            (
+                val=DataBlockValue() {
+                values.add(val); }
+            )*
+            ")" {
+            ((SimpleInlineData) inlineData).addValues(values); }
+        )
+    |
+        <NIL> {
+        ((SimpleInlineData) inlineData).addValues(new ArrayList<Resource>()); }
+    )*
+    "}"
+}
+
+/* [65]    DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF' */
+private Resource DataBlockValue() : {
+    Resource r = null; } {
+    (r=Iri() | r=RDFLiteral() | r=NumericLiteral() | r=BooleanLiteral() | <UNDEF> ) {
+    return r; }
+}
+
 /* [66]    MinusGraphPattern ::= 'MINUS' GroupGraphPattern */
+private void MinusGraphPattern(GroupGraphPattern groupGraphPattern) : {
+    GroupGraphPattern subtrahend; } {
+
+    <MINUS>
+    subtrahend=GroupGraphPattern() {
+    ((SimpleGroupGraphPattern) groupGraphPattern).addMinusGraphPattern(subtrahend); }
+}
+
 /* [67]    GroupOrUnionGraphPattern ::= GroupGraphPattern ( 'UNION' GroupGraphPattern )* */
+private void GroupOrUnionGraphPattern(GroupGraphPattern groupGraphPattern) : {
+    GroupGraphPattern g;
+    AlternativeGraphPattern unionGraphPattern = null; } {
+
+    g=GroupGraphPattern()
+    (
+        <UNION> {
+        if (unionGraphPattern == null) {
+            unionGraphPattern = new SimpleAlternativeGraphPattern(g);
+        } }
+        g=GroupGraphPattern() {
+        ((SimpleAlternativeGraphPattern) unionGraphPattern).addAlternativeGraphPattern(g); }
+    )* {
+    if (unionGraphPattern != null) {
+        ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(unionGraphPattern);
+    } else {
+        ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(g);
+    } }
+}
+
 /* [68]    Filter ::= 'FILTER' Constraint */
+private Expression Filter() : {
+    Expression c; } {
+
+    <FILTER>
+    c=Constraint() {
+    return c; }
+}
+
 /* [69]    Constraint ::= BrackettedExpression | BuiltInCall | FunctionCall */
+private Expression Constraint() : {
+    Expression c; } {
+
+    ( c=BrackettedExpression() | c=BuiltInCall() | c=FunctionCall() ) {
+    return c; }
+}
+
 /* [70]    FunctionCall ::= iri ArgList */
+private FunctionCall FunctionCall() : {
+    UriRef name;
+    List<Expression> arguments; } {
+
+    name=Iri()
+    arguments=ArgList() {
+    return new FunctionCall(name, arguments); }
+}
 
 /* [71]    ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression )* ')' */
 private List<Expression> ArgList() : {
@@ -731,9 +1161,11 @@ private List<Expression> ExpressionList(
 private Set<TriplePattern> ConstructTemplate() : {
     Set<TriplePattern> triplePatterns = null; } {
 
-    "{" (
-    triplePatterns=ConstructTriples()
-    )? "}" {
+    "{"
+    (
+        triplePatterns=ConstructTriples()
+    )?
+    "}" {
     return triplePatterns; }
 }
 
@@ -742,10 +1174,11 @@ private Set<TriplePattern> ConstructTrip
     Set<TriplePattern> triplePatterns, t; } {
 
     triplePatterns=TriplesSameSubject()
-    ( "."
+    (
+        "."
         (
-        t=ConstructTriples() {
-        triplePatterns.addAll(t); }
+            t=ConstructTriples() {
+            triplePatterns.addAll(t); }
         )?
     )? {
     return triplePatterns; }
@@ -820,25 +1253,246 @@ private ResourceOrVariable Object(Set<Tr
     return object; }
 }
 
-/*
-[81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty |    TriplesNodePath PropertyListPath
-[82]    PropertyListPath ::= PropertyListPathNotEmpty?
-[83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
-[84]    VerbPath ::= Path
-[85]    VerbSimple ::= Var
-[86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )*
-[87]    ObjectPath ::= GraphNodePath
-[88]    Path ::= PathAlternative
-[89]    PathAlternative ::= PathSequence ( '|' PathSequence )*
-[90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
-[91]    PathElt ::= PathPrimary PathMod?
-[92]    PathEltOrInverse ::= PathElt | '^' PathElt
-[93]    PathMod ::= '?' | '*' | '+'
-[94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')'
-[95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')'
-[96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' )
-[97]    Integer ::= INTEGER
-*/
+/* [81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath */
+private Set<PropertyPathPattern> TriplesSameSubjectPath() : {
+    Set<PropertyPathPattern> propertyPathPatterns = new LinkedHashSet<PropertyPathPattern>();
+    ResourceOrVariable subject; } {
+
+    (
+        subject=VarOrTerm()
+        PropertyListPathNotEmpty(subject, propertyPathPatterns) {
+        return propertyPathPatterns; }
+    )
+    |
+    (
+        subject=TriplesNodePath(propertyPathPatterns)
+        PropertyListPath(subject, propertyPathPatterns) {
+        return propertyPathPatterns; }
+    )
+}
+
+/* [82]    PropertyListPath ::= PropertyListPathNotEmpty? */
+private void PropertyListPath(ResourceOrVariable subject, Set<PropertyPathPattern> propertyPathPatterns) : { } {
+    (
+        PropertyListPathNotEmpty(subject, propertyPathPatterns)
+    )?
+}
+
+/* [83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* */
+private void PropertyListPathNotEmpty(ResourceOrVariable subject, Set<PropertyPathPattern> propertyPathPatterns) : {
+    PropertyPathExpressionOrVariable propertyPathExpressionOrVariable;
+    PropertyPathExpression propertyPathExpression;
+    Variable v;
+    Set<ResourceOrVariable> objects; } {
+    (
+        propertyPathExpression=VerbPath() {
+        propertyPathExpressionOrVariable = new PropertyPathExpressionOrVariable(propertyPathExpression); }
+    |
+        v=VerbSimple() {
+        propertyPathExpressionOrVariable = new PropertyPathExpressionOrVariable(v); }
+    )
+    objects=ObjectListPath(propertyPathPatterns) {
+    addPropertyPathPatterns(propertyPathPatterns, subject, propertyPathExpressionOrVariable, objects); }
+    (
+        ";"
+        (
+            (
+                propertyPathExpression=VerbPath() {
+                propertyPathExpressionOrVariable = new PropertyPathExpressionOrVariable(propertyPathExpression); }
+
+            |
+                v=VerbSimple() {
+                propertyPathExpressionOrVariable = new PropertyPathExpressionOrVariable(v); }
+            )
+            objects=ObjectListPath(propertyPathPatterns) {
+            addPropertyPathPatterns(propertyPathPatterns, subject, propertyPathExpressionOrVariable, objects); }
+        )?
+    )*
+}
+
+/* [84]    VerbPath ::= Path */
+private PropertyPathExpression VerbPath() : {
+    PropertyPathExpression propertyPathExpression; } {
+    propertyPathExpression=Path() {
+    return propertyPathExpression; }
+}
+
+/* [85]    VerbSimple ::= Var */
+private Variable VerbSimple() : {
+    Variable v; } {
+    v=Var() {
+    return v; }
+}
+
+/* [86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )* */
+private Set<ResourceOrVariable> ObjectListPath(Set<PropertyPathPattern> propertyPathPatterns) : {
+    ResourceOrVariable object; } {
+    {
+    Set<ResourceOrVariable> objects = new LinkedHashSet<ResourceOrVariable>();
+    }
+    object=ObjectPath(propertyPathPatterns) {
+    objects.add(object); }
+
+    (
+        ","
+        object=ObjectPath(propertyPathPatterns) {
+        objects.add(object); }
+    )* {
+    return objects; }
+}
+
+/* [87]    ObjectPath ::= GraphNodePath */
+private ResourceOrVariable ObjectPath(Set<PropertyPathPattern> propertyPathPatterns) : {
+    ResourceOrVariable object; } {
+
+    object=GraphNodePath(propertyPathPatterns) {
+    return object; }
+}
+
+/* [88]    Path ::= PathAlternative */
+private PropertyPathExpression Path() : {
+    PropertyPathExpression propertyPathExpression; } {
+    propertyPathExpression=PathAlternative() {
+    return propertyPathExpression; }
+}
+
+/* [89]    PathAlternative ::= PathSequence ( '|' PathSequence )* */
+private PropertyPathExpression PathAlternative() : {
+    PropertyPathExpression ppe, pathSequence; } {
+
+    ppe=PathSequence()
+    (
+        "|"
+        pathSequence=PathSequence() {
+        ppe = new BinaryPropertyPathOperation("|", ppe, pathSequence); }
+    )* {
+    return ppe; }
+}
+
+/* [90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )* */
+private PropertyPathExpression PathSequence() : {
+    PropertyPathExpression ppe, pathEltOrInverse; } {
+
+    ppe=PathEltOrInverse()
+    (
+        "/"
+        pathEltOrInverse=PathEltOrInverse() {
+        ppe = new BinaryPropertyPathOperation("/", ppe, pathEltOrInverse); }
+    )* {
+    return ppe; }
+}
+
+/* [91]    PathElt ::= PathPrimary PathMod? */
+private PropertyPathExpression PathElt() : {
+    PropertyPathExpression ppe;
+    String pathMode; } {
+
+    ppe=PathPrimary()
+    (
+        pathMode=PathMod() {
+        ppe = new UnaryPropertyPathOperation(pathMode, ppe); }
+    )? {
+    return ppe; }
+}
+
+/* [92]    PathEltOrInverse ::= PathElt | '^' PathElt */
+private PropertyPathExpression PathEltOrInverse() : {
+    PropertyPathExpression ppe; } {
+
+    (
+        ppe=PathElt() {
+        return ppe; }
+    |
+        "^"
+        ppe=PathElt() {
+        return new UnaryPropertyPathOperation("^", ppe); }
+    )
+}
+
+/* [93]    PathMod ::= '?' | '*' | '+' */
+private String PathMod() : {} {
+    (
+        "?" {
+        return "?"; }
+    |
+        "*" {
+        return "*"; }
+    |
+        "+" {
+        return "+"; }
+    )
+}
+
+/* [94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')' */
+private PropertyPathExpression PathPrimary() : {
+    PropertyPathExpression ppe;
+    UriRef uriRef; } {
+
+    (
+        uriRef=Iri() {
+        return new PredicatePath(uriRef); }
+    |
+        "a" {
+        return new PredicatePath(RDF_TYPE); }
+    |
+        "!"
+        ppe=PathNegatedPropertySet() {
+        return new UnaryPropertyPathOperation("!", ppe); }
+    |
+        "("
+        ppe=Path() {
+        return ppe; }
+        ")"
+    )
+}
+
+/* [95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')' */
+private PropertyPathExpression PathNegatedPropertySet() : {
+    PropertyPathExpression pathOneInPropertySet;
+    PropertySet propertySet = new PropertySet(); } {
+
+    (
+        pathOneInPropertySet=PathOneInPropertySet() {
+        return pathOneInPropertySet; }
+    |
+        "("
+        (
+            pathOneInPropertySet=PathOneInPropertySet() {
+            propertySet.addElement(pathOneInPropertySet); }
+            (
+                "|"
+                pathOneInPropertySet=PathOneInPropertySet() {
+                propertySet.addElement(pathOneInPropertySet); }
+            )*
+        )?
+        ")" {
+        return propertySet; }
+    )
+}
+
+/* [96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' ) */
+private PropertyPathExpression PathOneInPropertySet() : {
+    UriRef uriRef; } {
+
+    (
+        uriRef=Iri() {
+        return new PredicatePath(uriRef); }
+    |
+        "a" {
+        return new PredicatePath(RDF_TYPE); }
+    |
+        "^"
+        (
+            uriRef=Iri() {
+            return new UnaryPropertyPathOperation("^", new PredicatePath(uriRef)); }
+        |
+            "a" {
+            return new UnaryPropertyPathOperation("^", new PredicatePath(RDF_TYPE)); }
+        )
+    )
+}
+
+/* [97]    Integer ::= INTEGER */
 
 // Fill in the specified set of TriplePattern and returns the subject node
 /* [98]    TriplesNode ::= Collection |  BlankNodePropertyList */
@@ -857,14 +1511,34 @@ private ResourceOrVariable BlankNodeProp
     {
     ResourceOrVariable subject = getNewBNode();
     }
-    "[" PropertyListNotEmpty(subject, triplePatterns) "]" {
+    "["
+    PropertyListNotEmpty(subject, triplePatterns)
+    "]" {
     return subject; }
 }
 
-/*
-[100] TriplesNodePath ::= CollectionPath |    BlankNodePropertyListPath
-[101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']'
-*/
+/* [100] TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath */
+private ResourceOrVariable TriplesNodePath(Set<PropertyPathPattern> propertyPathPatterns) : {
+    ResourceOrVariable subject; } {
+    (
+        subject=CollectionPath(propertyPathPatterns)
+    |
+        subject=BlankNodePropertyListPath(propertyPathPatterns)
+    ) {
+    return subject; }
+}
+
+
+/* [101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']' */
+private ResourceOrVariable BlankNodePropertyListPath(Set<PropertyPathPattern> propertyPathPatterns) : {} {
+    {
+    ResourceOrVariable subject = getNewBNode();
+    }
+    "["
+    PropertyListPathNotEmpty(subject, propertyPathPatterns)
+    "]" {
+    return subject; }
+}
 
 /* [102]    Collection ::= '(' GraphNode+ ')' */
 private ResourceOrVariable Collection(Set<TriplePattern> triplePatterns) : {
@@ -872,30 +1546,49 @@ private ResourceOrVariable Collection(Se
     List<ResourceOrVariable> nodes = new ArrayList<ResourceOrVariable>(); } {
 
     "("
-        (
+    (
         node=GraphNode(triplePatterns) {
         nodes.add(node); }
-        )+
+    )+
     ")" {
     return addTriplePatterns(triplePatterns, nodes); }
 }
 
 /* [103]    CollectionPath ::= '(' GraphNodePath+ ')' */
+private ResourceOrVariable CollectionPath(Set<PropertyPathPattern> propertyPathPatterns) : {
+    ResourceOrVariable node;
+    List<ResourceOrVariable> nodes = new ArrayList<ResourceOrVariable>(); } {
 
+    "("
+    (
+        node=GraphNodePath(propertyPathPatterns) {
+        nodes.add(node); }
+    )+
+    ")" {
+    return addTriplePatterns(triplePatterns, nodes); }
+}
 
-/* [104]    GraphNode ::= VarOrTerm |  TriplesNode */
+/* [104]    GraphNode ::= VarOrTerm | TriplesNode */
 private ResourceOrVariable GraphNode(Set<TriplePattern> triplePatterns) : {
     ResourceOrVariable node; } {
-
     (
-    node=VarOrTerm()
+        node=VarOrTerm()
     |
-    node=TriplesNode(triplePatterns)
+        node=TriplesNode(triplePatterns)
     ) {
     return node; }
 }
 
-/* [105]    GraphNodePath ::= VarOrTerm |    TriplesNodePath */
+/* [105]    GraphNodePath ::= VarOrTerm | TriplesNodePath */
+private ResourceOrVariable GraphNodePath(Set<PropertyPathPattern> propertyPathPatterns) : {
+    ResourceOrVariable node; } {
+    (
+        node=VarOrTerm()
+    |
+        node=TriplesNodePath(propertyPathPatterns)
+    ) {
+    return node; }
+}
 
 /* [106]    VarOrTerm ::= Var | GraphTerm */
 private ResourceOrVariable VarOrTerm() : {
@@ -903,11 +1596,11 @@ private ResourceOrVariable VarOrTerm() :
     Variable v; } {
 
     (
-    v=Var() {
-    return new ResourceOrVariable(v); }
+        v=Var() {
+        return new ResourceOrVariable(v); }
     |
-    r=GraphTerm() {
-    return r; }
+        r=GraphTerm() {
+        return r; }
     )
 }
 
@@ -933,13 +1626,6 @@ private Variable Var() : {
     return createVariable(t.image); }
 }
 
-private String BuiltInCallName() : {
-    Token t;} {
-
-    t=<BUILT_IN_CALL_NAME> {
-    return t.image; }
-}
-
 /* [109]    GraphTerm ::= Iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL */
 private ResourceOrVariable GraphTerm() : {
     ResourceOrVariable bNode = null;
@@ -1305,6 +1991,13 @@ private BuiltInCall BuiltInCall() : {
     return new BuiltInCall(name, args); }
 }
 
+private String BuiltInCallName() : {
+    Token t;} {
+
+    t=<BUILT_IN_CALL_NAME> {
+    return t.image; }
+}
+
 /*
 [125]    ExistsFunc ::= 'EXISTS' GroupGraphPattern
 [126]    NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern

Modified: clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java?rev=1516993&r1=1516992&r2=1516993&view=diff
==============================================================================
--- clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java (original)
+++ clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java Fri Aug 23 19:29:05 2013
@@ -58,6 +58,18 @@ public class SparqlPreParserTest {
         SparqlPreParser parser;
         parser = new SparqlPreParser(TcManager.getInstance());
         Set<UriRef> referredGraphs = parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
+        Assert.assertTrue(referredGraphs.toArray()[0].equals(DEFAULT_GRAPH));
+    }
+
+    @Test
+    public void testAllGraphReferenceInSelectQuery() throws ParseException {
+
+        StringBuilder queryStrBuilder = new StringBuilder();
+        queryStrBuilder.append("SELECT DISTINCT ?g { GRAPH ?g { ?s ?p ?o } }\n");
+
+        SparqlPreParser parser;
+        parser = new SparqlPreParser(TcManager.getInstance());
+        Set<UriRef> referredGraphs = parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
         Assert.assertTrue(referredGraphs == null);
     }
 



Re: svn commit: r1516993 [2/2] - in /clerezza/trunk/rdf.core/src: main/java/org/apache/clerezza/rdf/core/sparql/ main/java/org/apache/clerezza/rdf/core/sparql/query/ main/java/org/apache/clerezza/rdf/core/sparql/query/impl/ main/javacc/org/apache/clerezza/...

Posted by Hasan Hasan <ha...@trialox.org>.
Hi Reto, all,

Sorry for having forgotten to do a mvn compile before committing. Running
the test file successfully in netbeans seems to be insufficient.
The two errors are fixed now.

cheers
hasan

On Sat, Aug 24, 2013 at 12:08 PM, Reto Bachmann-Gmür <re...@wymiwyg.com>wrote:

> Hi Hasan
>
> I'm getting the followin compile error (on a fresh compile with empty
> maven repo):
>
> Failed to execute goal
> org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile
> (default-compile) on project rdf.core: Compilation failure: Compilation
> failure:
> C:\Users\Reto\projects\apache\clerezza\rdf.core\target\generated-sources\javacc\org\apache\clerezza\rdf\core\sparql\JavaCCGeneratedSparqlPreParser.java:[1227,25]
> error: cannot find symbol
>
> could not parse error message:   symbol:   method setSubSelect(SelectQuery)
> location: variable groupGraphPattern of type GroupGraphPattern
> C:\Users\Reto\projects\apache\clerezza\rdf.core\target\generated-sources\javacc\org\apache\clerezza\rdf\core\sparql\JavaCCGeneratedSparqlPreParser.java:2651:
> error: cannot find symbol
> {if (true) return addTriplePatterns(triplePatterns, nodes);}
>
>
> I assume this to be related to this commit. Could you have a look into it?
>
> Cheers,
> Reto
>
>
> On Fri, Aug 23, 2013 at 9:29 PM, <ha...@apache.org> wrote:
>
>> Modified:
>> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
>> URL:
>> http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj?rev=1516993&r1=1516992&r2=1516993&view=diff
>>
>> ==============================================================================
>> ---
>> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
>> (original)
>> +++
>> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
>> Fri Aug 23 19:29:05 2013
>> @@ -49,18 +49,26 @@ import org.apache.clerezza.rdf.core.impl
>>  import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
>>  import org.apache.clerezza.rdf.core.sparql.query.AlternativeGraphPattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.BinaryOperation;
>> +import
>> org.apache.clerezza.rdf.core.sparql.query.BinaryPropertyPathOperation;
>>  import org.apache.clerezza.rdf.core.sparql.query.BuiltInCall;
>>  import org.apache.clerezza.rdf.core.sparql.query.Expression;
>>  import org.apache.clerezza.rdf.core.sparql.query.FunctionCall;
>>  import org.apache.clerezza.rdf.core.sparql.query.GroupGraphPattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.InlineData;
>>  import org.apache.clerezza.rdf.core.sparql.query.LiteralExpression;
>> +import org.apache.clerezza.rdf.core.sparql.query.PredicatePath;
>> +import
>> org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpressionOrVariable;
>> +import org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpression;
>> +import org.apache.clerezza.rdf.core.sparql.query.PropertyPathPattern;
>> +import org.apache.clerezza.rdf.core.sparql.query.PropertySet;
>>  import org.apache.clerezza.rdf.core.sparql.query.Query;
>>  import org.apache.clerezza.rdf.core.sparql.query.ResourceOrVariable;
>>  import org.apache.clerezza.rdf.core.sparql.query.RhsListBinaryOperation;
>> +import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
>>  import org.apache.clerezza.rdf.core.sparql.query.SparqlUnit;
>>  import org.apache.clerezza.rdf.core.sparql.query.TriplePattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.UnaryOperation;
>> +import
>> org.apache.clerezza.rdf.core.sparql.query.UnaryPropertyPathOperation;
>>  import org.apache.clerezza.rdf.core.sparql.query.UriRefExpression;
>>  import org.apache.clerezza.rdf.core.sparql.query.UriRefOrVariable;
>>  import org.apache.clerezza.rdf.core.sparql.query.Variable;
>> @@ -72,9 +80,11 @@ import org.apache.clerezza.rdf.core.spar
>>  import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleGroupGraphPattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleInlineData;
>>  import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleOrderCondition;
>> +import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimplePropertyPathPattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQuery;
>>  import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQueryWithSolutionModifier;
>>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSelectQuery;
>> +import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleServiceGraphPattern;
>>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSparqlUnit;
>>  import
>> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleTriplePattern;
>>  import org.apache.clerezza.rdf.core.sparql.update.Update;
>> @@ -168,6 +178,46 @@ class JavaCCGeneratedSparqlPreParser {
>>          return v;
>>      }
>>
>> +    private void addPropertyPathPatterns(Set<PropertyPathPattern>
>> propertyPathPatterns,
>> +            ResourceOrVariable subject,
>> +            PropertyPathExpressionOrVariable propertyPathExpression,
>> +            Set<ResourceOrVariable> objects) {
>> +
>> +        for (ResourceOrVariable object : objects) {
>> +            propertyPathPatterns.add(
>> +                new SimplePropertyPathPattern(subject,
>> propertyPathExpression, object));
>> +        }
>> +    }
>> +
>> +    // nodes contain at least one element
>> +    private ResourceOrVariable
>> addPropertyPathPatterns(Set<PropertyPathPattern> propertyPathPatterns,
>> +            List<ResourceOrVariable> 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<TriplePattern> triplePatterns,
>>              ResourceOrVariable subject,
>>              UriRefOrVariable predicate,
>> @@ -305,6 +355,9 @@ TOKEN [IGNORE_CASE] :
>>  |   < VALUES : "VALUES" >
>>  |   < UNDEF : "UNDEF" >
>>  |   < AS : "AS" >
>> +|   < BIND : "BIND" >
>> +|   < MINUS : "MINUS" >
>> +|   < SERVICE : "SERVICE" >
>>  |   < GROUP : "GROUP" >
>>  |   < HAVING : "HAVING" >
>>  |   < LOAD : "LOAD" >
>> @@ -409,11 +462,21 @@ private void PrefixDecl() : {
>>  private Query SelectQuery() : {
>>      Query query; } {
>>      query = SelectClause()
>> -    ( DatasetClause(query) )* {
>> +    ( 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() : {
>> @@ -455,18 +518,30 @@ private Query SelectClause() : {
>>  /* [10]    ConstructQuery ::= 'CONSTRUCT' ( ConstructTemplate
>> DatasetClause* WhereClause SolutionModifier | DatasetClause* 'WHERE' '{'
>> TriplesTemplate? '}' SolutionModifier ) */
>>  private Query ConstructQuery() : {
>>      Query query;
>> -    Set<TriplePattern> triplePatterns = null; } {
>> +    Set<TriplePattern> triplePatterns = null;
>> +    GroupGraphPattern queryPattern; } {
>>
>>      <CONSTRUCT>
>>      (
>>          triplePatterns=ConstructTemplate() {
>>          query = new SimpleConstructQuery(triplePatterns); }
>>          ( DatasetClause(query) )*
>> +        WhereClause(query)
>>      |
>>          {
>>          query = new SimpleConstructQuery(triplePatterns); }
>>          ( DatasetClause(query) )*
>> -    ) {
>> +        <WHERE>
>> +        "{" {
>> +        queryPattern = new SimpleGroupGraphPattern(); }
>> +        (
>> +            triplePatterns=TriplesTemplate()
>> +        )? {
>> +        ((SimpleGroupGraphPattern)
>> queryPattern).addTriplePatterns(triplePatterns); }
>> +        "}" {
>> +        ((SimpleQuery) query).setQueryPattern(queryPattern); }
>> +    )
>> +    SolutionModifier(query) {
>>      return query; }
>>  }
>>
>> @@ -484,7 +559,9 @@ private Query DescribeQuery() : {
>>          "*" {
>>              ((SimpleDescribeQuery) query).setDescribeAll(); }
>>      )
>> -    ( DatasetClause(query) )* {
>> +    ( DatasetClause(query) )*
>> +    ( WhereClause(query) )?
>> +    SolutionModifier(query) {
>>      return query; }
>>  }
>>
>> @@ -494,7 +571,9 @@ private Query AskQuery() : {
>>
>>      <ASK> {
>>      query = new SimpleAskQuery(); }
>> -    ( DatasetClause(query) )* {
>> +    ( DatasetClause(query) )*
>> +    WhereClause(query)
>> +    SolutionModifier(query) {
>>      return query; }
>>  }
>>
>> @@ -527,20 +606,117 @@ private UriRef SourceSelector() : {
>>      return graph; }
>>  }
>>
>> -/*
>> -[17] WhereClause ::= 'WHERE'? GroupGraphPattern
>> -[18] SolutionModifier ::= GroupClause? HavingClause? OrderClause?
>> LimitOffsetClauses?
>> -[19] GroupClause ::= 'GROUP' 'BY' GroupCondition+
>> -[20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression (
>> 'AS' Var )? ')' | Var
>> -[21] HavingClause ::= 'HAVING' HavingCondition+
>> -[22] HavingCondition ::= Constraint
>> -[23] OrderClause ::= 'ORDER' 'BY' OrderCondition+
>> -[24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | (
>> Constraint | Var )
>> -[25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause
>> LimitClause?
>> -[26] LimitClause ::= 'LIMIT' INTEGER
>> -[27] OffsetClause ::= 'OFFSET' INTEGER
>> -[28] ValuesClause ::= ( 'VALUES' DataBlock )?
>> -*/
>> +/* [17]    WhereClause ::= 'WHERE'? GroupGraphPattern */
>> +private void WhereClause(Query query) : {
>> +    GroupGraphPattern queryPattern; } {
>> +
>> +    (<WHERE>)?
>> +    queryPattern=GroupGraphPattern() {
>> +    ((SimpleQuery) query).setQueryPattern(queryPattern); }
>> +}
>> +
>> +/* [18] SolutionModifier ::= GroupClause? HavingClause? OrderClause?
>> LimitOffsetClauses? */
>> +private void SolutionModifier(Query query) : {} {
>> +    ( GroupClause(query) )?
>> +    ( HavingClause(query) )?
>> +    ( OrderClause(query) )?
>> +    ( LimitOffsetClauses(query) )?
>> +}
>> +
>> +/* [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+ */
>> +private void GroupClause(Query query) : {} {
>> +    <GROUP> <BY> ( GroupCondition(query) )+
>> +}
>> +
>> +/* [20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression (
>> 'AS' Var )? ')' | Var */
>> +private void GroupCondition(Query query) : {
>> +    Expression e;
>> +    Variable v; } {
>> +    (
>> +        e=BuiltInCall()
>> +    |
>> +        e=FunctionCall()
>> +    |
>> +        (
>> +            "("
>> +            e=Expression()
>> +            (
>> +                <AS>
>> +                v=Var() {
>> +                v.setBoundExpression(e);
>> +                e = v; }
>> +            )?
>> +            ")"
>> +        )
>> +    |
>> +        e=Var()
>> +    ) {
>> +    ((SimpleQueryWithSolutionModifier) query).addGroupCondition(e); }
>> +}
>> +
>> +/* [21] HavingClause ::= 'HAVING' HavingCondition+ */
>> +private void HavingClause(Query query) : {} {
>> +    <HAVING> ( HavingCondition(query) )+
>> +}
>> +
>> +/* [22] HavingCondition ::= Constraint */
>> +private void HavingCondition(Query query) : {
>> +    Expression c; } {
>> +
>> +    c=Constraint() {
>> +    ((SimpleQueryWithSolutionModifier) query).addHavingCondition(c); }
>> +}
>> +
>> +/* [23] OrderClause ::= 'ORDER' 'BY' OrderCondition+ */
>> +private void OrderClause(Query query) : {} {
>> +    <ORDER> <BY> ( OrderCondition(query) )+
>> +}
>> +
>> +/* [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) |
>> ( Constraint | Var ) */
>> +private void OrderCondition(Query query) : {
>> +    boolean asc = true;
>> +    Expression e; } {
>> +
>> +    (
>> +        ( ( "ASC" | "DESC" { asc = false; } ) e=BrackettedExpression() )
>> +    |
>> +        ( e=Constraint() | e=Var() )
>> +    ) {
>> +    ((SimpleQueryWithSolutionModifier) query).addOrderCondition(new
>> SimpleOrderCondition(e, asc)); }
>> +}
>> +
>> +/* [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause
>> LimitClause? */
>> +private void LimitOffsetClauses(Query query) : {} {
>> +    ( LimitClause(query) (OffsetClause(query))? )
>> +    |
>> +    ( OffsetClause(query) (LimitClause(query))? )
>> +}
>> +
>> +/* [26] LimitClause ::= 'LIMIT' INTEGER */
>> +private void LimitClause(Query query) : {
>> +    Token t; } {
>> +
>> +    <LIMIT> t=<INTEGER> {
>> +    ((SimpleQueryWithSolutionModifier)
>> query).setLimit(Integer.parseInt(t.image)); }
>> +}
>> +
>> +/* [27] OffsetClause ::= 'OFFSET' INTEGER */
>> +private void OffsetClause(Query query) : {
>> +    Token t; } {
>> +
>> +    <OFFSET> t=<INTEGER> {
>> +    ((SimpleQueryWithSolutionModifier)
>> query).setOffset(Integer.parseInt(t.image)); }
>> +}
>> +
>> +/* [28] ValuesClause ::= ( 'VALUES' DataBlock )? */
>> +private void ValuesClause(Query query) : {
>> +    InlineData data; } {
>> +    (
>> +        <VALUES>
>> +        data=DataBlock() {
>> +        ((SimpleQuery) query).setInlineData(data); }
>> +    )?
>> +}
>>
>>  /* [29]    Update ::= Prologue ( Update1 ( ';' Update )? )? */
>>  private void Update(Update update) : {} {
>> @@ -565,8 +741,7 @@ private void Update1(Update update) : {
>>      ) {
>>      if (updateOperation != null) {
>>          update.addOperation(updateOperation);
>> -    }
>> -    }
>> +    } }
>>  }
>>
>>  /* [31]    Load ::= 'LOAD' 'SILENT'? iri ( 'INTO' GraphRef )? */
>> @@ -580,8 +755,7 @@ private UpdateOperation Load() : {
>>          operation.setSilent(true); }
>>      )?
>>      uriRef = Iri() {
>> -        operation.setSource(uriRef);
>> -    }
>> +    operation.setSource(uriRef); }
>>      (
>>          <INTO>
>>          uriRef = GraphRef() {
>> @@ -657,26 +831,282 @@ private GraphRefAllSpec GraphRefAll() :
>>  /* [49]    QuadData ::= '{' Quads '}' */
>>  /* [50]    Quads ::= TriplesTemplate? ( QuadsNotTriples '.'?
>> TriplesTemplate? )* */
>>  /* [51]    QuadsNotTriples ::= 'GRAPH' VarOrIri '{' TriplesTemplate? '}'
>> */
>> +
>>  /* [52]    TriplesTemplate ::= TriplesSameSubject ( '.' TriplesTemplate?
>> )? */
>> +private Set<TriplePattern> TriplesTemplate() : {
>> +    Set<TriplePattern> triplePatterns, t; } {
>> +
>> +    triplePatterns=TriplesSameSubject()
>> +    (
>> +        "."
>> +        (
>> +            t=TriplesTemplate() {
>> +            triplePatterns.addAll(t); }
>> +        )?
>> +    )? {
>> +    return triplePatterns; }
>> +}
>>
>>  /* [53]    GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub
>> ) '}' */
>> +private GroupGraphPattern GroupGraphPattern() : {
>> +    Query query;
>> +    GroupGraphPattern groupGraphPattern = new SimpleGroupGraphPattern();
>> } {
>> +    "{"
>> +    (
>> +        query = SubSelect() {
>> +        groupGraphPattern.setSubSelect((SelectQuery) query); }
>> +    |
>> +        GroupGraphPatternSub(groupGraphPattern)
>> +    )
>> +    "}" {
>> +    return groupGraphPattern; }
>> +}
>> +
>>  /* [54]    GroupGraphPatternSub ::= TriplesBlock? (
>> GraphPatternNotTriples '.'? TriplesBlock? )* */
>> +private void GroupGraphPatternSub(GroupGraphPattern groupGraphPattern) :
>> {} {
>> +    ( TriplesBlock(groupGraphPattern) )?
>> +    (
>> +        GraphPatternNotTriples(groupGraphPattern)
>> +        (".")?
>> +        ( TriplesBlock(groupGraphPattern) )?
>> +    )*
>> +}
>> +
>>  /* [55]    TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock?
>> )? */
>> +private void TriplesBlock(GroupGraphPattern groupGraphPattern) : {
>> +    Set<PropertyPathPattern> propertyPathPatterns; } {
>> +
>> +    propertyPathPatterns=TriplesSameSubjectPath() {
>> +    ((SimpleGroupGraphPattern)
>> groupGraphPattern).addPropertyPathPatterns(propertyPathPatterns); }
>> +    (
>> +        "." ( TriplesBlock(groupGraphPattern) )?
>> +    )?
>> +}
>> +
>>  /* [56]    GraphPatternNotTriples ::= GroupOrUnionGraphPattern |
>> OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern |
>> ServiceGraphPattern | Filter | Bind | InlineData */
>> +private void GraphPatternNotTriples(GroupGraphPattern groupGraphPattern)
>> : {
>> +    Expression constraint;
>> +    Variable v; } {
>> +    (
>> +        GroupOrUnionGraphPattern(groupGraphPattern)
>> +    |
>> +        OptionalGraphPattern(groupGraphPattern)
>> +    |
>> +        MinusGraphPattern(groupGraphPattern)
>> +    |
>> +        GraphGraphPattern(groupGraphPattern)
>> +    |
>> +        ServiceGraphPattern(groupGraphPattern)
>> +    |
>> +        constraint=Filter() {
>> +        ((SimpleGroupGraphPattern)
>> groupGraphPattern).addConstraint(constraint); }
>> +    |
>> +        v=Bind() {
>> +        // We should either store this binding in the respective
>> variable in SelectQuery
>> +        // or we extend the BasicGraphPattern to store such binding.
>> +        // If we store the binding in the respective variable in
>> SelectQuery, a serializer
>> +        // won't be able to determine whether a binding is defined by
>> the BIND keyword or
>> +        // by an expression in the SELECT clause.
>> +        // The pre parser needs only to consume tokens, thus may ignore
>> this binding.
>> +
>> +        // The use of BIND ends the preceding basic graph pattern, thus
>> ...
>> +        ((SimpleGroupGraphPattern)
>> groupGraphPattern).endLastBasicGraphPattern(); }
>> +    |
>> +        InlineData(groupGraphPattern)
>> +    )
>> +}
>> +
>>  /* [57]    OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern */
>> +private void OptionalGraphPattern(GroupGraphPattern groupGraphPattern) :
>> {
>> +    GroupGraphPattern optional; } {
>> +
>> +    <OPTIONAL>
>> +    optional=GroupGraphPattern() {
>> +    ((SimpleGroupGraphPattern)
>> groupGraphPattern).addOptionalGraphPattern(optional); }
>> +}
>> +
>>  /* [58]    GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern */
>> +private void GraphGraphPattern(GroupGraphPattern groupGraphPattern) : {
>> +    UriRefOrVariable graph;
>> +    GroupGraphPattern g; } {
>> +
>> +    <GRAPH>
>> +    graph=VarOrIri()
>> +    g=GroupGraphPattern() {
>> +    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(new
>> SimpleGraphGraphPattern(graph, g)); }
>> +}
>> +
>>  /* [59]    ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri
>> GroupGraphPattern */
>> +private void ServiceGraphPattern(GroupGraphPattern groupGraphPattern) : {
>> +    UriRefOrVariable service;
>> +    GroupGraphPattern g;
>> +    boolean silent = false; } {
>> +
>> +    <SERVICE>
>> +    (
>> +        <SILENT> {
>> +        silent = true; }
>> +    )?
>> +    service=VarOrIri()
>> +    g=GroupGraphPattern() {
>> +    SimpleServiceGraphPattern simpleServiceGraphPattern;
>> +    simpleServiceGraphPattern = new SimpleServiceGraphPattern(service,
>> g);
>> +    ((SimpleGroupGraphPattern)
>> groupGraphPattern).addGraphPattern(simpleServiceGraphPattern);
>> +    if (silent) {
>> +        simpleServiceGraphPattern.setSilent(true);
>> +    } }
>> +}
>> +
>>  /* [60]    Bind ::= 'BIND' '(' Expression 'AS' Var ')' */
>> +private Variable Bind() : {
>> +    Variable v;
>> +    Expression e; } {
>> +
>> +    <BIND>
>> +    "("
>> +    e=Expression()
>> +    <AS>
>> +    v=Var() {
>> +    v.setBoundExpression(e); }
>> +    ")" {
>> +    return v; }
>> +}
>> +
>>  /* [61]    InlineData ::= 'VALUES' DataBlock */
>> +private void InlineData(GroupGraphPattern groupGraphPattern) : {
>> +    InlineData data; } {
>> +
>> +    <VALUES>
>> +    data=DataBlock() {
>> +    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(data);
>> }
>> +}
>> +
>>  /* [62]    DataBlock ::= InlineDataOneVar | InlineDataFull */
>> +private InlineData DataBlock() : {
>> +    InlineData inlineData = new SimpleInlineData(); } {
>> +
>> +    (
>> +        InlineDataOneVar(inlineData)
>> +    |
>> +        InlineDataFull(inlineData)
>> +    ) {
>> +    return inlineData; }
>> +}
>> +
>>  /* [63]    InlineDataOneVar ::= Var '{' DataBlockValue* '}' */
>> +private void InlineDataOneVar(InlineData inlineData) : {
>> +    Variable var;
>> +    Resource val; } {
>> +
>> +    var=Var() {
>> +    ((SimpleInlineData) inlineData).addVariable(var); }
>> +    "{"
>> +    (
>> +        val=DataBlockValue() {
>> +        List<Resource> values = new ArrayList<Resource>();
>> +        values.add(val);
>> +        ((SimpleInlineData) inlineData).addValues(values); }
>> +    )*
>> +    "}"
>> +}
>> +
>>  /* [64]    InlineDataFull ::= ( NIL | '(' Var* ')' ) '{' ( '('
>> DataBlockValue* ')' | NIL )* '}' */
>> -/* [65]    DataBlockValue ::= iri |    RDFLiteral |    NumericLiteral |
>>    BooleanLiteral |    'UNDEF' */
>> +private void InlineDataFull(InlineData inlineData) : {
>> +    Variable var;
>> +    Resource val; } {
>> +    (
>> +        <NIL>
>> +    |
>> +        "("
>> +        (
>> +            var=Var() {
>> +            ((SimpleInlineData) inlineData).addVariable(var); }
>> +        )*
>> +
>> +        ")"
>> +    )
>> +    "{"
>> +    (
>> +        (
>> +            "(" {
>> +            List<Resource> values = new ArrayList<Resource>(); }
>> +            (
>> +                val=DataBlockValue() {
>> +                values.add(val); }
>> +            )*
>> +            ")" {
>> +            ((SimpleInlineData) inlineData).addValues(values); }
>> +        )
>> +    |
>> +        <NIL> {
>> +        ((SimpleInlineData) inlineData).addValues(new
>> ArrayList<Resource>()); }
>> +    )*
>> +    "}"
>> +}
>> +
>> +/* [65]    DataBlockValue ::= iri | RDFLiteral | NumericLiteral |
>> BooleanLiteral | 'UNDEF' */
>> +private Resource DataBlockValue() : {
>> +    Resource r = null; } {
>> +    (r=Iri() | r=RDFLiteral() | r=NumericLiteral() | r=BooleanLiteral()
>> | <UNDEF> ) {
>> +    return r; }
>> +}
>> +
>>  /* [66]    MinusGraphPattern ::= 'MINUS' GroupGraphPattern */
>> +private void MinusGraphPattern(GroupGraphPattern groupGraphPattern) : {
>> +    GroupGraphPattern subtrahend; } {
>> +
>> +    <MINUS>
>> +    subtrahend=GroupGraphPattern() {
>> +    ((SimpleGroupGraphPattern)
>> groupGraphPattern).addMinusGraphPattern(subtrahend); }
>> +}
>> +
>>  /* [67]    GroupOrUnionGraphPattern ::= GroupGraphPattern ( 'UNION'
>> GroupGraphPattern )* */
>> +private void GroupOrUnionGraphPattern(GroupGraphPattern
>> groupGraphPattern) : {
>> +    GroupGraphPattern g;
>> +    AlternativeGraphPattern unionGraphPattern = null; } {
>> +
>> +    g=GroupGraphPattern()
>> +    (
>> +        <UNION> {
>> +        if (unionGraphPattern == null) {
>> +            unionGraphPattern = new SimpleAlternativeGraphPattern(g);
>> +        } }
>> +        g=GroupGraphPattern() {
>> +        ((SimpleAlternativeGraphPattern)
>> unionGraphPattern).addAlternativeGraphPattern(g); }
>> +    )* {
>> +    if (unionGraphPattern != null) {
>> +        ((SimpleGroupGraphPattern)
>> groupGraphPattern).addGraphPattern(unionGraphPattern);
>> +    } else {
>> +        ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(g);
>> +    } }
>> +}
>> +
>>  /* [68]    Filter ::= 'FILTER' Constraint */
>> +private Expression Filter() : {
>> +    Expression c; } {
>> +
>> +    <FILTER>
>> +    c=Constraint() {
>> +    return c; }
>> +}
>> +
>>  /* [69]    Constraint ::= BrackettedExpression | BuiltInCall |
>> FunctionCall */
>> +private Expression Constraint() : {
>> +    Expression c; } {
>> +
>> +    ( c=BrackettedExpression() | c=BuiltInCall() | c=FunctionCall() ) {
>> +    return c; }
>> +}
>> +
>>  /* [70]    FunctionCall ::= iri ArgList */
>> +private FunctionCall FunctionCall() : {
>> +    UriRef name;
>> +    List<Expression> arguments; } {
>> +
>> +    name=Iri()
>> +    arguments=ArgList() {
>> +    return new FunctionCall(name, arguments); }
>> +}
>>
>>  /* [71]    ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression
>> )* ')' */
>>  private List<Expression> ArgList() : {
>> @@ -731,9 +1161,11 @@ private List<Expression> ExpressionList(
>>  private Set<TriplePattern> ConstructTemplate() : {
>>      Set<TriplePattern> triplePatterns = null; } {
>>
>> -    "{" (
>> -    triplePatterns=ConstructTriples()
>> -    )? "}" {
>> +    "{"
>> +    (
>> +        triplePatterns=ConstructTriples()
>> +    )?
>> +    "}" {
>>      return triplePatterns; }
>>  }
>>
>> @@ -742,10 +1174,11 @@ private Set<TriplePattern> ConstructTrip
>>      Set<TriplePattern> triplePatterns, t; } {
>>
>>      triplePatterns=TriplesSameSubject()
>> -    ( "."
>> +    (
>> +        "."
>>          (
>> -        t=ConstructTriples() {
>> -        triplePatterns.addAll(t); }
>> +            t=ConstructTriples() {
>> +            triplePatterns.addAll(t); }
>>          )?
>>      )? {
>>      return triplePatterns; }
>> @@ -820,25 +1253,246 @@ private ResourceOrVariable Object(Set<Tr
>>      return object; }
>>  }
>>
>> -/*
>> -[81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty |
>>    TriplesNodePath PropertyListPath
>> -[82]    PropertyListPath ::= PropertyListPathNotEmpty?
>> -[83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple )
>> ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
>> -[84]    VerbPath ::= Path
>> -[85]    VerbSimple ::= Var
>> -[86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )*
>> -[87]    ObjectPath ::= GraphNodePath
>> -[88]    Path ::= PathAlternative
>> -[89]    PathAlternative ::= PathSequence ( '|' PathSequence )*
>> -[90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
>> -[91]    PathElt ::= PathPrimary PathMod?
>> -[92]    PathEltOrInverse ::= PathElt | '^' PathElt
>> -[93]    PathMod ::= '?' | '*' | '+'
>> -[94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '('
>> Path ')'
>> -[95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' (
>> PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')'
>> -[96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' )
>> -[97]    Integer ::= INTEGER
>> -*/
>> +/* [81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty
>> | TriplesNodePath PropertyListPath */
>> +private Set<PropertyPathPattern> TriplesSameSubjectPath() : {
>> +    Set<PropertyPathPattern> propertyPathPatterns = new
>> LinkedHashSet<PropertyPathPattern>();
>> +    ResourceOrVariable subject; } {
>> +
>> +    (
>> +        subject=VarOrTerm()
>> +        PropertyListPathNotEmpty(subject, propertyPathPatterns) {
>> +        return propertyPathPatterns; }
>> +    )
>> +    |
>> +    (
>> +        subject=TriplesNodePath(propertyPathPatterns)
>> +        PropertyListPath(subject, propertyPathPatterns) {
>> +        return propertyPathPatterns; }
>> +    )
>> +}
>> +
>> +/* [82]    PropertyListPath ::= PropertyListPathNotEmpty? */
>> +private void PropertyListPath(ResourceOrVariable subject,
>> Set<PropertyPathPattern> propertyPathPatterns) : { } {
>> +    (
>> +        PropertyListPathNotEmpty(subject, propertyPathPatterns)
>> +    )?
>> +}
>> +
>> +/* [83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple )
>> ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* */
>> +private void PropertyListPathNotEmpty(ResourceOrVariable subject,
>> Set<PropertyPathPattern> propertyPathPatterns) : {
>> +    PropertyPathExpressionOrVariable propertyPathExpressionOrVariable;
>> +    PropertyPathExpression propertyPathExpression;
>> +    Variable v;
>> +    Set<ResourceOrVariable> objects; } {
>> +    (
>> +        propertyPathExpression=VerbPath() {
>> +        propertyPathExpressionOrVariable = new
>> PropertyPathExpressionOrVariable(propertyPathExpression); }
>> +    |
>> +        v=VerbSimple() {
>> +        propertyPathExpressionOrVariable = new
>> PropertyPathExpressionOrVariable(v); }
>> +    )
>> +    objects=ObjectListPath(propertyPathPatterns) {
>> +    addPropertyPathPatterns(propertyPathPatterns, subject,
>> propertyPathExpressionOrVariable, objects); }
>> +    (
>> +        ";"
>> +        (
>> +            (
>> +                propertyPathExpression=VerbPath() {
>> +                propertyPathExpressionOrVariable = new
>> PropertyPathExpressionOrVariable(propertyPathExpression); }
>> +
>> +            |
>> +                v=VerbSimple() {
>> +                propertyPathExpressionOrVariable = new
>> PropertyPathExpressionOrVariable(v); }
>> +            )
>> +            objects=ObjectListPath(propertyPathPatterns) {
>> +            addPropertyPathPatterns(propertyPathPatterns, subject,
>> propertyPathExpressionOrVariable, objects); }
>> +        )?
>> +    )*
>> +}
>> +
>> +/* [84]    VerbPath ::= Path */
>> +private PropertyPathExpression VerbPath() : {
>> +    PropertyPathExpression propertyPathExpression; } {
>> +    propertyPathExpression=Path() {
>> +    return propertyPathExpression; }
>> +}
>> +
>> +/* [85]    VerbSimple ::= Var */
>> +private Variable VerbSimple() : {
>> +    Variable v; } {
>> +    v=Var() {
>> +    return v; }
>> +}
>> +
>> +/* [86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )* */
>> +private Set<ResourceOrVariable> ObjectListPath(Set<PropertyPathPattern>
>> propertyPathPatterns) : {
>> +    ResourceOrVariable object; } {
>> +    {
>> +    Set<ResourceOrVariable> objects = new
>> LinkedHashSet<ResourceOrVariable>();
>> +    }
>> +    object=ObjectPath(propertyPathPatterns) {
>> +    objects.add(object); }
>> +
>> +    (
>> +        ","
>> +        object=ObjectPath(propertyPathPatterns) {
>> +        objects.add(object); }
>> +    )* {
>> +    return objects; }
>> +}
>> +
>> +/* [87]    ObjectPath ::= GraphNodePath */
>> +private ResourceOrVariable ObjectPath(Set<PropertyPathPattern>
>> propertyPathPatterns) : {
>> +    ResourceOrVariable object; } {
>> +
>> +    object=GraphNodePath(propertyPathPatterns) {
>> +    return object; }
>> +}
>> +
>> +/* [88]    Path ::= PathAlternative */
>> +private PropertyPathExpression Path() : {
>> +    PropertyPathExpression propertyPathExpression; } {
>> +    propertyPathExpression=PathAlternative() {
>> +    return propertyPathExpression; }
>> +}
>> +
>> +/* [89]    PathAlternative ::= PathSequence ( '|' PathSequence )* */
>> +private PropertyPathExpression PathAlternative() : {
>> +    PropertyPathExpression ppe, pathSequence; } {
>> +
>> +    ppe=PathSequence()
>> +    (
>> +        "|"
>> +        pathSequence=PathSequence() {
>> +        ppe = new BinaryPropertyPathOperation("|", ppe, pathSequence); }
>> +    )* {
>> +    return ppe; }
>> +}
>> +
>> +/* [90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )* */
>> +private PropertyPathExpression PathSequence() : {
>> +    PropertyPathExpression ppe, pathEltOrInverse; } {
>> +
>> +    ppe=PathEltOrInverse()
>> +    (
>> +        "/"
>> +        pathEltOrInverse=PathEltOrInverse() {
>> +        ppe = new BinaryPropertyPathOperation("/", ppe,
>> pathEltOrInverse); }
>> +    )* {
>> +    return ppe; }
>> +}
>> +
>> +/* [91]    PathElt ::= PathPrimary PathMod? */
>> +private PropertyPathExpression PathElt() : {
>> +    PropertyPathExpression ppe;
>> +    String pathMode; } {
>> +
>> +    ppe=PathPrimary()
>> +    (
>> +        pathMode=PathMod() {
>> +        ppe = new UnaryPropertyPathOperation(pathMode, ppe); }
>> +    )? {
>> +    return ppe; }
>> +}
>> +
>> +/* [92]    PathEltOrInverse ::= PathElt | '^' PathElt */
>> +private PropertyPathExpression PathEltOrInverse() : {
>> +    PropertyPathExpression ppe; } {
>> +
>> +    (
>> +        ppe=PathElt() {
>> +        return ppe; }
>> +    |
>> +        "^"
>> +        ppe=PathElt() {
>> +        return new UnaryPropertyPathOperation("^", ppe); }
>> +    )
>> +}
>> +
>> +/* [93]    PathMod ::= '?' | '*' | '+' */
>> +private String PathMod() : {} {
>> +    (
>> +        "?" {
>> +        return "?"; }
>> +    |
>> +        "*" {
>> +        return "*"; }
>> +    |
>> +        "+" {
>> +        return "+"; }
>> +    )
>> +}
>> +
>> +/* [94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '('
>> Path ')' */
>> +private PropertyPathExpression PathPrimary() : {
>> +    PropertyPathExpression ppe;
>> +    UriRef uriRef; } {
>> +
>> +    (
>> +        uriRef=Iri() {
>> +        return new PredicatePath(uriRef); }
>> +    |
>> +        "a" {
>> +        return new PredicatePath(RDF_TYPE); }
>> +    |
>> +        "!"
>> +        ppe=PathNegatedPropertySet() {
>> +        return new UnaryPropertyPathOperation("!", ppe); }
>> +    |
>> +        "("
>> +        ppe=Path() {
>> +        return ppe; }
>> +        ")"
>> +    )
>> +}
>> +
>> +/* [95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' (
>> PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')' */
>> +private PropertyPathExpression PathNegatedPropertySet() : {
>> +    PropertyPathExpression pathOneInPropertySet;
>> +    PropertySet propertySet = new PropertySet(); } {
>> +
>> +    (
>> +        pathOneInPropertySet=PathOneInPropertySet() {
>> +        return pathOneInPropertySet; }
>> +    |
>> +        "("
>> +        (
>> +            pathOneInPropertySet=PathOneInPropertySet() {
>> +            propertySet.addElement(pathOneInPropertySet); }
>> +            (
>> +                "|"
>> +                pathOneInPropertySet=PathOneInPropertySet() {
>> +                propertySet.addElement(pathOneInPropertySet); }
>> +            )*
>> +        )?
>> +        ")" {
>> +        return propertySet; }
>> +    )
>> +}
>> +
>> +/* [96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' ) */
>> +private PropertyPathExpression PathOneInPropertySet() : {
>> +    UriRef uriRef; } {
>> +
>> +    (
>> +        uriRef=Iri() {
>> +        return new PredicatePath(uriRef); }
>> +    |
>> +        "a" {
>> +        return new PredicatePath(RDF_TYPE); }
>> +    |
>> +        "^"
>> +        (
>> +            uriRef=Iri() {
>> +            return new UnaryPropertyPathOperation("^", new
>> PredicatePath(uriRef)); }
>> +        |
>> +            "a" {
>> +            return new UnaryPropertyPathOperation("^", new
>> PredicatePath(RDF_TYPE)); }
>> +        )
>> +    )
>> +}
>> +
>> +/* [97]    Integer ::= INTEGER */
>>
>>  // Fill in the specified set of TriplePattern and returns the subject
>> node
>>  /* [98]    TriplesNode ::= Collection |  BlankNodePropertyList */
>> @@ -857,14 +1511,34 @@ private ResourceOrVariable BlankNodeProp
>>      {
>>      ResourceOrVariable subject = getNewBNode();
>>      }
>> -    "[" PropertyListNotEmpty(subject, triplePatterns) "]" {
>> +    "["
>> +    PropertyListNotEmpty(subject, triplePatterns)
>> +    "]" {
>>      return subject; }
>>  }
>>
>> -/*
>> -[100] TriplesNodePath ::= CollectionPath |    BlankNodePropertyListPath
>> -[101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']'
>> -*/
>> +/* [100] TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath
>> */
>> +private ResourceOrVariable TriplesNodePath(Set<PropertyPathPattern>
>> propertyPathPatterns) : {
>> +    ResourceOrVariable subject; } {
>> +    (
>> +        subject=CollectionPath(propertyPathPatterns)
>> +    |
>> +        subject=BlankNodePropertyListPath(propertyPathPatterns)
>> +    ) {
>> +    return subject; }
>> +}
>> +
>> +
>> +/* [101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']'
>> */
>> +private ResourceOrVariable
>> BlankNodePropertyListPath(Set<PropertyPathPattern> propertyPathPatterns) :
>> {} {
>> +    {
>> +    ResourceOrVariable subject = getNewBNode();
>> +    }
>> +    "["
>> +    PropertyListPathNotEmpty(subject, propertyPathPatterns)
>> +    "]" {
>> +    return subject; }
>> +}
>>
>>  /* [102]    Collection ::= '(' GraphNode+ ')' */
>>  private ResourceOrVariable Collection(Set<TriplePattern> triplePatterns)
>> : {
>> @@ -872,30 +1546,49 @@ private ResourceOrVariable Collection(Se
>>      List<ResourceOrVariable> nodes = new
>> ArrayList<ResourceOrVariable>(); } {
>>
>>      "("
>> -        (
>> +    (
>>          node=GraphNode(triplePatterns) {
>>          nodes.add(node); }
>> -        )+
>> +    )+
>>      ")" {
>>      return addTriplePatterns(triplePatterns, nodes); }
>>  }
>>
>>  /* [103]    CollectionPath ::= '(' GraphNodePath+ ')' */
>> +private ResourceOrVariable CollectionPath(Set<PropertyPathPattern>
>> propertyPathPatterns) : {
>> +    ResourceOrVariable node;
>> +    List<ResourceOrVariable> nodes = new
>> ArrayList<ResourceOrVariable>(); } {
>>
>> +    "("
>> +    (
>> +        node=GraphNodePath(propertyPathPatterns) {
>> +        nodes.add(node); }
>> +    )+
>> +    ")" {
>> +    return addTriplePatterns(triplePatterns, nodes); }
>> +}
>>
>> -/* [104]    GraphNode ::= VarOrTerm |  TriplesNode */
>> +/* [104]    GraphNode ::= VarOrTerm | TriplesNode */
>>  private ResourceOrVariable GraphNode(Set<TriplePattern> triplePatterns)
>> : {
>>      ResourceOrVariable node; } {
>> -
>>      (
>> -    node=VarOrTerm()
>> +        node=VarOrTerm()
>>      |
>> -    node=TriplesNode(triplePatterns)
>> +        node=TriplesNode(triplePatterns)
>>      ) {
>>      return node; }
>>  }
>>
>> -/* [105]    GraphNodePath ::= VarOrTerm |    TriplesNodePath */
>> +/* [105]    GraphNodePath ::= VarOrTerm | TriplesNodePath */
>> +private ResourceOrVariable GraphNodePath(Set<PropertyPathPattern>
>> propertyPathPatterns) : {
>> +    ResourceOrVariable node; } {
>> +    (
>> +        node=VarOrTerm()
>> +    |
>> +        node=TriplesNodePath(propertyPathPatterns)
>> +    ) {
>> +    return node; }
>> +}
>>
>>  /* [106]    VarOrTerm ::= Var | GraphTerm */
>>  private ResourceOrVariable VarOrTerm() : {
>> @@ -903,11 +1596,11 @@ private ResourceOrVariable VarOrTerm() :
>>      Variable v; } {
>>
>>      (
>> -    v=Var() {
>> -    return new ResourceOrVariable(v); }
>> +        v=Var() {
>> +        return new ResourceOrVariable(v); }
>>      |
>> -    r=GraphTerm() {
>> -    return r; }
>> +        r=GraphTerm() {
>> +        return r; }
>>      )
>>  }
>>
>> @@ -933,13 +1626,6 @@ private Variable Var() : {
>>      return createVariable(t.image); }
>>  }
>>
>> -private String BuiltInCallName() : {
>> -    Token t;} {
>> -
>> -    t=<BUILT_IN_CALL_NAME> {
>> -    return t.image; }
>> -}
>> -
>>  /* [109]    GraphTerm ::= Iri | RDFLiteral | NumericLiteral |
>> BooleanLiteral | BlankNode | NIL */
>>  private ResourceOrVariable GraphTerm() : {
>>      ResourceOrVariable bNode = null;
>> @@ -1305,6 +1991,13 @@ private BuiltInCall BuiltInCall() : {
>>      return new BuiltInCall(name, args); }
>>  }
>>
>> +private String BuiltInCallName() : {
>> +    Token t;} {
>> +
>> +    t=<BUILT_IN_CALL_NAME> {
>> +    return t.image; }
>> +}
>> +
>>  /*
>>  [125]    ExistsFunc ::= 'EXISTS' GroupGraphPattern
>>  [126]    NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern
>>
>> Modified:
>> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
>> URL:
>> http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java?rev=1516993&r1=1516992&r2=1516993&view=diff
>>
>> ==============================================================================
>> ---
>> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
>> (original)
>> +++
>> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
>> Fri Aug 23 19:29:05 2013
>> @@ -58,6 +58,18 @@ public class SparqlPreParserTest {
>>          SparqlPreParser parser;
>>          parser = new SparqlPreParser(TcManager.getInstance());
>>          Set<UriRef> referredGraphs =
>> parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
>> +
>>  Assert.assertTrue(referredGraphs.toArray()[0].equals(DEFAULT_GRAPH));
>> +    }
>> +
>> +    @Test
>> +    public void testAllGraphReferenceInSelectQuery() throws
>> ParseException {
>> +
>> +        StringBuilder queryStrBuilder = new StringBuilder();
>> +        queryStrBuilder.append("SELECT DISTINCT ?g { GRAPH ?g { ?s ?p ?o
>> } }\n");
>> +
>> +        SparqlPreParser parser;
>> +        parser = new SparqlPreParser(TcManager.getInstance());
>> +        Set<UriRef> referredGraphs =
>> parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
>>          Assert.assertTrue(referredGraphs == null);
>>      }
>>
>>
>>
>>
>

Re: svn commit: r1516993 [2/2] - in /clerezza/trunk/rdf.core/src: main/java/org/apache/clerezza/rdf/core/sparql/ main/java/org/apache/clerezza/rdf/core/sparql/query/ main/java/org/apache/clerezza/rdf/core/sparql/query/impl/ main/javacc/org/apache/clerezza/...

Posted by Reto Bachmann-Gmür <re...@wymiwyg.com>.
Hi Hasan

I'm getting the followin compile error (on a fresh compile with empty maven
repo):

Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile
(default-compile) on project rdf.core: Compilation failure: Compilation
failure:
C:\Users\Reto\projects\apache\clerezza\rdf.core\target\generated-sources\javacc\org\apache\clerezza\rdf\core\sparql\JavaCCGeneratedSparqlPreParser.java:[1227,25]
error: cannot find symbol

could not parse error message:   symbol:   method setSubSelect(SelectQuery)
location: variable groupGraphPattern of type GroupGraphPattern
C:\Users\Reto\projects\apache\clerezza\rdf.core\target\generated-sources\javacc\org\apache\clerezza\rdf\core\sparql\JavaCCGeneratedSparqlPreParser.java:2651:
error: cannot find symbol
{if (true) return addTriplePatterns(triplePatterns, nodes);}


I assume this to be related to this commit. Could you have a look into it?

Cheers,
Reto


On Fri, Aug 23, 2013 at 9:29 PM, <ha...@apache.org> wrote:

> Modified:
> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
> URL:
> http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj?rev=1516993&r1=1516992&r2=1516993&view=diff
>
> ==============================================================================
> ---
> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
> (original)
> +++
> clerezza/trunk/rdf.core/src/main/javacc/org/apache/clerezza/rdf/core/sparql/JavaCCGeneratedSparqlPreParser.jj
> Fri Aug 23 19:29:05 2013
> @@ -49,18 +49,26 @@ import org.apache.clerezza.rdf.core.impl
>  import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
>  import org.apache.clerezza.rdf.core.sparql.query.AlternativeGraphPattern;
>  import org.apache.clerezza.rdf.core.sparql.query.BinaryOperation;
> +import
> org.apache.clerezza.rdf.core.sparql.query.BinaryPropertyPathOperation;
>  import org.apache.clerezza.rdf.core.sparql.query.BuiltInCall;
>  import org.apache.clerezza.rdf.core.sparql.query.Expression;
>  import org.apache.clerezza.rdf.core.sparql.query.FunctionCall;
>  import org.apache.clerezza.rdf.core.sparql.query.GroupGraphPattern;
>  import org.apache.clerezza.rdf.core.sparql.query.InlineData;
>  import org.apache.clerezza.rdf.core.sparql.query.LiteralExpression;
> +import org.apache.clerezza.rdf.core.sparql.query.PredicatePath;
> +import
> org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpressionOrVariable;
> +import org.apache.clerezza.rdf.core.sparql.query.PropertyPathExpression;
> +import org.apache.clerezza.rdf.core.sparql.query.PropertyPathPattern;
> +import org.apache.clerezza.rdf.core.sparql.query.PropertySet;
>  import org.apache.clerezza.rdf.core.sparql.query.Query;
>  import org.apache.clerezza.rdf.core.sparql.query.ResourceOrVariable;
>  import org.apache.clerezza.rdf.core.sparql.query.RhsListBinaryOperation;
> +import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
>  import org.apache.clerezza.rdf.core.sparql.query.SparqlUnit;
>  import org.apache.clerezza.rdf.core.sparql.query.TriplePattern;
>  import org.apache.clerezza.rdf.core.sparql.query.UnaryOperation;
> +import
> org.apache.clerezza.rdf.core.sparql.query.UnaryPropertyPathOperation;
>  import org.apache.clerezza.rdf.core.sparql.query.UriRefExpression;
>  import org.apache.clerezza.rdf.core.sparql.query.UriRefOrVariable;
>  import org.apache.clerezza.rdf.core.sparql.query.Variable;
> @@ -72,9 +80,11 @@ import org.apache.clerezza.rdf.core.spar
>  import
> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleGroupGraphPattern;
>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleInlineData;
>  import
> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleOrderCondition;
> +import
> org.apache.clerezza.rdf.core.sparql.query.impl.SimplePropertyPathPattern;
>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQuery;
>  import
> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleQueryWithSolutionModifier;
>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSelectQuery;
> +import
> org.apache.clerezza.rdf.core.sparql.query.impl.SimpleServiceGraphPattern;
>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSparqlUnit;
>  import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleTriplePattern;
>  import org.apache.clerezza.rdf.core.sparql.update.Update;
> @@ -168,6 +178,46 @@ class JavaCCGeneratedSparqlPreParser {
>          return v;
>      }
>
> +    private void addPropertyPathPatterns(Set<PropertyPathPattern>
> propertyPathPatterns,
> +            ResourceOrVariable subject,
> +            PropertyPathExpressionOrVariable propertyPathExpression,
> +            Set<ResourceOrVariable> objects) {
> +
> +        for (ResourceOrVariable object : objects) {
> +            propertyPathPatterns.add(
> +                new SimplePropertyPathPattern(subject,
> propertyPathExpression, object));
> +        }
> +    }
> +
> +    // nodes contain at least one element
> +    private ResourceOrVariable
> addPropertyPathPatterns(Set<PropertyPathPattern> propertyPathPatterns,
> +            List<ResourceOrVariable> 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<TriplePattern> triplePatterns,
>              ResourceOrVariable subject,
>              UriRefOrVariable predicate,
> @@ -305,6 +355,9 @@ TOKEN [IGNORE_CASE] :
>  |   < VALUES : "VALUES" >
>  |   < UNDEF : "UNDEF" >
>  |   < AS : "AS" >
> +|   < BIND : "BIND" >
> +|   < MINUS : "MINUS" >
> +|   < SERVICE : "SERVICE" >
>  |   < GROUP : "GROUP" >
>  |   < HAVING : "HAVING" >
>  |   < LOAD : "LOAD" >
> @@ -409,11 +462,21 @@ private void PrefixDecl() : {
>  private Query SelectQuery() : {
>      Query query; } {
>      query = SelectClause()
> -    ( DatasetClause(query) )* {
> +    ( 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() : {
> @@ -455,18 +518,30 @@ private Query SelectClause() : {
>  /* [10]    ConstructQuery ::= 'CONSTRUCT' ( ConstructTemplate
> DatasetClause* WhereClause SolutionModifier | DatasetClause* 'WHERE' '{'
> TriplesTemplate? '}' SolutionModifier ) */
>  private Query ConstructQuery() : {
>      Query query;
> -    Set<TriplePattern> triplePatterns = null; } {
> +    Set<TriplePattern> triplePatterns = null;
> +    GroupGraphPattern queryPattern; } {
>
>      <CONSTRUCT>
>      (
>          triplePatterns=ConstructTemplate() {
>          query = new SimpleConstructQuery(triplePatterns); }
>          ( DatasetClause(query) )*
> +        WhereClause(query)
>      |
>          {
>          query = new SimpleConstructQuery(triplePatterns); }
>          ( DatasetClause(query) )*
> -    ) {
> +        <WHERE>
> +        "{" {
> +        queryPattern = new SimpleGroupGraphPattern(); }
> +        (
> +            triplePatterns=TriplesTemplate()
> +        )? {
> +        ((SimpleGroupGraphPattern)
> queryPattern).addTriplePatterns(triplePatterns); }
> +        "}" {
> +        ((SimpleQuery) query).setQueryPattern(queryPattern); }
> +    )
> +    SolutionModifier(query) {
>      return query; }
>  }
>
> @@ -484,7 +559,9 @@ private Query DescribeQuery() : {
>          "*" {
>              ((SimpleDescribeQuery) query).setDescribeAll(); }
>      )
> -    ( DatasetClause(query) )* {
> +    ( DatasetClause(query) )*
> +    ( WhereClause(query) )?
> +    SolutionModifier(query) {
>      return query; }
>  }
>
> @@ -494,7 +571,9 @@ private Query AskQuery() : {
>
>      <ASK> {
>      query = new SimpleAskQuery(); }
> -    ( DatasetClause(query) )* {
> +    ( DatasetClause(query) )*
> +    WhereClause(query)
> +    SolutionModifier(query) {
>      return query; }
>  }
>
> @@ -527,20 +606,117 @@ private UriRef SourceSelector() : {
>      return graph; }
>  }
>
> -/*
> -[17] WhereClause ::= 'WHERE'? GroupGraphPattern
> -[18] SolutionModifier ::= GroupClause? HavingClause? OrderClause?
> LimitOffsetClauses?
> -[19] GroupClause ::= 'GROUP' 'BY' GroupCondition+
> -[20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression (
> 'AS' Var )? ')' | Var
> -[21] HavingClause ::= 'HAVING' HavingCondition+
> -[22] HavingCondition ::= Constraint
> -[23] OrderClause ::= 'ORDER' 'BY' OrderCondition+
> -[24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | (
> Constraint | Var )
> -[25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause
> LimitClause?
> -[26] LimitClause ::= 'LIMIT' INTEGER
> -[27] OffsetClause ::= 'OFFSET' INTEGER
> -[28] ValuesClause ::= ( 'VALUES' DataBlock )?
> -*/
> +/* [17]    WhereClause ::= 'WHERE'? GroupGraphPattern */
> +private void WhereClause(Query query) : {
> +    GroupGraphPattern queryPattern; } {
> +
> +    (<WHERE>)?
> +    queryPattern=GroupGraphPattern() {
> +    ((SimpleQuery) query).setQueryPattern(queryPattern); }
> +}
> +
> +/* [18] SolutionModifier ::= GroupClause? HavingClause? OrderClause?
> LimitOffsetClauses? */
> +private void SolutionModifier(Query query) : {} {
> +    ( GroupClause(query) )?
> +    ( HavingClause(query) )?
> +    ( OrderClause(query) )?
> +    ( LimitOffsetClauses(query) )?
> +}
> +
> +/* [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+ */
> +private void GroupClause(Query query) : {} {
> +    <GROUP> <BY> ( GroupCondition(query) )+
> +}
> +
> +/* [20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression (
> 'AS' Var )? ')' | Var */
> +private void GroupCondition(Query query) : {
> +    Expression e;
> +    Variable v; } {
> +    (
> +        e=BuiltInCall()
> +    |
> +        e=FunctionCall()
> +    |
> +        (
> +            "("
> +            e=Expression()
> +            (
> +                <AS>
> +                v=Var() {
> +                v.setBoundExpression(e);
> +                e = v; }
> +            )?
> +            ")"
> +        )
> +    |
> +        e=Var()
> +    ) {
> +    ((SimpleQueryWithSolutionModifier) query).addGroupCondition(e); }
> +}
> +
> +/* [21] HavingClause ::= 'HAVING' HavingCondition+ */
> +private void HavingClause(Query query) : {} {
> +    <HAVING> ( HavingCondition(query) )+
> +}
> +
> +/* [22] HavingCondition ::= Constraint */
> +private void HavingCondition(Query query) : {
> +    Expression c; } {
> +
> +    c=Constraint() {
> +    ((SimpleQueryWithSolutionModifier) query).addHavingCondition(c); }
> +}
> +
> +/* [23] OrderClause ::= 'ORDER' 'BY' OrderCondition+ */
> +private void OrderClause(Query query) : {} {
> +    <ORDER> <BY> ( OrderCondition(query) )+
> +}
> +
> +/* [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) |
> ( Constraint | Var ) */
> +private void OrderCondition(Query query) : {
> +    boolean asc = true;
> +    Expression e; } {
> +
> +    (
> +        ( ( "ASC" | "DESC" { asc = false; } ) e=BrackettedExpression() )
> +    |
> +        ( e=Constraint() | e=Var() )
> +    ) {
> +    ((SimpleQueryWithSolutionModifier) query).addOrderCondition(new
> SimpleOrderCondition(e, asc)); }
> +}
> +
> +/* [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause
> LimitClause? */
> +private void LimitOffsetClauses(Query query) : {} {
> +    ( LimitClause(query) (OffsetClause(query))? )
> +    |
> +    ( OffsetClause(query) (LimitClause(query))? )
> +}
> +
> +/* [26] LimitClause ::= 'LIMIT' INTEGER */
> +private void LimitClause(Query query) : {
> +    Token t; } {
> +
> +    <LIMIT> t=<INTEGER> {
> +    ((SimpleQueryWithSolutionModifier)
> query).setLimit(Integer.parseInt(t.image)); }
> +}
> +
> +/* [27] OffsetClause ::= 'OFFSET' INTEGER */
> +private void OffsetClause(Query query) : {
> +    Token t; } {
> +
> +    <OFFSET> t=<INTEGER> {
> +    ((SimpleQueryWithSolutionModifier)
> query).setOffset(Integer.parseInt(t.image)); }
> +}
> +
> +/* [28] ValuesClause ::= ( 'VALUES' DataBlock )? */
> +private void ValuesClause(Query query) : {
> +    InlineData data; } {
> +    (
> +        <VALUES>
> +        data=DataBlock() {
> +        ((SimpleQuery) query).setInlineData(data); }
> +    )?
> +}
>
>  /* [29]    Update ::= Prologue ( Update1 ( ';' Update )? )? */
>  private void Update(Update update) : {} {
> @@ -565,8 +741,7 @@ private void Update1(Update update) : {
>      ) {
>      if (updateOperation != null) {
>          update.addOperation(updateOperation);
> -    }
> -    }
> +    } }
>  }
>
>  /* [31]    Load ::= 'LOAD' 'SILENT'? iri ( 'INTO' GraphRef )? */
> @@ -580,8 +755,7 @@ private UpdateOperation Load() : {
>          operation.setSilent(true); }
>      )?
>      uriRef = Iri() {
> -        operation.setSource(uriRef);
> -    }
> +    operation.setSource(uriRef); }
>      (
>          <INTO>
>          uriRef = GraphRef() {
> @@ -657,26 +831,282 @@ private GraphRefAllSpec GraphRefAll() :
>  /* [49]    QuadData ::= '{' Quads '}' */
>  /* [50]    Quads ::= TriplesTemplate? ( QuadsNotTriples '.'?
> TriplesTemplate? )* */
>  /* [51]    QuadsNotTriples ::= 'GRAPH' VarOrIri '{' TriplesTemplate? '}'
> */
> +
>  /* [52]    TriplesTemplate ::= TriplesSameSubject ( '.' TriplesTemplate?
> )? */
> +private Set<TriplePattern> TriplesTemplate() : {
> +    Set<TriplePattern> triplePatterns, t; } {
> +
> +    triplePatterns=TriplesSameSubject()
> +    (
> +        "."
> +        (
> +            t=TriplesTemplate() {
> +            triplePatterns.addAll(t); }
> +        )?
> +    )? {
> +    return triplePatterns; }
> +}
>
>  /* [53]    GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub )
> '}' */
> +private GroupGraphPattern GroupGraphPattern() : {
> +    Query query;
> +    GroupGraphPattern groupGraphPattern = new SimpleGroupGraphPattern();
> } {
> +    "{"
> +    (
> +        query = SubSelect() {
> +        groupGraphPattern.setSubSelect((SelectQuery) query); }
> +    |
> +        GroupGraphPatternSub(groupGraphPattern)
> +    )
> +    "}" {
> +    return groupGraphPattern; }
> +}
> +
>  /* [54]    GroupGraphPatternSub ::= TriplesBlock? (
> GraphPatternNotTriples '.'? TriplesBlock? )* */
> +private void GroupGraphPatternSub(GroupGraphPattern groupGraphPattern) :
> {} {
> +    ( TriplesBlock(groupGraphPattern) )?
> +    (
> +        GraphPatternNotTriples(groupGraphPattern)
> +        (".")?
> +        ( TriplesBlock(groupGraphPattern) )?
> +    )*
> +}
> +
>  /* [55]    TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock? )?
> */
> +private void TriplesBlock(GroupGraphPattern groupGraphPattern) : {
> +    Set<PropertyPathPattern> propertyPathPatterns; } {
> +
> +    propertyPathPatterns=TriplesSameSubjectPath() {
> +    ((SimpleGroupGraphPattern)
> groupGraphPattern).addPropertyPathPatterns(propertyPathPatterns); }
> +    (
> +        "." ( TriplesBlock(groupGraphPattern) )?
> +    )?
> +}
> +
>  /* [56]    GraphPatternNotTriples ::= GroupOrUnionGraphPattern |
> OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern |
> ServiceGraphPattern | Filter | Bind | InlineData */
> +private void GraphPatternNotTriples(GroupGraphPattern groupGraphPattern)
> : {
> +    Expression constraint;
> +    Variable v; } {
> +    (
> +        GroupOrUnionGraphPattern(groupGraphPattern)
> +    |
> +        OptionalGraphPattern(groupGraphPattern)
> +    |
> +        MinusGraphPattern(groupGraphPattern)
> +    |
> +        GraphGraphPattern(groupGraphPattern)
> +    |
> +        ServiceGraphPattern(groupGraphPattern)
> +    |
> +        constraint=Filter() {
> +        ((SimpleGroupGraphPattern)
> groupGraphPattern).addConstraint(constraint); }
> +    |
> +        v=Bind() {
> +        // We should either store this binding in the respective variable
> in SelectQuery
> +        // or we extend the BasicGraphPattern to store such binding.
> +        // If we store the binding in the respective variable in
> SelectQuery, a serializer
> +        // won't be able to determine whether a binding is defined by the
> BIND keyword or
> +        // by an expression in the SELECT clause.
> +        // The pre parser needs only to consume tokens, thus may ignore
> this binding.
> +
> +        // The use of BIND ends the preceding basic graph pattern, thus
> ...
> +        ((SimpleGroupGraphPattern)
> groupGraphPattern).endLastBasicGraphPattern(); }
> +    |
> +        InlineData(groupGraphPattern)
> +    )
> +}
> +
>  /* [57]    OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern */
> +private void OptionalGraphPattern(GroupGraphPattern groupGraphPattern) : {
> +    GroupGraphPattern optional; } {
> +
> +    <OPTIONAL>
> +    optional=GroupGraphPattern() {
> +    ((SimpleGroupGraphPattern)
> groupGraphPattern).addOptionalGraphPattern(optional); }
> +}
> +
>  /* [58]    GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern */
> +private void GraphGraphPattern(GroupGraphPattern groupGraphPattern) : {
> +    UriRefOrVariable graph;
> +    GroupGraphPattern g; } {
> +
> +    <GRAPH>
> +    graph=VarOrIri()
> +    g=GroupGraphPattern() {
> +    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(new
> SimpleGraphGraphPattern(graph, g)); }
> +}
> +
>  /* [59]    ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri
> GroupGraphPattern */
> +private void ServiceGraphPattern(GroupGraphPattern groupGraphPattern) : {
> +    UriRefOrVariable service;
> +    GroupGraphPattern g;
> +    boolean silent = false; } {
> +
> +    <SERVICE>
> +    (
> +        <SILENT> {
> +        silent = true; }
> +    )?
> +    service=VarOrIri()
> +    g=GroupGraphPattern() {
> +    SimpleServiceGraphPattern simpleServiceGraphPattern;
> +    simpleServiceGraphPattern = new SimpleServiceGraphPattern(service, g);
> +    ((SimpleGroupGraphPattern)
> groupGraphPattern).addGraphPattern(simpleServiceGraphPattern);
> +    if (silent) {
> +        simpleServiceGraphPattern.setSilent(true);
> +    } }
> +}
> +
>  /* [60]    Bind ::= 'BIND' '(' Expression 'AS' Var ')' */
> +private Variable Bind() : {
> +    Variable v;
> +    Expression e; } {
> +
> +    <BIND>
> +    "("
> +    e=Expression()
> +    <AS>
> +    v=Var() {
> +    v.setBoundExpression(e); }
> +    ")" {
> +    return v; }
> +}
> +
>  /* [61]    InlineData ::= 'VALUES' DataBlock */
> +private void InlineData(GroupGraphPattern groupGraphPattern) : {
> +    InlineData data; } {
> +
> +    <VALUES>
> +    data=DataBlock() {
> +    ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(data); }
> +}
> +
>  /* [62]    DataBlock ::= InlineDataOneVar | InlineDataFull */
> +private InlineData DataBlock() : {
> +    InlineData inlineData = new SimpleInlineData(); } {
> +
> +    (
> +        InlineDataOneVar(inlineData)
> +    |
> +        InlineDataFull(inlineData)
> +    ) {
> +    return inlineData; }
> +}
> +
>  /* [63]    InlineDataOneVar ::= Var '{' DataBlockValue* '}' */
> +private void InlineDataOneVar(InlineData inlineData) : {
> +    Variable var;
> +    Resource val; } {
> +
> +    var=Var() {
> +    ((SimpleInlineData) inlineData).addVariable(var); }
> +    "{"
> +    (
> +        val=DataBlockValue() {
> +        List<Resource> values = new ArrayList<Resource>();
> +        values.add(val);
> +        ((SimpleInlineData) inlineData).addValues(values); }
> +    )*
> +    "}"
> +}
> +
>  /* [64]    InlineDataFull ::= ( NIL | '(' Var* ')' ) '{' ( '('
> DataBlockValue* ')' | NIL )* '}' */
> -/* [65]    DataBlockValue ::= iri |    RDFLiteral |    NumericLiteral |
>  BooleanLiteral |    'UNDEF' */
> +private void InlineDataFull(InlineData inlineData) : {
> +    Variable var;
> +    Resource val; } {
> +    (
> +        <NIL>
> +    |
> +        "("
> +        (
> +            var=Var() {
> +            ((SimpleInlineData) inlineData).addVariable(var); }
> +        )*
> +
> +        ")"
> +    )
> +    "{"
> +    (
> +        (
> +            "(" {
> +            List<Resource> values = new ArrayList<Resource>(); }
> +            (
> +                val=DataBlockValue() {
> +                values.add(val); }
> +            )*
> +            ")" {
> +            ((SimpleInlineData) inlineData).addValues(values); }
> +        )
> +    |
> +        <NIL> {
> +        ((SimpleInlineData) inlineData).addValues(new
> ArrayList<Resource>()); }
> +    )*
> +    "}"
> +}
> +
> +/* [65]    DataBlockValue ::= iri | RDFLiteral | NumericLiteral |
> BooleanLiteral | 'UNDEF' */
> +private Resource DataBlockValue() : {
> +    Resource r = null; } {
> +    (r=Iri() | r=RDFLiteral() | r=NumericLiteral() | r=BooleanLiteral() |
> <UNDEF> ) {
> +    return r; }
> +}
> +
>  /* [66]    MinusGraphPattern ::= 'MINUS' GroupGraphPattern */
> +private void MinusGraphPattern(GroupGraphPattern groupGraphPattern) : {
> +    GroupGraphPattern subtrahend; } {
> +
> +    <MINUS>
> +    subtrahend=GroupGraphPattern() {
> +    ((SimpleGroupGraphPattern)
> groupGraphPattern).addMinusGraphPattern(subtrahend); }
> +}
> +
>  /* [67]    GroupOrUnionGraphPattern ::= GroupGraphPattern ( 'UNION'
> GroupGraphPattern )* */
> +private void GroupOrUnionGraphPattern(GroupGraphPattern
> groupGraphPattern) : {
> +    GroupGraphPattern g;
> +    AlternativeGraphPattern unionGraphPattern = null; } {
> +
> +    g=GroupGraphPattern()
> +    (
> +        <UNION> {
> +        if (unionGraphPattern == null) {
> +            unionGraphPattern = new SimpleAlternativeGraphPattern(g);
> +        } }
> +        g=GroupGraphPattern() {
> +        ((SimpleAlternativeGraphPattern)
> unionGraphPattern).addAlternativeGraphPattern(g); }
> +    )* {
> +    if (unionGraphPattern != null) {
> +        ((SimpleGroupGraphPattern)
> groupGraphPattern).addGraphPattern(unionGraphPattern);
> +    } else {
> +        ((SimpleGroupGraphPattern) groupGraphPattern).addGraphPattern(g);
> +    } }
> +}
> +
>  /* [68]    Filter ::= 'FILTER' Constraint */
> +private Expression Filter() : {
> +    Expression c; } {
> +
> +    <FILTER>
> +    c=Constraint() {
> +    return c; }
> +}
> +
>  /* [69]    Constraint ::= BrackettedExpression | BuiltInCall |
> FunctionCall */
> +private Expression Constraint() : {
> +    Expression c; } {
> +
> +    ( c=BrackettedExpression() | c=BuiltInCall() | c=FunctionCall() ) {
> +    return c; }
> +}
> +
>  /* [70]    FunctionCall ::= iri ArgList */
> +private FunctionCall FunctionCall() : {
> +    UriRef name;
> +    List<Expression> arguments; } {
> +
> +    name=Iri()
> +    arguments=ArgList() {
> +    return new FunctionCall(name, arguments); }
> +}
>
>  /* [71]    ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression
> )* ')' */
>  private List<Expression> ArgList() : {
> @@ -731,9 +1161,11 @@ private List<Expression> ExpressionList(
>  private Set<TriplePattern> ConstructTemplate() : {
>      Set<TriplePattern> triplePatterns = null; } {
>
> -    "{" (
> -    triplePatterns=ConstructTriples()
> -    )? "}" {
> +    "{"
> +    (
> +        triplePatterns=ConstructTriples()
> +    )?
> +    "}" {
>      return triplePatterns; }
>  }
>
> @@ -742,10 +1174,11 @@ private Set<TriplePattern> ConstructTrip
>      Set<TriplePattern> triplePatterns, t; } {
>
>      triplePatterns=TriplesSameSubject()
> -    ( "."
> +    (
> +        "."
>          (
> -        t=ConstructTriples() {
> -        triplePatterns.addAll(t); }
> +            t=ConstructTriples() {
> +            triplePatterns.addAll(t); }
>          )?
>      )? {
>      return triplePatterns; }
> @@ -820,25 +1253,246 @@ private ResourceOrVariable Object(Set<Tr
>      return object; }
>  }
>
> -/*
> -[81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty |
>  TriplesNodePath PropertyListPath
> -[82]    PropertyListPath ::= PropertyListPathNotEmpty?
> -[83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple )
> ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
> -[84]    VerbPath ::= Path
> -[85]    VerbSimple ::= Var
> -[86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )*
> -[87]    ObjectPath ::= GraphNodePath
> -[88]    Path ::= PathAlternative
> -[89]    PathAlternative ::= PathSequence ( '|' PathSequence )*
> -[90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
> -[91]    PathElt ::= PathPrimary PathMod?
> -[92]    PathEltOrInverse ::= PathElt | '^' PathElt
> -[93]    PathMod ::= '?' | '*' | '+'
> -[94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path
> ')'
> -[95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' (
> PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')'
> -[96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' )
> -[97]    Integer ::= INTEGER
> -*/
> +/* [81]    TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty
> | TriplesNodePath PropertyListPath */
> +private Set<PropertyPathPattern> TriplesSameSubjectPath() : {
> +    Set<PropertyPathPattern> propertyPathPatterns = new
> LinkedHashSet<PropertyPathPattern>();
> +    ResourceOrVariable subject; } {
> +
> +    (
> +        subject=VarOrTerm()
> +        PropertyListPathNotEmpty(subject, propertyPathPatterns) {
> +        return propertyPathPatterns; }
> +    )
> +    |
> +    (
> +        subject=TriplesNodePath(propertyPathPatterns)
> +        PropertyListPath(subject, propertyPathPatterns) {
> +        return propertyPathPatterns; }
> +    )
> +}
> +
> +/* [82]    PropertyListPath ::= PropertyListPathNotEmpty? */
> +private void PropertyListPath(ResourceOrVariable subject,
> Set<PropertyPathPattern> propertyPathPatterns) : { } {
> +    (
> +        PropertyListPathNotEmpty(subject, propertyPathPatterns)
> +    )?
> +}
> +
> +/* [83]    PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple )
> ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* */
> +private void PropertyListPathNotEmpty(ResourceOrVariable subject,
> Set<PropertyPathPattern> propertyPathPatterns) : {
> +    PropertyPathExpressionOrVariable propertyPathExpressionOrVariable;
> +    PropertyPathExpression propertyPathExpression;
> +    Variable v;
> +    Set<ResourceOrVariable> objects; } {
> +    (
> +        propertyPathExpression=VerbPath() {
> +        propertyPathExpressionOrVariable = new
> PropertyPathExpressionOrVariable(propertyPathExpression); }
> +    |
> +        v=VerbSimple() {
> +        propertyPathExpressionOrVariable = new
> PropertyPathExpressionOrVariable(v); }
> +    )
> +    objects=ObjectListPath(propertyPathPatterns) {
> +    addPropertyPathPatterns(propertyPathPatterns, subject,
> propertyPathExpressionOrVariable, objects); }
> +    (
> +        ";"
> +        (
> +            (
> +                propertyPathExpression=VerbPath() {
> +                propertyPathExpressionOrVariable = new
> PropertyPathExpressionOrVariable(propertyPathExpression); }
> +
> +            |
> +                v=VerbSimple() {
> +                propertyPathExpressionOrVariable = new
> PropertyPathExpressionOrVariable(v); }
> +            )
> +            objects=ObjectListPath(propertyPathPatterns) {
> +            addPropertyPathPatterns(propertyPathPatterns, subject,
> propertyPathExpressionOrVariable, objects); }
> +        )?
> +    )*
> +}
> +
> +/* [84]    VerbPath ::= Path */
> +private PropertyPathExpression VerbPath() : {
> +    PropertyPathExpression propertyPathExpression; } {
> +    propertyPathExpression=Path() {
> +    return propertyPathExpression; }
> +}
> +
> +/* [85]    VerbSimple ::= Var */
> +private Variable VerbSimple() : {
> +    Variable v; } {
> +    v=Var() {
> +    return v; }
> +}
> +
> +/* [86]    ObjectListPath ::= ObjectPath ( ',' ObjectPath )* */
> +private Set<ResourceOrVariable> ObjectListPath(Set<PropertyPathPattern>
> propertyPathPatterns) : {
> +    ResourceOrVariable object; } {
> +    {
> +    Set<ResourceOrVariable> objects = new
> LinkedHashSet<ResourceOrVariable>();
> +    }
> +    object=ObjectPath(propertyPathPatterns) {
> +    objects.add(object); }
> +
> +    (
> +        ","
> +        object=ObjectPath(propertyPathPatterns) {
> +        objects.add(object); }
> +    )* {
> +    return objects; }
> +}
> +
> +/* [87]    ObjectPath ::= GraphNodePath */
> +private ResourceOrVariable ObjectPath(Set<PropertyPathPattern>
> propertyPathPatterns) : {
> +    ResourceOrVariable object; } {
> +
> +    object=GraphNodePath(propertyPathPatterns) {
> +    return object; }
> +}
> +
> +/* [88]    Path ::= PathAlternative */
> +private PropertyPathExpression Path() : {
> +    PropertyPathExpression propertyPathExpression; } {
> +    propertyPathExpression=PathAlternative() {
> +    return propertyPathExpression; }
> +}
> +
> +/* [89]    PathAlternative ::= PathSequence ( '|' PathSequence )* */
> +private PropertyPathExpression PathAlternative() : {
> +    PropertyPathExpression ppe, pathSequence; } {
> +
> +    ppe=PathSequence()
> +    (
> +        "|"
> +        pathSequence=PathSequence() {
> +        ppe = new BinaryPropertyPathOperation("|", ppe, pathSequence); }
> +    )* {
> +    return ppe; }
> +}
> +
> +/* [90]    PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )* */
> +private PropertyPathExpression PathSequence() : {
> +    PropertyPathExpression ppe, pathEltOrInverse; } {
> +
> +    ppe=PathEltOrInverse()
> +    (
> +        "/"
> +        pathEltOrInverse=PathEltOrInverse() {
> +        ppe = new BinaryPropertyPathOperation("/", ppe,
> pathEltOrInverse); }
> +    )* {
> +    return ppe; }
> +}
> +
> +/* [91]    PathElt ::= PathPrimary PathMod? */
> +private PropertyPathExpression PathElt() : {
> +    PropertyPathExpression ppe;
> +    String pathMode; } {
> +
> +    ppe=PathPrimary()
> +    (
> +        pathMode=PathMod() {
> +        ppe = new UnaryPropertyPathOperation(pathMode, ppe); }
> +    )? {
> +    return ppe; }
> +}
> +
> +/* [92]    PathEltOrInverse ::= PathElt | '^' PathElt */
> +private PropertyPathExpression PathEltOrInverse() : {
> +    PropertyPathExpression ppe; } {
> +
> +    (
> +        ppe=PathElt() {
> +        return ppe; }
> +    |
> +        "^"
> +        ppe=PathElt() {
> +        return new UnaryPropertyPathOperation("^", ppe); }
> +    )
> +}
> +
> +/* [93]    PathMod ::= '?' | '*' | '+' */
> +private String PathMod() : {} {
> +    (
> +        "?" {
> +        return "?"; }
> +    |
> +        "*" {
> +        return "*"; }
> +    |
> +        "+" {
> +        return "+"; }
> +    )
> +}
> +
> +/* [94]    PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '('
> Path ')' */
> +private PropertyPathExpression PathPrimary() : {
> +    PropertyPathExpression ppe;
> +    UriRef uriRef; } {
> +
> +    (
> +        uriRef=Iri() {
> +        return new PredicatePath(uriRef); }
> +    |
> +        "a" {
> +        return new PredicatePath(RDF_TYPE); }
> +    |
> +        "!"
> +        ppe=PathNegatedPropertySet() {
> +        return new UnaryPropertyPathOperation("!", ppe); }
> +    |
> +        "("
> +        ppe=Path() {
> +        return ppe; }
> +        ")"
> +    )
> +}
> +
> +/* [95]    PathNegatedPropertySet ::= PathOneInPropertySet | '(' (
> PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')' */
> +private PropertyPathExpression PathNegatedPropertySet() : {
> +    PropertyPathExpression pathOneInPropertySet;
> +    PropertySet propertySet = new PropertySet(); } {
> +
> +    (
> +        pathOneInPropertySet=PathOneInPropertySet() {
> +        return pathOneInPropertySet; }
> +    |
> +        "("
> +        (
> +            pathOneInPropertySet=PathOneInPropertySet() {
> +            propertySet.addElement(pathOneInPropertySet); }
> +            (
> +                "|"
> +                pathOneInPropertySet=PathOneInPropertySet() {
> +                propertySet.addElement(pathOneInPropertySet); }
> +            )*
> +        )?
> +        ")" {
> +        return propertySet; }
> +    )
> +}
> +
> +/* [96]    PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' ) */
> +private PropertyPathExpression PathOneInPropertySet() : {
> +    UriRef uriRef; } {
> +
> +    (
> +        uriRef=Iri() {
> +        return new PredicatePath(uriRef); }
> +    |
> +        "a" {
> +        return new PredicatePath(RDF_TYPE); }
> +    |
> +        "^"
> +        (
> +            uriRef=Iri() {
> +            return new UnaryPropertyPathOperation("^", new
> PredicatePath(uriRef)); }
> +        |
> +            "a" {
> +            return new UnaryPropertyPathOperation("^", new
> PredicatePath(RDF_TYPE)); }
> +        )
> +    )
> +}
> +
> +/* [97]    Integer ::= INTEGER */
>
>  // Fill in the specified set of TriplePattern and returns the subject node
>  /* [98]    TriplesNode ::= Collection |  BlankNodePropertyList */
> @@ -857,14 +1511,34 @@ private ResourceOrVariable BlankNodeProp
>      {
>      ResourceOrVariable subject = getNewBNode();
>      }
> -    "[" PropertyListNotEmpty(subject, triplePatterns) "]" {
> +    "["
> +    PropertyListNotEmpty(subject, triplePatterns)
> +    "]" {
>      return subject; }
>  }
>
> -/*
> -[100] TriplesNodePath ::= CollectionPath |    BlankNodePropertyListPath
> -[101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']'
> -*/
> +/* [100] TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath */
> +private ResourceOrVariable TriplesNodePath(Set<PropertyPathPattern>
> propertyPathPatterns) : {
> +    ResourceOrVariable subject; } {
> +    (
> +        subject=CollectionPath(propertyPathPatterns)
> +    |
> +        subject=BlankNodePropertyListPath(propertyPathPatterns)
> +    ) {
> +    return subject; }
> +}
> +
> +
> +/* [101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']' */
> +private ResourceOrVariable
> BlankNodePropertyListPath(Set<PropertyPathPattern> propertyPathPatterns) :
> {} {
> +    {
> +    ResourceOrVariable subject = getNewBNode();
> +    }
> +    "["
> +    PropertyListPathNotEmpty(subject, propertyPathPatterns)
> +    "]" {
> +    return subject; }
> +}
>
>  /* [102]    Collection ::= '(' GraphNode+ ')' */
>  private ResourceOrVariable Collection(Set<TriplePattern> triplePatterns)
> : {
> @@ -872,30 +1546,49 @@ private ResourceOrVariable Collection(Se
>      List<ResourceOrVariable> nodes = new ArrayList<ResourceOrVariable>();
> } {
>
>      "("
> -        (
> +    (
>          node=GraphNode(triplePatterns) {
>          nodes.add(node); }
> -        )+
> +    )+
>      ")" {
>      return addTriplePatterns(triplePatterns, nodes); }
>  }
>
>  /* [103]    CollectionPath ::= '(' GraphNodePath+ ')' */
> +private ResourceOrVariable CollectionPath(Set<PropertyPathPattern>
> propertyPathPatterns) : {
> +    ResourceOrVariable node;
> +    List<ResourceOrVariable> nodes = new ArrayList<ResourceOrVariable>();
> } {
>
> +    "("
> +    (
> +        node=GraphNodePath(propertyPathPatterns) {
> +        nodes.add(node); }
> +    )+
> +    ")" {
> +    return addTriplePatterns(triplePatterns, nodes); }
> +}
>
> -/* [104]    GraphNode ::= VarOrTerm |  TriplesNode */
> +/* [104]    GraphNode ::= VarOrTerm | TriplesNode */
>  private ResourceOrVariable GraphNode(Set<TriplePattern> triplePatterns) :
> {
>      ResourceOrVariable node; } {
> -
>      (
> -    node=VarOrTerm()
> +        node=VarOrTerm()
>      |
> -    node=TriplesNode(triplePatterns)
> +        node=TriplesNode(triplePatterns)
>      ) {
>      return node; }
>  }
>
> -/* [105]    GraphNodePath ::= VarOrTerm |    TriplesNodePath */
> +/* [105]    GraphNodePath ::= VarOrTerm | TriplesNodePath */
> +private ResourceOrVariable GraphNodePath(Set<PropertyPathPattern>
> propertyPathPatterns) : {
> +    ResourceOrVariable node; } {
> +    (
> +        node=VarOrTerm()
> +    |
> +        node=TriplesNodePath(propertyPathPatterns)
> +    ) {
> +    return node; }
> +}
>
>  /* [106]    VarOrTerm ::= Var | GraphTerm */
>  private ResourceOrVariable VarOrTerm() : {
> @@ -903,11 +1596,11 @@ private ResourceOrVariable VarOrTerm() :
>      Variable v; } {
>
>      (
> -    v=Var() {
> -    return new ResourceOrVariable(v); }
> +        v=Var() {
> +        return new ResourceOrVariable(v); }
>      |
> -    r=GraphTerm() {
> -    return r; }
> +        r=GraphTerm() {
> +        return r; }
>      )
>  }
>
> @@ -933,13 +1626,6 @@ private Variable Var() : {
>      return createVariable(t.image); }
>  }
>
> -private String BuiltInCallName() : {
> -    Token t;} {
> -
> -    t=<BUILT_IN_CALL_NAME> {
> -    return t.image; }
> -}
> -
>  /* [109]    GraphTerm ::= Iri | RDFLiteral | NumericLiteral |
> BooleanLiteral | BlankNode | NIL */
>  private ResourceOrVariable GraphTerm() : {
>      ResourceOrVariable bNode = null;
> @@ -1305,6 +1991,13 @@ private BuiltInCall BuiltInCall() : {
>      return new BuiltInCall(name, args); }
>  }
>
> +private String BuiltInCallName() : {
> +    Token t;} {
> +
> +    t=<BUILT_IN_CALL_NAME> {
> +    return t.image; }
> +}
> +
>  /*
>  [125]    ExistsFunc ::= 'EXISTS' GroupGraphPattern
>  [126]    NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern
>
> Modified:
> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
> URL:
> http://svn.apache.org/viewvc/clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java?rev=1516993&r1=1516992&r2=1516993&view=diff
>
> ==============================================================================
> ---
> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
> (original)
> +++
> clerezza/trunk/rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/SparqlPreParserTest.java
> Fri Aug 23 19:29:05 2013
> @@ -58,6 +58,18 @@ public class SparqlPreParserTest {
>          SparqlPreParser parser;
>          parser = new SparqlPreParser(TcManager.getInstance());
>          Set<UriRef> referredGraphs =
> parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
> +
>  Assert.assertTrue(referredGraphs.toArray()[0].equals(DEFAULT_GRAPH));
> +    }
> +
> +    @Test
> +    public void testAllGraphReferenceInSelectQuery() throws
> ParseException {
> +
> +        StringBuilder queryStrBuilder = new StringBuilder();
> +        queryStrBuilder.append("SELECT DISTINCT ?g { GRAPH ?g { ?s ?p ?o
> } }\n");
> +
> +        SparqlPreParser parser;
> +        parser = new SparqlPreParser(TcManager.getInstance());
> +        Set<UriRef> referredGraphs =
> parser.getReferredGraphs(queryStrBuilder.toString(), DEFAULT_GRAPH);
>          Assert.assertTrue(referredGraphs == null);
>      }
>
>
>
>