UNPKG

orange-orm

Version:

Object Relational Mapper

118 lines (97 loc) 2.49 kB
var newLeg = require('./relation/newJoinLeg'), getById = require('./getById'), nullPromise = require('./nullPromise'), newGetRelated = require('./newGetRelated'), getRelatives = require('./joinRelation/getRelatives'), fuzzyPromise = require('./fuzzyPromise'); function _newJoin(parentTable, childTable, columnNames) { var c = {}; c.parentTable = parentTable; c.childTable = childTable; c.columns = []; var columns = parentTable._columns; addColumns(); c.accept = function(visitor) { visitor.visitJoin(c); }; c.toLeg = function() { return newLeg(c); }; c.getFromDb = function(parent) { var key = parentToArrayKey(parent); if (key.length === 0) { return nullPromise; } var args = [childTable].concat(key); return getById.apply(null, args); }; c.getFromCache = function(parent) { var result = c.getRowsSync(parent); return fuzzyPromise(result); }; c.toGetRelated = function(parent) { return newGetRelated(parent, c); }; c.getRelatives = function(parent) { return getRelatives(parent, c); }; c.expand = function(parent) { parent.expand(c.leftAlias); }; c.getRowsSync = function(parent) { var key = parentToKey(parent); let cache = parent._relationCacheMap.get(c); return cache.tryGet(key); }; c.getInnerCache = function() { return childTable._cache.getInnerCache(); }; c.notNullExceptInsert = function() { return c; }; c.notNull = function() { return c; }; return c; function addColumns() { var numberOfColumns = columnNames.length; for (var i = 0; i < columns.length; i++) { var curColumn = columns[i]; tryAdd(curColumn); if (numberOfColumns === c.columns.length) return; } } function tryAdd(column) { for (var i = 0; i < columnNames.length; i++) { var name = columnNames[i]; if (column._dbName === name) { column.default = undefined; // delete column.lazyDefault; c.columns.push(column); return; } } } function parentToKey(parent) { let key = {}; for (let i = 0; i < c.columns.length; i++) { let value = parent[c.columns[i].alias]; if (value === null || value === undefined) return {}; key[childTable._primaryColumns[i].alias] = value; } return key; } function parentToArrayKey(parent) { let key = []; for (let i = 0; i < c.columns.length; i++) { let value = parent[c.columns[i].alias]; if (value === null || value === undefined) return []; key.push(value); } return key; } } module.exports = _newJoin;