Skip to content

Commit 9601d0a

Browse files
committed
push static with comma-separated sources enabled
1 parent 8a25b34 commit 9601d0a

File tree

4 files changed

+72
-15
lines changed

4 files changed

+72
-15
lines changed

src/main/antlr/While.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ statement : SKIP_S SEMI
152152
| RETURN expression SEMI # return_statement
153153
| fmu=expression DOT TICK OPARAN time=expression CPARAN SEMI # tick_statement
154154
| (declType = type)? target=expression ASS WINDOW OPARAN monitor=expression CPARAN SEMI # window_statement
155-
| PUSH_STATIC SEMI # pushStatic_statement
155+
| (declType = type)? target=expression ASS PUSH_STATIC OPARAN sources=expression CPARAN SEMI # pushStatic_statement
156156
| ((declType = type)? target=expression ASS)? expression DOT NAME OPARAN (expression (COMMA expression)*)? CPARAN SEMI # call_statement
157157
// TODO: allow new statements without assignment
158158
| (declType = type)? target=expression ASS NEW newType = type OPARAN (expression (COMMA expression)*)? CPARAN (MODELS owldescription = expression)? SEMI # create_statement

src/main/kotlin/no/uio/microobject/ast/Translate.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,17 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
434434
}
435435

436436
override fun visitPushStatic_statement(ctx: PushStatic_statementContext?): ProgramElement {
437-
return PushStaticStatement(ctx!!.start.line)
437+
val target = visit(ctx!!.target) as Location
438+
if(ctx.declType != null) {
439+
val decl = getClassDecl(ctx)
440+
val className = if(decl == null) ERRORTYPE.name else decl!!.className.text
441+
val targetType = TypeChecker.translateType(ctx.declType, className, mutableMapOf())
442+
target.setType(targetType)
443+
}
444+
445+
val sources = visit(ctx!!.sources) as Expression
446+
447+
return PushStaticStmt(target, sources, ctx!!.start.line, target.getType())
438448
}
439449

440450

src/main/kotlin/no/uio/microobject/ast/stmt/PushStaticStmt.kt

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,62 @@ import no.uio.microobject.ast.expr.TRUEEXPR
88
import no.uio.microobject.runtime.*
99
import no.uio.microobject.type.*
1010
import no.uio.microobject.data.TripleSettings
11+
import no.uio.microobject.main.ReasonerMode
1112
import org.apache.jena.datatypes.xsd.XSDDatatype
13+
import org.apache.jena.rdf.model.Model
1214
import java.io.File
1315

1416
import eu.larkc.csparql.core.engine.CsparqlQueryResultProxy
1517
import eu.larkc.csparql.common.RDFTuple
1618

