Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
histream
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Raphael
histream
Commits
dc7f8635
Commit
dc7f8635
authored
Jun 15, 2016
by
R.W.Majeed
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed and improved javascript execution
parent
ec55c7c0
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
195 additions
and
53 deletions
+195
-53
histream-import/src/main/java/de/sekmi/histream/etl/ETLObservationSupplier.java
...in/java/de/sekmi/histream/etl/ETLObservationSupplier.java
+7
-1
histream-import/src/main/java/de/sekmi/histream/etl/ScriptProcessingQueue.java
...ain/java/de/sekmi/histream/etl/ScriptProcessingQueue.java
+5
-1
histream-import/src/test/java/de/sekmi/histream/etl/TestETLSupplier.java
.../src/test/java/de/sekmi/histream/etl/TestETLSupplier.java
+23
-2
histream-import/src/test/java/de/sekmi/histream/etl/config/TestMarshall.java
.../test/java/de/sekmi/histream/etl/config/TestMarshall.java
+2
-1
histream-import/src/test/resources/data/test-1-datasource.xml
...ream-import/src/test/resources/data/test-1-datasource.xml
+2
-0
histream-import/src/test/resources/data/test-1-script.js
histream-import/src/test/resources/data/test-1-script.js
+1
-1
histream-js/src/main/java/de/sekmi/histream/scripting/AbstractFacts.java
.../main/java/de/sekmi/histream/scripting/AbstractFacts.java
+18
-29
histream-js/src/main/java/de/sekmi/histream/scripting/EncounterScriptEngine.java
...va/de/sekmi/histream/scripting/EncounterScriptEngine.java
+20
-6
histream-js/src/main/java/de/sekmi/histream/scripting/Fact.java
...am-js/src/main/java/de/sekmi/histream/scripting/Fact.java
+4
-4
histream-js/src/main/java/de/sekmi/histream/scripting/SimpleFacts.java
...rc/main/java/de/sekmi/histream/scripting/SimpleFacts.java
+40
-0
histream-js/src/main/java/de/sekmi/histream/scripting/VisitExtensionFacts.java
...java/de/sekmi/histream/scripting/VisitExtensionFacts.java
+31
-0
histream-js/src/test/java/de/sekmi/histream/scripting/TestEncounterScriptEngine.java
...e/sekmi/histream/scripting/TestEncounterScriptEngine.java
+40
-6
histream-js/src/test/java/de/sekmi/histream/scripting/TestFacts.java
.../src/test/java/de/sekmi/histream/scripting/TestFacts.java
+2
-2
No files found.
histream-import/src/main/java/de/sekmi/histream/etl/ETLObservationSupplier.java
View file @
dc7f8635
...
...
@@ -98,7 +98,13 @@ public class ETLObservationSupplier implements ObservationSupplier{
of
.
registerExtension
(
new
SimpleVisitExtension
());
return
load
(
configuration
,
of
);
}
/**
* Get the loaded configuration
* @return configuration
*/
public
DataSource
getConfiguration
(){
return
ds
;
}
/**
* Construct a new observation supplier directly from a {@link DataSource}.
*
...
...
histream-import/src/main/java/de/sekmi/histream/etl/ScriptProcessingQueue.java
View file @
dc7f8635
...
...
@@ -38,11 +38,15 @@ public class ScriptProcessingQueue extends VisitPostProcessorQueue {
return
;
// don't want null visits
}
try
{
engine
.
processEncounter
(
getPatient
()
.
getId
(),
getVisit
().
getId
(),
getVisit
().
getStartTime
(),
getVisitFacts
());
engine
.
processEncounter
(
getPatient
()
,
getVisit
(),
getVisitFacts
());
}
catch
(
ScriptException
e
)
{
IOException
io
=
new
IOException
(
"Error during script execution for patient="
+
getPatient
().
getId
()+
", visit="
+
getVisit
().
getId
(),
e
);
throw
new
UncheckedIOException
(
io
);
}
}
public
int
getNumScripts
(){
return
engine
.
getScriptCount
();
}
}
histream-import/src/test/java/de/sekmi/histream/etl/TestETLSupplier.java
View file @
dc7f8635
package
de.sekmi.histream.etl
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
import
org.junit.After
;
import
org.junit.Assert
;
...
...
@@ -9,11 +12,13 @@ import org.junit.Test;
import
de.sekmi.histream.DateTimeAccuracy
;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
import
de.sekmi.histream.ObservationSupplier
;
import
de.sekmi.histream.ext.ExternalSourceType
;
import
de.sekmi.histream.ext.Patient
;
import
de.sekmi.histream.ext.Visit
;
import
de.sekmi.histream.impl.Meta
;
import
de.sekmi.histream.impl.ObservationFactoryImpl
;
import
de.sekmi.histream.io.GroupedXMLWriter
;
import
de.sekmi.histream.io.Streams
;
...
...
@@ -44,15 +49,25 @@ public class TestETLSupplier {
Assert
.
assertNotNull
(
source
.
getSourceId
());
Assert
.
assertNotNull
(
source
.
getSourceTimestamp
());
// patient id should match patient.id
Assert
.
assertEquals
(
fact
.
getPatientId
(),
fact
.
getExtension
(
Patient
.
class
).
getId
());
// encounter id should match encounter.id
Assert
.
assertEquals
(
fact
.
getEncounterId
(),
fact
.
getExtension
(
Visit
.
class
).
getId
());
// next fact
fact
=
os
.
get
();
}
}
@Test
public
void
expectMetadataPresent
(){
public
void
expectMetadataPresent
()
throws
Exception
{
Assert
.
assertNotNull
(
"Source id metadata required"
,
os
.
getMeta
(
ObservationSupplier
.
META_SOURCE_ID
));
//Assert.assertNotNull("Source timestamp metadata required",os.getMeta(ObservationSupplier.META_SOURCE_TIMESTAMP));
// verify all scripts are loaded
ObservationFactory
f
=
new
ObservationFactoryImpl
();
FactGroupingQueue
fq
=
os
.
getConfiguration
().
createFactQueue
(
f
);
Assert
.
assertTrue
(
fq
instanceof
ScriptProcessingQueue
);
ScriptProcessingQueue
sq
=
(
ScriptProcessingQueue
)
fq
;
Assert
.
assertEquals
(
2
,
sq
.
getNumScripts
());
}
@Test
public
void
testXMLConversion
()
throws
Exception
{
...
...
@@ -95,7 +110,13 @@ public class TestETLSupplier {
// TODO verify other patient information
Assert
.
assertEquals
(
"v1"
,
p
.
getGivenName
());
Assert
.
assertEquals
(
"n1"
,
p
.
getSurname
());
}
@Test
public
void
testExtensionInstances
()
throws
IOException
{
List
<
Observation
>
all
=
new
ArrayList
<>();
os
.
stream
().
forEach
(
all:
:
add
);
// nothing to do anymore
}
@Test
public
void
testVisitExtension
()
throws
IOException
{
...
...
histream-import/src/test/java/de/sekmi/histream/etl/config/TestMarshall.java
View file @
dc7f8635
...
...
@@ -66,13 +66,14 @@ public class TestMarshall {
Assert
.
assertNotNull
(
ds
.
eavTables
[
0
].
virtualColumnMap
.
get
(
"f_eav_x"
));
// check script
Assert
.
assertEquals
(
2
,
ds
.
scripts
.
length
);
/*
Assert.assertEquals(2, ds.scripts.length);
Assert.assertNull(ds.scripts[0].src);
Assert.assertNull(ds.scripts[0].charset);
Assert.assertNotNull(ds.scripts[1].src);
Assert.assertEquals("UTF-8",ds.scripts[1].charset);
Assert.assertEquals("text/javascript",ds.scripts[1].type);
*/
}
}
@Test
...
...
histream-import/src/test/resources/data/test-1-datasource.xml
View file @
dc7f8635
...
...
@@ -139,7 +139,9 @@
if( facts.get("natrium") && facts.get("kalium") ){
facts.add("nakl").value(1);
}
facts.add("cnt").value(facts.size());
]]>
</script>
<!-- TODO check why second script does not work -->
<script
type=
"text/javascript"
charset=
"UTF-8"
src=
"test-1-script.js"
/>
</datasource>
histream-import/src/test/resources/data/test-1-script.js
View file @
dc7f8635
// add a fact which indicates the number of observations
// in this encounter
facts
.
add
(
"
COUNT
"
).
value
(
facts
.
size
());
\ No newline at end of file
facts
.
add
(
"
COUNT
"
).
value
(
7
);
\ No newline at end of file
histream-js/src/main/java/de/sekmi/histream/scripting/Facts.java
→
histream-js/src/main/java/de/sekmi/histream/scripting/
Abstract
Facts.java
View file @
dc7f8635
...
...
@@ -3,7 +3,6 @@ package de.sekmi.histream.scripting;
import
java.util.ArrayList
;
import
java.util.List
;
import
de.sekmi.histream.DateTimeAccuracy
;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
import
de.sekmi.histream.ext.ExternalSourceType
;
...
...
@@ -18,21 +17,14 @@ import de.sekmi.histream.ext.ExternalSourceType;
* @author R.W.Majeed
*
*/
public
class
Facts
{
pr
ivate
List
<
Fact
>
facts
;
pr
ivate
List
<
Observation
>
sourceList
;
pr
ivate
ObservationFactory
factory
;
pr
ivate
ExternalSourceType
source
;
public
abstract
class
Abstract
Facts
{
pr
otected
List
<
Fact
>
facts
;
pr
otected
List
<
Observation
>
sourceList
;
pr
otected
ObservationFactory
factory
;
pr
otected
ExternalSourceType
source
;
private
String
patientId
;
private
String
encounterId
;
private
DateTimeAccuracy
defaultStartTime
;
public
Facts
(
ObservationFactory
factory
,
String
patientId
,
String
encounterId
,
DateTimeAccuracy
defaultStartTime
){
public
AbstractFacts
(
ObservationFactory
factory
)
{
this
.
factory
=
factory
;
this
.
patientId
=
patientId
;
this
.
encounterId
=
encounterId
;
this
.
defaultStartTime
=
defaultStartTime
;
this
.
facts
=
new
ArrayList
<>();
}
public
void
setObservations
(
List
<
Observation
>
observations
){
...
...
@@ -46,21 +38,6 @@ public class Facts {
public
int
size
(){
return
facts
.
size
();}
public
List
<
Fact
>
facts
(){
return
facts
;}
public
Fact
add
(
String
conceptId
){
Observation
o
=
factory
.
createObservation
(
patientId
,
conceptId
,
defaultStartTime
);
if
(
encounterId
!=
null
){
o
.
setEncounterId
(
encounterId
);
}
if
(
source
!=
null
){
o
.
setSource
(
source
);
}
Fact
f
=
new
Fact
(
o
);
sourceList
.
add
(
o
);
facts
.
add
(
f
);
return
f
;
}
public
int
firstIndexOf
(
String
conceptId
){
for
(
int
i
=
0
;
i
<
facts
.
size
();
i
++
){
if
(
conceptId
.
equals
(
facts
.
get
(
i
).
getConcept
())
){
...
...
@@ -92,4 +69,16 @@ public class Facts {
return
facts
.
get
(
i
);
}
}
protected
abstract
Observation
create
(
String
conceptId
);
public
Fact
add
(
String
conceptId
){
Observation
o
=
create
(
conceptId
);
o
.
setSource
(
source
);
Fact
f
=
new
Fact
(
o
);
sourceList
.
add
(
o
);
facts
.
add
(
f
);
return
f
;
}
}
histream-js/src/main/java/de/sekmi/histream/scripting/EncounterScriptEngine.java
View file @
dc7f8635
...
...
@@ -21,6 +21,8 @@ import de.sekmi.histream.DateTimeAccuracy;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
import
de.sekmi.histream.ext.ExternalSourceType
;
import
de.sekmi.histream.ext.Patient
;
import
de.sekmi.histream.ext.Visit
;
import
de.sekmi.histream.impl.ExternalSourceImpl
;
...
...
@@ -69,18 +71,30 @@ public class EncounterScriptEngine {
scripts
.
add
(
new
Script
(((
Compilable
)
engine
).
compile
(
reader
),
sourceId
,
timestamp
));
}
public
int
getScriptCount
(){
return
scripts
.
size
();
}
public
void
setObservationFactory
(
ObservationFactory
factory
){
this
.
factory
=
factory
;
}
public
void
processEncounter
(
String
patientId
,
String
encounterId
,
DateTimeAccuracy
defaultStartTime
,
List
<
Observation
>
facts
)
throws
ScriptException
{
Facts
f
=
new
Facts
(
factory
,
patientId
,
encounterId
,
defaultStartTime
);
f
.
setObservations
(
facts
);
private
void
process
(
AbstractFacts
facts
)
throws
ScriptException
{
Bindings
b
=
engine
.
createBindings
();
b
.
put
(
"facts"
,
f
);
b
.
put
(
"facts"
,
f
acts
);
for
(
Script
script
:
scripts
){
f
.
setSource
(
script
.
source
);
f
acts
.
setSource
(
script
.
source
);
script
.
script
.
eval
(
b
);
}
// TODO is there a way to add information which script threw an exception?
// TODO is there a way to add information which script threw an exception?
}
public
void
processEncounter
(
String
patientId
,
String
encounterId
,
DateTimeAccuracy
defaultStartTime
,
List
<
Observation
>
facts
)
throws
ScriptException
{
SimpleFacts
f
=
new
SimpleFacts
(
factory
,
patientId
,
encounterId
,
defaultStartTime
);
f
.
setObservations
(
facts
);
process
(
f
);
}
public
void
processEncounter
(
Patient
patient
,
Visit
visit
,
List
<
Observation
>
facts
)
throws
ScriptException
{
VisitExtensionFacts
f
=
new
VisitExtensionFacts
(
factory
,
patient
,
visit
);
f
.
setObservations
(
facts
);
process
(
f
);
}
}
histream-js/src/main/java/de/sekmi/histream/scripting/Fact.java
View file @
dc7f8635
...
...
@@ -29,12 +29,12 @@ public class Fact {
return
this
;
}
public
Value
value
(
String
value
){
public
String
Value
value
(
String
value
){
if
(
value
==
null
){
observation
.
setValue
(
null
);
return
null
;
}
Value
v
=
new
StringValue
(
value
);
String
Value
v
=
new
StringValue
(
value
);
observation
.
setValue
(
v
);
return
v
;
}
...
...
@@ -45,12 +45,12 @@ public class Fact {
* @param value value
* @return value object
*/
public
Value
value
(
Double
value
){
public
Numeric
Value
value
(
Double
value
){
if
(
value
==
null
){
observation
.
setValue
(
null
);
return
null
;
}
Value
v
=
new
NumericValue
(
new
BigDecimal
(
value
));
Numeric
Value
v
=
new
NumericValue
(
new
BigDecimal
(
value
));
observation
.
setValue
(
v
);
return
v
;
}
...
...
histream-js/src/main/java/de/sekmi/histream/scripting/SimpleFacts.java
0 → 100644
View file @
dc7f8635
package
de.sekmi.histream.scripting
;
import
de.sekmi.histream.DateTimeAccuracy
;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
/**
* Facts implementation which doesn't use
* any observation extensions.
*
* @author R.W.Majeed
*
*/
public
class
SimpleFacts
extends
AbstractFacts
{
// without extensions
private
String
patientId
;
private
String
encounterId
;
private
DateTimeAccuracy
defaultStartTime
;
public
SimpleFacts
(
ObservationFactory
factory
,
String
patientId
,
String
encounterId
,
DateTimeAccuracy
defaultStartTime
){
super
(
factory
);
this
.
patientId
=
patientId
;
this
.
encounterId
=
encounterId
;
this
.
defaultStartTime
=
defaultStartTime
;
}
@Override
protected
Observation
create
(
String
conceptId
)
{
Observation
o
=
factory
.
createObservation
(
patientId
,
conceptId
,
defaultStartTime
);
if
(
encounterId
!=
null
){
o
.
setEncounterId
(
encounterId
);
}
if
(
source
!=
null
){
o
.
setSource
(
source
);
}
return
o
;
}
}
histream-js/src/main/java/de/sekmi/histream/scripting/VisitExtensionFacts.java
0 → 100644
View file @
dc7f8635
package
de.sekmi.histream.scripting
;
import
java.util.Objects
;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
import
de.sekmi.histream.ext.Patient
;
import
de.sekmi.histream.ext.Visit
;
public
class
VisitExtensionFacts
extends
AbstractFacts
{
private
Patient
patient
;
private
Visit
visit
;
public
VisitExtensionFacts
(
ObservationFactory
factory
,
Patient
patient
,
Visit
visit
)
{
super
(
factory
);
Objects
.
requireNonNull
(
patient
);
Objects
.
requireNonNull
(
visit
);
this
.
patient
=
patient
;
this
.
visit
=
visit
;
}
@Override
protected
Observation
create
(
String
conceptId
)
{
Observation
o
=
factory
.
createObservation
(
patient
.
getId
(),
conceptId
,
visit
.
getStartTime
());
o
.
setExtension
(
Patient
.
class
,
patient
);
o
.
setEncounterId
(
visit
.
getId
());
o
.
setExtension
(
Visit
.
class
,
visit
);
return
o
;
}
}
histream-js/src/test/java/de/sekmi/histream/scripting/TestEncounterScriptEngine.java
View file @
dc7f8635
package
de.sekmi.histream.scripting
;
import
java.io.IOException
;
import
java.time.Instant
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
javax.script.ScriptException
;
import
org.junit.Assert
;
import
org.junit.Test
;
...
...
@@ -15,7 +12,8 @@ import de.sekmi.histream.DateTimeAccuracy;
import
de.sekmi.histream.Observation
;
import
de.sekmi.histream.ObservationFactory
;
import
de.sekmi.histream.Value
;
import
de.sekmi.histream.ext.ExternalSourceType
;
import
de.sekmi.histream.ext.Patient
;
import
de.sekmi.histream.impl.CachedPatientExtension
;
import
de.sekmi.histream.impl.ExternalSourceImpl
;
import
de.sekmi.histream.impl.ObservationFactoryImpl
;
...
...
@@ -37,9 +35,7 @@ public class TestEncounterScriptEngine {
EncounterScriptEngine
e
=
new
EncounterScriptEngine
();
e
.
setObservationFactory
(
factory
);
e
.
addScript
(
getClass
().
getResource
(
"/postprocess-encounter-1.js"
),
"UTF-8"
,
"script1"
);
// run
ExternalSourceType
source
=
new
ExternalSourceImpl
(
"script"
,
Instant
.
now
());
e
.
processEncounter
(
"P1"
,
"E1"
,
DateTimeAccuracy
.
parsePartialIso8601
(
"2011-02-01"
),
list
);
// verify
...
...
@@ -47,4 +43,42 @@ public class TestEncounterScriptEngine {
Assert
.
assertEquals
(
"test1"
,
last
.
getConceptId
());
Assert
.
assertEquals
(
Value
.
Type
.
Numeric
,
last
.
getValue
().
getType
());
}
@Test
/**
* Verifies that the non-extension script call for {@link AbstractFacts}
* will work with extensions (if the patient extension is cached)
*
* @throws Exception failure
*/
public
void
verifyPatientExtensionForNonExtensionCall
()
throws
Exception
{
ObservationFactory
factory
=
new
ObservationFactoryImpl
();
// this test works only with CachedPatientExtension
factory
.
registerExtension
(
new
CachedPatientExtension
());
DateTimeAccuracy
start
=
DateTimeAccuracy
.
parsePartialIso8601
(
"2011"
);
// create full observation
Observation
o
=
factory
.
createObservation
(
"P1"
,
"C1"
,
start
);
o
.
setSource
(
new
ExternalSourceImpl
());
Patient
p
=
o
.
getExtension
(
Patient
.
class
);
p
.
setGivenName
(
"A"
);
p
.
setSurname
(
"B"
);
p
.
setBirthDate
(
start
);
// create list
List
<
Observation
>
list
=
new
ArrayList
<>();
list
.
add
(
o
);
// prepare engine
EncounterScriptEngine
e
=
new
EncounterScriptEngine
();
e
.
setObservationFactory
(
factory
);
e
.
addScript
(
getClass
().
getResource
(
"/postprocess-encounter-1.js"
),
"UTF-8"
,
"script1"
);
// run
e
.
processEncounter
(
"P1"
,
"C1"
,
DateTimeAccuracy
.
parsePartialIso8601
(
"2011-02-01"
),
list
);
Observation
o2
=
list
.
get
(
1
);
Assert
.
assertNotEquals
(
o
,
o2
);
Patient
p2
=
o2
.
getExtension
(
Patient
.
class
);
Assert
.
assertNotNull
(
p2
);
Assert
.
assertEquals
(
p
,
p2
);
}
}
histream-js/src/test/java/de/sekmi/histream/scripting/TestFacts.java
View file @
dc7f8635
...
...
@@ -45,7 +45,7 @@ public class TestFacts {
@Test
public
void
verifyAddFacts
()
throws
ScriptException
{
Facts
f
=
new
Facts
(
factory
,
"P1"
,
"V1"
,
defaultStart
);
SimpleFacts
f
=
new
Simple
Facts
(
factory
,
"P1"
,
"V1"
,
defaultStart
);
f
.
setObservations
(
list
);
engine
.
put
(
"facts"
,
f
);
engine
.
eval
(
"facts.add('C4')"
);
...
...
@@ -59,7 +59,7 @@ public class TestFacts {
@Test
public
void
verifyHasFacts
()
throws
ScriptException
{
Facts
f
=
new
Facts
(
factory
,
"P1"
,
"V1"
,
defaultStart
);
SimpleFacts
f
=
new
Simple
Facts
(
factory
,
"P1"
,
"V1"
,
defaultStart
);
f
.
setObservations
(
list
);
engine
.
put
(
"facts"
,
f
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment