Commit 58551eac authored by R.W.Majeed's avatar R.W.Majeed
Browse files

javascript integration for histream-import, still bugs in VisitPostProcessorQueue

parent 2d256f9d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -52,6 +52,12 @@
			<artifactId>histream-core</artifactId>
			<version>0.8-SNAPSHOT</version>
		</dependency>
		<!-- script support -->
		<dependency>
			<groupId>de.sekmi.histream</groupId>
			<artifactId>histream-js</artifactId>
			<version>0.8-SNAPSHOT</version>
		</dependency>
		<!-- add later for sorting data tables
		<dependency>
			<groupId>com.google.protobuf</groupId>
+2 −6
Original line number Diff line number Diff line
@@ -7,16 +7,12 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.bind.JAXB;

import de.sekmi.histream.Observation;
import de.sekmi.histream.ObservationFactory;
import de.sekmi.histream.ObservationSupplier;
import de.sekmi.histream.etl.config.DataSource;
import de.sekmi.histream.etl.config.EavTable;
import de.sekmi.histream.etl.config.Meta;
import de.sekmi.histream.etl.config.PatientTable;
import de.sekmi.histream.etl.config.VisitTable;
import de.sekmi.histream.etl.config.WideTable;
import de.sekmi.histream.impl.ObservationFactoryImpl;
import de.sekmi.histream.impl.SimplePatientExtension;
@@ -112,7 +108,7 @@ public class ETLObservationSupplier implements ObservationSupplier{
	 * @throws ParseException configuration error
	 */
	public ETLObservationSupplier(DataSource ds, ObservationFactory factory) throws IOException, ParseException {
		this(ds,factory,new FactGroupingQueue());
		this(ds,factory,ds.createFactQueue(factory));
	}
	/**
	 * Construct a new observation supplier directly from a {@link DataSource}.
@@ -123,7 +119,7 @@ public class ETLObservationSupplier implements ObservationSupplier{
	 * @throws IOException error reading configuration or table data
	 * @throws ParseException configuration error
	 */
	public ETLObservationSupplier(DataSource ds, ObservationFactory factory, FactGroupingQueue queue) throws IOException, ParseException {
	protected ETLObservationSupplier(DataSource ds, ObservationFactory factory, FactGroupingQueue queue) throws IOException, ParseException {
		this.ds = ds;
		this.sync = new ExtensionSync(factory);
		this.queue = queue;
+47 −0
Original line number Diff line number Diff line
package de.sekmi.histream.etl;

import java.io.IOException;
import java.io.Reader;
import java.io.UncheckedIOException;
import java.net.URL;

import javax.script.ScriptException;

import de.sekmi.histream.ObservationFactory;
import de.sekmi.histream.etl.config.Script;
import de.sekmi.histream.scripting.EncounterScriptEngine;

public class ScriptProcessingQueue extends VisitPostProcessorQueue {
	private EncounterScriptEngine engine;

	public ScriptProcessingQueue(Script[] scripts, URL baseURL, ObservationFactory factory) throws IOException {
		try {
			engine = new EncounterScriptEngine();
		} catch (ScriptException e) {
			throw new IOException("Unable to create script engine", e);
		}
		engine.setObservationFactory(factory);

		// load scripts
		for( int i=0; i<scripts.length; i++ ){
			try( Reader r = scripts[i].openReader(baseURL) ){
				engine.addScript(r);
			} catch (ScriptException e) {
				throw new IOException("Script error in script "+i, e);
			}
		}
	}
	@Override
	protected void postProcessVisit() {
		if( getVisit() == null ){
			return; // don't want null visits
		}
		try {
			engine.processEncounter(getPatient().getId(), getVisit().getId(), getVisit().getStartTime(), getVisitFacts());
		} catch (ScriptException e) {
			IOException io = new IOException("Error during script execution for patient="+getPatient().getId()+", visit="+getVisit().getId(), e);
			throw new UncheckedIOException(io);
		}
	}

}
+2 −1
Original line number Diff line number Diff line
@@ -75,7 +75,8 @@ public abstract class VisitPostProcessorQueue extends FactGroupingQueue {
			// next fact
			nextFact = super.get();
		}
		
		// TODO visit can be processed, without having any facts left to return (either there were no facts in the visit or or postProcessing removed all facts)
		// TODO maybe rename visitProcessed to visitProcessedNonempty
		if( visitProcessed ){
			if( !visitFacts.isEmpty() ){
				// remove first
+30 −0
Original line number Diff line number Diff line
package de.sekmi.histream.etl.config;

import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

import javax.script.ScriptException;
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -12,6 +14,11 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

import de.sekmi.histream.ObservationFactory;
import de.sekmi.histream.etl.FactGroupingQueue;
import de.sekmi.histream.etl.ScriptProcessingQueue;
import de.sekmi.histream.etl.VisitPostProcessorQueue;

/**
 * Data source configuration.
 * This is the XML root element which can be loaded 
@@ -88,4 +95,27 @@ public class DataSource {
		ds.getMeta().setLocation(configuration);
		return ds;
	}

	/**
	 * If scripts are present, an instance of {@link ScriptProcessingQueue}
	 * is returned. Otherwise an instance of {@link FactGroupingQueue}.
	 * @return fact queue
	 * @throws IOException 
	 * @throws  
	 */
	public FactGroupingQueue createFactQueue(ObservationFactory factory) throws IOException{
//		if( true ){
//			// TODO debug problems with visitpostprocessorqueue
//			return new VisitPostProcessorQueue() {
//				@Override
//				protected void postProcessVisit() {
//				}
//			};
//		}
		if( true || scripts == null || scripts.length == 0 ){
			return new FactGroupingQueue();
		}else{
			return new ScriptProcessingQueue(scripts, meta.getLocation(), factory);
		}
	}
}
Loading