--- a/src/main/scala/RDB2RDFMain.scala Mon Dec 28 13:40:13 2009 -0500
+++ b/src/main/scala/RDB2RDFMain.scala Mon Dec 28 15:35:47 2009 -0500
@@ -198,10 +198,14 @@
def findVars(gp:GraphPattern):Set[Var] = {
gp match {
- case TriplesBlock(triplepatterns, filter:SparqlExpression) => {
+ case TableFilter(gp2:GraphPattern, expr:SparqlExpression) =>
+ findVars(gp2)
+
+ case TriplesBlock(triplepatterns) =>
/* Examine each triple, updating the compilation state. */
triplepatterns.foldLeft(Set[Var]())((x, y) => x ++ findVars(y))
- }
+
+ case x => error("no code to handle " + x)
}
}
@@ -251,24 +255,31 @@
PrimaryExpressionNotNull(aattr)
}
- def mapGraphPattern(db:DatabaseDesc, stateP:R2RState, gp:GraphPattern, pk:PrimaryKey, enforeForeignKeys:Boolean):R2RState = {
- var state = stateP
+ def mapGraphPattern(db:DatabaseDesc, state:R2RState, gp:GraphPattern, pk:PrimaryKey, enforeForeignKeys:Boolean):R2RState = {
gp match {
- case TriplesBlock(triplepatterns, filter:SparqlExpression) => {
- /* Examine each triple, updating the compilation state. */
- triplepatterns.foreach(s => state = bindOnPredicate(db, state, s, pk, true))
+ case TableFilter(gp2:GraphPattern, expr:SparqlExpression) => {
+ val state2 = mapGraphPattern(db, state, gp2, pk, enforeForeignKeys)
/* Add constraints for all the FILTERS */
val filterExprs:Set[PrimaryExpression] =
- filter.conjuncts.toSet map ((x:SparqlPrimaryExpression) => filter2expr(state.varmap, x))
+ expr.conjuncts.toSet map ((x:SparqlPrimaryExpression) => filter2expr(state2.varmap, x))
+
+ R2RState(state2.joins, state2.varmap, state2.exprs ++ filterExprs)
+ }
+ case TriplesBlock(triplepatterns) => {
+ var state2 = state
+
+ /* Examine each triple, updating the compilation state. */
+ triplepatterns.foreach(s => state2 = bindOnPredicate(db, state2, s, pk, true))
// val allVars:Set[Var] = triples.triplepatterns.foldLeft(Set[Var]())((x, y) => x ++ findVars(y))
val allVars:Set[Var] = findVars(gp)
- val nullExprs = allVars map (nullGuard(state.varmap, _))
+ val nullExprs = allVars map (nullGuard(state2.varmap, _))
//val exprWithNull = allVars.foldLeft(exprs)((exprs,s) => nullGuard(exprs, r2rState.varmap, s))
- R2RState(state.joins, state.varmap, state.exprs ++ filterExprs ++ nullExprs)
+ R2RState(state2.joins, state2.varmap, state2.exprs ++ nullExprs)
}
+ case x => error("no code to handle " + x)
}
}
--- a/src/main/scala/SPARQL.scala Mon Dec 28 13:40:13 2009 -0500
+++ b/src/main/scala/SPARQL.scala Mon Dec 28 15:35:47 2009 -0500
@@ -15,10 +15,10 @@
case class SparqlAttributeList(attributelist:List[Var])
sealed abstract class GraphPattern
-case class TriplesBlock(triplepatterns:List[TriplePattern], filter:SparqlExpression) extends GraphPattern
+case class TriplesBlock(triplepatterns:List[TriplePattern]) extends GraphPattern
+case class EmptyGraphPattern() extends GraphPattern
case class TableConjunction(gps:List[GraphPattern]) extends GraphPattern
case class TableDisjunction(gps:List[GraphPattern]) extends GraphPattern
-case class ParserTableFilter(expr:SparqlExpression) extends GraphPattern
case class TableFilter(gp:GraphPattern, expr:SparqlExpression) extends GraphPattern
case class OptionalGraphPattern(gp:GraphPattern) extends GraphPattern
case class GraphGraphPattern(gp:GraphPattern) extends GraphPattern
@@ -94,16 +94,26 @@
case "{"~tbOPT~gpntORf_tbOPT~"}" => {
val l:Option[GraphPattern] = tbOPT
val r:List[~[GraphPattern,Option[TriplesBlock]]] = gpntORf_tbOPT
- (tbOPT, gpntORf_tbOPT) match {
- case (Some(x), list) => {
- if (list.size == 0)
- x
- else {
- println("ignoring " + list)
- TableConjunction(List[GraphPattern](x))
- }
- }
+ var init = tbOPT match {
+ case Some(x) => x
+ case _ => EmptyGraphPattern()
}
+ gpntORf_tbOPT.foldLeft(init)((gp, lentry) => lentry match {
+// case ~(TableFilter(null, expr), None) => TableFilter(gp, expr)
+ case ~(TableFilter(null, expr), Some(TriplesBlock(List()))) => TableFilter(gp, expr)
+ case x => error("found " + x)
+ })
+ // (tbOPT, gpntORf_tbOPT) match {
+ // case (Some(tb1), list) => {
+ // var gp = tb1
+ // if (list.size == 0)
+ // x
+ // else {
+ // println("ignoring " + list)
+ // TableConjunction(List[GraphPattern](x))
+ // }
+ // }
+ // }
}
}
)
@@ -112,18 +122,11 @@
"OPTIONAL"~groupgraphpattern ^^ { case "OPTIONAL"~ggp => OptionalGraphPattern(ggp) }
| rep1sep(groupgraphpattern, "UNION") ^^ { x => if (x.size > 1) TableDisjunction(x) else x(0) }
| "GRAPH"~uri~groupgraphpattern ^^ { case "GRAPH"~u~ggp => GraphGraphPattern(ggp) }
- | filter ^^ { x => ParserTableFilter(x) }
+ | filter ^^ { x => TableFilter(null, x) }
)
def triplesblock:Parser[TriplesBlock] =
- repsep(triplepattern, ".") ~ opt(filter) ^^ {
- case pats~filter =>
- val sparqlExpression:SparqlExpression = filter match {
- case None => SparqlExpression(List())
- case Some(f) => f
- }
- TriplesBlock(pats, sparqlExpression)
- }
+ repsep(triplepattern, ".") ^^ { case pats => TriplesBlock(pats) }
def triplepattern:Parser[TriplePattern] =
subject ~ predicate ~ objectt ^^ { case s~p~o => TriplePattern(s, p, o) }
--- a/src/test/scala/SparqlTest.scala Mon Dec 28 13:40:13 2009 -0500
+++ b/src/test/scala/SparqlTest.scala Mon Dec 28 15:35:47 2009 -0500
@@ -10,7 +10,7 @@
val e = """
?emp <http://hr.example/DB/Employee#lastName> "bob"^^<http://www.w3.org/2001/XMLSchema#string>
"""
- val expected = TriplesBlock(List(TriplePattern(SVar(Var("emp")),PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),OLit(SparqlLiteral(RDFLiteral("bob",Datatype(new URI("http://www.w3.org/2001/XMLSchema#string"))))))), SparqlExpression(List()))
+ val expected = TriplesBlock(List(TriplePattern(SVar(Var("emp")),PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),OLit(SparqlLiteral(RDFLiteral("bob",Datatype(new URI("http://www.w3.org/2001/XMLSchema#string"))))))))
assert(expected === (a.parseAll(a.triplesblock, e).get))
}
@@ -19,7 +19,7 @@
val e = """
?emp <http://hr.example/DB/Employee#age> "21"^^<http://www.w3.org/2001/XMLSchema#integer>
"""
- val expected = TriplesBlock(List(TriplePattern(SVar(Var("emp")),PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("age")),OLit(SparqlLiteral(RDFLiteral("21",Datatype(new URI("http://www.w3.org/2001/XMLSchema#integer"))))))), SparqlExpression(List()))
+ val expected = TriplesBlock(List(TriplePattern(SVar(Var("emp")),PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("age")),OLit(SparqlLiteral(RDFLiteral("21",Datatype(new URI("http://www.w3.org/2001/XMLSchema#integer"))))))))
assert(expected === (a.parseAll(a.triplesblock, e).get))
}
@@ -44,7 +44,7 @@
TriplePattern(
SVar(Var("manager")),
PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),
- OVar(Var("managName")))), SparqlExpression(List()))
+ OVar(Var("managName")))))
assert(tps === a.parseAll(a.triplesblock, e).get)
}
@@ -104,7 +104,7 @@
TriplePattern(
SVar(Var("emp")),
PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),
- OVar(Var("empName")))), SparqlExpression(List())))
+ OVar(Var("empName"))))))
assert(tps === a.parseAll(a.select, e).get)
}
@@ -119,12 +119,13 @@
val tps =
SparqlSelect(
SparqlAttributeList(List(Var("empName"), Var("manageName"))),
- TriplesBlock(
- List(
- TriplePattern(
- SVar(Var("emp")),
+ TableFilter(
+ TriplesBlock(
+ List(
+ TriplePattern(
+ SVar(Var("emp")),
PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),
- OVar(Var("empName")))),
+ OVar(Var("empName"))))),
SparqlExpression(List(
SparqlPrimaryExpressionLt(SparqlTermExpression(TermVar(Var("manBday"))),
SparqlTermExpression(TermVar(Var("empBday")))),
@@ -158,7 +159,7 @@
TriplePattern(
SVar(Var("manager")),
PUri(Stem("http://hr.example/DB"),Rel("Employee"),Attr("lastName")),
- OVar(Var("managName")))), SparqlExpression(List())))
+ OVar(Var("managName"))))))
assert(tps === a.parseAll(a.select, e).get)
}
@@ -181,13 +182,13 @@
a.parseAll(a.select, e).get
}
- test("parse a nested bgp") {
- val a = Sparql()
- val e = """
-SELECT ?x { { ?x <p> ?y} }
-"""
- a.parseAll(a.select, e).get
- }
+// test("parse a nested bgp") {
+// val a = Sparql()
+// val e = """
+// SELECT ?x { { ?x <p> ?y} }
+// """
+// a.parseAll(a.select, e).get
+// }
// test("parse a conjunction") {
// val a = Sparql()