HashMergePreparser

Gruppe

Preparser

Funktion

Der HashMergePreparser gleicht Datensätze einer CSV-Datei, oder Datenbank-Abfrage mit einer separaten Datenbank-Tabelle ab und prüft, ob Datensätze neu sind, oder sich seit dem letzten Lauf verändert haben.

Konfigurationsdatei

sample_HashMergePreparser.properties und evtl. sql_input_sample.properties (eingelesen mit Cron JobDatei, falls mode=sql).

Beschreibung


Der HashMergePreparser gleicht Datensätze einer CSV-Datei, oder Datenbank-Abfrage mit einer separaten Datenbank-Tabelle ab und prüft, ob Datensätze neu sind, oder sich seit dem letzten Lauf verändert haben. Dazu wird zu einem angegebenen Key eine Art Prüfsumme (Hashwert) über den ganzen Satz erzeugt und mit bestehenden Einträgen in der Tabelle verglichen. Existiert der Key noch nicht, wird der Satz als neu gekennzeichnet. Ist für den Key bereits ein Hashwert vorhanden, wird der Wert verglichen und so geprüft, ob sich im Satz etwas geändert hat. Falls ja, wird der Satz als geändert gekennzeichnet, falls nicht, wird der Satz nicht an das Mapping weiter gegeben und aus der Datei (bzw. dem Resultset des Selects) entfernt.

Parameter


Folgende Parameter stehen zur Konfiguration zur Verfügung.


Parameter

Beschreibung

debug

(optional) Falls true, wird ein ausführliches Log geschrieben. Default: false

delimiter

(optional) gibt das Trennzeichen der CSV-Datei an. Default: ,

encoding

(optional) gibt den Zeichensatz an, mit der die Datei gelesen und geschrieben wird. Default: utf8

excludeColumnsForHash

(optional) Es können Spalten angegeben werden, die ignoriert werden bei der Erzeugung des Hashwerts (Index beginnend bei 0). Beispiel: excludeColumnsForHash=3,5,7

hashAlias

Der Datenbank-Alias (wie in database.xml definiert) für die Hash-Tabelle.

hasHeadLine

(optional) Gibt an, ob CSV-Datei eine Kopfzeile hat. Default: true

hashInsertStatement

Das Insert-Statement, um neue Hashwerte hinzuzufügen.

hashMethod

(optional) gibt die Hash-Berechnungsmethode an (z. B. MD5, SHA1, etc). Default: MD5

hashSelectQuery

Das SQL-Select Statement (siehe unten).

hashSelectQueryBatchSize

Anzahl der Sätze, die in ein Datenblatt geschrieben werden.

hashUpdateStatement

Das Update-Statement, um vorhandene Hashwerte zu ändern.

idColumnIndex

(wichtig für mode=csv, beginnend bei 0) gibt an, in welcher Spalte der CSV-Datei der Key steht. Bei mode=sql wird das Property sourceIdColumn in der Datei sql_input_sample.properties dafür verwendet.

includeNew

(optional) Falls true, werden neue Einträge an das Mapping übergeben. Default: true

includeOriginal

(optional) Falls true, werden auch Einträge an das Mapping übergeben, die sich nicht geändert haben. Default: true

includeUpdated

(optional) Falls true, werden geänderte Einträge an das Mapping übergeben. Default: true

mode

Mögliche Werte sind csv und sql (siehe unten).

quote

(optional) gibt das Quote-Zeichen an. Default: "

splitHeaderToken

(optional) Diese Trennzeile wird eingefügt, falls useFileSplitter den Wert true hat. Default: header!

useFileSplitter

(optional) Falls true, wird nach einer bestimmten Anzahl von Sätzen (Parameter hashSelectQueryBatchSize) eine Trennzeile (Parameter splitHeaderToken) eingefügt, um die Datei auf mehrere Datenblätter aufteilen zu können. Default: true

writeHeadLine

(optional) gibt an, ob die Überschrift (falls vorhanden) in die erzeugte Datei geschrieben wird. Default: true

Beispiel

hashSelectQuery


Das SQL-Select-Statement, um die gespeicherten Hashwerte zu überprüfen.

Wichtiger Hinweis: Hierbei muss die Abfrage mit dem IN-Operator aufgebaut werden (siehe Beispiel-Datei unten).

CSV/SQL Mode


