-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathstack.js
More file actions
128 lines (115 loc) · 3.46 KB
/
Copy pathstack.js
File metadata and controls
128 lines (115 loc) · 3.46 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { validateType } from './type'
export const Stack = Object.freeze({
PAST: 0,
FUTURE: 1
})
const topSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
SELECT ${entityId} AS entityId, stack, position, type, type_id AS typeId, history_id AS historyId
FROM ${sequenceTable}
WHERE ${entityId} = ? AND stack = ? AND position = (
SELECT max(position)
FROM ${sequenceTable}
WHERE ${entityId} = ? AND stack = ?
)
`
}
const topPositionSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
SELECT max(position) AS maxPosition
FROM ${sequenceTable}
WHERE ${entityId} = ? AND stack = ?
`
}
const removeSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
DELETE FROM ${sequenceTable}
WHERE ${entityId} = ? AND
stack = ? AND
position = ? AND
type = ? AND
type_id = ? AND
history_id = ?
`
}
const stackSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
SELECT ${entityId} AS entityId, stack, position, type,
type_id AS typeId, history_id AS historyId
FROM ${sequenceTable}
WHERE ${entityId} = ? AND stack = ?
ORDER BY position ASC
`
}
const addSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
INSERT INTO ${sequenceTable}
(position, ${entityId}, type, type_id, history_id, stack)
VALUES (?, ?, ?, ?, ?, ?)
`
}
const deleteSql = (type) => {
const sequenceTable = type.sequenceTable.name
const entityId = type.sequenceTable.entityIdColumn
return `
DELETE FROM ${sequenceTable}
WHERE ${entityId} = ? AND stack = ?
`
}
export const getStackTop = async (stack, database, type, entityId) => {
validateType(type)
const sql = topSql(type)
const params = [entityId, stack, entityId, stack]
return database.get(sql, params)
}
export const getStackTopPosition = async (stack, database, type, entityId) => {
validateType(type)
const sql = topPositionSql(type)
const params = [entityId, stack]
const result = await database.get(sql, params)
return result.maxPosition
}
export const removeFromStack = async (database, type, entry) => {
validateType(type)
const sql = removeSql(type)
const params = [
entry.entityId,
entry.stack,
entry.position,
entry.type,
entry.typeId,
entry.historyId
]
return database.run(sql, params)
}
export const getStack = async (stack, database, type, entityId) => {
validateType(type)
const sql = stackSql(type)
const params = [entityId, stack]
return database.all(sql, params)
}
export const pushToStack = async (stack, database, type, entityId, typeId, historyId) => {
validateType(type)
const topPosition = await getStackTopPosition(stack, database, type, entityId)
const nextPosition = topPosition === null ? 0 : topPosition + 1
const sql = addSql(type)
const params = [nextPosition, entityId, type.id, typeId, historyId, stack]
await database.run(sql, params)
return nextPosition
}
export const deleteStack = async (stack, database, type, entityId) => {
validateType(type)
const sql = deleteSql(type)
const params = [entityId, stack]
return database.run(sql, params)
}