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/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;