-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.js
167 lines (139 loc) · 3.74 KB
/
test.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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
const levelup = require('levelup')
const level = require('level')
const levelPackager = require('level-packager')
const sqldown = require('sqldown')
const Uuid = require('uuid/v4')
const factory = require('./index')
const schema = require('./schema')
const lev = levelPackager(sqldown)
const db = lev(':memory:', {
keyEncoding: require('charwise'),
valueEncoding: 'json'
})
const tr = factory(db, schema)
const orgId = Uuid()
const org2Id = Uuid()
const qsetId = Uuid()
const questionId = Uuid()
const qsetQuestionId = Uuid()
const answerId = Uuid()
const answer2Id = Uuid()
const requestId = Uuid()
// in english:
// fetch the requestee's answers associated with the
// request's questionSet's questions
const answersByRequest = [
['?rqId', 'request_qsetId', '?qsetId'],
['?rqId', 'request_requesteeId', '?requesteeId'],
['?qqId', 'qsetQuestion_qsetId', '?qsetId'],
['?qqId', 'qsetQuestion_questionId', '?qId'],
['?aId', 'answer_questionId', '?qId'],
['?aId', 'answer_orgId', '?requesteeId'],
['?aId', 'answer_model', '?model'],
['?aId', 'answer_createdAt', '?createdAt'],
['?aId', 'answer_updatedAt', '?updatedAt']
]
// entitities with complex relationships
// requests have_one requestor_org
// requests have_one requestee_org
// requests have_one questionSet
// questionSets have_many questions
// questions have_many questionSets
// answers have_one question
// answers have_one org
tr.transact(
[
{
$e: orgId,
org_name: 'test',
create: true
},
{
$e: org2Id,
org_name: 'org2',
create: true
},
{
$e: qsetId,
qset_name: 'main question set',
create: true
},
{
$e: questionId,
question_body: 'best question',
create: true
},
{
$e: Uuid(),
question_body: 'nother question',
create: true
},
{
$e: answerId,
answer_orgId: orgId,
answer_questionId: questionId,
answer_model: 'an answer',
create: true
},
{
$e: answer2Id,
answer_orgId: org2Id,
answer_questionId: questionId,
answer_model: 'second answer',
create: true
},
{
$e: qsetQuestionId,
qsetQuestion_qsetId: qsetId,
qsetQuestion_questionId: questionId,
create: true
},
{
$e: requestId,
request_requesteeId: orgId,
request_requestorId: org2Id,
request_qsetId: qsetId,
create: true
},
],
async (err, fb) => {
const results = await fb.q(
answersByRequest,
{ rqId: requestId },
['model', 'aId', 'updatedAt', 'createdAt']
)
// initial results from first transaction
console.log({ results1: results })
setTimeout(async function () {
await tr.transact([
{
$e: answerId,
answer_model: 'updated answer',
}
], async (err, fbNext) => {
const results = await fbNext.q(
answersByRequest,
{ rqId: requestId },
['model', 'aId', 'updatedAt', 'createdAt']
)
const answer = results[0]
// midpoint between first a second transactions
const midTime = parseInt(((answer.updatedAt - answer.createdAt) / 2) + answer.createdAt)
// results after second transaction
console.log({ results2: results });
tr.pointInTime(
midTime,
[
answersByRequest,
{ rqId: requestId },
['model', 'aId', 'updatedAt', 'createdAt']
],
(err, results) => {
// results from the transaction prior to queried epoch
console.log({ results3: results});
}
)
})
}, 3000)
}
)