~ added a SELECT var to assymDisj1
authorEric Prud'hommeaux <eric@w3.org>
Sat, 09 Jan 2010 10:37:57 -0500
changeset 136 5aa8c9c0a6e2
parent 135 434a54e4588c
child 137 aafd5a43289d
~ added a SELECT var to assymDisj1
src/main/scala/RDB2RDFMain.scala
src/main/scala/SQL.scala
src/test/scala/RDB2RDFTest.scala
src/test/scala/SQLTest.scala
--- a/src/main/scala/RDB2RDFMain.scala	Sat Jan 09 00:49:31 2010 -0500
+++ b/src/main/scala/RDB2RDFMain.scala	Sat Jan 09 10:37:57 2010 -0500
@@ -173,13 +173,13 @@
 	  case sparql.SUri(u) => uriConstraint(stateP, sql.RelAliasAttribute(relalias, db.relationdescs(rel).primarykey.get), u, true)
 	  case sparql.SVar(v) => varConstraint(stateP, relalias, db.relationdescs(rel).primarykey, v, db, rel)
 	}
-	val state_subjJoin = R2RState(state_postSubj.joins + sql.InnerJoin(sql.AliasedResource(rel,relalias)), state_postSubj.varmap, state_postSubj.exprs)
+	val state_subjJoin = R2RState(state_postSubj.joins + sql.InnerJoin(sql.AliasedResource(rel,relalias), None), state_postSubj.varmap, state_postSubj.exprs)
 
 	try { db.relationdescs(rel).attributes(attr) } catch {
 	  case e:java.util.NoSuchElementException =>
 	    throw new Exception("error processing { " + s + " " + p + " " + o + " } :db.relationdescs(" + rel + ").attributes(" + attr + ") not found in " + db)
 	}
