xmysql-timzoned 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +28 -0
- package/.travis.yml +17 -0
- package/LICENSE +22 -0
- package/bin/index.js +94 -0
- package/dockerfile +33 -0
- package/index.js +1 -0
- package/lib/util/cmd.helper.js +109 -0
- package/lib/util/data.helper.js +211 -0
- package/lib/util/whereClause.helper.js +350 -0
- package/lib/xapi.js +509 -0
- package/lib/xctrl.js +589 -0
- package/lib/xsql.js +1321 -0
- package/package.json +46 -0
package/lib/xctrl.js
ADDED
@@ -0,0 +1,589 @@
|
|
1
|
+
//define class
|
2
|
+
class xctrl {
|
3
|
+
constructor(app, mysql) {
|
4
|
+
this.app = app;
|
5
|
+
this.mysql = mysql;
|
6
|
+
}
|
7
|
+
|
8
|
+
async create(req, res) {
|
9
|
+
let query = "INSERT INTO ?? SET ?";
|
10
|
+
let params = [];
|
11
|
+
|
12
|
+
params.push(req.app.locals._tableName);
|
13
|
+
params.push(req.body);
|
14
|
+
|
15
|
+
var results = await this.mysql.exec(query, params);
|
16
|
+
res.status(200).json(results);
|
17
|
+
}
|
18
|
+
|
19
|
+
async list(req, res) {
|
20
|
+
let queryParamsObj = {};
|
21
|
+
queryParamsObj.query = "";
|
22
|
+
queryParamsObj.params = [];
|
23
|
+
|
24
|
+
this.mysql.prepareListQuery(req, res, queryParamsObj, 0);
|
25
|
+
|
26
|
+
let results = await this.mysql.exec(
|
27
|
+
queryParamsObj.query,
|
28
|
+
queryParamsObj.params
|
29
|
+
);
|
30
|
+
res.status(200).json(results);
|
31
|
+
}
|
32
|
+
|
33
|
+
async nestedList(req, res) {
|
34
|
+
let queryParamsObj = {};
|
35
|
+
queryParamsObj.query = "";
|
36
|
+
queryParamsObj.params = [];
|
37
|
+
|
38
|
+
this.mysql.prepareListQuery(req, res, queryParamsObj, 1);
|
39
|
+
|
40
|
+
let results = await this.mysql.exec(
|
41
|
+
queryParamsObj.query,
|
42
|
+
queryParamsObj.params
|
43
|
+
);
|
44
|
+
res.status(200).json(results);
|
45
|
+
}
|
46
|
+
|
47
|
+
async findOne(req, res) {
|
48
|
+
let queryParamsObj = {};
|
49
|
+
queryParamsObj.query = "";
|
50
|
+
queryParamsObj.params = [];
|
51
|
+
|
52
|
+
this.mysql.prepareListQuery(req, res, queryParamsObj, 2);
|
53
|
+
|
54
|
+
let results = await this.mysql.exec(
|
55
|
+
queryParamsObj.query,
|
56
|
+
queryParamsObj.params
|
57
|
+
);
|
58
|
+
res.status(200).json(results);
|
59
|
+
}
|
60
|
+
|
61
|
+
async read(req, res) {
|
62
|
+
let query = "select * from ?? where ";
|
63
|
+
let params = [];
|
64
|
+
|
65
|
+
params.push(req.app.locals._tableName);
|
66
|
+
|
67
|
+
let clause = this.mysql.getPrimaryKeyWhereClause(
|
68
|
+
req.app.locals._tableName,
|
69
|
+
req.params.id.split("___")
|
70
|
+
);
|
71
|
+
|
72
|
+
if (!clause) {
|
73
|
+
return res.status(400).send({
|
74
|
+
error:
|
75
|
+
"Table is made of composite primary keys - all keys were not in input"
|
76
|
+
});
|
77
|
+
}
|
78
|
+
|
79
|
+
query += clause;
|
80
|
+
query += " LIMIT 1";
|
81
|
+
|
82
|
+
let results = await this.mysql.exec(query, params);
|
83
|
+
res.status(200).json(results);
|
84
|
+
}
|
85
|
+
|
86
|
+
async exists(req, res) {
|
87
|
+
let query = "select * from ?? where ";
|
88
|
+
let params = [];
|
89
|
+
|
90
|
+
params.push(req.app.locals._tableName);
|
91
|
+
|
92
|
+
let clause = this.mysql.getPrimaryKeyWhereClause(
|
93
|
+
req.app.locals._tableName,
|
94
|
+
req.params.id.split("___")
|
95
|
+
);
|
96
|
+
|
97
|
+
if (!clause) {
|
98
|
+
return res.status(400).send({
|
99
|
+
error:
|
100
|
+
"Table is made of composite primary keys - all keys were not in input"
|
101
|
+
});
|
102
|
+
}
|
103
|
+
|
104
|
+
query += clause;
|
105
|
+
query += " LIMIT 1";
|
106
|
+
|
107
|
+
let results = await this.mysql.exec(query, params);
|
108
|
+
res.status(200).json(results);
|
109
|
+
}
|
110
|
+
|
111
|
+
async update(req, res) {
|
112
|
+
let query = "REPLACE INTO ?? SET ?";
|
113
|
+
let params = [];
|
114
|
+
|
115
|
+
params.push(req.app.locals._tableName);
|
116
|
+
params.push(req.body);
|
117
|
+
|
118
|
+
var results = await this.mysql.exec(query, params);
|
119
|
+
res.status(200).json(results);
|
120
|
+
}
|
121
|
+
|
122
|
+
async patch(req, res) {
|
123
|
+
let query = "UPDATE ?? SET ";
|
124
|
+
let keys = Object.keys(req.body);
|
125
|
+
|
126
|
+
// SET clause
|
127
|
+
let updateKeys = "";
|
128
|
+
for (let i = 0; i < keys.length; ++i) {
|
129
|
+
updateKeys += keys[i] + " = ? ";
|
130
|
+
if (i !== keys.length - 1) updateKeys += ", ";
|
131
|
+
}
|
132
|
+
|
133
|
+
// where clause
|
134
|
+
query += updateKeys + " where ";
|
135
|
+
let clause = this.mysql.getPrimaryKeyWhereClause(
|
136
|
+
req.app.locals._tableName,
|
137
|
+
req.params.id.split("___")
|
138
|
+
);
|
139
|
+
|
140
|
+
if (!clause) {
|
141
|
+
return res.status(400).send({
|
142
|
+
error:
|
143
|
+
"Table is made of composite primary keys - all keys were not in input"
|
144
|
+
});
|
145
|
+
}
|
146
|
+
|
147
|
+
query += clause;
|
148
|
+
|
149
|
+
// params
|
150
|
+
let params = [];
|
151
|
+
params.push(req.app.locals._tableName);
|
152
|
+
params = params.concat(Object.values(req.body));
|
153
|
+
|
154
|
+
let results = await this.mysql.exec(query, params);
|
155
|
+
res.status(200).json(results);
|
156
|
+
}
|
157
|
+
|
158
|
+
async delete(req, res) {
|
159
|
+
let query = "DELETE FROM ?? WHERE ";
|
160
|
+
let params = [];
|
161
|
+
|
162
|
+
params.push(req.app.locals._tableName);
|
163
|
+
|
164
|
+
let clause = this.mysql.getPrimaryKeyWhereClause(
|
165
|
+
req.app.locals._tableName,
|
166
|
+
req.params.id.split("___")
|
167
|
+
);
|
168
|
+
|
169
|
+
if (!clause) {
|
170
|
+
return res.status(400).send({
|
171
|
+
error:
|
172
|
+
"Table is made of composite primary keys - all keys were not in input"
|
173
|
+
});
|
174
|
+
}
|
175
|
+
|
176
|
+
query += clause;
|
177
|
+
|
178
|
+
let results = await this.mysql.exec(query, params);
|
179
|
+
res.status(200).json(results);
|
180
|
+
}
|
181
|
+
|
182
|
+
async bulkInsert(req, res) {
|
183
|
+
let queryParamsObj = {};
|
184
|
+
queryParamsObj.query = "";
|
185
|
+
queryParamsObj.params = [];
|
186
|
+
let results = [];
|
187
|
+
|
188
|
+
//console.log(req.app.locals._tableName, req.body);
|
189
|
+
|
190
|
+
this.mysql.prepareBulkInsert(
|
191
|
+
req.app.locals._tableName,
|
192
|
+
req.body,
|
193
|
+
queryParamsObj
|
194
|
+
);
|
195
|
+
|
196
|
+
results = await this.mysql.exec(
|
197
|
+
queryParamsObj.query,
|
198
|
+
queryParamsObj.params
|
199
|
+
);
|
200
|
+
res.status(200).json(results);
|
201
|
+
}
|
202
|
+
|
203
|
+
async bulkDelete(req, res) {
|
204
|
+
let query = "delete from ?? where ?? in ";
|
205
|
+
let params = [];
|
206
|
+
|
207
|
+
params.push(req.app.locals._tableName);
|
208
|
+
params.push(this.mysql.getPrimaryKeyName(req.app.locals._tableName));
|
209
|
+
|
210
|
+
query += "(";
|
211
|
+
|
212
|
+
if (req.query && req.query._ids) {
|
213
|
+
let ids = req.query._ids.split(",");
|
214
|
+
for (var i = 0; i < ids.length; ++i) {
|
215
|
+
if (i) {
|
216
|
+
query += ",";
|
217
|
+
}
|
218
|
+
query += "?";
|
219
|
+
params.push(ids[i]);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
query += ")";
|
224
|
+
|
225
|
+
//console.log(query, params);
|
226
|
+
|
227
|
+
var results = await this.mysql.exec(query, params);
|
228
|
+
res.status(200).json(results);
|
229
|
+
}
|
230
|
+
|
231
|
+
async bulkRead(req, res) {
|
232
|
+
let queryParamsObj = {};
|
233
|
+
queryParamsObj.query = "";
|
234
|
+
queryParamsObj.params = [];
|
235
|
+
|
236
|
+
this.mysql.prepareListQuery(req, res, queryParamsObj, 3);
|
237
|
+
|
238
|
+
//console.log(queryParamsObj.query, queryParamsObj.params);
|
239
|
+
|
240
|
+
let results = await this.mysql.exec(
|
241
|
+
queryParamsObj.query,
|
242
|
+
queryParamsObj.params
|
243
|
+
);
|
244
|
+
res.status(200).json(results);
|
245
|
+
}
|
246
|
+
|
247
|
+
async count(req, res) {
|
248
|
+
let queryParams = {};
|
249
|
+
|
250
|
+
queryParams.query = "select count(1) as no_of_rows from ?? ";
|
251
|
+
queryParams.params = [];
|
252
|
+
|
253
|
+
queryParams.params.push(req.app.locals._tableName);
|
254
|
+
|
255
|
+
this.mysql.getWhereClause(
|
256
|
+
req.query._where,
|
257
|
+
req.app.locals._tableName,
|
258
|
+
queryParams,
|
259
|
+
" where "
|
260
|
+
);
|
261
|
+
|
262
|
+
let results = await this.mysql.exec(queryParams.query, queryParams.params);
|
263
|
+
res.status(200).json(results);
|
264
|
+
}
|
265
|
+
|
266
|
+
async distinct(req, res) {
|
267
|
+
let queryParamsObj = {};
|
268
|
+
queryParamsObj.query = "";
|
269
|
+
queryParamsObj.params = [];
|
270
|
+
|
271
|
+
this.mysql.prepareListQuery(req, res, queryParamsObj, 4);
|
272
|
+
|
273
|
+
let results = await this.mysql.exec(
|
274
|
+
queryParamsObj.query,
|
275
|
+
queryParamsObj.params
|
276
|
+
);
|
277
|
+
res.status(200).json(results);
|
278
|
+
}
|
279
|
+
|
280
|
+
async groupBy(req, res) {
|
281
|
+
if (req.query && req.query._fields) {
|
282
|
+
let queryParamsObj = {};
|
283
|
+
queryParamsObj.query = "select ";
|
284
|
+
queryParamsObj.params = [];
|
285
|
+
|
286
|
+
/**************** add columns and group by columns ****************/
|
287
|
+
this.mysql.getColumnsForSelectStmt(
|
288
|
+
req.app.locals._tableName,
|
289
|
+
req.query,
|
290
|
+
queryParamsObj
|
291
|
+
);
|
292
|
+
|
293
|
+
queryParamsObj.query += ",count(*) as _count from ?? group by ";
|
294
|
+
let tableName = req.app.locals._tableName;
|
295
|
+
queryParamsObj.params.push(tableName);
|
296
|
+
|
297
|
+
this.mysql.getColumnsForGroupBy(
|
298
|
+
req.app.locals._tableName,
|
299
|
+
req.query,
|
300
|
+
queryParamsObj
|
301
|
+
);
|
302
|
+
|
303
|
+
if (!req.query._sort) {
|
304
|
+
req.query._sort = {};
|
305
|
+
req.query._sort = "-_count";
|
306
|
+
}
|
307
|
+
|
308
|
+
/**************** add having clause ****************/
|
309
|
+
this.mysql.getHavingClause(
|
310
|
+
req.query._having,
|
311
|
+
req.app.locals._tableName,
|
312
|
+
queryParamsObj,
|
313
|
+
" having "
|
314
|
+
);
|
315
|
+
|
316
|
+
/**************** add orderby clause ****************/
|
317
|
+
this.mysql.getOrderByClause(req.query, tableName, queryParamsObj);
|
318
|
+
|
319
|
+
//console.log(queryParamsObj.query, queryParamsObj.params);
|
320
|
+
var results = await this.mysql.exec(
|
321
|
+
queryParamsObj.query,
|
322
|
+
queryParamsObj.params
|
323
|
+
);
|
324
|
+
|
325
|
+
res.status(200).json(results);
|
326
|
+
} else {
|
327
|
+
res
|
328
|
+
.status(400)
|
329
|
+
.json({
|
330
|
+
message:
|
331
|
+
"Missing _fields query params eg: /api/tableName/groupby?_fields=column1"
|
332
|
+
});
|
333
|
+
}
|
334
|
+
}
|
335
|
+
|
336
|
+
async ugroupby(req, res) {
|
337
|
+
if (req.query && req.query._fields) {
|
338
|
+
let queryParamsObj = {};
|
339
|
+
queryParamsObj.query = "";
|
340
|
+
queryParamsObj.params = [];
|
341
|
+
let uGrpByResults = {};
|
342
|
+
|
343
|
+
/**************** add fields with count(*) *****************/
|
344
|
+
let fields = req.query._fields.split(",");
|
345
|
+
|
346
|
+
for (var i = 0; i < fields.length; ++i) {
|
347
|
+
uGrpByResults[fields[i]] = [];
|
348
|
+
|
349
|
+
if (i) {
|
350
|
+
queryParamsObj.query += " UNION ";
|
351
|
+
}
|
352
|
+
queryParamsObj.query +=
|
353
|
+
" SELECT IFNULL(CONCAT(?,?,??),?) as ugroupby, count(*) as _count from ?? GROUP BY ?? ";
|
354
|
+
queryParamsObj.params.push(fields[i]);
|
355
|
+
queryParamsObj.params.push("~");
|
356
|
+
queryParamsObj.params.push(fields[i]);
|
357
|
+
queryParamsObj.params.push(fields[i] + "~");
|
358
|
+
queryParamsObj.params.push(req.app.locals._tableName);
|
359
|
+
queryParamsObj.params.push(fields[i]);
|
360
|
+
}
|
361
|
+
|
362
|
+
//console.log(queryParamsObj.query, queryParamsObj.params);
|
363
|
+
var results = await this.mysql.exec(
|
364
|
+
queryParamsObj.query,
|
365
|
+
queryParamsObj.params
|
366
|
+
);
|
367
|
+
|
368
|
+
for (var i = 0; i < results.length; ++i) {
|
369
|
+
let grpByColName = results[i]["ugroupby"].split("~")[0];
|
370
|
+
let grpByColValue = results[i]["ugroupby"].split("~")[1];
|
371
|
+
|
372
|
+
let obj = {};
|
373
|
+
obj[grpByColValue] = results[i]["_count"];
|
374
|
+
|
375
|
+
uGrpByResults[grpByColName].push(obj);
|
376
|
+
}
|
377
|
+
|
378
|
+
res.status(200).json(uGrpByResults);
|
379
|
+
} else {
|
380
|
+
res
|
381
|
+
.status(400)
|
382
|
+
.json({
|
383
|
+
message:
|
384
|
+
"Missing _fields query params eg: /api/tableName/ugroupby?_fields=column1,column2"
|
385
|
+
});
|
386
|
+
}
|
387
|
+
}
|
388
|
+
|
389
|
+
async aggregate(req, res) {
|
390
|
+
if (req.query && req.query._fields) {
|
391
|
+
let tableName = req.app.locals._tableName;
|
392
|
+
let query = "select ";
|
393
|
+
let params = [];
|
394
|
+
let fields = req.query._fields.split(",");
|
395
|
+
|
396
|
+
for (var i = 0; i < fields.length; ++i) {
|
397
|
+
if (i) {
|
398
|
+
query = query + ",";
|
399
|
+
}
|
400
|
+
query =
|
401
|
+
query +
|
402
|
+
" min(??) as ?,max(??) as ?,avg(??) as ?,sum(??) as ?,stddev(??) as ?,variance(??) as ? ";
|
403
|
+
params.push(fields[i]);
|
404
|
+
params.push("min_of_" + fields[i]);
|
405
|
+
params.push(fields[i]);
|
406
|
+
params.push("max_of_" + fields[i]);
|
407
|
+
params.push(fields[i]);
|
408
|
+
params.push("avg_of_" + fields[i]);
|
409
|
+
params.push(fields[i]);
|
410
|
+
params.push("sum_of_" + fields[i]);
|
411
|
+
params.push(fields[i]);
|
412
|
+
params.push("stddev_of_" + fields[i]);
|
413
|
+
params.push(fields[i]);
|
414
|
+
params.push("variance_of_" + fields[i]);
|
415
|
+
}
|
416
|
+
|
417
|
+
query = query + " from ??";
|
418
|
+
params.push(tableName);
|
419
|
+
|
420
|
+
var results = await this.mysql.exec(query, params);
|
421
|
+
|
422
|
+
res.status(200).json(results);
|
423
|
+
} else {
|
424
|
+
res
|
425
|
+
.status(400)
|
426
|
+
.json({
|
427
|
+
message:
|
428
|
+
"Missing _fields in query params eg: /api/tableName/aggregate?_fields=numericColumn1"
|
429
|
+
});
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
async chart(req, res) {
|
434
|
+
let query = "";
|
435
|
+
let params = [];
|
436
|
+
let obj = {};
|
437
|
+
|
438
|
+
if (req.query) {
|
439
|
+
let isRange = false;
|
440
|
+
if (req.query.range) {
|
441
|
+
isRange = true;
|
442
|
+
}
|
443
|
+
|
444
|
+
if (req.query && req.query.min && req.query.max && req.query.step) {
|
445
|
+
//console.log(req.params.min, req.params.max, req.params.step);
|
446
|
+
|
447
|
+
obj = this.mysql.getChartQueryAndParamsFromMinMaxStep(
|
448
|
+
req.app.locals._tableName,
|
449
|
+
req.query._fields,
|
450
|
+
parseInt(req.query.min),
|
451
|
+
parseInt(req.query.max),
|
452
|
+
parseInt(req.query.step),
|
453
|
+
isRange
|
454
|
+
);
|
455
|
+
} else if (
|
456
|
+
req.query &&
|
457
|
+
req.query.steparray &&
|
458
|
+
req.query.steparray.length > 1
|
459
|
+
) {
|
460
|
+
obj = this.mysql.getChartQueryAndParamsFromStepArray(
|
461
|
+
req.app.locals._tableName,
|
462
|
+
req.query._fields,
|
463
|
+
req.query.steparray.split(",").map(Number),
|
464
|
+
isRange
|
465
|
+
);
|
466
|
+
} else if (
|
467
|
+
req.query &&
|
468
|
+
req.query.steppair &&
|
469
|
+
req.query.steppair.length > 1
|
470
|
+
) {
|
471
|
+
obj = this.mysql.getChartQueryAndParamsFromStepPair(
|
472
|
+
req.app.locals._tableName,
|
473
|
+
req.query._fields,
|
474
|
+
req.query.steppair.split(",").map(Number),
|
475
|
+
false
|
476
|
+
);
|
477
|
+
} else {
|
478
|
+
query =
|
479
|
+
"select min(??) as min,max(??) as max,stddev(??) as stddev,avg(??) as avg from ??";
|
480
|
+
params = [];
|
481
|
+
|
482
|
+
params.push(req.query._fields);
|
483
|
+
params.push(req.query._fields);
|
484
|
+
params.push(req.query._fields);
|
485
|
+
params.push(req.query._fields);
|
486
|
+
params.push(req.app.locals._tableName);
|
487
|
+
|
488
|
+
let _this = this;
|
489
|
+
|
490
|
+
let results = await _this.mysql.exec(query, params);
|
491
|
+
|
492
|
+
//console.log(results, results['max'], req.params);
|
493
|
+
|
494
|
+
obj = _this.mysql.getChartQueryAndParamsFromMinMaxStddev(
|
495
|
+
req.app.locals._tableName,
|
496
|
+
req.query._fields,
|
497
|
+
results[0]["min"],
|
498
|
+
results[0]["max"],
|
499
|
+
results[0]["stddev"],
|
500
|
+
isRange
|
501
|
+
);
|
502
|
+
}
|
503
|
+
|
504
|
+
this.mysql.getWhereClause(
|
505
|
+
req.query._where,
|
506
|
+
req.app.locals._tableName,
|
507
|
+
obj,
|
508
|
+
" where "
|
509
|
+
);
|
510
|
+
|
511
|
+
let results = await this.mysql.exec(obj.query, obj.params);
|
512
|
+
|
513
|
+
res.status(200).json(results);
|
514
|
+
} else {
|
515
|
+
res
|
516
|
+
.status(400)
|
517
|
+
.json({
|
518
|
+
message:
|
519
|
+
"Missing _fields in query params eg: /api/tableName/chart?_fields=numericColumn1"
|
520
|
+
});
|
521
|
+
}
|
522
|
+
}
|
523
|
+
|
524
|
+
async autoChart(req, res) {
|
525
|
+
let query = "describe ??";
|
526
|
+
let params = [req.app.locals._tableName];
|
527
|
+
let obj = {};
|
528
|
+
let results = [];
|
529
|
+
|
530
|
+
let isRange = false;
|
531
|
+
if (req.query.range) {
|
532
|
+
isRange = true;
|
533
|
+
}
|
534
|
+
|
535
|
+
let describeResults = await this.mysql.exec(query, params);
|
536
|
+
|
537
|
+
//console.log(describeResults);
|
538
|
+
|
539
|
+
for (var i = 0; i < describeResults.length; ++i) {
|
540
|
+
//console.log('is this numeric column', describeResults[i]['Type']);
|
541
|
+
|
542
|
+
if (
|
543
|
+
describeResults[i]["Key"] !== "PRI" &&
|
544
|
+
this.mysql.isTypeOfColumnNumber(describeResults[i]["Type"])
|
545
|
+
) {
|
546
|
+
query =
|
547
|
+
"select min(??) as min,max(??) as max,stddev(??) as stddev,avg(??) as avg from ??";
|
548
|
+
params = [];
|
549
|
+
|
550
|
+
params.push(describeResults[i]["Field"]);
|
551
|
+
params.push(describeResults[i]["Field"]);
|
552
|
+
params.push(describeResults[i]["Field"]);
|
553
|
+
params.push(describeResults[i]["Field"]);
|
554
|
+
params.push(req.app.locals._tableName);
|
555
|
+
|
556
|
+
let _this = this;
|
557
|
+
|
558
|
+
let minMaxResults = await _this.mysql.exec(query, params);
|
559
|
+
|
560
|
+
//console.log(minMaxResults, minMaxResults['max'], req.params);
|
561
|
+
|
562
|
+
query = "";
|
563
|
+
params = [];
|
564
|
+
|
565
|
+
obj = _this.mysql.getChartQueryAndParamsFromMinMaxStddev(
|
566
|
+
req.app.locals._tableName,
|
567
|
+
describeResults[i]["Field"],
|
568
|
+
minMaxResults[0]["min"],
|
569
|
+
minMaxResults[0]["max"],
|
570
|
+
minMaxResults[0]["stddev"],
|
571
|
+
isRange
|
572
|
+
);
|
573
|
+
|
574
|
+
let r = await this.mysql.exec(obj.query, obj.params);
|
575
|
+
|
576
|
+
let resultObj = {};
|
577
|
+
resultObj["column"] = describeResults[i]["Field"];
|
578
|
+
resultObj["chart"] = r;
|
579
|
+
|
580
|
+
results.push(resultObj);
|
581
|
+
}
|
582
|
+
}
|
583
|
+
|
584
|
+
res.status(200).json(results);
|
585
|
+
}
|
586
|
+
}
|
587
|
+
|
588
|
+
//expose class
|
589
|
+
module.exports = xctrl;
|