UNPKG

offshore

Version:
393 lines (392 loc) 11.8 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for lib/offshore/query/integrator/populate.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../../../../prettify.css" /> <link rel="stylesheet" href="../../../../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../../../../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../../../../index.html">all files</a> / <a href="index.html">lib/offshore/query/integrator/</a> populate.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>37/37</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Branches</span> <span class='fraction'>8/8</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>7/7</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>36/36</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">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</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">241×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">524×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">2852×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">6741×</span> <span class="cline-any cline-yes">4103×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">2638×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">2988×</span> <span class="cline-any cline-yes">2988×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-yes">520×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-yes">358×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/** * Module dependencies */ var _ = require('lodash'); &nbsp; &nbsp; /** * populate() * * Destructive mapping of `parentRows` to include a new key, `alias`, * which is an ordered array of child rows. * * @option [{Object}] parentRows - the parent rows the joined rows will be folded into * @option {String} alias - the alias of the association * @option [{Object}] childRows - the unfolded result set from the joins * * @option {String} parentPK - the primary key of the parent table (optional- only needed for M..N associations) * @option {String} fkToChild - the foreign key associating a row with the child table * @option {String} childPK - the primary key of the child table * * @option [{String}] childNamespace- attributes to keep * * @return {*Object} reference to `parentRows` */ module.exports = function populate(options) { &nbsp; var parentRows = options.parentRows; var alias = options.alias; var childRows = options.childRows; &nbsp; var parentPK = options.parentPK; var childPK = options.childPK; var fkToChild = options.fkToChild; var fkToParent = parentPK;// At least for all use cases currently, `fkToParent` &lt;=&gt; `parentPK` &nbsp; var childNamespace = options.childNamespace || ''; &nbsp; return _.map(parentRows, function _insertJoinedResults(parentRow) { &nbsp; // Gather the subset of child rows associated with the current parent row var associatedChildRows = _.filter(childRows, // { (parentPK): (parentRow[(parentPK)]) }, e.g. { id: 3 } _cons(fkToParent, parentRow[parentPK]) ); &nbsp; // Clone the `associatedChildRows` to avoid mutating the original // `childRows` in the cache. associatedChildRows = _.cloneDeep(associatedChildRows); &nbsp; // Stuff the sanitized associated child rows into the parent row. parentRow[alias] = _.reduce(associatedChildRows, function(memo, childRow) { &nbsp; // Ignore child rows without an appropriate foreign key // to an instance in the REAL child collection. if (!childRow[childNamespace + childPK] &amp;&amp; !childRow[childPK]) return memo; &nbsp; // Rename childRow's [fkToChild] key to [childPK] // (so that it will have the proper primary key attribute for its collection) var childPKValue = childRow[fkToChild]; childRow[childPK] = childPKValue; &nbsp; // Determine if we have any double nested attributes. // These would come from m:m joins var doubleNested = _.find(childRow, function(name, key) { return _.startsWith(key, '..'); }); &nbsp; // Grab all the keys that start with a dot or double dot depending on // the status of doubleNested childRow = _.pickBy(childRow, function(name, key) { if (doubleNested) { return _.startsWith(key, '..'); } else { return _.startsWith(key, '.'); } }); &nbsp; var _origChildRow = childRow; &nbsp; // Strip off childNamespace prefix childRow = {}; var PREFIX_REGEXP = new RegExp('^' + childNamespace + ''); _.each(_origChildRow, function(attrValue, attrName) { var unprefixedKey = attrName.replace(PREFIX_REGEXP, ''); childRow[unprefixedKey] = attrValue; }); &nbsp; // Build the set of rows to stuff into our parent row. memo.push(childRow); return memo; }, []); &nbsp; return parentRow; }); }; &nbsp; &nbsp; /** * Dumb little helper because I hate naming anonymous objects just to use them once. * * @return {Object} [a tuple] * @api private */ function _cons(key, value) { var obj = {}; obj[key] = value; return obj; } &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Tue Apr 17 2018 10:49:40 GMT+0200 (CEST) </div> </div> <script src="../../../../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../../../../sorter.js"></script> </body> </html>