-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobs.js
More file actions
113 lines (97 loc) · 4.67 KB
/
obs.js
File metadata and controls
113 lines (97 loc) · 4.67 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
let utils = require('./utils');
let strValue = utils.stringValue;
let moveAllTableRecords = utils.moveAllTableRecords;
let beehive = global.beehive;
let obsWithTheirGroupNotUpdated = new Map();
let obsWithPreviousNotUpdated = new Map();
function prepareObsInsert(rows, nextId) {
let insert = 'INSERT INTO obs(obs_id, person_id, concept_id, encounter_id, '
+ 'order_id, obs_datetime, location_id, obs_group_id, accession_number, '
+ 'value_group_id, value_boolean, value_coded, value_coded_name_id, '
+ 'value_drug, value_datetime, value_numeric, value_modifier, '
+ 'value_text, value_complex, comments, previous_version, creator, '
+ 'date_created, voided, voided_by, '
+ 'date_voided, void_reason, uuid) VALUES ';
let toBeinserted = '';
rows.forEach(row => {
if(toBeinserted.length > 1) {
toBeinserted += ',';
}
let voidedBy = row['voided_by'] === null ? null : beehive.userMap.get(row['voided_by']);
let obsGroupsId = row['obs_group_id'] === null ? null : beehive.obsMap.get(row['obs_group_id']);
let previous = row['previous_version']=== null ? null : beehive.obsMap.get(row['previous_version']);
let encounterId = row['encounter_id'] === null ? null : beehive.encounterMap.get(row['encounter_id']);
let locationId = row['location_id'] === null ? null : beehive.locationMap.get(row['location_id']);
beehive.obsMap.set(row['obs_id'], nextId);
if(obsGroupsId === undefined) {
obsGroupsId = null;
if(row['obs_group_id'] !== null) {
obsWithTheirGroupNotUpdated.set(nextId, row['obs_group_id']);
}
}
if(previous === undefined) {
previous = null;
if(row['previous_version'] !== null) {
obsWithPreviousNotUpdated.set(nextId, row['previous_version']);
}
}
toBeinserted += `(${nextId}, ${beehive.personMap.get(row['person_id'])}, `
+ `${row['concept_id']}, ${encounterId}, `
+ `${row['order_id']}, ${strValue(utils.formatDate(row['obs_datetime']))}, `
+ `${locationId}, ${obsGroupsId}, `
+ `${strValue(row['accession_number'])}, ${row['value_group_id']}, `
+ `${row['value_boolean']}, ${row['value_coded']}, `
+ `${row['value_coded_name_id']}, ${row['value_drug']}, `
+ `${strValue(utils.formatDate(row['value_datetime']))}, `
+ `${row['value_numeric']}, ${strValue(row['value_modifier'])}, `
+ `${strValue(row['value_text'])}, ${strValue(row['value_complex'])}, `
+ `${strValue(row['comments'])}, ${previous}, `
+ `${beehive.userMap.get(row['creator'])}, `
+ `${strValue(utils.formatDate(row['date_created']))}, `
+ `${row['voided']}, ${voidedBy}, ${strValue(utils.formatDate(row['date_voided']))}, `
+ `${strValue(row['void_reason'])}, ${utils.uuid(row['uuid'])})`
nextId++;
});
let insertStatement = insert + toBeinserted;
return [insertStatement, nextId];
}
async function moveObs(srcConn, destConn) {
return await moveAllTableRecords(srcConn, destConn, 'obs', 'date_created',
prepareObsInsert);
}
async function updateObsPreviousOrGroupId(connection, idMap, field) {
if(idMap.size > 0) {
let update = `INSERT INTO obs(obs_id, ${field}) VALUES `;
let lastPart = ` ON DUPLICATE KEY UPDATE ${field} = VALUES(${field})`;
let values = '';
idMap.forEach((srcIdValue, obsId) => {
if(values.length > 1) {
values += ',';
}
values += `(${obsId}, ${beehive.obsMap.get(srcIdValue)})`;
});
let query = update + values + lastPart;
utils.logDebug(`${field} update query:`, query);
await connection.query(query);
}
return idMap.size;
}
module.exports = async function(srcConn, destConn) {
utils.logInfo('Moving obs...');
let srcObsCount = await utils.getCount(srcConn, 'obs');
let initialDestCount = await utils.getCount(destConn, 'obs');
let expectedFinalCount = initialDestCount + srcObsCount;
let moved = await moveObs(srcConn, destConn);
let finalDestCount = await utils.getCount(destConn, 'obs');
if (finalDestCount === expectedFinalCount) {
// Update obs_group_id & previous_version for records not yet updated
await updateObsPreviousOrGroupId(destConn, obsWithTheirGroupNotUpdated, 'obs_group_id');
await updateObsPreviousOrGroupId(destConn, obsWithPreviousNotUpdated, 'previous_version');
utils.logOk(`Ok... ${moved} obs moved.`);
} else {
let error = `Problem moving obs: the actual final count ` +
`(${expectedFinalCount}) is not equal to the expected value ` +
`(${finalDestCount})`;
throw new Error(error);
}
}