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 2009/12/14 18:55:43 UTC

svn commit: r890414 - in /incubator/clerezza/issues/CLEREZZA-15: ./ org.apache.clerezza.rdf.core/ org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/ org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sp...

Author: hasan
Date: Mon Dec 14 17:55:41 2009
New Revision: 890414

URL: http://svn.apache.org/viewvc?rev=890414&view=rev
Log:
CLEREZZA-15: fixed bug in serializer

Added:
    incubator/clerezza/issues/CLEREZZA-15/
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/
      - copied from r890277, incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.core/
Modified:
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/StringQuerySerializer.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleAskQuery.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleConstructQuery.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleDescribeQuery.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleGroupGraphPattern.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleOptionalGraphPattern.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleSelectQuery.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleStringQuerySerializer.java
    incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/QuerySerializerTest.java

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/StringQuerySerializer.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/StringQuerySerializer.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/StringQuerySerializer.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/StringQuerySerializer.java Mon Dec 14 17:55:41 2009
@@ -25,11 +25,21 @@
 import org.apache.clerezza.rdf.core.sparql.query.SelectQuery;
 
 /**
+ * This abstract class provides a method to generate a {@link String}
+ * representation of a {@link Query}.
  *
  * @author hasan
  */
 public abstract class StringQuerySerializer {
 
+	/**
+	 * Serializes a {@link Query} object to a {@link String}.
+	 *
+	 * @param query
+	 *		the Query object to be serialized
+	 * @return
+	 *		a String representation of the specified Query object.
+	 */
 	public String serialize(Query query) {
 		if (query instanceof SelectQuery) {
 			return serialize((SelectQuery) query);
@@ -42,11 +52,43 @@
 		}
 	}
 
+	/**
+	 * Serializes a {@link SelectQuery} object to a {@link String}.
+	 *
+	 * @param selectQuery
+	 *		the SelectQuery object to be serialized
+	 * @return
+	 *		a String representation of the specified SelectQuery object.
+	 */
 	public abstract String serialize(SelectQuery selectQuery);
 
+	/**
+	 * Serializes a {@link ConstructQuery} object to a {@link String}.
+	 *
+	 * @param constructQuery
+	 *		the ConstructQuery object to be serialized
+	 * @return
+	 *		a String representation of the specified ConstructQuery object.
+	 */
 	public abstract String serialize(ConstructQuery constructQuery);
 
+	/**
+	 * Serializes a {@link DescribeQuery} object to a {@link String}.
+	 *
+	 * @param describeQuery
+	 *		the DescribeQuery object to be serialized
+	 * @return
+	 *		a String representation of the specified DescribeQuery object.
+	 */
 	public abstract String serialize(DescribeQuery describeQuery);
 
+	/**
+	 * Serializes an {@link AskQuery} object to a {@link String}.
+	 *
+	 * @param askQuery
+	 *		the AskQuery object to be serialized
+	 * @return
+	 *		a String representation of the specified AskQuery object.
+	 */
 	public abstract String serialize(AskQuery askQuery);
 }

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleAskQuery.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleAskQuery.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleAskQuery.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleAskQuery.java Mon Dec 14 17:55:41 2009
@@ -28,6 +28,6 @@
 
 	@Override
 	public String toString() {
-		return SimpleStringQuerySerializer.getInstance().serialize(this);
+		return (new SimpleStringQuerySerializer()).serialize(this);
 	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleConstructQuery.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleConstructQuery.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleConstructQuery.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleConstructQuery.java Mon Dec 14 17:55:41 2009
@@ -45,6 +45,6 @@
 
 	@Override
 	public String toString() {
-		return SimpleStringQuerySerializer.getInstance().serialize(this);
+		return (new SimpleStringQuerySerializer()).serialize(this);
 	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleDescribeQuery.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleDescribeQuery.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleDescribeQuery.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleDescribeQuery.java Mon Dec 14 17:55:41 2009
@@ -55,6 +55,6 @@
 
 	@Override
 	public String toString() {
-		return SimpleStringQuerySerializer.getInstance().serialize(this);
+		return (new SimpleStringQuerySerializer()).serialize(this);
 	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleGroupGraphPattern.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleGroupGraphPattern.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleGroupGraphPattern.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleGroupGraphPattern.java Mon Dec 14 17:55:41 2009
@@ -25,9 +25,11 @@
 import org.apache.clerezza.rdf.core.sparql.query.Expression;
 import org.apache.clerezza.rdf.core.sparql.query.GraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.GroupGraphPattern;
+import org.apache.clerezza.rdf.core.sparql.query.OptionalGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.TriplePattern;
 
 /**
+ * This class implements {@link GroupGraphPattern}.
  *
  * @author hasan
  */
@@ -46,14 +48,37 @@
 		return constraints;
 	}
 
+	/**
+	 * Adds a {@link GraphPattern} to the group.
+	 *
+	 * @param graphPattern
+	 *		the GraphPattern to be added.
+	 */
 	public void addGraphPattern(GraphPattern graphPattern) {
 		graphPatterns.add(graphPattern);
 	}
 
+	/**
+	 * Adds a constraint to the {@link GroupGraphPattern}.
+	 *
+	 * @param constraint
+	 *		an {@link Expression} as the constraint to be added.
+	 */
 	public void addConstraint(Expression constraint) {
 		constraints.add(constraint);
 	}
 
+	/**
+	 * If the last {@link GraphPattern} added to the group is not a 
+	 * {@link SimpleBasicGraphPattern}, then creates one containing the 
+	 * specified {@link TriplePattern}s and adds it to the group.
+	 * Otherwise, adds the specified {@link TriplePattern}s to the last
+	 * added {@link SimpleBasicGraphPattern} in the group.
+	 * 
+	 * @param triplePatterns
+	 *		a set of {@link TriplePattern}s to be added into a 
+	 *		{@link SimpleBasicGraphPattern} of the group.
+	 */
 	public void addTriplePatterns(Set<TriplePattern> triplePatterns) {
 		GraphPattern prevGraphPattern;
 		int size = graphPatterns.size();
@@ -68,6 +93,17 @@
 		graphPatterns.add(new SimpleBasicGraphPattern(triplePatterns));
 	}
 
+	/**
+	 * Adds an {@link OptionalGraphPattern} to the group consisting of
+	 * a main graph pattern and the specified {@link GroupGraphPattern} as
+	 * the optional pattern.
+	 * The main graph pattern is taken from the last added {@link GraphPattern}
+	 * in the group, if it exists. Otherwise, the main graph pattern is null.
+	 *
+	 * @param optional
+	 *		a {@link GroupGraphPattern} as the optional pattern of
+	 *		an {@link OptionalGraphPattern}.
+	 */
 	public void addOptionalGraphPattern(GroupGraphPattern optional) {
 
 		GraphPattern prevGraphPattern = null;

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleOptionalGraphPattern.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleOptionalGraphPattern.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleOptionalGraphPattern.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleOptionalGraphPattern.java Mon Dec 14 17:55:41 2009
@@ -23,7 +23,8 @@
 import org.apache.clerezza.rdf.core.sparql.query.OptionalGraphPattern;
 
 /**
- * 
+ * This class implements {@link OptionalGraphPattern}.
+ *
  * @author hasan
  */
 public class SimpleOptionalGraphPattern implements OptionalGraphPattern {
@@ -31,15 +32,26 @@
 	private GraphPattern mainGraphPattern;
 	private GroupGraphPattern optionalGraphPattern;
 
+	/**
+	 * Constructs an {@link OptionalGraphPattern} out of a {@link GraphPattern}
+	 * as the main graph pattern and a {@link GroupGraphPattern} as the 
+	 * optional pattern.
+	 * 
+	 * @param mainGraphPattern
+	 *		a {@link GraphPattern} specifying the main pattern.
+	 * @param optionalGraphPattern
+	 *		a {@link GroupGraphPattern} specifying the optional pattern.
+	 */
 	public SimpleOptionalGraphPattern(GraphPattern mainGraphPattern,
 			GroupGraphPattern optionalGraphPattern) {
-		if (mainGraphPattern == null) {
-			throw new IllegalArgumentException("Main graph pattern may not be null");
-		}
 		if (optionalGraphPattern == null) {
 			throw new IllegalArgumentException("Optional graph pattern may not be null");
 		}
-		this.mainGraphPattern = mainGraphPattern;
+		if (mainGraphPattern == null) {
+			this.mainGraphPattern = new SimpleGroupGraphPattern();
+		} else {
+			this.mainGraphPattern = mainGraphPattern;
+		}
 		this.optionalGraphPattern = optionalGraphPattern;
 	}
 

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleSelectQuery.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleSelectQuery.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleSelectQuery.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleSelectQuery.java Mon Dec 14 17:55:41 2009
@@ -74,6 +74,6 @@
 
 	@Override
 	public String toString() {
-		return SimpleStringQuerySerializer.getInstance().serialize(this);
+		return (new SimpleStringQuerySerializer()).serialize(this);
 	}
 }

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleStringQuerySerializer.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleStringQuerySerializer.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleStringQuerySerializer.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/main/java/org/apache/clerezza/rdf/core/sparql/query/impl/SimpleStringQuerySerializer.java Mon Dec 14 17:55:41 2009
@@ -45,21 +45,18 @@
 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.Variable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
+ * This class implements abstract methods of {@link StringQuerySerializer}
+ * to serialize specific {@link Query} types.
  *
  * @author hasan
  */
 public class SimpleStringQuerySerializer extends StringQuerySerializer {
 
-	static final SimpleStringQuerySerializer instance = new SimpleStringQuerySerializer();
-
-	private SimpleStringQuerySerializer() {
-	}
-
-	public static StringQuerySerializer getInstance() {
-		return instance;
-	}
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
 	@Override
 	public String serialize(SelectQuery selectQuery) {
@@ -108,50 +105,20 @@
 		if (queryPattern == null) {
 			return;
 		}
-		s.append("WHERE\n{\n");
-		appendQueryPattern(s, q.getQueryPattern());
-		s.append("\n}\n");
-	}
-
-	private void appendQueryPattern(StringBuffer s, GroupGraphPattern g) {
-
-		for (GraphPattern p : g.getGraphPatterns()) {
-			if (p instanceof BasicGraphPattern) {
-				appendTriplePatterns(s,
-						((BasicGraphPattern) p).getTriplePatterns());
-			} else if (p instanceof GroupGraphPattern) {
-				s.append(" {");
-				appendQueryPattern(s, (GroupGraphPattern) p);
-				s.append("} ");
-			} else if (p instanceof OptionalGraphPattern) {
-				appendQueryPattern(s,
-						(GroupGraphPattern) ((OptionalGraphPattern) p).getMainGraphPattern());
-				s.append(" OPTIONAL ");
-				appendQueryPattern(s,
-						((OptionalGraphPattern) p).getOptionalGraphPattern());
-			} else if (p instanceof AlternativeGraphPattern) {
-				List<GroupGraphPattern> alternativeGraphPatterns =
-						((AlternativeGraphPattern) p).getAlternativeGraphPatterns();
-				if ((alternativeGraphPatterns != null) &&
-						(!alternativeGraphPatterns.isEmpty())) {
-					appendQueryPattern(s, alternativeGraphPatterns.get(0));
-					int size = alternativeGraphPatterns.size();
-					int i = 1;
-					while (i < size) {
-						s.append(" UNION ");
-						appendQueryPattern(s, alternativeGraphPatterns.get(i));
-						i++;
-					}
-				}
-			} else if (p instanceof GraphGraphPattern) {
-				s.append("GRAPH ");
-				appendResourceOrVariable(s, ((GraphGraphPattern) p).getGraph());
-				s.append(" ");
-				appendQueryPattern(s, ((GraphGraphPattern) p).getGroupGraphPattern());
-			}
+		s.append("WHERE\n");
+		appendGroupGraphPattern(s, q.getQueryPattern());
+	}
+
+	private void appendGroupGraphPattern(StringBuffer s,
+			GroupGraphPattern groupGraphPattern) {
+
+		s.append("{ ");
+		for (GraphPattern graphPattern : groupGraphPattern.getGraphPatterns()) {
+			appendGraphPattern(s, graphPattern);
 		}
-		for (Expression e : g.getFilter()) {
-			boolean brackettedExpr = !((e instanceof BuiltInCall) || (e instanceof FunctionCall));
+		for (Expression e : groupGraphPattern.getFilter()) {
+			boolean brackettedExpr = !((e instanceof BuiltInCall)
+					|| (e instanceof FunctionCall));
 			s.append("FILTER ");
 			if (brackettedExpr) {
 				s.append("(");
@@ -162,6 +129,43 @@
 			}
 			s.append("\n");
 		}
+		s.append("} ");
+	}
+
+	private void appendGraphPattern(StringBuffer s, GraphPattern graphPattern) {
+		if (graphPattern instanceof BasicGraphPattern) {
+			appendTriplePatterns(s,
+					((BasicGraphPattern) graphPattern).getTriplePatterns());
+		} else if (graphPattern instanceof GroupGraphPattern) {
+			appendGroupGraphPattern(s, (GroupGraphPattern) graphPattern);
+		} else if (graphPattern instanceof OptionalGraphPattern) {
+			appendGraphPattern(s,
+					((OptionalGraphPattern) graphPattern).getMainGraphPattern());
+			s.append(" OPTIONAL ");
+			appendGroupGraphPattern(s,
+					((OptionalGraphPattern) graphPattern).getOptionalGraphPattern());
+		} else if (graphPattern instanceof AlternativeGraphPattern) {
+			List<GroupGraphPattern> alternativeGraphPatterns =
+					((AlternativeGraphPattern) graphPattern).getAlternativeGraphPatterns();
+			if ((alternativeGraphPatterns != null) &&
+					(!alternativeGraphPatterns.isEmpty())) {
+				appendGroupGraphPattern(s, alternativeGraphPatterns.get(0));
+				int size = alternativeGraphPatterns.size();
+				int i = 1;
+				while (i < size) {
+					s.append(" UNION ");
+					appendGroupGraphPattern(s, alternativeGraphPatterns.get(i));
+					i++;
+				}
+			}
+		} else if (graphPattern instanceof GraphGraphPattern) {
+			s.append("GRAPH ");
+			appendResourceOrVariable(s, ((GraphGraphPattern) graphPattern).getGraph());
+			s.append(" ");
+			appendGroupGraphPattern(s, ((GraphGraphPattern) graphPattern).getGroupGraphPattern());
+		} else {
+			logger.warn("Unsupported GraphPattern {}", graphPattern.getClass());
+		}
 	}
 
 	private void appendTriplePatterns(StringBuffer s,

Modified: incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/QuerySerializerTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/QuerySerializerTest.java?rev=890414&r1=890277&r2=890414&view=diff
==============================================================================
--- incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/QuerySerializerTest.java (original)
+++ incubator/clerezza/issues/CLEREZZA-15/org.apache.clerezza.rdf.core/src/test/java/org/apache/clerezza/rdf/core/sparql/QuerySerializerTest.java Mon Dec 14 17:55:41 2009
@@ -35,6 +35,7 @@
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleConstructQuery;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleDescribeQuery;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleGroupGraphPattern;
+import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleOptionalGraphPattern;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleOrderCondition;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleSelectQuery;
 import org.apache.clerezza.rdf.core.sparql.query.impl.SimpleTriplePattern;
@@ -202,4 +203,45 @@
 		Assert.assertTrue(selectQuery.toString()
 				.replaceAll("( |\n)+", " ").trim().equals(queryString));
 	}
+
+	@Test
+	public void testOptional() {
+
+		final String queryString = "SELECT ?title ?price WHERE { " +
+				"?x <http://purl.org/dc/elements/1.1/title> ?title . " +
+				"OPTIONAL { ?x <http://example.org/ns#price> ?price . } " +
+				"}";
+
+		Variable title = new Variable("title");
+		Variable price = new Variable("price");
+		SimpleSelectQuery selectQuery = new SimpleSelectQuery();
+		selectQuery.addSelection(title);
+		selectQuery.addSelection(price);
+
+		Variable x = new Variable("x");
+		Set<TriplePattern> triplePatterns = new HashSet<TriplePattern>();
+		triplePatterns.add(new SimpleTriplePattern(x,
+				new UriRef("http://purl.org/dc/elements/1.1/title"), title));
+
+		SimpleBasicGraphPattern bgp = new SimpleBasicGraphPattern(triplePatterns);
+
+		Set<TriplePattern> triplePatternsOpt = new HashSet<TriplePattern>();
+		triplePatternsOpt.add(new SimpleTriplePattern(x,
+				new UriRef("http://example.org/ns#price"), price));
+
+		SimpleBasicGraphPattern bgpOpt =
+				new SimpleBasicGraphPattern(triplePatternsOpt);
+
+		SimpleGroupGraphPattern ggpOpt = new SimpleGroupGraphPattern();
+		ggpOpt.addGraphPattern(bgpOpt);
+
+		SimpleOptionalGraphPattern ogp = new SimpleOptionalGraphPattern(bgp, ggpOpt);
+
+		SimpleGroupGraphPattern queryPattern = new SimpleGroupGraphPattern();
+		queryPattern.addGraphPattern(ogp);
+		selectQuery.setQueryPattern(queryPattern);
+
+		Assert.assertTrue(selectQuery.toString()
+				.replaceAll("( |\n)+", " ").trim().equals(queryString));
+	}
 }