diff --git a/sparql/src/main/java/fr/inria/corese/sparql/triple/function/core/ZeroaryFunction.java b/sparql/src/main/java/fr/inria/corese/sparql/triple/function/core/ZeroaryFunction.java index 6e882b25f..4de1aa3db 100644 --- a/sparql/src/main/java/fr/inria/corese/sparql/triple/function/core/ZeroaryFunction.java +++ b/sparql/src/main/java/fr/inria/corese/sparql/triple/function/core/ZeroaryFunction.java @@ -1,15 +1,17 @@ package fr.inria.corese.sparql.triple.function.core; +import java.util.Optional; + +import fr.inria.corese.kgram.api.core.ExprType; +import fr.inria.corese.kgram.api.query.Environment; +import fr.inria.corese.kgram.api.query.Producer; import fr.inria.corese.sparql.api.Computer; import fr.inria.corese.sparql.api.IDatatype; import fr.inria.corese.sparql.datatype.CoreseDouble; import fr.inria.corese.sparql.datatype.DatatypeMap; +import fr.inria.corese.sparql.exceptions.EngineException; import fr.inria.corese.sparql.triple.function.term.Binding; import fr.inria.corese.sparql.triple.function.term.TermEval; -import fr.inria.corese.kgram.api.core.ExprType; -import fr.inria.corese.kgram.api.query.Environment; -import fr.inria.corese.sparql.exceptions.EngineException; -import fr.inria.corese.kgram.api.query.Producer; /** * @@ -17,19 +19,44 @@ * */ public class ZeroaryFunction extends TermEval { - - public ZeroaryFunction(){} - - public ZeroaryFunction(String name){ + + public ZeroaryFunction() { + } + + public ZeroaryFunction(String name) { super(name); } - + @Override public IDatatype eval(Computer eval, Binding b, Environment env, Producer p) throws EngineException { - switch (oper()){ - case ExprType.RANDOM: return CoreseDouble.create(Math.random()); - case ExprType.NOW: return DatatypeMap.newDate(); - } + switch (oper()) { + case ExprType.RANDOM: + return CoreseDouble.create(Math.random()); + case ExprType.NOW: + return this.getOrSetCurrentTime(b); + + } return null; } + + /** + * Returns the current time, or sets it if it is not already set. + * + * @param binding The Binding to get or set the current time in + * @return The current time + */ + private IDatatype getOrSetCurrentTime(Binding binding) { + + // Check if current time is already set in the Binding + Optional savedNowTime = binding.getNowValue(); + + if (savedNowTime.isPresent()) { + return savedNowTime.get(); + } else { + // If not set, create a new time, save it, and return it + IDatatype nowValue = DatatypeMap.newDate(); + binding.setNowValue(nowValue); + return nowValue; + } + } } diff --git a/sparql/src/main/java/fr/inria/corese/sparql/triple/function/term/Binding.java b/sparql/src/main/java/fr/inria/corese/sparql/triple/function/term/Binding.java index 5f17c483c..b2f352699 100644 --- a/sparql/src/main/java/fr/inria/corese/sparql/triple/function/term/Binding.java +++ b/sparql/src/main/java/fr/inria/corese/sparql/triple/function/term/Binding.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Optional; + import org.slf4j.LoggerFactory; import org.slf4j.Logger; @@ -112,6 +114,9 @@ public class Share { // transformer also records its Binding and hence its Visitor private Object transformerVisitor; + // Enables function now() to return the same value during processing + private Optional savNowValue = Optional.empty(); + public Object getTransformerVisitor() { return transformerVisitor; } @@ -120,6 +125,14 @@ public void setTransformerVisitor(Object transformerVisitor) { this.transformerVisitor = transformerVisitor; } + public Optional getSavNowValue() { + return savNowValue; + } + + public void setNowValue(IDatatype nowValue) { + this.savNowValue = Optional.ofNullable(nowValue); + } + } public static Binding create() { @@ -662,6 +675,14 @@ void shareGlobalVariable(Binding b) { setGlobalVariableNames(b.getGlobalVariableNames()); setGlobalVariableValues(b.getGlobalVariableValues()); } + + public Optional getNowValue() { + return getShare().getSavNowValue(); + } + + public void setNowValue(IDatatype nowValue) { + getShare().setNowValue(nowValue); + } public HashMap getGlobalVariableNames() { return globalVariable;