/******************************************************************************* * Copyright (c) 2009, A. Kaufmann and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * A. Kaufmann - initial implementation * P. Chaubert - adapted to Messwerte V2 * medshare GmbH - adapted to Messwerte V2.1 in February 2012 * *******************************************************************************/ package com.hilotec.elexis.messwerte.v2.data; import java.util.ArrayList; import java.util.List; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.rgw.tools.TimeTool; import com.hilotec.elexis.messwerte.v2.Activator; import com.hilotec.elexis.messwerte.v2.data.typen.IMesswertTyp; import com.hilotec.elexis.messwerte.v2.views.Messages; public class Messung extends PersistentObject { private static final String VERSION = "3"; // 05.02.2012 //$NON-NLS-1$ public static final String PLUGIN_ID = Activator.PLUGIN_ID; private static final String TABLENAME = "COM_HILOTEC_ELEXIS_MESSWERTE_MESSUNGEN"; //$NON-NLS-1$ static { addMapping(TABLENAME, "PatientID", "TypName", "Datum=S:D:Datum"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ checkTable(); } private static final String setVersionSQL = "UPDATE " + TABLENAME + " SET TypName='" + VERSION //$NON-NLS-1$ //$NON-NLS-2$ + "' WHERE ID='VERSION'; "; //$NON-NLS-1$ private static final String index1SQL = "CREATE INDEX idx1 on " + TABLENAME + " (PatientID);"; //$NON-NLS-1$ //$NON-NLS-2$ private static final String index2SQL = "CREATE INDEX idx2 on " + TABLENAME + " (Datum);"; //$NON-NLS-1$ //$NON-NLS-2$ private static final String index3SQL = "CREATE INDEX idx3 on " + TABLENAME //$NON-NLS-1$ + " (PatientID, Datum);"; //$NON-NLS-1$ private static final String lengthTypName = "ALTER TABLE " + TABLENAME //$NON-NLS-1$ + " MODIFY TypName VARCHAR(255);"; //$NON-NLS-1$ private static final String create = "CREATE TABLE " + TABLENAME + " (" //$NON-NLS-1$ //$NON-NLS-2$ + " ID VARCHAR(25) PRIMARY KEY, " + " lastupdate BIGINT, " //$NON-NLS-1$ //$NON-NLS-2$ + " deleted CHAR(1) DEFAULT '0', " + " PatientID VARCHAR(25), " //$NON-NLS-1$ //$NON-NLS-2$ + " TypName VARCHAR(255), " + " Datum CHAR(8) " + ");" + "INSERT INTO " + TABLENAME //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + " (ID, TypName) VALUES " + " ('VERSION', '" + VERSION + "');" + index1SQL + index2SQL //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + index3SQL; /** * Pruefen ob die Tabelle existiert */ private static void checkTable(){ Messung check = load("VERSION"); //$NON-NLS-1$ if (!check.exists()) { createOrModifyTable(create); } try { int ver = Integer.parseInt(check.get("TypName")); //$NON-NLS-1$ switch (ver) { case 1: // No known changes between Version 1 and 2 updateToVersion3(); createOrModifyTable(setVersionSQL); break; case 2: updateToVersion3(); createOrModifyTable(setVersionSQL); break; } } catch (Exception e) { SWTHelper.showError(Messages.DBError, String.format(Messages.DBErrorTable, TABLENAME)); } } private static void updateToVersion3(){ createOrModifyTable(lengthTypName); createOrModifyTable(index1SQL); createOrModifyTable(index2SQL); createOrModifyTable(index3SQL); } @Override public String getLabel(){ return get("TypName"); //$NON-NLS-1$ } @Override public String getTableName(){ return TABLENAME; } /** * Dieser Konstruktor darf nicht oeffentlich sein */ protected Messung(){} /** * Vorhandene Messung anhand der ID erstellen * * @param id */ protected Messung(String id){ super(id); } /** * Neue Messung erstellen * * @param patient * Patient, dem diese Messung zugeordnet werden soll * @param typ * Typ der Messung */ public Messung(Patient patient, MessungTyp typ){ create(null); set("PatientID", patient.getId()); //$NON-NLS-1$ set("TypName", typ.getName()); //$NON-NLS-1$ set("Datum", new TimeTool().toString(TimeTool.DATE_GER)); //$NON-NLS-1$ set("deleted", "1"); // sonst wird der Wert über den IDataAccessor schon gefunden... //$NON-NLS-1$ //$NON-NLS-2$ } /** * Messung anhand der ID laden * * @param id * ID der Messung * @return Messung */ public static Messung load(final String id){ return new Messung(id); } /** * Datum dieser Messung */ public String getDatum(){ return get("Datum"); //$NON-NLS-1$ } /** * Messwert in dieser Messung anhand seines Namens holen * * @param name * Name des Messwerttyps * @return Messwert */ public Messwert getMesswert(String name){ return getMesswert(name, true); } public Messwert getMesswert(String name, boolean create){ Query<Messwert> query = new Query<Messwert>(Messwert.class); query.add("MessungID", Query.EQUALS, getId()); //$NON-NLS-1$ query.and(); query.add("Name", Query.EQUALS, name); //$NON-NLS-1$ List<Messwert> list = query.execute(); if (list.size() == 0) { if (create) { // Messwert existiert noch nicht, wir legen ihn neu an return new Messwert(this, name); } return null; } return list.get(0); } /** * @return Liste aller Messwerte */ public List<Messwert> getMesswerte(){ ArrayList<Messwert> messwerte = new ArrayList<Messwert>(); MessungTyp typ = getTyp(); if (typ != null) { List<IMesswertTyp> fields = typ.getMesswertTypen(); for (IMesswertTyp dft : fields) { messwerte.add(getMesswert(dft.getName())); } } return messwerte; } /** * @param datum * Datum neu setzen */ public void setDatum(String datum){ set("Datum", datum); //$NON-NLS-1$ } /** * @return Typ der Messung */ public MessungTyp getTyp(){ MessungKonfiguration config = MessungKonfiguration.getInstance(); return config.getTypeByName(get("TypName")); //$NON-NLS-1$ } /** * @return Patient zu dem diese Messung gehoert */ public Patient getPatient(){ return Patient.load(get("PatientID")); //$NON-NLS-1$ } /** * Alle Messungen eines bestimmten Typs zu einem bestimmten Patienten zusammensuchen. * * @param patient * Der Patient * @param typ * Typ der zu suchenden Messungen * * @return Liste mit den Messungen */ public static List<Messung> getPatientMessungen(Patient patient, MessungTyp typ){ Query<Messung> query = new Query<Messung>(Messung.class); query.add("PatientID", Query.EQUALS, patient.getId()); //$NON-NLS-1$ if (typ != null) { query.and(); query.add("TypName", Query.EQUALS, typ.getName()); //$NON-NLS-1$ } query.orderBy(true, "Datum"); //$NON-NLS-1$ return query.execute(); } /** * Alle Messungen zu einem bestimmten Patienten zusammensuchen. * * @param patient * Der Patient * * @return Liste mit den Messungen */ public static List<Messung> getAllePatientMessungen(Patient patient){ Query<Messung> query = new Query<Messung>(Messung.class); query.add("PatientID", Query.EQUALS, patient.getId()); //$NON-NLS-1$ query.orderBy(true, "Datum"); //$NON-NLS-1$ return query.execute(); } /** * Alle Messungen eines bestimmten Typs zusammensuchen. * * @param typ * Typ der zu suchenden Messung * * @return Liste mit den Messungen */ public static List<Messung> getMessungen(MessungTyp typ){ Query<Messung> query = new Query<Messung>(Messung.class); query.add("TypName", Query.EQUALS, typ.getName()); //$NON-NLS-1$ return query.execute(); } public static List<Messung> getMessungenForExport(MessungTyp t, TimeTool dateFrom, TimeTool dateTo){ dateTo.addDays(1); Query<Messung> query = new Query<Messung>(Messung.class); query.add("TypName", Query.EQUALS, t.getName()); //$NON-NLS-1$ query.add("Datum", Query.GREATER_OR_EQUAL, dateFrom.toDBString(false)); //$NON-NLS-1$ query.add("Datum", Query.LESS, dateTo.toDBString(false)); //$NON-NLS-1$ query.orderBy(true, "Datum", "PatientID"); //$NON-NLS-1$ //$NON-NLS-2$ return query.execute(); } }