@opengis/fastify-table 1.2.52 → 1.2.53

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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "1.2.52",
3
+ "version": "1.2.53",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [
@@ -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();
@@ -28,7 +28,19 @@ export default async function filterAPI(req) {
28
28
  search,
29
29
  }) : {};
30
30
 
31
- const filters = loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || [];
31
+ const filters = (loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || []).concat(loadTable?.filterSql || []);
32
+
33
+ // admin.custom_column - user filter NA-165
34
+ 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]);
35
+ properties.forEach((row) => filters.push({ id: row.name, name: row.name, ua: row.title, type: row.format, data: row.data }));
36
+
37
+ // KRYVYIRIH-231
38
+ autoIndex({ table: loadTable.table, columns: filters.filter((el) => columns?.find?.((item) => item?.name === el.name)) })
39
+ .catch(err => {
40
+ console.error(err.toString());
41
+ logger.file('autoindex/error', { name: params?.name, error: err.toString(), stack: err.stack });
42
+ });
43
+
32
44
  await Promise.all(filters.filter((el) => el.data && (el.id || el.name)).map(async (el) => {
33
45
  const name = el.id || el.name;
34
46
  const cls = await getSelect(el.data, pg);
@@ -36,6 +48,15 @@ export default async function filterAPI(req) {
36
48
  if (!cls || !loadTable.table) return;
37
49
  const { dataTypeID } = columns.find((item) => item.name === name) || {};
38
50
 
51
+ if (el.extra && el.type === 'select' && Array.isArray(cls)) {
52
+ 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]);
53
+ const options = countArr.rows.map(cel => {
54
+ const data = cls.find(c => c.id === cel.id);
55
+ return { ...cel, ...data };
56
+ });
57
+ Object.assign(el, { options });
58
+ }
59
+
39
60
  const countArr = pg.pgType[dataTypeID]?.includes('[]')
40
61
  ? await pg.queryCache(`select unnest(${name})::text as id,count(*) from (${optimizedSQL})q group by unnest(${name})`, { table: loadTable.table, time: 5 })
41
62
  : await pg.queryCache(`select ${name}::text as id,count(*) from (${optimizedSQL})q group by ${name}`, { table: loadTable.table, time: 5 });
@@ -59,12 +80,38 @@ export default async function filterAPI(req) {
59
80
  });
60
81
  }
61
82
 
83
+ const sqlList = loadTable?.sql
84
+ ?.filter((el) => !el.disabled && el?.sql?.replace)
85
+ ?.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 `)
86
+ ?.join(' ') || '';
87
+
88
+ // percentile_cont - alternative
89
+ await Promise.all(filters.filter((el) => el.name && el.type === 'Range' && columns?.find?.((item) => item?.name === el.name)).map(async (el) => {
90
+ const data = await pg.queryCache(`select array[
91
+ min(${el.name}),
92
+ percentile_disc(0.25) within group (order by ${el.name}),
93
+ percentile_disc(0.5) within group (order by ${el.name}),
94
+ percentile_disc(0.75) within group (order by ${el.name}),
95
+ max(${el.name})
96
+ ] as range from ${loadTable.table} ${sqlList && false ? ` t ${sqlList}` : ''} where ${loadTable.query || '1=1'}`, { table: loadTable.table }).then(el => el.rows?.[0]?.range);
97
+ Object.assign(el, { data });
98
+ }));
99
+
100
+ const sqlFilters = (loadTable?.filterCustom || []).filter((el) => el.name && el.sql);
101
+ 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 ');
102
+ const { rows: sqlRows = [] } = q1 ? await pg.queryCache(q1, { table: loadTable.table }) : {};
103
+ if (sqlRows?.length) {
104
+ sqlFilters.forEach((el) => {
105
+ const { count } = sqlRows.find((row) => row.name === el.name) || {};
106
+ Object.assign(el, { count, sql: undefined });
107
+ });
108
+ }
109
+
62
110
  return {
63
111
  time: Date.now() - time,
64
112
  list: filters,
65
113
  custom: loadTable?.filterCustom,
66
114
  inline: loadTable?.filterInline,
67
115
  state: loadTable?.filterState,
68
- sql: loadTable?.filterSql,
69
116
  };
70
117
  }
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,