|
9 | 9 | import { getModel } from "./utils/model-manager.js"; |
10 | 10 | import dico, { fieldTypes as ft } from "./utils/dico.js"; |
11 | 11 | import { runQuery } from "./utils/query.js"; |
12 | | -import errors from "./utils/errors.js"; |
| 12 | +import { badRequest } from "./utils/errors.js"; |
13 | 13 | import logger from "./utils/logger.js"; |
14 | 14 | import config from "../config.js"; |
15 | 15 |
|
@@ -83,70 +83,66 @@ export function getStats(req, res) { |
83 | 83 |
|
84 | 84 | const mid = req.params.entity, |
85 | 85 | m = getModel(mid); |
86 | | - let sqlNulls = []; |
| 86 | + |
| 87 | + if (!m) { |
| 88 | + return badRequest(res, `Model not found: "${mid}".`, 404); |
| 89 | + } |
| 90 | + if (m.noStats) { |
| 91 | + return badRequest(res, `noStats=true on model "${mid}".`, 400); |
| 92 | + } |
87 | 93 |
|
88 | 94 | const sqlFROM = " FROM " + m.schemaTable; |
89 | 95 | const sqlNull = (f) => |
90 | 96 | `(SELECT COUNT(*)::integer AS "${f.id}_nulls" ${sqlFROM} WHERE "${f.column}" IS NULL)`; |
91 | 97 | const sqlNullorEmpty = (f) => |
92 | 98 | `(SELECT COUNT(*)::integer AS "${f.id}_nulls" ${sqlFROM} WHERE "${f.column}" IS NULL OR "${f.column}"='')`; |
93 | 99 |
|
94 | | - if (m) { |
95 | | - if (!m.noStats) { |
96 | | - let sql = "SELECT count(*)::integer AS count"; |
| 100 | + let sql = "SELECT count(*)::integer AS count"; |
| 101 | + const sqlNulls = []; |
97 | 102 |
|
98 | | - m.fields.forEach(function (f) { |
99 | | - if (!f.noStats) { |
100 | | - if (dico.fieldIsNumeric(f)) { |
101 | | - if (!dico.fieldIsDateOrTime(f)) { |
102 | | - sql += |
103 | | - sqlAggregate("avg", f) + |
104 | | - sqlAggregate("stddev", f) + |
105 | | - sqlAggregate("variance", f); |
106 | | - } |
107 | | - if (f.type === ft.money || f.type === ft.int) { |
108 | | - // TODO: should we? (it may be too big a number) |
109 | | - sql += sqlAggregate("sum", f); |
110 | | - } |
111 | | - sql += sqlAggregate("min", f); |
112 | | - sql += sqlAggregate("max", f); |
113 | | - //}else if(f.type===ft.lov){ |
114 | | - // sql += ',(select id, count("'+f.column+'")::integer FROM '+m.schemaTable+' GROUP BY id LIMIT 3)' |
115 | | - sqlNulls.push(sqlNull(f)); |
116 | | - } else { |
117 | | - if (f.type === "lov" || f.type === "boolean") { |
118 | | - sqlNulls.push(sqlNull(f)); |
119 | | - } else { |
120 | | - sqlNulls.push(sqlNullorEmpty(f)); |
121 | | - } |
122 | | - } |
| 103 | + m.fields.forEach((f) => { |
| 104 | + if (!f.noStats) { |
| 105 | + if (dico.fieldIsNumeric(f)) { |
| 106 | + if (!dico.fieldIsDateOrTime(f)) { |
| 107 | + sql += |
| 108 | + sqlAggregate("avg", f) + |
| 109 | + sqlAggregate("stddev", f) + |
| 110 | + sqlAggregate("variance", f); |
| 111 | + } |
| 112 | + if (f.type === ft.money || f.type === ft.int) { |
| 113 | + sql += sqlAggregate("sum", f); |
| 114 | + } |
| 115 | + sql += sqlAggregate("min", f); |
| 116 | + sql += sqlAggregate("max", f); |
| 117 | + sqlNulls.push(sqlNull(f)); |
| 118 | + } else { |
| 119 | + if (f.type === ft.lov || f.type === ft.bool) { |
| 120 | + sqlNulls.push(sqlNull(f)); |
| 121 | + } else { |
| 122 | + sqlNulls.push(sqlNullorEmpty(f)); |
123 | 123 | } |
124 | | - }); |
125 | | - if (config.wTimestamp) { |
126 | | - // - last update |
127 | | - sql += `, max(${config.updatedDateColumn}) AS u_date_max`; |
128 | | - // - number of insert & updates this week |
129 | | - sql += |
130 | | - `, (SELECT count(${m.pKey})::integer ${sqlFROM}` + |
131 | | - " WHERE " + |
132 | | - config.updatedDateColumn + |
133 | | - " > NOW() - interval '7 days') AS u_date_week_count" + |
134 | | - // - first insert |
135 | | - `, min(${config.createdDateColumn}) AS c_date_min`; |
136 | | - } |
137 | | - if (config.wComments) { |
138 | | - // - number of comments |
139 | | - sql += ", sum(nb_comments::integer)::integer AS nb_comments"; |
140 | 124 | } |
141 | | - sql += ", " + sqlNulls.join(", "); |
142 | | - sql += sqlFROM; |
143 | | - runQuery(res, sql, [], true, null, null, fnPrep(m.fields)); |
144 | | - } else { |
145 | | - errors.badRequest(res, 'noStats=true on model "' + mid + '".', 401); |
146 | 125 | } |
147 | | - } else { |
148 | | - errors.badRequest(res, 'Model not found: "' + mid + '".', 404); |
| 126 | + }); |
| 127 | + |
| 128 | + if (config.wTimestamp) { |
| 129 | + // - last update |
| 130 | + sql += `, max(${config.updatedDateColumn}) AS u_date_max`; |
| 131 | + // - number of insert & updates this week |
| 132 | + sql += |
| 133 | + `, (SELECT count(${m.pKey})::integer ${sqlFROM}` + |
| 134 | + " WHERE " + |
| 135 | + config.updatedDateColumn + |
| 136 | + " > NOW() - interval '7 days') AS u_date_week_count" + |
| 137 | + // - first insert |
| 138 | + `, min(${config.createdDateColumn}) AS c_date_min`; |
| 139 | + } |
| 140 | + if (config.wComments) { |
| 141 | + sql += ", sum(nb_comments::integer)::integer AS nb_comments"; |
149 | 142 | } |
| 143 | + sql += ", " + sqlNulls.join(", "); |
| 144 | + sql += sqlFROM; |
| 145 | + runQuery(res, sql, [], true, null, null, fnPrep(m.fields)); |
150 | 146 | } |
151 | 147 |
|
152 | 148 | // -------------------------------------------------------------------------------------- |
|
0 commit comments