@@ -66,6 +66,8 @@ trait SelectQueryColumn extends Entity
6666 */
6767case class QueryVariable (variableName : String ) extends SelectQueryColumn {
6868 override def toSparql : String = s " ? $variableName"
69+
70+ override def getVariables : Set [QueryVariable ] = Set (this )
6971}
7072
7173/**
@@ -83,6 +85,8 @@ case class GroupConcat(inputVariable: QueryVariable, separator: Char, outputVari
8385 override def toSparql : String = {
8486 s """ (GROUP_CONCAT(DISTINCT(IF(BOUND( ${inputVariable.toSparql}), STR( ${inputVariable.toSparql}), "")); SEPARATOR=' $separator') AS ${outputVariable.toSparql}) """
8587 }
88+
89+ override def getVariables : Set [QueryVariable ] = Set (inputVariable)
8690}
8791
8892/**
@@ -108,6 +112,7 @@ case class Count(inputVariable: QueryVariable, distinct: Boolean, outputVariable
108112 s " (COUNT( $distinctAsStr ${inputVariable.toSparql}) AS ${outputVariable.toSparql}) "
109113 }
110114
115+ override def getVariables : Set [QueryVariable ] = Set (inputVariable, outputVariable)
111116}
112117
113118/**
@@ -135,6 +140,8 @@ case class IriRef(iri: SmartIri, propertyPathOperator: Option[Char] = None) exte
135140 def toOntologySchema (targetSchema : OntologySchema ): IriRef = {
136141 copy(iri = iri.toOntologySchema(targetSchema))
137142 }
143+
144+ override def getVariables : Set [QueryVariable ] = Set .empty
138145}
139146
140147/**
@@ -156,6 +163,8 @@ case class XsdLiteral(value: String, datatype: SmartIri) extends Entity {
156163
157164 " \" " + value + " \" ^^" + transformedDatatype.toSparql
158165 }
166+
167+ override def getVariables : Set [QueryVariable ] = Set .empty
159168}
160169
161170/**
@@ -198,7 +207,7 @@ case class StatementPattern(subj: Entity, pred: Entity, obj: Entity, namedGraph:
198207
199208 private def entityToOntologySchema (entity : Entity , targetSchema : OntologySchema ): Entity = {
200209 entity match {
201- case iriRef : IriRef => iriRef.toOntologySchema(InternalSchema )
210+ case iriRef : IriRef => iriRef.toOntologySchema(targetSchema )
202211 case other => other
203212 }
204213 }
@@ -314,7 +323,13 @@ object CompareExpressionOperator extends Enumeration {
314323/**
315324 * Represents an expression that can be used in a FILTER.
316325 */
317- sealed trait Expression extends SparqlGenerator
326+ sealed trait Expression extends SparqlGenerator {
327+
328+ /**
329+ * Returns the set of query variables used in this expression.
330+ */
331+ def getVariables : Set [QueryVariable ]
332+ }
318333
319334/**
320335 * Represents a comparison expression in a FILTER.
@@ -326,6 +341,8 @@ sealed trait Expression extends SparqlGenerator
326341case class CompareExpression (leftArg : Expression , operator : CompareExpressionOperator .Value , rightArg : Expression )
327342 extends Expression {
328343 override def toSparql : String = s " ( ${leftArg.toSparql} $operator ${rightArg.toSparql}) "
344+
345+ override def getVariables : Set [QueryVariable ] = leftArg.getVariables ++ rightArg.getVariables
329346}
330347
331348/**
@@ -336,6 +353,8 @@ case class CompareExpression(leftArg: Expression, operator: CompareExpressionOpe
336353 */
337354case class AndExpression (leftArg : Expression , rightArg : Expression ) extends Expression {
338355 override def toSparql : String = s " ( ${leftArg.toSparql} && ${rightArg.toSparql}) "
356+
357+ override def getVariables : Set [QueryVariable ] = leftArg.getVariables ++ rightArg.getVariables
339358}
340359
341360/**
@@ -346,6 +365,8 @@ case class AndExpression(leftArg: Expression, rightArg: Expression) extends Expr
346365 */
347366case class OrExpression (leftArg : Expression , rightArg : Expression ) extends Expression {
348367 override def toSparql : String = s " ( ${leftArg.toSparql} || ${rightArg.toSparql}) "
368+
369+ override def getVariables : Set [QueryVariable ] = leftArg.getVariables ++ rightArg.getVariables
349370}
350371
351372/**
@@ -372,6 +393,8 @@ case object MinusOperator extends ArithmeticOperator {
372393 */
373394case class IntegerLiteral (value : Int ) extends Expression {
374395 override def toSparql : String = value.toString
396+
397+ override def getVariables : Set [QueryVariable ] = Set .empty
375398}
376399
377400/**
@@ -380,6 +403,8 @@ case class IntegerLiteral(value: Int) extends Expression {
380403case class ArithmeticExpression (leftArg : Expression , operator : ArithmeticOperator , rightArg : Expression )
381404 extends Expression {
382405 override def toSparql : String = s """ ${leftArg.toSparql} $operator ${rightArg.toSparql}"""
406+
407+ override def getVariables : Set [QueryVariable ] = leftArg.getVariables ++ rightArg.getVariables
383408}
384409
385410/**
@@ -397,6 +422,8 @@ case class RegexFunction(textExpr: Expression, pattern: String, modifier: Option
397422 case None =>
398423 s """ regex( ${textExpr.toSparql}, " $pattern") """
399424 }
425+
426+ override def getVariables : Set [QueryVariable ] = textExpr.getVariables
400427}
401428
402429/**
@@ -406,6 +433,8 @@ case class RegexFunction(textExpr: Expression, pattern: String, modifier: Option
406433 */
407434case class LangFunction (textValueVar : QueryVariable ) extends Expression {
408435 override def toSparql : String = s """ lang( ${textValueVar.toSparql}) """
436+
437+ override def getVariables : Set [QueryVariable ] = Set (textValueVar)
409438}
410439
411440/**
@@ -419,6 +448,8 @@ case class SubStrFunction(textLiteralVar: QueryVariable, startExpression: Expres
419448 extends Expression {
420449 override def toSparql : String =
421450 s """ substr( ${textLiteralVar.toSparql}, ${startExpression.toSparql}, ${lengthExpression.toSparql}) """
451+
452+ override def getVariables : Set [QueryVariable ] = Set (textLiteralVar)
422453}
423454
424455/**
@@ -428,6 +459,8 @@ case class SubStrFunction(textLiteralVar: QueryVariable, startExpression: Expres
428459 */
429460case class StrFunction (textLiteralVar : QueryVariable ) extends Expression {
430461 override def toSparql : String = s """ str( ${textLiteralVar.toSparql}) """
462+
463+ override def getVariables : Set [QueryVariable ] = Set (textLiteralVar)
431464}
432465
433466/**
@@ -482,6 +515,8 @@ case class FunctionCallExpression(functionIri: IriRef, args: Seq[Entity]) extend
482515 }
483516
484517 }
518+
519+ override def getVariables : Set [QueryVariable ] = args.toSet.flatMap((arg : Entity ) => arg.getVariables)
485520}
486521
487522/**
0 commit comments