-	val (targetattr, targetrel, dt, state_fkeys:R2RState) = db.relationdescs(rel).attributes(attr) match {
+	val (targetattr:sql.RelAliasAttribute, targetrel, dt, state_fkeys:R2RState) = db.relationdescs(rel).attributes(attr) match {
 	  case sql.ForeignKey(fkrel, fkattr) => {
 	    try { db.relationdescs(fkrel).attributes(fkattr) } catch {
 	      case e:java.util.NoSuchElementException =>
@@ -194,7 +194,7 @@
 	    if (enforceForeignKeys) {
 	      val oRelAlias = relAliasFromO(o)
 	      val fkaliasattr = sql.RelAliasAttribute(oRelAlias, fkattr)
-	      val state_t = R2RState(state_subjJoin.joins + sql.InnerJoin(sql.AliasedResource(fkrel,oRelAlias)),
+	      val state_t = R2RState(state_subjJoin.joins + sql.InnerJoin(sql.AliasedResource(fkrel,oRelAlias), None),
 				     state_subjJoin.varmap,
 				     state_subjJoin.exprs + sql.RelationalExpressionEq(sql.PrimaryExpressionAttr(fkaliasattr),
 										       sql.PrimaryExpressionAttr(objattr)))
@@ -449,7 +449,7 @@
 	  (outerState2, no+1)
 	})
 	val subselect = sql.Subselect(sql.Union(subselects))
-	R2RState(state.joins + sql.InnerJoin(sql.AliasedResource(subselect,unionAlias)), state2.varmap, state2.exprs)
+	R2RState(state.joins + sql.InnerJoin(sql.AliasedResource(subselect,unionAlias), None), state2.varmap, state2.exprs)
       }
       case sparql.OptionalGraphPattern(gp) => {
 	/* state_postLeadingTable: create an initial table if the first conjoint is optional.
@@ -463,7 +463,7 @@
 							 sql.AttrAlias(sql.Name("_EMPTY_"))))),
 		sql.TableList(util.AddOrderedSet()),
 		None
-	      )), sql.RelAlias(sql.Name("_EMPTY_")))), state.varmap, state.exprs)
+	      )), sql.RelAlias(sql.Name("_EMPTY_"))), None), state.varmap, state.exprs)
 	  else
 	    state
 
--- a/src/main/scala/SQL.scala	Sat Jan 09 00:49:31 2010 -0500
+++ b/src/main/scala/SQL.scala	Sat Jan 09 10:37:57 2010 -0500
@@ -66,7 +66,7 @@
 }
 
 sealed abstract class Join(res:AliasedResource)
-case class InnerJoin(res:AliasedResource) extends Join(res) {
+case class InnerJoin(res:AliasedResource, optOn:Option[Expression]) extends Join(res) {
   override def toString = "\n       INNER JOIN " + res
 }
 case class LeftOuterJoin(res:AliasedResource, on:Expression) extends Join(res) {
@@ -230,12 +230,12 @@
 
   def tablelist:Parser[(TableList, Set[Expression])] =
     "FROM" ~ aliasedjoin ~ rep(innerORouter) ^^
-    { case "FROM"~aj~l => (TableList(AddOrderedSet(InnerJoin(aj) :: l.map((one) => one._1))), 
+    { case "FROM"~aj~l => (TableList(AddOrderedSet(InnerJoin(aj, None) :: l.map((one) => one._1))), 
 			   l.foldLeft(Set[Expression]())((all, one) => all ++ one._2)) }
 
   def innerORouter:Parser[(Join, Set[Expression])] = (
       "INNER" ~ "JOIN" ~ aliasedjoin ~ opt("ON" ~ expression) ^^
-      { case "INNER"~"JOIN"~a~o => (InnerJoin(a), { if (o.isDefined) Set(o.get._2) else Set[Expression]() } ) }
+      { case "INNER"~"JOIN"~a~o => (InnerJoin(a, None), { if (o.isDefined) Set(o.get._2) else Set[Expression]() } ) }
     | "LEFT" ~ "OUTER" ~ "JOIN" ~ aliasedjoin ~ "ON" ~ expression ^^
       { case l~o~j~alijoin~on~expr => (LeftOuterJoin(alijoin, expr), Set[Expression]()) }
   )
@@ -292,11 +292,11 @@
       else None
     val strippedTables = tablelist.joins.foldLeft(AddOrderedSet[Join]())((set, join) => set + {
       join match {
-	case InnerJoin(AliasedResource(rel, as)) => InnerJoin(AliasedResource({ rel match {
+	case InnerJoin(AliasedResource(rel, as), optOn) => InnerJoin(AliasedResource({ rel match {
 	  case Subselect(s:Select) => Subselect(PrettySql(s).makePretty())
 	  case Subselect(Union(disjoints)) => Subselect(Union(disjoints.map(s => PrettySql(s).makePretty())))
 	  case r:Relation => r
-	}}, as))
+	}}, as), None)
 	case LeftOuterJoin(AliasedResource(rel, as), on:Expression) => LeftOuterJoin(AliasedResource({ rel match {
 	  case Subselect(s:Select) => Subselect(PrettySql(s).makePretty())
 	  case Subselect(Union(disjoints)) => Subselect(Union(disjoints.map(s => PrettySql(s).makePretty())))
--- a/src/test/scala/RDB2RDFTest.scala	Sat Jan 09 00:49:31 2010 -0500
+++ b/src/test/scala/RDB2RDFTest.scala	Sat Jan 09 10:37:57 2010 -0500
@@ -534,7 +534,7 @@
 PREFIX task : <http://hr.example/DB/Tasks#>
 PREFIX tass : <http://hr.example/DB/TaskAssignments#>
 PREFIX xsd : <http://www.w3.org/2001/XMLSchema#>
-SELECT ?name
+SELECT ?name ?bday
  WHERE { { ?above   tass:employee  ?who .
            ?above   tass:task      ?atask .
            ?atask   task:lead      ?taskLead .
@@ -550,7 +550,7 @@
 """).get
     val sqlParser = Sql()
     val parsed = sqlParser.parseAll(sqlParser.select, """
-SELECT G_union0.name AS name
+SELECT G_union0.name AS name, G_union0.bday AS bday
   FROM (
          SELECT R_above.id AS above, R_above.task AS atask, NULL AS bday, NULL AS below,
                 NULL AS btask, NULL AS managed, R_taskLead.lastName AS name,
--- a/src/test/scala/SQLTest.scala	Sat Jan 09 00:49:31 2010 -0500
+++ b/src/test/scala/SQLTest.scala	Sat Jan 09 10:37:57 2010 -0500
@@ -73,8 +73,8 @@
     val expected = Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),
 									     Attribute(Name("lastName"))),
 							   AttrAlias(Name("A_empName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
-						  InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
+						  InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None))),
 			  Some(
 			    RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id")))),
 						   PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("manager")))))))
@@ -92,8 +92,8 @@
     val expected = Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),
 									     Attribute(Name("lastName"))),
 							   AttrAlias(Name("A_empName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
-						  InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
+						  InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None))),
 			  Some(
 			    RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id")))),
 						   PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("manager")))))))
@@ -115,8 +115,8 @@
 					     NamedAttribute(RelAliasAttribute(RelAlias(Name("R_manager")),
 									      Attribute(Name("lastName"))),
 							    AttrAlias(Name("A_managName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
-					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None))),
 			  Some(ExprConjunction(Set(
 			    RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id")))),
 						   PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("manager"))))),
@@ -135,7 +135,7 @@
     val expected = Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),
 									      Attribute(Name("lastName"))),
 							    AttrAlias(Name("A_empName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None))),
 			  Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("manager")))),
 									  PrimaryExpressionTyped(Datatype.INTEGER,Name("18"))),
 					  RelationalExpressionNotNull(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("lastName")))))))))
@@ -153,8 +153,8 @@
     val expected = Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),
 									      Attribute(Name("lastName"))),
 							    AttrAlias(Name("A_empName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
-					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None))),
 			  Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("manager")))),
 									  PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id"))))),
 					  RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("lastName")))),
@@ -182,11 +182,11 @@
 							   AttrAlias(Name("A_empName"))),
 					    NamedAttribute(RelAliasAttribute(RelAlias(Name("R_grandManager")),Attribute(Name("lastName"))),
 							   AttrAlias(Name("A_grandManagName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
-					InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_lower")))),
-					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager")))),
-					InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_upper")))),
-					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_grandManager")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_lower"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_upper"))), None),
+					InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_grandManager"))), None))),
 			  Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_lower")),Attribute(Name("manages")))),
 									  PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("id"))))),
 					 RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id")))),
@@ -224,15 +224,15 @@
 """
     val expected = Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_union1")), Attribute(Name("name"))),
 							   AttrAlias(Name("A_name"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_who")))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_who"))), None),
 					InnerJoin(AliasedResource(Subselect(Union(Set(
 					  Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_manager")), Attribute(Name("lastName"))),
 										  AttrAlias(Name("A_name"))), 
 								   NamedAttribute(RelAliasAttribute(RelAlias(Name("R_above")), Attribute(Name("manages"))),
 										  AttrAlias(Name("A_who"))))),
 						 TableList(AddOrderedSet(
-						   InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above")))),
-						   InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))))
+						   InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above"))), None),
+						   InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_manager"))), None)
 						 )), 
 						 Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_above")),Attribute(Name("manager")))),
 												 PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_manager")),Attribute(Name("id"))))),
@@ -242,13 +242,13 @@
 								   NamedAttribute(RelAliasAttribute(RelAlias(Name("R_below")), Attribute(Name("manager"))),
 										  AttrAlias(Name("A_who"))))),
 						 TableList(AddOrderedSet(
-						   InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_below")))),
-						   InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_managed"))))
+						   InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_below"))), None),
+						   InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_managed"))), None)
 						 )), 
 						 Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_below")),Attribute(Name("manages")))),
 												 PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_managed")),Attribute(Name("id"))))),
 								RelationalExpressionNotNull(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_managed")),Attribute(Name("lastName")))))))))))),
-							RelAlias(Name("R_union1")))))), 
+							RelAlias(Name("R_union1"))), None))), 
 			  Some(ExprConjunction(Set(RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_union1")),Attribute(Name("A_who")))),
 									  PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_who")),Attribute(Name("id"))))),
 					 RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_who")),Attribute(Name("lastName")))),
@@ -268,7 +268,7 @@
 							    AttrAlias(Name("A_who"))),
 					     NamedAttribute(ConstNULL(),
 							    AttrAlias(Name("A_bday"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above"))), None))),
 			  Some(
 			    RelationalExpressionNotNull(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_above")),Attribute(Name("id")))))))
     assert(expected === (a.parseAll(a.select, e).get))
@@ -289,7 +289,7 @@
 								       PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("id")))),
 								       PrimaryExpressionTyped(Datatype("String"),Name("#record")))),
 							    AttrAlias(Name("A_emp"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None))),
 			  None)
     assert(expected === (a.parseAll(a.select, e).get))
   }
@@ -306,7 +306,7 @@
 							    AttrAlias(Name("A_who"))),
 					     NamedAttribute(ConstNULL(),
 							    AttrAlias(Name("A_bday"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above")))))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_above"))), None))),
 			  Some(
 			    ExprDisjunction(Set(
 			      RelationalExpressionNotNull(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_above")),Attribute(Name("id"))))),
@@ -333,7 +333,7 @@
 					     NamedAttribute(RelAliasAttribute(RelAlias(Name("R_mang")),
 									      Attribute(Name("manageName"))),
 							    AttrAlias(Name("A_manageName"))))),
-			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
+			  TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
 					LeftOuterJoin(AliasedResource(Relation(Name("Manage")),RelAlias(Name("R_mang"))),
 						      RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_mang")),Attribute(Name("emp")))),
 									     PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("id"))))
@@ -358,11 +358,11 @@
     val expected = 
       Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("lastName"))),AttrAlias(Name("A_empName"))),
 			       NamedAttribute(RelAliasAttribute(RelAlias(Name("R_mang")),Attribute(Name("manageName"))),AttrAlias(Name("A_manageName"))))),
-	     TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))),
+	     TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None),
 			   LeftOuterJoin(AliasedResource(
 			     Subselect(Select(AttributeList(Set(NamedAttribute(RelAliasAttribute(RelAlias(Name("R_emp")),Attribute(Name("lastName"))),AttrAlias(Name("A_empName"))),
 						      NamedAttribute(RelAliasAttribute(RelAlias(Name("R_mang")),Attribute(Name("manageName"))),AttrAlias(Name("A_manageName"))))),
-				    TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp")))))),
+				    TableList(AddOrderedSet(InnerJoin(AliasedResource(Relation(Name("Employee")),RelAlias(Name("R_emp"))), None))),
 				    None)),
 			     RelAlias(Name("R_mang"))),
 					 RelationalExpressionEq(PrimaryExpressionAttr(RelAliasAttribute(RelAlias(Name("R_mang")),Attribute(Name("emp")))),