Skip to content

Commit

Permalink
Merge pull request #46 from herminiogg/enhancement-#45
Browse files Browse the repository at this point in the history
Enhancement #45
  • Loading branch information
herminiogg authored Jan 20, 2020
2 parents 6329b67 + 86e6f73 commit 25cd706
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 144 deletions.
2 changes: 1 addition & 1 deletion src/main/java/es/weso/antlr/ShExMLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ leftUnionOption: iteratorQuery | stringOperation ;
rightUnionOption: iteratorQuery | union | stringOperation ;
shape: tripleElement prefixVar '[' (exp | variable) ']' '{' (predicateObject ';')* predicateObject? '}' ;
predicateObject: predicate (objectElement | shapeLink | literalValue) ;
objectElement: prefixVar? '[' (exp | variable) (MATCHING variable)? ']' (XMLSCHEMADATATYPE | LANGTAG)? ;
objectElement: prefixVar? ('[' (exp | variable) (MATCHING variable)? ']' | STRINGOPERATOR) (XMLSCHEMADATATYPE | LANGTAG)? ;
shapeLink: SHAPELINK ;
predicate: (literalValue | A) ;
literalValue: prefixVar variable ;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/es/weso/antlr/ShExMLParser.interp

Large diffs are not rendered by default.

281 changes: 150 additions & 131 deletions src/main/java/es/weso/antlr/ShExMLParser.java

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion src/main/scala-2.12/es/weso/ast/AST.scala
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,15 @@ case class Var(name: String) extends Variable with VarOrIteratorQuery
case class ShapeVar(name: String) extends Variable

case class LiteralObject(prefix: Var, value: String) extends ObjectOrShapeLink
case class LiteralObjectValue(value: String) extends ObjectOrShapeLink

case class PredicateObject(predicate: Predicate, objectOrShapeLink: ObjectOrShapeLink) extends AST
case class Predicate(prefix: String, extension: String) extends AST


sealed trait ObjectOrShapeLink extends AST

