/*******************************************************************************
* 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
*
*******************************************************************************/
package com.hilotec.elexis.pluginstatistiken;
import java.util.HashMap;
import com.hilotec.elexis.pluginstatistiken.config.KonfigurationQuery;
import com.hilotec.elexis.pluginstatistiken.schnittstelle.IDatensatz;
/**
* Einzelner Datensatz einer Abfrage. Ein Datensatz besteht jeweils aus einem oder mehreren internen
* Datensaetzen (einer pro Tabelle die in der Abfrage referenziert wird, also fuer From und alle
* Joins)
*
* @author Antoine Kaufmann
*/
public class Datensatz {
HashMap<String, IDatensatz> internalRows;
HashMap<String, String> spalten;
/**
* Konstruktor fuer Datensatz
*
* @param q
* Abfrage zu der dieser Datensatz gehoeren soll
* @param ids
* Roher Datensatz von der Datenquelle
* @param startDatum
* Startdatum des Bereichs der als Parameter angegeben wurde.
* @param endDatum
* Enddatum des Bereiches
*/
public Datensatz(KonfigurationQuery q, String startDatum, String endDatum){
internalRows = new HashMap<String, IDatensatz>();
spalten = new HashMap<String, String>();
}
/**
* Kopierkonstruktor
*/
public Datensatz(Datensatz orig){
internalRows = new HashMap<String, IDatensatz>(orig.internalRows);
spalten = new HashMap<String, String>(orig.spalten);
}
/**
* Neue Abfragespalte anhaengen
*
* @param name
* Spaltenname
* @param source
* Datenquelle fuer die Spalte; Dabei kann es sich entweder um einen Verweis auf eine
* andere Spalte, oder auf eine Tabellenspalte handeln.
*/
public void addSpalte(String name, String source){
spalten.put(name, source);
}
/**
* Internen Datensatz hinzufuegen. Bei Joins, die zu NULL-Werten fuehren, muss trotzdem ein
* interner Datensatz angelegt werden mit dem entsprechenden Namen, und null als ids.
*
* @param as
* Alias der Tabelle die diesen Datensatz stellt
* @param ids
* Interner Datensatz
*/
public void addIntDs(String as, IDatensatz ids){
internalRows.put(as, ids);
}
/**
* Bestimmtes Feld des Datensatzes auslesen. Dabei koennen sowohl Felder ausgelesen werden, die
* direkt als Spalte in der Abfrage drin sind anhand des Namens, als auch Spalten aus anderen
* Tabellen in der Abfrage, die in der Form Alias.Spalte angesprochen werden koennen. Alias ist
* hierbei der Tabellen Name, der in der Konfiguration als "as" angegeben wurde.
*
* @param name
* Name des Felds
*
* @return Wert des Feldes oder null, wenn das Feld nicht gefunden wurde.
*/
public String getFeld(String name){
String source = spalten.get(name);
if (source != null) {
return getIntFeld(source);
}
return getIntFeld(name);
}
/**
* Wert aus einer Tabelle auslesen. Der Spaltenbezeichner muss die Form Alias.Spalte haben.
*
* @param name
* Spalte, die ausgelesen werden soll
*
* @return Wert der Spalte, oder null, wenn diese nicht gefunden wurde
*/
private String getIntFeld(String name){
if (name.indexOf('.') < 0) {
return null;
}
String parts[] = name.split("\\.");
String as = parts[0];
String spalte = parts[1];
IDatensatz ids = internalRows.get(as);
if (ids == null) {
return null;
}
return ids.getSpalte(spalte);
}
}