-
Notifications
You must be signed in to change notification settings - Fork 0
/
queryBuilder.js
80 lines (73 loc) · 1.86 KB
/
queryBuilder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
function applyOrMap(fn, objOrArray) {
return Array.isArray(objOrArray)
? objOrArray.map(fn)
: fn(objOrArray)
}
function splitTableAndAlias(table) {
return table
.split(/ as /i)
.map((x) => x.trim().replace(/[[\]]/g, ''))
}
function applyOnInsertFilter(filter, queryBuilder) {
const [table] = splitTableAndAlias(queryBuilder._single.table)
const { onInsert } = filter(table)
if (!onInsert) {
return
}
applyOrMap(
(inserted) => onInsert(inserted, queryBuilder),
queryBuilder._single.insert,
)
}
function applyOnSelectFilter(filter, queryBuilder) {
let tables = queryBuilder._statements
.filter((st) => st.joinType !== undefined)
.map((st) => st.table)
tables.push(queryBuilder._single.table)
tables.map(splitTableAndAlias).forEach(([table, alias]) => {
const { onSelect } = filter(table)
if (!onSelect) {
return
}
onSelect(alias ?? table, queryBuilder)
})
}
function applyOnUpdateFilter(filter, queryBuilder) {
const [table, alias] = splitTableAndAlias(
queryBuilder._single.table,
)
const { onUpdate } = filter(table)
if (!onUpdate) {
return
}
onUpdate(alias ?? table, queryBuilder, queryBuilder._single.update)
}
function applyOnDeleteFilter(filter, queryBuilder) {
const [table, alias] = splitTableAndAlias(
queryBuilder._single.table,
)
const { onDelete } = filter(table)
if (!onDelete) {
return
}
onDelete(alias ?? table, queryBuilder)
}
function applyFilter(filter, queryBuilder) {
switch (queryBuilder._method) {
case 'insert':
applyOnInsertFilter(filter, queryBuilder)
break
case 'select':
applyOnSelectFilter(filter, queryBuilder)
break
case 'update':
applyOnUpdateFilter(filter, queryBuilder)
break
case 'del':
applyOnDeleteFilter(filter, queryBuilder)
break
}
}
module.exports = {
applyFilter,
}