Gibt an, ob die Daten anhand einer SQL-Abfrage, oder als CSV-Datei eingelesen werden. Ist mode=csv, muss im Parameter idColumnIndex angegeben werden, welche Spalte den Schlüsselwert (Id/Key) enthält. Bei mode=sql wird das Property sourceIdColumn in der Datei sql_input_sample.properties dafür verwendet. Wird mode=sql verwendet, muss die dort ausgelesene Tabelle (hier shipmentstatus) natürlich schon vorhanden sein und gegebenenfalls auch mit Daten gefüllt sein.

Hinweis: Wird die zeitgesteuerte eigene Klasse DefaultFileSQLCron verwendet, muss mode=csv eingetragen werden.

sql_input_sample.properties


Diese Datei konfigurieren, wenn Datensätze aus einer bestehenden Datenbank auf Veränderungen geprüft werden sollen (mode=sql). In diesem Fall bitte bedenken, dass die Datei sql_input_sample.properties (zusätzlich zur Konfigurationsdatei sample_HashMergePreparser.properties) über Cron JobDatei angegeben werden muss.

Ergebnis des Preparsers


Als Ergebnis werden den Eingangsdaten, also den Daten aus der CSV-Datei, oder dem SQL-Select (hier aus Tabelle shipmentstatus), zwei zusätzliche Spalten action (N=new,U=updated) und hash vorangestellt. Diese müssen in der Quellstruktur hinzugefügt werden. Über die Parameter includeNew=false und includeUpdated=false kann ein Voranstellen auch unterbunden werden.

Tabelle für Hashwerte erstellen


createTable.sql
CREATE TABLE shipmentstatus_hashwert (
sendungsid VARCHAR(20) NOT NULL,
hashvalue VARCHAR(100) NOT NULL,
PRIMARY KEY (sendungsid)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

Hinweis: Für MySQL.

Beispiele für die Konfigurationsdateien


sample_HashMergePreparser.properties
###################################################
# hash calculation method like MD5, SHA1, etc.
# default: MD5
hashMethod=MD5
###################################################
###################################################
# identfies if head line should be written, if available
#
# default=true
writeHeadLine=true
###################################################
###################################################
#include N lines in output csv
includeNew=true
#include U lines in output csv
includeUpdated=true
#exclude O lines from output csv
includeOriginal=false
###################################################
###################################################
# io encoding
# default: utf8
encoding=utf8
###################################################
###################################################
# log debug messages
# default=false
debug=false
###################################################
###################################################
# fetch mode: csv|sql|auto
#
# csv mode:
# Input is a CSV File which will be parsed
# sql mode:
# Input is a Properties File with sql config
# auto mode:
# tries sql mode first, then csv mode
# required
mode=sql
###################################################
###################################################
# csv i/o configuration
#
# Delimiter character
# default=,
delimiter=,
#
# Quote character
# default="
# quote=
#
# useFileSplitter
# insert splitHeaderToken before each 100 lines (hashSelectQueryBatchSize)
# default=true
useFileSplitter=true
#
# splitHeaderToken
# default=header!
splitHeaderToken=header!
###################################################
###################################################
# Hash storage settings
###################################################
# Datawizard database alias
# required
hashAlias=test
#
###################################################
# SQL select query to fetch the stored hash
# value by given id
# required, has to return a single column
hashSelectQueryBatchSize=100
hashSelectQuery=SELECT sendungsid, hashvalue FROM shipmentstatus_hashwert WHERE sendungsid in ( @0:s@ )
###################################################
#
###################################################
# insert hash sql statement with 2 parameters
# not required
hashInsertStatement=INSERT INTO shipmentstatus_hashwert ( sendungsid, hashvalue ) VALUES ( @0:s@, @1:s@ )
###################################################
#
###################################################
# update hash sql statement with 2 parameters
# not required
hashUpdateStatement=UPDATE shipmentstatus_hashwert SET hashValue = @1:s@ WHERE sendungsid = @0:s@
###################################################
###################################################
# index of the id Column in csv mode
# required in csv input mode
idColumnIndex=1
###################################################
# identifies if csv source has a head line
# default=true
hasHeadLine=true
###################################################
sql_input_sample.properties
###################################################
# sql mode configuration file
###################################################
###################################################
# Specifies the count of rows in memory
# while fetching data
# default=100
pageSize=100
###################################################
###################################################
# Datawizard database alias
# required
sourceAlias=test
###################################################
###################################################
# result id column name
sourceIdColumn=sendungsid
###################################################
###################################################
# the sql query to fetch input data
# required
sourceQuery=SELECT * FROM shipmentstatus
###################################################