-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
122 lines (80 loc) · 2.4 KB
/
index.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
116
117
118
119
120
121
122
const _ = require('lodash');
function GenQL(model) {
if (!model) {
throw new Error('Model is required');
}
if (!model.columns) {
throw new Error('Invalid model structure');
}
this.model = model;
}
GenQL.prototype._default = function(field) {
if (!field) {
throw new Error('Field is required');
}
const column = this._find(field);
if (!column) {
return;
}
return column.defaultValue;
};
GenQL.prototype._find = function(field) {
if (!field) {
throw new Error('Field is required');
}
return _.find(this.model.columns, { name: field });
};
GenQL.prototype._insert = function(prefix) {
prefix = prefix ? `${prefix}.` : '';
const columns = _.filter(this.model.columns, (column) => !column.auto);
return _.map(columns, column => {
return `${prefix}${column.name}`;
});
};
GenQL.prototype._join = function(prefix) {
prefix = prefix ? `${prefix}.` : '';
const { join_key, columns } = this.model;
return _.map(columns, (column) => {
if (column.alternate) {
return `COALESCE(NULLIF(${prefix}${column.name}, ''), ${column.alternate}) as ${join_key}_${column.name}`;
}
return `${prefix}${column.name} as ${join_key}_${column.name}`;
});
};
GenQL.prototype._pointer = function(length) {
if (!length) {
throw new Error('Length is required');
}
return _.times(length, _.constant('?'));
};
GenQL.prototype._findPrivate = function(prefix) {
prefix = prefix ? `${prefix}.` : '';
const columns = _.filter(this.model.columns, column => column.private);
return _.map(columns, (column) => {
return `${prefix}${column.name}`;
});
};
GenQL.prototype._removePrivate = function(data) {
return _.omit(data, this._findPrivate());
};
GenQL.prototype._values = function(data) {
const columns = _.filter(this.model.columns, column => !column.auto);
return _.map(columns, column => {
return _.get(data, column.name) || column.defaultValue;
});
};
GenQL.prototype._select = function(prefix) {
prefix = prefix ? `${prefix}.` : '';
return _.map(this.model.columns, column => {
if (column.alternate) {
return `COALESCE(NULLIF(${prefix}${column.name}, ''), ${column.alternate})`;
}
return `${prefix}${column.name}`;
});
};
GenQL.prototype._update = function(fields, data) {
return _.map(fields, field => {
return _.get(data, field) || this._default(field);
});
};
module.exports = GenQL;