var config = {
|
marketingDB: 'localhost:27017/marketing',
|
feedbackDB: 'localhost:27017/feedback',
|
teleporterDB: 'localhost:27017/teleporter',
|
batchSz: 1000
|
};
|
|
var DB = {
|
marketingDB: connect(config.marketingDB),
|
feedbackDB: connect(config.feedbackDB),
|
teleporterDB: connect(config.teleporterDB)
|
};
|
|
function Datasegment() {
|
var db = DB.teleporterDB;
|
var datasegmentCollectionObjects = {};
|
|
function init() {
|
var collectionNames = db.getCollectionNames();
|
for (var i in collectionNames) {
|
var datasegmentName = collectionNames[i];
|
datasegmentCollectionObjects[datasegmentName] = db[datasegmentName]
|
}
|
};
|
|
this.getCollection = function(dataSegmentName) {
|
return datasegmentCollectionObjects[dataSegmentName];
|
};
|
|
init();
|
};
|
|
function Template() {
|
var db = DB.marketingDB;
|
|
this.findAllTemplateDataSnapshotMap = function() {
|
var results = {};
|
db.template.find().forEach(
|
function(rec){
|
if(rec.data_snapshot_id) {
|
results[rec._id] = rec.data_snapshot_id;
|
}
|
});
|
|
return results;
|
};
|
}
|
|
function Runbook() {
|
var db = DB.feedbackDB;
|
var datasegment = new Datasegment();
|
var template = new Template();
|
|
this.merge = function() {
|
var templateIdDatasegmentNameMap = template.findAllTemplateDataSnapshotMap();
|
printjson(templateIdDatasegmentNameMap);
|
var jobDataSegmentMapping = getJobIdDataSegmentMapping(templateIdDatasegmentNameMap);
|
printjson(jobDataSegmentMapping);
|
mergeAllTeleporterDataToRunbook(jobDataSegmentMapping);
|
};
|
|
function getRunbookCollection(jobId) {
|
return db[jobId];
|
}
|
|
function getRunbookCollectionWrite(jobId) {
|
return writeDB[jobId];
|
}
|
|
function getRequestRowIndexInDataSegment(channel, requestId) {
|
var lastPos = requestId.lastIndexOf("_");
|
var idx = 0;
|
|
if (channel == 'push') {
|
var usualReqId = requestId.substring(lastPos + 1, requestId.length - 1);
|
var lastToLastPos = usualReqId.lastIndexOf("_");
|
idx = usualReqId.substring(lastToLastPos + 1, requestId.length - 1);
|
} else {
|
idx = requestId.substring(lastPos + 1, requestId.length - 1);
|
}
|
return idx;
|
}
|
|
function getRequestRowInDataSegment(datasegmentCollection, index) {
|
return datasegmentCollection.find().skip(index).limit(1).next()
|
}
|
|
function mergeTeleporterDataToRunbook(jobId, runbookCollection, datasegmentCollection ) {
|
if (!runbookCollection || !datasegmentCollection) {
|
return; // fall back to do nothing
|
}
|
|
try {
|
var sz = runbookCollection.find().count();
|
var offset = 0;
|
|
while (offset <= sz) {
|
var batchData = [];
|
runbookCollection.find().skip(offset).limit(config.batchSz).forEach(function(ref) {
|
if (ref.user_id) {
|
// this is already populated. No need
|
throw 100;
|
}
|
|
var index = getRequestRowIndexInDataSegment(ref.channel, ref.request_id);
|
var datasegmentRow = getRequestRowInDataSegment(datasegmentCollection, index);
|
var info = {};
|
if (datasegmentRow.user_id) {
|
info['user_id'] = datasegmentRow.user_id;
|
}
|
|
if(ref.channel === 'sms') {
|
if (datasegmentRow.phone) {
|
info['phone'] = datasegmentRow.phone;
|
}
|
}
|
|
if(ref.channel === 'email') {
|
if (datasegmentRow.email) {
|
info['email'] = datasegmentRow.email;
|
}
|
}
|
|
//runbookCollection.update({request_id : ref.request_id}, { $set : info });
|
batchData.push({request_id: ref.request_id, info: info});
|
}
|
);
|
|
for (var i in batchData) {
|
var ref = batchData[i];
|
// this is the line with error
|
runbookCollection.update({request_id : ref.request_id}, { $set : ref.info });
|
}
|
offset = offset + batchData.length;
|
batchData = [];
|
}
|
} catch (err) {
|
if (err !== 100) throw err;
|
}
|
|
printjson("Done with " + jobId);
|
}
|
|
|
function mergeAllTeleporterDataToRunbook(jobDataSegmentMapping) {
|
//printjson(jobDataSegmentMapping);
|
for (var jobId in jobDataSegmentMapping) {
|
var dataSegmentName = jobDataSegmentMapping[jobId];
|
var runbookCollection = getRunbookCollection(jobId);
|
var datasegmentCollection = datasegment.getCollection(dataSegmentName);
|
mergeTeleporterDataToRunbook(jobId, runbookCollection,
|
datasegmentCollection);
|
}
|
}
|