-
Notifications
You must be signed in to change notification settings - Fork 8
/
table.js
115 lines (98 loc) · 3.28 KB
/
table.js
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
114
115
var Util = require('./util'),
Join = require('./join');
// a table model
function Table(tableName, registry) {
this.id = 'id';
this.tableName = tableName;
this.joins = {};
this.defaultJoins = [];
this.columns = null;
this.selectColumns = null;
this.defaultSelectCriteria = null;
this.columnMap = null;
this.isInitialized = false;
this.defaultJoinsNeedPostProcessing = false;
this.registry = registry;
}
Table.prototype.init = function() {
if (this.isInitialized) return;
this.isInitialized = true;
if (!this.columnMap)
this.columnMap = camelCaseToUnderscoreMap(this.columns);
// build a list of default join names
if (this.joins) {
Util.eachKey(this.joins, function (name, join) {
if (join.default)
this.defaultJoins.push(name);
}, this);
}
this.defaultJoinsNeedPostProcessing = this.needsJoinPostProcessing(this.defaultJoins);
};
Table.prototype.selectColumnList = function (dbColumns, joinsOrPrefix) {
var self = this,
prefix = ' ',
joins = this.defaultJoins,
columns;
if (joinsOrPrefix instanceof Array)
joins = joins.concat(joinsOrPrefix);
if (joins.length > 0)
prefix = ' ' + this.tableName + '.';
else if ((typeof joinsOrPrefix === 'string') || (joinsOrPrefix instanceof String))
prefix = ' ' + joinsOrPrefix + '.';
columns = dbColumns.map(function (col) {
var dbName = self.columnMap[col];
if (dbName === col)
return prefix + col;
else if (dbName)
return prefix + dbName + ' AS "' + col + '"';
return col;
});
if (joins.length > 0)
columns = columns.concat(this.joinColumns(joins));
return columns;
};
Table.prototype.joinColumns = function (joins) {
var columns = [];
joins.forEach(function (joinName) {
var join = this.joins[joinName];
if (join) {
var map = join.map;
var joinTable = this.registry.getTableDefinition(join.table);
if (!map)
map = joinTable.columnMap;
Util.eachKey(map, function (field, column) {
if (join.type === Join.ONE_TO_MANY)
columns.push(' ' + join.table + '.' + column + ' AS "' + join.table + '.' + field + '"');
else
columns.push(' ' + join.table + '.' + column + ' AS "' + field + '"');
});
}
}, this);
return columns;
};
Table.prototype.needsJoinPostProcessing = function (names) {
if (this.defaultJoinsNeedPostProcessing)
return true;
if (!names || (names.length === 0))
return false;
for (var i = 0; i < names.length; i++) {
var join = this.joins[names[i]];
if (join && (join.type === Join.ONE_TO_MANY))
return true;
}
return false;
};
// convert camel case to underscore
function toUnderscore(str) {
return str.replace(/([A-Z])/g, function (s) {
return '_' + s.toLowerCase();
});
}
// build a map that converts each camel case column name to an underscore name
function camelCaseToUnderscoreMap(columns) {
var map = {};
for (var i = 0; i < columns.length; i++)
map[columns[i]] = toUnderscore(columns[i]);
return map;
}
module.exports = Table;