@opengis/fastify-table 1.2.52 → 1.2.54
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/package.json
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import routeFilter from '../../../routes/table/controllers/filter.js';
|
|
2
|
+
|
|
3
|
+
export default async function getFilter({ pg, table, filter, custom, state, search, user }) {
|
|
4
|
+
const params = { table };
|
|
5
|
+
const query = { filter, custom, state, search };
|
|
6
|
+
const result = await routeFilter({ pg, params, query, user });
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getSelect, getFilterSQL, getTemplate, getSelectVal, pgClients } from '../../../../utils.js';
|
|
1
|
+
import { logger, autoIndex, getSelect, getFilterSQL, getTemplate, getSelectVal, pgClients } from '../../../../utils.js';
|
|
2
2
|
|
|
3
3
|
export default async function filterAPI(req) {
|
|
4
4
|
const time = Date.now();
|
|
@@ -11,13 +11,14 @@ export default async function filterAPI(req) {
|
|
|
11
11
|
if (!loadTable) { return { status: 404, message: 'not found' }; }
|
|
12
12
|
|
|
13
13
|
const sqlTable = loadTable.sql?.filter?.((el) => !el?.disabled && el?.sql?.replace).map((el, i) => ` left join lateral (${el.sql.replace('{{uid}}', user?.uid)}) ${el.name || `t${i}`} on 1=1 `)?.join('') || '';
|
|
14
|
-
const { fields: columns } = await pg.query(`select * from ${loadTable.table} t ${sqlTable} limit 0`);
|
|
14
|
+
const { fields: columns = [] } = await pg.query(`select * from ${loadTable.table} t ${sqlTable} limit 0`);
|
|
15
|
+
const { fields = [] } = await pg.query(`select * from ${loadTable.table} t limit 0`);
|
|
15
16
|
|
|
16
17
|
const {
|
|
17
18
|
filter, custom, state, search,
|
|
18
19
|
} = query;
|
|
19
20
|
|
|
20
|
-
const { extra } = loadTable?.form ? await getTemplate('form', loadTable?.form) : {};
|
|
21
|
+
const { extra } = loadTable?.form ? await getTemplate('form', loadTable?.form) || {} : {};
|
|
21
22
|
|
|
22
23
|
const { optimizedSQL = `select * from ${loadTable.table}` } = loadTable?.sql || filter || custom || state || search || extra ? await getFilterSQL({
|
|
23
24
|
pg,
|
|
@@ -28,7 +29,19 @@ export default async function filterAPI(req) {
|
|
|
28
29
|
search,
|
|
29
30
|
}) : {};
|
|
30
31
|
|
|
31
|
-
const filters = loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || [];
|
|
32
|
+
const filters = (loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || []).concat(loadTable?.filterSql || []);
|
|
33
|
+
|
|
34
|
+
// admin.custom_column - user filter NA-165
|
|
35
|
+
const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2 and filter`, [params.name, user?.uid]);
|
|
36
|
+
properties.forEach((row) => filters.push({ id: row.name, name: row.name, ua: row.title, type: row.format, data: row.data }));
|
|
37
|
+
|
|
38
|
+
// KRYVYIRIH-231
|
|
39
|
+
autoIndex({ table: loadTable.table, columns: filters.filter((el) => columns?.find?.((item) => item?.name === el.name)) })
|
|
40
|
+
.catch(err => {
|
|
41
|
+
console.error(err.toString());
|
|
42
|
+
logger.file('autoindex/error', { name: params?.name, error: err.toString(), stack: err.stack });
|
|
43
|
+
});
|
|
44
|
+
|
|
32
45
|
await Promise.all(filters.filter((el) => el.data && (el.id || el.name)).map(async (el) => {
|
|
33
46
|
const name = el.id || el.name;
|
|
34
47
|
const cls = await getSelect(el.data, pg);
|
|
@@ -36,6 +49,15 @@ export default async function filterAPI(req) {
|
|
|
36
49
|
if (!cls || !loadTable.table) return;
|
|
37
50
|
const { dataTypeID } = columns.find((item) => item.name === name) || {};
|
|
38
51
|
|
|
52
|
+
if (el.extra && el.type === 'select' && Array.isArray(cls)) {
|
|
53
|
+
const countArr = await pg.query(`select value_text as id, count(*) from crm.extra_data where property_key=$1 and property_entity=$2 group by value_text`, [name, params.table]);
|
|
54
|
+
const options = countArr.rows.map(cel => {
|
|
55
|
+
const data = cls.find(c => c.id === cel.id);
|
|
56
|
+
return { ...cel, ...data };
|
|
57
|
+
});
|
|
58
|
+
Object.assign(el, { options });
|
|
59
|
+
}
|
|
60
|
+
|
|
39
61
|
const countArr = pg.pgType[dataTypeID]?.includes('[]')
|
|
40
62
|
? await pg.queryCache(`select unnest(${name})::text as id,count(*) from (${optimizedSQL})q group by unnest(${name})`, { table: loadTable.table, time: 5 })
|
|
41
63
|
: await pg.queryCache(`select ${name}::text as id,count(*) from (${optimizedSQL})q group by ${name}`, { table: loadTable.table, time: 5 });
|
|
@@ -59,12 +81,38 @@ export default async function filterAPI(req) {
|
|
|
59
81
|
});
|
|
60
82
|
}
|
|
61
83
|
|
|
84
|
+
const sqlList = loadTable?.sql
|
|
85
|
+
?.filter((el) => !el.disabled && el?.sql?.replace)
|
|
86
|
+
?.map((el, i) => ` left join lateral (${el.filter ? el.sql.replace(/limit 1/ig, '') : el.sql}) as ${el.name || `t${i + 1}`} on 1=1 `)
|
|
87
|
+
?.join(' ') || '';
|
|
88
|
+
|
|
89
|
+
// percentile_cont - alternative
|
|
90
|
+
await Promise.all(filters.filter((el) => el.name && el.type === 'Range' && fields?.find?.((item) => item?.name === el.name)).map(async (el) => {
|
|
91
|
+
const data = await pg.queryCache(`select array[
|
|
92
|
+
min(${el.name}),
|
|
93
|
+
percentile_disc(0.25) within group (order by ${el.name}),
|
|
94
|
+
percentile_disc(0.5) within group (order by ${el.name}),
|
|
95
|
+
percentile_disc(0.75) within group (order by ${el.name}),
|
|
96
|
+
max(${el.name})
|
|
97
|
+
] as range from ${loadTable.table} ${sqlList && false ? ` t ${sqlList}` : ''} where ${loadTable.query || '1=1'}`, { table: loadTable.table }).then(el => el.rows?.[0]?.range);
|
|
98
|
+
Object.assign(el, { data });
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
const sqlFilters = (loadTable?.filterCustom || []).filter((el) => el.name && el.sql);
|
|
102
|
+
const q1 = sqlFilters.map((el) => `select count(*), '${el.name}' as name from ${loadTable.table} where ${loadTable.query || '1=1'} and ${el.sql}`).join(' union all ');
|
|
103
|
+
const { rows: sqlRows = [] } = q1 ? await pg.queryCache(q1, { table: loadTable.table }) : {};
|
|
104
|
+
if (sqlRows?.length) {
|
|
105
|
+
sqlFilters.forEach((el) => {
|
|
106
|
+
const { count } = sqlRows.find((row) => row.name === el.name) || {};
|
|
107
|
+
Object.assign(el, { count, sql: undefined });
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
62
111
|
return {
|
|
63
112
|
time: Date.now() - time,
|
|
64
113
|
list: filters,
|
|
65
114
|
custom: loadTable?.filterCustom,
|
|
66
115
|
inline: loadTable?.filterInline,
|
|
67
116
|
state: loadTable?.filterState,
|
|
68
|
-
sql: loadTable?.filterSql,
|
|
69
117
|
};
|
|
70
118
|
}
|
package/utils.js
CHANGED
|
@@ -33,6 +33,7 @@ import getSelect from './server/plugins/table/funcs/getSelect.js';
|
|
|
33
33
|
import getSelectMeta from './server/plugins/table/funcs/getSelectMeta.js';
|
|
34
34
|
import gisIRColumn from './server/plugins/table/funcs/gisIRColumn.js';
|
|
35
35
|
import getData from './server/plugins/table/funcs/getData.js';
|
|
36
|
+
import getFilter from './server/plugins/table/funcs/getFilter.js';
|
|
36
37
|
|
|
37
38
|
// crud
|
|
38
39
|
import dataInsert from './server/plugins/crud/funcs/dataInsert.js';
|
|
@@ -62,6 +63,7 @@ import logger from './server/plugins/logger/getLogger.js';
|
|
|
62
63
|
|
|
63
64
|
// utils
|
|
64
65
|
import config from './config.js';
|
|
66
|
+
import dblist from './dblist.js';
|
|
65
67
|
import eventStream from './server/plugins/util/funcs/eventStream.js';
|
|
66
68
|
import isFileExists from './server/plugins/crud/funcs/isFileExists.js';
|
|
67
69
|
import getFolder from './server/plugins/crud/funcs/utils/getFolder.js';
|
|
@@ -71,6 +73,7 @@ import logChanges from './server/plugins/crud/funcs/utils/logChanges.js';
|
|
|
71
73
|
export default null;
|
|
72
74
|
export {
|
|
73
75
|
config,
|
|
76
|
+
dblist,
|
|
74
77
|
getFolder,
|
|
75
78
|
handlebars,
|
|
76
79
|
handlebarsSync,
|
|
@@ -116,6 +119,7 @@ export {
|
|
|
116
119
|
getMeta,
|
|
117
120
|
gisIRColumn,
|
|
118
121
|
getData,
|
|
122
|
+
getFilter,
|
|
119
123
|
|
|
120
124
|
// pg
|
|
121
125
|
initPG,
|