@things-factory/shell 5.0.0-alpha.50 → 5.0.0-alpha.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/dist-server/service/domain/domain-resolver.js +4 -1
- package/dist-server/service/domain/domain-resolver.js.map +1 -1
- package/dist-server/utils/list-params-converter.js +37 -7
- package/dist-server/utils/list-params-converter.js.map +1 -1
- package/dist-server/utils/list-query-builder.js +228 -44
- package/dist-server/utils/list-query-builder.js.map +1 -1
- package/package.json +14 -13
- package/server/service/domain/domain-resolver.ts +5 -1
- package/server/utils/list-params-converter.ts +52 -7
- package/server/utils/list-query-builder.ts +292 -48
- package/dist-server/utils/where-clause-builder.js +0 -159
- package/dist-server/utils/where-clause-builder.js.map +0 -1
- package/server/utils/where-clause-builder.ts +0 -200
@@ -1,6 +1,9 @@
|
|
1
1
|
import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'
|
2
2
|
|
3
3
|
import { Filter, ListParam, Pagination, Sorting } from '../service/common-types'
|
4
|
+
import { Domain } from '../service/domain/domain'
|
5
|
+
|
6
|
+
const debug = require('debug')('things-factory:shell:list-params-converter')
|
4
7
|
|
5
8
|
const OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {
|
6
9
|
search: value => ILike(value),
|
@@ -67,17 +70,43 @@ function makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DE
|
|
67
70
|
return result
|
68
71
|
}
|
69
72
|
|
70
|
-
function makeFilterParams(
|
73
|
+
function makeFilterParams(
|
74
|
+
filters: Filter[],
|
75
|
+
searchables?: string[]
|
76
|
+
): {
|
71
77
|
where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]
|
72
78
|
} {
|
73
79
|
/* for where AND clauses */
|
74
|
-
const columnFilters =
|
80
|
+
const columnFilters =
|
81
|
+
filters?.filter(filter => {
|
82
|
+
if (filter.operator === 'search') {
|
83
|
+
return false
|
84
|
+
}
|
85
|
+
if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
|
86
|
+
return false
|
87
|
+
}
|
88
|
+
return true
|
89
|
+
}) || []
|
90
|
+
|
91
|
+
const searchFilters =
|
92
|
+
searchables instanceof Array
|
93
|
+
? filters?.filter(filter => {
|
94
|
+
if (filter.operator !== 'search') {
|
95
|
+
return false
|
96
|
+
}
|
97
|
+
if (!searchables.includes(filter.name)) {
|
98
|
+
debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
|
99
|
+
return false
|
100
|
+
}
|
101
|
+
return true
|
102
|
+
}) || []
|
103
|
+
: []
|
104
|
+
|
75
105
|
const columnWhere = columnFilters.reduce((where, f) => {
|
76
106
|
where[f.name] = getOperatorFunction(f)
|
77
107
|
return where
|
78
108
|
}, {} as { [name: string]: FindOperator<any> })
|
79
109
|
|
80
|
-
const searchFilters = filters.filter(filter => filter.operator === 'search')
|
81
110
|
if (searchFilters.length === 0) {
|
82
111
|
return {
|
83
112
|
where: columnWhere
|
@@ -99,7 +128,12 @@ function makeFilterParams(filters: Filter[]): {
|
|
99
128
|
|
100
129
|
export function convertListParams(
|
101
130
|
params: ListParam,
|
102
|
-
|
131
|
+
options?:
|
132
|
+
| string
|
133
|
+
| {
|
134
|
+
domain?: string | Domain
|
135
|
+
searchables?: string[]
|
136
|
+
}
|
103
137
|
): {
|
104
138
|
where?: { [name: string]: FindOperator<any> }
|
105
139
|
order?: {
|
@@ -108,20 +142,31 @@ export function convertListParams(
|
|
108
142
|
skip?: number
|
109
143
|
take?: number
|
110
144
|
} {
|
145
|
+
var domainId: string | undefined
|
146
|
+
|
147
|
+
if (options) {
|
148
|
+
if (typeof options === 'string' /* for 하위 호환성 */) {
|
149
|
+
var domainId = options
|
150
|
+
} else {
|
151
|
+
var { domain, searchables } = options
|
152
|
+
var domainId = typeof domain === 'string' ? domain : domain?.id
|
153
|
+
}
|
154
|
+
}
|
155
|
+
|
111
156
|
var { pagination, filters = [], sortings } = params
|
112
157
|
var result = {}
|
113
158
|
|
114
|
-
if (
|
159
|
+
if (domainId) {
|
115
160
|
filters.push({
|
116
161
|
name: 'domain',
|
117
162
|
operator: 'eq',
|
118
|
-
value:
|
163
|
+
value: domainId
|
119
164
|
})
|
120
165
|
}
|
121
166
|
|
122
167
|
if (pagination) Object.assign(result, makePaginationParams(pagination))
|
123
168
|
if (sortings) Object.assign(result, makeSortingParams(sortings))
|
124
|
-
if (filters) Object.assign(result, makeFilterParams(filters))
|
169
|
+
if (filters) Object.assign(result, makeFilterParams(filters, searchables))
|
125
170
|
|
126
171
|
return result
|
127
172
|
}
|
@@ -1,13 +1,59 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { Filter, ListParam } from 'server/service'
|
2
|
+
import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm'
|
3
3
|
|
4
4
|
import { Domain } from '../service/domain/domain'
|
5
5
|
import { buildCondition } from './condition-builder'
|
6
|
-
import { buildWhereClause } from './where-clause-builder'
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
const debug = require('debug')('things-factory:shell:list-query-builder')
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @deprecated The name of this function does not imply an exact purpose and it is not possible to correspond to a foreign key using the meta information of the table column, so it is recommended to replace it with the A function.
|
11
|
+
*/
|
12
|
+
export const buildQuery = function (
|
13
|
+
queryBuilder: any,
|
14
|
+
params: any,
|
15
|
+
context: any,
|
16
|
+
options?:
|
17
|
+
| boolean
|
18
|
+
| {
|
19
|
+
domainRef?: boolean
|
20
|
+
searchables?: string[]
|
21
|
+
}
|
22
|
+
) {
|
23
|
+
/* default value of domainRef is 'true' */
|
24
|
+
var domainRef = typeof options === 'boolean' ? options : true
|
25
|
+
|
26
|
+
/* for backwards compatibility of function spec */
|
27
|
+
if (typeof options === 'object') {
|
28
|
+
var { domainRef = true, searchables } = options
|
29
|
+
}
|
30
|
+
|
31
|
+
const columnFilters =
|
32
|
+
params.filters?.filter(filter => {
|
33
|
+
if (filter.operator === 'search') {
|
34
|
+
return false
|
35
|
+
}
|
36
|
+
if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
|
37
|
+
debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
|
38
|
+
return false
|
39
|
+
}
|
40
|
+
return true
|
41
|
+
}) || []
|
42
|
+
|
43
|
+
const searchFilters =
|
44
|
+
searchables instanceof Array
|
45
|
+
? params.filters?.filter(filter => {
|
46
|
+
if (filter.operator !== 'search') {
|
47
|
+
return false
|
48
|
+
}
|
49
|
+
if (!searchables.includes(filter.name)) {
|
50
|
+
debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
|
51
|
+
return false
|
52
|
+
}
|
53
|
+
return true
|
54
|
+
}) || []
|
55
|
+
: []
|
56
|
+
|
11
57
|
const pagination = params.pagination
|
12
58
|
const sortings = params.sortings
|
13
59
|
const domainId = context && context.state.domain && context.state.domain.id
|
@@ -64,43 +110,49 @@ export const buildQuery = function (queryBuilder: any, params: any, context: any
|
|
64
110
|
|
65
111
|
export function getQueryBuilderFromListParams<Type>(options: {
|
66
112
|
repository: Repository<Type>
|
67
|
-
params:
|
113
|
+
params: ListParam
|
68
114
|
domain?: Domain
|
69
115
|
alias?: string
|
116
|
+
searchables?: string[]
|
117
|
+
filtersMap?: { [name: string]: { columnName: string; relationColumn: string } }
|
70
118
|
}): SelectQueryBuilder<Type> {
|
71
|
-
var { repository, params, domain, alias } = options
|
119
|
+
var { repository, params, domain, alias, searchables, filtersMap = {} } = options
|
120
|
+
|
72
121
|
const selectQueryBuilder = repository.createQueryBuilder(alias)
|
73
|
-
|
122
|
+
const entityAlias = selectQueryBuilder.alias
|
74
123
|
|
75
|
-
const columnFilters =
|
76
|
-
|
124
|
+
const columnFilters =
|
125
|
+
params.filters?.filter(filter => {
|
126
|
+
if (filter.operator === 'search') {
|
127
|
+
return false
|
128
|
+
}
|
129
|
+
if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
|
130
|
+
debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
|
131
|
+
return false
|
132
|
+
}
|
133
|
+
return true
|
134
|
+
}) || []
|
135
|
+
const searchFilters =
|
136
|
+
searchables instanceof Array
|
137
|
+
? params.filters?.filter(filter => {
|
138
|
+
if (filter.operator !== 'search') {
|
139
|
+
return false
|
140
|
+
}
|
141
|
+
if (!searchables.includes(filter.name)) {
|
142
|
+
debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
|
143
|
+
return false
|
144
|
+
}
|
145
|
+
return true
|
146
|
+
}) || []
|
147
|
+
: []
|
77
148
|
const pagination = params.pagination
|
78
149
|
const sortings = params.sortings
|
79
150
|
|
80
151
|
const metadata = repository.metadata
|
81
|
-
const columnMetas = params.filters
|
82
|
-
.map(filter => filter.name)
|
83
|
-
.reduce((sum, name) => {
|
84
|
-
sum[name] = metadata.columns.find(column => column.propertyName === name)
|
85
|
-
return sum
|
86
|
-
}, {} as { [name: string]: ColumnMetadata })
|
87
152
|
|
88
153
|
if (columnFilters && columnFilters.length > 0) {
|
89
154
|
columnFilters.forEach(filter => {
|
90
|
-
|
91
|
-
|
92
|
-
const condition = buildWhereClause({
|
93
|
-
alias,
|
94
|
-
columnMeta: columnMetas[name],
|
95
|
-
operator,
|
96
|
-
value,
|
97
|
-
seq: Object.keys(selectQueryBuilder.getParameters()).length + 1,
|
98
|
-
domain,
|
99
|
-
selectQueryBuilder
|
100
|
-
})
|
101
|
-
|
102
|
-
if (condition?.clause) selectQueryBuilder.andWhere(condition.clause)
|
103
|
-
if (condition?.parameters) selectQueryBuilder.setParameters(condition.parameters)
|
155
|
+
addCondition(metadata, selectQueryBuilder, selectQueryBuilder, filter, filtersMap, true)
|
104
156
|
})
|
105
157
|
}
|
106
158
|
|
@@ -108,27 +160,14 @@ export function getQueryBuilderFromListParams<Type>(options: {
|
|
108
160
|
selectQueryBuilder.andWhere(
|
109
161
|
new Brackets(qb => {
|
110
162
|
searchFilters.forEach(filter => {
|
111
|
-
|
112
|
-
|
113
|
-
const condition = buildWhereClause({
|
114
|
-
alias,
|
115
|
-
columnMeta: columnMetas[name],
|
116
|
-
operator /* has to be 'search' */,
|
117
|
-
value,
|
118
|
-
seq: Object.keys(selectQueryBuilder.getParameters()).length + 1,
|
119
|
-
domain,
|
120
|
-
selectQueryBuilder
|
121
|
-
})
|
122
|
-
|
123
|
-
if (condition?.clause) qb.orWhere(condition.clause)
|
124
|
-
if (condition?.parameters) selectQueryBuilder.setParameters(condition.parameters)
|
163
|
+
addCondition(metadata, selectQueryBuilder, qb, filter, filtersMap, false)
|
125
164
|
})
|
126
165
|
})
|
127
166
|
)
|
128
167
|
}
|
129
168
|
|
130
169
|
if (domain) {
|
131
|
-
selectQueryBuilder.andWhere(`${
|
170
|
+
selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: domain.id })
|
132
171
|
}
|
133
172
|
|
134
173
|
if (pagination && pagination.page > 0 && pagination.limit > 0) {
|
@@ -138,8 +177,7 @@ export function getQueryBuilderFromListParams<Type>(options: {
|
|
138
177
|
|
139
178
|
if (sortings && sortings.length > 0) {
|
140
179
|
sortings.forEach((sorting, index) => {
|
141
|
-
const sortField =
|
142
|
-
sorting.name.split('.').length > 1 ? sorting.name : `${selectQueryBuilder.alias}.${sorting.name}`
|
180
|
+
const sortField = sorting.name.split('.').length > 1 ? sorting.name : `${entityAlias}.${sorting.name}`
|
143
181
|
if (index === 0) {
|
144
182
|
selectQueryBuilder.orderBy(sortField, sorting.desc ? 'DESC' : 'ASC')
|
145
183
|
} else {
|
@@ -150,3 +188,209 @@ export function getQueryBuilderFromListParams<Type>(options: {
|
|
150
188
|
|
151
189
|
return selectQueryBuilder
|
152
190
|
}
|
191
|
+
|
192
|
+
function addCondition<T>(
|
193
|
+
metadata: EntityMetadata,
|
194
|
+
selectQueryBuilder: SelectQueryBuilder<T>,
|
195
|
+
whereExpressionBuilder: WhereExpressionBuilder,
|
196
|
+
filter: Filter,
|
197
|
+
filtersMap: { [name: string]: { columnName: string; relationColumn: string } } = {},
|
198
|
+
andCondition: boolean
|
199
|
+
): void {
|
200
|
+
const { name, operator, value } = filter
|
201
|
+
const values = value instanceof Array ? value : [value]
|
202
|
+
const entityAlias = selectQueryBuilder.alias
|
203
|
+
|
204
|
+
var { relationColumn, columnName } = filtersMap[name] || {}
|
205
|
+
/*
|
206
|
+
1. relationColumn과 columnName이 지정된 경우
|
207
|
+
- relation inverse 테이블에서, columnName을 찾는다.
|
208
|
+
2. relationColumn만 지정된 경우는 없어야 한다.
|
209
|
+
- 이 경우 columnName 은 'name' 이라고 판단한다.
|
210
|
+
3. columnName이 지정된 경우.
|
211
|
+
- 이 경우는 columnName 만 적용한다.
|
212
|
+
*/
|
213
|
+
if (relationColumn) {
|
214
|
+
var relationColumnMeta = metadata.columns.find(column => column.propertyName === relationColumn)
|
215
|
+
if (!relationColumnMeta) {
|
216
|
+
debug(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
|
217
|
+
return
|
218
|
+
}
|
219
|
+
|
220
|
+
var relation = relationColumnMeta.relationMetadata
|
221
|
+
var entityMetadata = relation.inverseEntityMetadata
|
222
|
+
var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))
|
223
|
+
if (!columnMeta) {
|
224
|
+
debug(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
|
225
|
+
return
|
226
|
+
}
|
227
|
+
} else {
|
228
|
+
var columnMeta = metadata.columns.find(column => column.propertyName === (columnName || name))
|
229
|
+
if (!columnMeta) {
|
230
|
+
columnName
|
231
|
+
? debug(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
|
232
|
+
: debug(`name "${name}" is not a column`)
|
233
|
+
return
|
234
|
+
}
|
235
|
+
var relation = columnMeta.relationMetadata
|
236
|
+
|
237
|
+
if (relation) {
|
238
|
+
/* filterMap에 의해서 relationColumn 이 지정되지 않았더라도, name 또는 columnName의 column이 relation인 경우에는
|
239
|
+
- 조건절 구성을 위한 타겟필드명은 'name' 으로만 한정된다.
|
240
|
+
*/
|
241
|
+
var relationColumnMeta = columnMeta
|
242
|
+
var entityMetadata = relation.inverseEntityMetadata
|
243
|
+
columnMeta = entityMetadata.columns.find(column => column.propertyName === 'name')
|
244
|
+
if (!columnMeta) {
|
245
|
+
debug(`relation column "${columnName || name}" does not have "name" column`)
|
246
|
+
return
|
247
|
+
}
|
248
|
+
}
|
249
|
+
}
|
250
|
+
|
251
|
+
const dbNameForColumn = columnMeta.databaseName
|
252
|
+
const alias = relationColumnMeta ? `${name}-filter` : entityAlias
|
253
|
+
|
254
|
+
/* relation columne인 경우 name을 alias로 사용한다. */
|
255
|
+
const field = `${alias}.${dbNameForColumn}`
|
256
|
+
|
257
|
+
var clause = ''
|
258
|
+
var parameters = {}
|
259
|
+
|
260
|
+
switch (operator) {
|
261
|
+
case 'eq':
|
262
|
+
clause = `${field} = :${name}`
|
263
|
+
parameters = { [name]: value }
|
264
|
+
break
|
265
|
+
|
266
|
+
case 'like':
|
267
|
+
clause = `${field} LIKE :${name}`
|
268
|
+
parameters = { [name]: `%${value}%` }
|
269
|
+
break
|
270
|
+
|
271
|
+
case 'search':
|
272
|
+
case 'i_like':
|
273
|
+
clause = `LOWER(${field}) LIKE :${name}`
|
274
|
+
parameters = { [name]: `%${String(value).toLowerCase()}%` }
|
275
|
+
break
|
276
|
+
|
277
|
+
case 'nlike':
|
278
|
+
clause = `${field} NOT LIKE :${name}`
|
279
|
+
parameters = { [name]: `%${value}%` }
|
280
|
+
break
|
281
|
+
|
282
|
+
case 'i_nlike':
|
283
|
+
clause = `LOWER(${field}) NOT LIKE :${name}`
|
284
|
+
parameters = { [name]: `%${String(value).toLowerCase()}%` }
|
285
|
+
break
|
286
|
+
|
287
|
+
case 'lt':
|
288
|
+
clause = `${field} < :${name}`
|
289
|
+
parameters = { [name]: value }
|
290
|
+
break
|
291
|
+
|
292
|
+
case 'gt':
|
293
|
+
clause = `${field} > :${name}`
|
294
|
+
parameters = { [name]: value }
|
295
|
+
break
|
296
|
+
|
297
|
+
case 'lte':
|
298
|
+
clause = `${field} <= :${name}`
|
299
|
+
parameters = { [name]: value }
|
300
|
+
break
|
301
|
+
|
302
|
+
case 'gte':
|
303
|
+
clause = `${field} >= :${name}`
|
304
|
+
parameters = { [name]: value }
|
305
|
+
break
|
306
|
+
|
307
|
+
case 'noteq':
|
308
|
+
clause = `${field} != :${name}`
|
309
|
+
parameters = { [name]: value }
|
310
|
+
break
|
311
|
+
|
312
|
+
case 'in':
|
313
|
+
clause = `${field} IN (:...${name})`
|
314
|
+
parameters = { [name]: values }
|
315
|
+
break
|
316
|
+
|
317
|
+
case 'notin':
|
318
|
+
clause = `${field} NOT IN (:...${name})`
|
319
|
+
parameters = { [name]: values }
|
320
|
+
break
|
321
|
+
|
322
|
+
case 'notin_with_null':
|
323
|
+
clause = `${field} IS NULL OR ${field} NOT IN (:...${name}))`
|
324
|
+
parameters = { [name]: values }
|
325
|
+
break
|
326
|
+
|
327
|
+
case 'is_null':
|
328
|
+
clause = `${field} IS NULL`
|
329
|
+
break
|
330
|
+
|
331
|
+
case 'is_not_null':
|
332
|
+
clause = `${field} IS NOT NULL`
|
333
|
+
break
|
334
|
+
|
335
|
+
case 'is_false':
|
336
|
+
clause = `${field} IS FALSE`
|
337
|
+
break
|
338
|
+
|
339
|
+
case 'is_true':
|
340
|
+
clause = `${field} IS TRUE`
|
341
|
+
break
|
342
|
+
|
343
|
+
case 'is_not_false':
|
344
|
+
clause = `${field} IS NOT FALSE`
|
345
|
+
break
|
346
|
+
|
347
|
+
case 'is_not_true':
|
348
|
+
clause = `${field} IS NOT TRUE`
|
349
|
+
break
|
350
|
+
|
351
|
+
case 'is_present':
|
352
|
+
clause = `${field} IS PRESENT`
|
353
|
+
break
|
354
|
+
|
355
|
+
case 'is_blank':
|
356
|
+
clause = `${field} IS BLANK`
|
357
|
+
break
|
358
|
+
|
359
|
+
case 'is_empty_num_id':
|
360
|
+
clause = `${field} IS EMPTY NUMERIC ID`
|
361
|
+
break
|
362
|
+
|
363
|
+
case 'between':
|
364
|
+
clause = `${field} BETWEEN :${name}_1 AND :${name}_2`
|
365
|
+
parameters = { [`${name}_1`]: values[0], [`${name}_2`]: values[1] }
|
366
|
+
break
|
367
|
+
}
|
368
|
+
|
369
|
+
if (relationColumnMeta) {
|
370
|
+
const { propertyName } = relationColumnMeta
|
371
|
+
const property = `${entityAlias}.${propertyName}`
|
372
|
+
if (andCondition) {
|
373
|
+
selectQueryBuilder.innerJoin(property, alias, clause, parameters)
|
374
|
+
} else {
|
375
|
+
selectQueryBuilder.leftJoin(property, alias)
|
376
|
+
whereExpressionBuilder.orWhere(clause, parameters)
|
377
|
+
}
|
378
|
+
} else {
|
379
|
+
andCondition
|
380
|
+
? whereExpressionBuilder.andWhere(clause, parameters)
|
381
|
+
: whereExpressionBuilder.orWhere(clause, parameters)
|
382
|
+
}
|
383
|
+
}
|
384
|
+
|
385
|
+
// export function adjustFiltersFromListParam(params: ListParam, filtersChange: Filter[]): ListParam {
|
386
|
+
// const { filters = [] } = params
|
387
|
+
|
388
|
+
// var filtersNew = [...filters]
|
389
|
+
|
390
|
+
// filtersChange.forEach(change => {
|
391
|
+
// const idx = (filtersNew || []).findIndex(f => f.name === change.name)
|
392
|
+
// idx !== -1 ? filtersNew.splice(idx, 1, change) : filtersNew.push(change)
|
393
|
+
// })
|
394
|
+
|
395
|
+
// return { ...params, filters: filtersNew }
|
396
|
+
// }
|
@@ -1,159 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.buildWhereClause = void 0;
|
4
|
-
function getClause(selectQueryBuilder, columnMeta, operator, field, pname) {
|
5
|
-
const relation = columnMeta.relationMetadata;
|
6
|
-
if (!relation) {
|
7
|
-
switch (operator) {
|
8
|
-
case 'like':
|
9
|
-
return `${field} LIKE :${pname}`;
|
10
|
-
case 'search':
|
11
|
-
case 'i_like':
|
12
|
-
return `LOWER(${field}) LIKE :${pname}`;
|
13
|
-
case 'nlike':
|
14
|
-
return `${field} NOT LIKE :${pname}`;
|
15
|
-
case 'i_nlike':
|
16
|
-
return `LOWER(${field}) NOT LIKE :${pname}`;
|
17
|
-
}
|
18
|
-
}
|
19
|
-
const inverseEntityMetadata = relation.inverseEntityMetadata;
|
20
|
-
const { target, tableName, ownColumns } = inverseEntityMetadata;
|
21
|
-
var subquery = selectQueryBuilder.subQuery().select('id').from(target, tableName);
|
22
|
-
switch (operator) {
|
23
|
-
case 'like':
|
24
|
-
subquery = subquery.where(`${tableName}.name LIKE :${pname}`);
|
25
|
-
break;
|
26
|
-
case 'search':
|
27
|
-
case 'i_like':
|
28
|
-
subquery = subquery.where(`LOWER(${tableName}.name) LIKE :${pname}`);
|
29
|
-
break;
|
30
|
-
case 'nlike':
|
31
|
-
subquery = subquery.where(`${tableName}.name NOT LIKE :${pname}`);
|
32
|
-
break;
|
33
|
-
case 'i_nlike':
|
34
|
-
subquery = subquery.where(`LOWER(${tableName}.name) NOT LIKE :${pname}`);
|
35
|
-
break;
|
36
|
-
}
|
37
|
-
if (ownColumns.find(column => column.propertyName === 'domain')) {
|
38
|
-
subquery.andWhere(`${tableName}.domain_id = :domain`);
|
39
|
-
}
|
40
|
-
return `${field} IN ${subquery.getQuery()}`;
|
41
|
-
}
|
42
|
-
const buildWhereClause = function (options) {
|
43
|
-
const { alias, columnMeta, operator, value, seq, selectQueryBuilder, domain } = options;
|
44
|
-
const values = value instanceof Array ? value : [value];
|
45
|
-
const { propertyName: name, propertyAliasName, propertyPath: path, databaseName } = columnMeta;
|
46
|
-
const field = `${alias}.${databaseName}`;
|
47
|
-
const pname = `args${seq}`;
|
48
|
-
switch (operator) {
|
49
|
-
case 'eq':
|
50
|
-
return {
|
51
|
-
clause: `${field} = :${pname}`,
|
52
|
-
parameters: { [pname]: value }
|
53
|
-
};
|
54
|
-
case 'like':
|
55
|
-
return {
|
56
|
-
clause: getClause(selectQueryBuilder, columnMeta, operator, field, pname),
|
57
|
-
parameters: { [pname]: `%${value}%` }
|
58
|
-
};
|
59
|
-
case 'search':
|
60
|
-
case 'i_like':
|
61
|
-
return {
|
62
|
-
clause: getClause(selectQueryBuilder, columnMeta, operator, field, pname),
|
63
|
-
parameters: { [pname]: `%${String(value).toLowerCase()}%` }
|
64
|
-
};
|
65
|
-
case 'nlike':
|
66
|
-
return {
|
67
|
-
clause: getClause(selectQueryBuilder, columnMeta, operator, field, pname),
|
68
|
-
value: { [pname]: `%${value}%` }
|
69
|
-
};
|
70
|
-
case 'i_nlike':
|
71
|
-
return {
|
72
|
-
clause: getClause(selectQueryBuilder, columnMeta, operator, field, pname),
|
73
|
-
value: { [pname]: `%${String(value).toLowerCase()}%` }
|
74
|
-
};
|
75
|
-
case 'lt':
|
76
|
-
return {
|
77
|
-
clause: `${field} < :${pname}`,
|
78
|
-
parameters: { [pname]: value }
|
79
|
-
};
|
80
|
-
case 'gt':
|
81
|
-
return {
|
82
|
-
clause: `${field} > :${pname}`,
|
83
|
-
parameters: { [pname]: value }
|
84
|
-
};
|
85
|
-
case 'lte':
|
86
|
-
return {
|
87
|
-
clause: `${field} <= :${pname}`,
|
88
|
-
parameters: { [pname]: value }
|
89
|
-
};
|
90
|
-
case 'gte':
|
91
|
-
return {
|
92
|
-
clause: `${field} >= :${pname}`,
|
93
|
-
parameters: { [pname]: value }
|
94
|
-
};
|
95
|
-
case 'noteq':
|
96
|
-
return {
|
97
|
-
clause: `${field} != :${pname}`,
|
98
|
-
parameters: { [pname]: value }
|
99
|
-
};
|
100
|
-
case 'in':
|
101
|
-
return {
|
102
|
-
clause: `${field} IN (:...${pname})`,
|
103
|
-
parameters: { [pname]: values }
|
104
|
-
};
|
105
|
-
case 'notin':
|
106
|
-
return {
|
107
|
-
clause: `${field} NOT IN (:...${pname})`,
|
108
|
-
parameters: { [pname]: values }
|
109
|
-
};
|
110
|
-
case 'notin_with_null':
|
111
|
-
return {
|
112
|
-
clause: `${field} IS NULL OR ${field} NOT IN (:...${pname}))`,
|
113
|
-
parameters: { [pname]: values }
|
114
|
-
};
|
115
|
-
case 'is_null':
|
116
|
-
return {
|
117
|
-
clause: `${field} IS NULL`
|
118
|
-
};
|
119
|
-
case 'is_not_null':
|
120
|
-
return {
|
121
|
-
clause: `${field} IS NOT NULL`
|
122
|
-
};
|
123
|
-
case 'is_false':
|
124
|
-
return {
|
125
|
-
clause: `${field} IS FALSE`
|
126
|
-
};
|
127
|
-
case 'is_true':
|
128
|
-
return {
|
129
|
-
clause: `${field} IS TRUE`
|
130
|
-
};
|
131
|
-
case 'is_not_false':
|
132
|
-
return {
|
133
|
-
clause: `${field} IS NOT FALSE`
|
134
|
-
};
|
135
|
-
case 'is_not_true':
|
136
|
-
return {
|
137
|
-
clause: `${field} IS NOT TRUE`
|
138
|
-
};
|
139
|
-
case 'is_present':
|
140
|
-
return {
|
141
|
-
clause: `${field} IS PRESENT`
|
142
|
-
};
|
143
|
-
case 'is_blank':
|
144
|
-
return {
|
145
|
-
clause: `${field} IS BLANK`
|
146
|
-
};
|
147
|
-
case 'is_empty_num_id':
|
148
|
-
return {
|
149
|
-
clause: `${field} IS EMPTY NUMERIC ID`
|
150
|
-
};
|
151
|
-
case 'between':
|
152
|
-
return {
|
153
|
-
clause: `${field} BETWEEN :${pname}_1 AND :${pname}_2`,
|
154
|
-
parameters: { [`args${seq}_1`]: values[0], [`args${seq}_2`]: values[1] }
|
155
|
-
};
|
156
|
-
}
|
157
|
-
};
|
158
|
-
exports.buildWhereClause = buildWhereClause;
|
159
|
-
//# sourceMappingURL=where-clause-builder.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"where-clause-builder.js","sourceRoot":"","sources":["../../server/utils/where-clause-builder.ts"],"names":[],"mappings":"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"}
|