case class ObjectElement(prefix: String, action: ExpOrVar, matcher: Option[Var],
case class ObjectElement(prefix: String, action: Option[ExpOrVar], literalValue: Option[LiteralObjectValue], matcher: Option[Var],
dataType: Option[String], langTag: Option[String]) extends ObjectOrShapeLink
case class ShapeLink(shape: ShapeVar) extends ObjectOrShapeLink

Expand Down
10 changes: 8 additions & 2 deletions src/main/scala-2.12/es/weso/parser/ASTCreatorVisitor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,17 @@ class ASTCreatorVisitor extends ShExMLParserBaseVisitor[AST] {

override def visitObjectElement(ctx: ObjectElementContext): AST = {
val prefix = if(ctx.prefixVar() != null) ctx.prefixVar().getText else ""
val expOrVar = if(ctx.variable().size() == 2 || (ctx.variable().size() == 1 && ctx.exp() == null)) createVar(ctx.variable(0)) else visit(ctx.exp()).asInstanceOf[ExpOrVar]
val expOrVar = if(ctx.variable().size() == 2 || (ctx.variable().size() == 1 && ctx.exp() == null))
Some(createVar(ctx.variable(0)))
else if(ctx.exp() != null) Some(visit(ctx.exp()).asInstanceOf[ExpOrVar])
else None
val literalValue = if(ctx.STRINGOPERATOR() != null)
Some(LiteralObjectValue(ctx.STRINGOPERATOR().getText.replaceAll("\"", "")))
else None
val matcherVar = if(ctx.variable(1) == null && ctx.exp() != null) Option(ctx.variable(0)).map(createVar) else Option(ctx.variable(1)).map(createVar)
val dataType = if(ctx.XMLSCHEMADATATYPE() != null) Some(ctx.XMLSCHEMADATATYPE().getText) else None
val langTag = if(ctx.LANGTAG() != null) Some(ctx.LANGTAG().getText.replace("@", "")) else None
ObjectElement(prefix, expOrVar, matcherVar, dataType, langTag)
ObjectElement(prefix, expOrVar, literalValue, matcherVar, dataType, langTag)
}

override def visitShapeLink(ctx: ShapeLinkContext): AST = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ abstract class DefaultUnitVisitor {
doVisit(predicate)
}

case ObjectElement(_, action, _, _, _) => doVisit(action)
case ObjectElement(_, action, _, _, _, _) => action match { case Some(value) => doVisit(value) }

case _ => // do nothing
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala-2.12/es/weso/visitor/DefaultVisitor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ abstract class DefaultVisitor[A, B] {
doVisit(predicate, optionalArgument)
}

case ObjectElement(_, action, _, _, _) => doVisit(action, optionalArgument)
case ObjectElement(_, action, _, _, _, _) => action match { case Some(value) => doVisit(value, optionalArgument) }

case _ => doVisitDefault()

Expand Down
33 changes: 29 additions & 4 deletions src/main/scala-2.12/es/weso/visitor/RDFGeneratorVisitor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class RDFGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
val finalActions = for(a <- actions) yield {
val predicateObjectsWithAutoIncrements = solveAutoIncrementResults(predicateObjectsList, a)
val finalPredicateObjectsList = predicateObjectsWithAutoIncrements.filter(i => i.rootIds.contains(a.id) ||
i.id == a.id || (i.id.isEmpty && i.rootIds.isEmpty))
i.id == a.id || (i.id.isEmpty && i.rootIds.isEmpty) || a.id.isEmpty)
for(result <- finalPredicateObjectsList) {
val predicateObjects = result.results.map(_.toString.split(" ", 2))
val action = normaliseURI(a.results.head)
Expand Down Expand Up @@ -98,8 +98,14 @@ class RDFGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
prefixTable(prefix) + extension
}

case ObjectElement(prefix, action, matcher, dataType, langTag) => {
val result = doVisit(action, optionalArgument)
case ObjectElement(prefix, action, literalValue, matcher, dataType, langTag) => {
val result = action match {
case Some(value) => doVisit(value, optionalArgument)
case None => literalValue match {
case Some(literal) => doVisit(literal, optionalArgument)
case None => throw new Exception("No generation clause given.")
}
}
val matchedResultList = matcher match {
case Some(matcherVar) => doVisit(matcherVar, result)
case None => result
Expand Down Expand Up @@ -287,6 +293,10 @@ class RDFGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
List(Result("", Nil, List(prefixValue + value), None, None))
}

case LiteralObjectValue(value) => {
List(Result("", Nil, List(value), None, None))
}

case ShapeLink(shapeVar) => {
doVisit(shapeVar, optionalArgument)
}
Expand Down Expand Up @@ -532,7 +542,7 @@ class RDFGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var

private def visitAction(action: ExpOrVar, predicateObjectsList: List[Any], optionalArgument: Any): List[Result] = {
if(action.isInstanceOf[Var] && varTable(action.asInstanceOf[Var]).isInstanceOf[AutoIncrement]) {
predicateObjectsList.flatMap {
getMaxOccurrencesPredicateObjectList(predicateObjectsList) match {
case lr: List[Result] => lr.flatMap(r =>
doVisit(action, optionalArgument).asInstanceOf[ResultAutoIncrement].results.map(re => Result(r.id, r.rootIds, List(re), None, None)))
case ra: ResultAutoIncrement =>
Expand All @@ -543,6 +553,21 @@ class RDFGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
} else doVisit(action, optionalArgument).asInstanceOf[List[Result]]
}

private def getMaxOccurrencesPredicateObjectList(list: List[Any]) = {
val mostCommonSize = mutable.HashMap[Int, Int]()
list.filter(_ != Nil).foreach {
case lr: List[Result] if lr.nonEmpty => mostCommonSize += ((lr.size, mostCommonSize.getOrElse(lr.size, 0) + 1))
case ra: ResultAutoIncrement if ra.results.nonEmpty =>
mostCommonSize += ((ra.results.size, mostCommonSize.getOrElse(ra.results.size, 0) + 1))
}
val maxSize = if(mostCommonSize.isEmpty) (0, 0) else mostCommonSize.toList.sortBy(_._1)(Ordering[Int].reverse).maxBy(_._2)
val filterList = list.filter {
case lr: List[Result] => lr.size == maxSize._1
case ra: ResultAutoIncrement => ra.results.size == maxSize._1
}
filterList.head
}

override def doVisitDefault(): Any = Nil

}
Expand Down
31 changes: 29 additions & 2 deletions src/main/scala-2.12/es/weso/visitor/RMLGeneratorVisitor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -258,12 +258,18 @@ class RMLGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
)
}

case ObjectElement(prefix, action, matcher, dataType, langTag) => {
case ObjectElement(prefix, action, literalValue, matcher, dataType, langTag) => {
val arguments = if(optionalArgument != null) optionalArgument.asInstanceOf[Map[String, Any]] else Map[String, Any]()
val prefixArguments = if(prefix.nonEmpty) arguments.+("prefix" -> prefix) else arguments
val dataTypeArguments = if(dataType.isDefined) prefixArguments.+("dataType" -> dataType.getOrElse(None)) else prefixArguments
val finalArguments = if(langTag.isDefined) dataTypeArguments.+("langTag" -> langTag.getOrElse(None)) else dataTypeArguments
doVisit(action, finalArguments)
action match {
case Some(value) => doVisit(value, finalArguments)
case None => literalValue match {
case Some(literal) => doVisit(literal, finalArguments)
case None => throw new Exception("No generation clause given.")
}
}
}

case LiteralObject(prefix, value) => {
Expand All @@ -277,6 +283,27 @@ class RMLGeneratorVisitor(output: Model, varTable: mutable.HashMap[Variable, Var
List(RMLMap(Nil, objectMap, Nil, Nil))
}

case LiteralObjectValue(value) => {
val arguments = optionalArgument.asInstanceOf[Map[String, Any]]
val datatypePrefix = arguments.get("dataType").map(d => prefixTable(d.toString.split(":")(0) + ":"))
val datatype = arguments.get("dataType").map(d => d.toString.split(":")(1))
val datatypeURI = datatypePrefix.map(_ + datatype.get)
val langTag = arguments.get("langTag").map(_.asInstanceOf[String])
val objectMapID = mapPrefix + "o_" + objectIndex.next
val datatypeStatement =
if(datatype.isDefined) List(createStatement(objectMapID, rrPrefix + "datatype", datatypeURI.get))
else List()
val langTagStatement =
if(langTag.isDefined) List(createStatementWithLiteral(objectMapID, rrPrefix + "language", langTag.get))
else List()
val objectMap = List(
createStatement(objectMapID, rdfPrefix + "type", rrPrefix + "ObjectMap"),
createStatementWithLiteral(objectMapID, rrPrefix + "template", value),
createStatement(objectMapID, rrPrefix + "termType", rrPrefix + "Literal")
) ::: datatypeStatement ::: langTagStatement
List(RMLMap(Nil, objectMap, Nil, Nil))
}

case sv: ShapeVar => {
val shapeResult = doVisit(varTable(sv), optionalArgument).asInstanceOf[List[Tuple2[String, RMLMap]]]
shapeResult.map(sr => {
Expand Down

0 comments on commit 25cd706

Please sign in to comment.