scripts/diff-elasticsearch-dumps.js (92 lines of code) (raw):

// This tool compares an array of elasticsearch records to another array of elasticsearch records // Finds: // * record level differences old to new and new to old // * records missing from old in new and new in old // // Note: Requires ramda! // // Run like so: `node sourceDiff.js > differences.json` var R = require("ramda"); var oldTags = require("./tag.json"); var newTags = require("./tagmanagerTag.json"); function diffArray(a, b, fieldName, differingFields) { var same = 0; a[fieldName].forEach(function (e) { same += R.contains(e, b[fieldName]) }); if (same !== a[fieldName].length) { differingFields.push(fieldName); } } function diffObject(a, b, fieldName, differingFields) { var aSubfields = Object.keys(a[fieldName]); var shouldContinue = true; aSubfields.forEach(function(subfield) { if (shouldContinue) { return; } if (!compare(a[fieldName][subfield], b[fieldName[subfield]])) { differingFields.push(fieldName); shouldContinue = false; } }); } function compare(a, b) { if (a && typeof a === 'string' && b) { var aClean = a.replace("http://", "https://"); var bClean = b.replace("http://", "https://"); return aClean === bClean; } return a === b; } function getDifferentSources(a, b) { var differingFields = []; var aFields = Object.keys(a); aFields.forEach(function (f) { if (Array.isArray(a[f])) { diffArray(a, b, f, differingFields); } else if ((typeof a[f] === "object") && (a[f] !== null)) { diffObject(a, b, f, differingFields); } else { if (!compare(a[f], b[f])) { differingFields.push(f); } } }); return differingFields; } function testAToB(A, B) { var bAsMap = {}; B.forEach(function (b) { var bSource = b._source; bAsMap[bSource.id] = bSource; }); var problems = { missing: [], different: [] }; A.forEach(function (a) { var aSource = a._source; var bSource = bAsMap[aSource.id]; if (bSource) { var differentFields = getDifferentSources(aSource, bSource); if (differentFields.length > 0) { var badTag = { "id": aSource.id, "fields": {} }; differentFields.forEach(function (d) { if (Array.isArray(aSource[d])) { aSource[d].sort(); bSource[d].sort(); } badTag.fields[d] = { "a": aSource[d], "b": bSource[d] } }); problems.different.push(badTag); } } else { problems.missing.push(aSource); } }) return problems; } var all = { "newDiffOld" : testAToB(newTags, oldTags), "oldDiffNew" : testAToB(oldTags, newTags) } console.log(JSON.stringify(all, undefined, 4));