-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathepix-cli-chunked.sh
executable file
·76 lines (64 loc) · 3.38 KB
/
epix-cli-chunked.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash
SEP=","
CHUNKSIZE=10
EPIX_SERVICE="https://demo.ths-greifswald.de/epix/epixService"
DOMAIN="Demo"
SOURCE="dummy_safe_source"
TEMP=`getopt -o hd:c:s:n:e: --long help,delimiter:,chunk:,epix-service:,domain:,source: -n "$(basename "$BASH_SOURCE")" -- "${@}"`
if [ $? != 0 ] ; then exit 1 ; fi
eval set -- "${TEMP}";
while [[ ${1:0:1} = - ]]; do
case $1 in
-h|--help)
cat <<EOF
$(basename "$BASH_SOURCE") reads input from STDIN, sends it in batches to E-PIX service
and returns Master-Patient-Indices (MPIs) ordered accordingly.
USAGE: $(basename "$BASH_SOURCE") [OPTIONS] < input.csv
USAGE: cat input.csv | $(basename "$BASH_SOURCE") [OPTIONS]
OPTIONS
-h --help Print this help
-d --delimiter Set field delimiter (default: ${SEP})
-c --chunk Request Master-Patient-Index in chunks of # datasets (default: ${CHUNKSIZE})
-s --epix-service Set E-PIX service URL (default: ${EPIX_SERVICE})
-n --domain Set E-PIX domain (default: ${DOMAIN})
-e --source Set E-PIX source (default: ${SOURCE})
EOF
shift 1; exit ;;
--) shift 1; break ;;
-d|--delimiter) SEP="$2"; shift 2; continue ;;
-c|--chunk) CHUNKSIZE="$2"; shift 2; continue ;;
-s|--epix-service) EPIX_SERVICE="$2"; shift 2; continue ;;
-n|--domain) DOMAIN="$2"; shift 2; continue ;;
-e|--source) SOURCE="$2"; shift 2; continue ;;
esac
echo "ERROR: Unknown parameter ${1}"
exit;
done
function send_request() {
REQE="$1"
DATA="$(echo -n "$2")"
REQH='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.epix.ttp.icmvc.emau.org/"><soapenv:Header/><soapenv:Body><ser:requestMPIBatch><mpiRequest><domainName>'"$DOMAIN"'</domainName>'
REQF='<sourceName>'"$SOURCE"'</sourceName></mpiRequest></ser:requestMPIBatch></soapenv:Body></soapenv:Envelope>'
ORDER="$(echo "$DATA" | awk -F"$SEP" '{print $0 FS NR}' | sort -t"$SEP" | rev | cut -d"$SEP" -f1 | rev)"
COUNT="$(echo "$DATA" | awk -F"$SEP" '{d[$0]++} END{for(l in d){print l FS d[l]}}' | sort -t"$SEP" | rev | cut -d"$SEP" -f1 | rev)"
echo "$(curl --silent -X POST -H "Content-Type: text/xml" --data-binary @<(echo "$REQH$REQE$REQF") "$EPIX_SERVICE" | xsltproc <(echo "$XSLT") - | sort -t"$SEP" | paste -d"$SEP" <(echo "$COUNT") - | awk -F',' '{for(i=1;i<=$1;i++){print}}' | cut -d"$SEP" -f1 --complement | paste -d"$SEP" <(echo "$ORDER") - | sort -nt"$SEP" | cut -d"$SEP" -f1 --complement | rev | cut -d"$SEP" -f1 | rev)"
}
i=0
REQE=""
DATA=""
cat /dev/stdin | \
awk -F"$SEP" 'NR == 1 { for(i=1;i<=NF;i++) { fn[i] = $i }; print } NR > 1 { printf "<requestEntries>"; for(i=1;i<=NF;i++) { printf "<%s>%s</%s>",fn[i],$i,fn[i] }; printf "</requestEntries>%c",FS; print }' | {
read HEAD
XSLT="$(echo "$HEAD" | awk -F"$SEP" '{ printf "<xsl:transform xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.1\"><xsl:output method=\"text\" /><xsl:template match=\"/\"><xsl:for-each select=\"//entry\">"; for(i=1;i<=NF;i++) { printf "<xsl:value-of select=\"key/%s\" /><xsl:text>%c</xsl:text>",$i,FS }; printf "<xsl:value-of select=\"value/person/mpiId/value\" /><xsl:text>
</xsl:text></xsl:for-each></xsl:template></xsl:transform>" }')"
while IFS= read line; do
REQE+="$(echo "$line" | cut -d"$SEP" -f1 )"
DATA+="$(echo "$line" | cut -d"$SEP" -f1 --complement )"$'\n'
if [ $((++i)) -ge $CHUNKSIZE ]; then
send_request "$REQE" "$DATA"
i=0; REQE=""; DATA=""
fi
done
if [ $i -gt 0 ]; then
send_request "$REQE" "$DATA"
fi
}