17-
data class PushStaticStmt(val pos : Int = -1) : Statement {
18-
override fun toString(): String = "pushStatic()"
19+
data class PushStaticStmt(val target : Location, val sources: Expression, val pos : Int = -1, val declares: Type?) : Statement {
20+
override fun toString(): String = "$target:=pushStatic(sources=$sources)"
1921
override fun getRDF(): String {
2022
var s = "prog:stmt${this.hashCode()} rdf:type smol:PushStaticStmt.".trimIndent()
2123
return s
2224
}
2325

2426

2527
override fun eval(heapObj: Memory, stackFrame: StackEntry, interpreter: Interpreter): EvalResult {
26-
// fixed iri: prog:staticTable
27-
val namedIri = "${interpreter.settings.progPrefix}staticTable"
28+
val namedIri = interpreter.streamManager.getStaticNamedIri()
29+
30+
// parse sources from comma-separated string sources
31+
val sourcesLit = interpreter.eval(sources, stackFrame)
32+
if (sourcesLit.tag != STRINGTYPE) {
33+
throw Exception("The sources parameter in pushStatic statement must be a string literal")
34+
}
35+
val sourcesStr = sourcesLit.literal.removeSurrounding("\"")
36+
val sourcesList = sourcesStr.split(",")
37+
val sourcesMap = hashMapOf(
38+
"heap" to false,
39+
"staticTable" to false,
40+
"vocabularyFile" to false,
41+
"externalOntology" to false,
42+
"urlOntology" to false,
43+
"fmos" to false
44+
)
45+
for (s in sourcesList) {
46+
val trimmed = s.trim()
47+
if (sourcesMap.containsKey(trimmed)) {
48+
sourcesMap[trimmed] = true
49+
} else {
50+
throw Exception("Unknown source '$trimmed' in pushStatic statement, only comma-separated [heap, staticTable, vocabularyFile, externalOntology, urlOntology, fmos] are allowed")
51+
}
52+
}
2853

29-
// add only staticTable
3054
val ts = TripleSettings(
31-
sources = hashMapOf("heap" to false, "staticTable" to true, "vocabularyFile" to false, "fmos" to false, "externalOntology" to false, "urlOntology" to false),
55+
sources = sourcesMap,
3256
guards = hashMapOf("heap" to true, "staticTable" to true),
3357
virtualization = hashMapOf("heap" to true, "staticTable" to true, "fmos" to true),
3458
jenaReasoner = interpreter.settings.reasoner,
3559
cachedModel = null
3660
)
37-
val sTableModel = interpreter.tripleManager.getModel(ts)
38-
interpreter.streamManager.putStaticNamedGraph(namedIri, sTableModel)
3961

40-
return EvalResult(null, emptyList())
62+
val model = interpreter.tripleManager.getModel(ts)
63+
64+
interpreter.streamManager.putStaticNamedGraph(namedIri, model)
65+
val resultLit = LiteralExpr(namedIri, STRINGTYPE)
66+
return replaceStmt(AssignStmt(target, resultLit, declares = declares), stackFrame)
4167
}
4268

4369
}

src/main/kotlin/no/uio/microobject/data/StreamManager.kt

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class StreamManager(private val settings: Settings, val staticTable: StaticTable
4747

4848
var clockVar : String? = null
4949
var clockTimestampSec : String? = null
50+
var lastTimestamp: Long = 0
51+
var firstTsPassed: Boolean = false
52+
53+
var nStaticGraphsPushed = 0
5054

5155
init {
5256

@@ -82,8 +86,18 @@ class StreamManager(private val settings: Settings, val staticTable: StaticTable
8286
}
8387

8488
private fun getTimestamp(): Long {
85-
if (clockTimestampSec != null) return secToMs(clockTimestampSec!!.toLong())
86-
return System.currentTimeMillis()
89+
var ms: Long
90+
if (clockTimestampSec != null) {
91+
ms = secToMs(clockTimestampSec!!.toLong())
92+
if (!firstTsPassed) ms -= 1 // workaround: first timestamp is decreased by 1 ms
93+
} else {
94+
ms = System.currentTimeMillis()
95+
}
96+
97+
if (ms > lastTimestamp && !firstTsPassed) firstTsPassed = true
98+
99+
lastTimestamp = ms
100+
return ms
87101
}
88102

89103
private fun secToMs(s: Long): Long {
@@ -128,13 +142,14 @@ class StreamManager(private val settings: Settings, val staticTable: StaticTable
128142
public fun registerQuery(name: LiteralExpr, queryExpr : Expression, params: List<Expression>, stackMemory: Memory, heap: GlobalMemory, obj: LiteralExpr, SPARQL : Boolean = true): CsparqlQueryResultProxy {
129143
if (!engineInitialized) initEngine()
130144
val queryStr = prepareQuery(name, queryExpr, params, stackMemory, heap, obj, SPARQL)
131-
var resultProxy = engine.registerQuery(queryStr, true) // reasoning enabled
145+
if (settings.verbose) println("Registering query:\n$queryStr")
146+
var resultProxy = engine.registerQuery(queryStr, false) // reasoning disabled
132147
resultProxy.addObserver(ResultPusher(name, queryResults)) // each key is only used by one observer
133148
return resultProxy
134149
}
135150

136151
private fun prepareQuery(name: LiteralExpr, queryExpr : Expression, params : List<Expression>, stackMemory: Memory, heap: GlobalMemory, obj: LiteralExpr, SPARQL : Boolean = true) : String{
137-
val queryHeader = "REGISTER QUERY ${name.literal} AS "
152+
val queryHeader = "REGISTER QUERY Query${name.literal} AS "
138153

139154
val queryBody = interpreter!!.prepareQuery(queryExpr, params, stackMemory, heap, obj, SPARQL)
140155
.removePrefix("\"").removeSuffix("\"")
@@ -167,5 +182,11 @@ class StreamManager(private val settings: Settings, val staticTable: StaticTable
167182
engine.putStaticNamedModel(iri, sw.toString())
168183
}
169184

185+
public fun getStaticNamedIri(): String {
186+
val s = "${settings.runPrefix}loadStatic${nStaticGraphsPushed}"
187+
nStaticGraphsPushed += 1
188+
return s
189+
}
190+
170191
}
171192

0 commit comments

Comments
 (0)