jinaga-server 1.0.0

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.
Files changed (127) hide show
  1. package/LICENSE +22 -0
  2. package/dist/authentication/authentication-device.d.ts +20 -0
  3. package/dist/authentication/authentication-device.js +61 -0
  4. package/dist/authentication/authentication-device.js.map +1 -0
  5. package/dist/authentication/authentication-impl.d.ts +21 -0
  6. package/dist/authentication/authentication-impl.js +61 -0
  7. package/dist/authentication/authentication-impl.js.map +1 -0
  8. package/dist/authentication/authentication-session.d.ts +23 -0
  9. package/dist/authentication/authentication-session.js +85 -0
  10. package/dist/authentication/authentication-session.js.map +1 -0
  11. package/dist/authentication/authentication.d.ts +5 -0
  12. package/dist/authentication/authentication.js +3 -0
  13. package/dist/authentication/authentication.js.map +1 -0
  14. package/dist/authentication.d.ts +17 -0
  15. package/dist/authentication.js +52 -0
  16. package/dist/authentication.js.map +1 -0
  17. package/dist/authorization/authorization-keystore.d.ts +13 -0
  18. package/dist/authorization/authorization-keystore.js +61 -0
  19. package/dist/authorization/authorization-keystore.js.map +1 -0
  20. package/dist/http/node-http.d.ts +7 -0
  21. package/dist/http/node-http.js +126 -0
  22. package/dist/http/node-http.js.map +1 -0
  23. package/dist/http/router.d.ts +20 -0
  24. package/dist/http/router.js +223 -0
  25. package/dist/http/router.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +6 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/jinaga-server.d.ts +18 -0
  30. package/dist/jinaga-server.js +101 -0
  31. package/dist/jinaga-server.js.map +1 -0
  32. package/dist/keystore.d.ts +9 -0
  33. package/dist/keystore.js +3 -0
  34. package/dist/keystore.js.map +1 -0
  35. package/dist/memory/memory-keystore.d.ts +16 -0
  36. package/dist/memory/memory-keystore.js +86 -0
  37. package/dist/memory/memory-keystore.js.map +1 -0
  38. package/dist/postgres/connection.d.ts +12 -0
  39. package/dist/postgres/connection.js +83 -0
  40. package/dist/postgres/connection.js.map +1 -0
  41. package/dist/postgres/edge-record.d.ts +9 -0
  42. package/dist/postgres/edge-record.js +30 -0
  43. package/dist/postgres/edge-record.js.map +1 -0
  44. package/dist/postgres/maps.d.ts +21 -0
  45. package/dist/postgres/maps.js +86 -0
  46. package/dist/postgres/maps.js.map +1 -0
  47. package/dist/postgres/postgres-keystore.d.ts +20 -0
  48. package/dist/postgres/postgres-keystore.js +168 -0
  49. package/dist/postgres/postgres-keystore.js.map +1 -0
  50. package/dist/postgres/postgres-store.d.ts +20 -0
  51. package/dist/postgres/postgres-store.js +717 -0
  52. package/dist/postgres/postgres-store.js.map +1 -0
  53. package/dist/postgres/query-description-builder.d.ts +13 -0
  54. package/dist/postgres/query-description-builder.js +104 -0
  55. package/dist/postgres/query-description-builder.js.map +1 -0
  56. package/dist/postgres/query-description.d.ts +71 -0
  57. package/dist/postgres/query-description.js +256 -0
  58. package/dist/postgres/query-description.js.map +1 -0
  59. package/dist/postgres/specification-result-sql.d.ts +41 -0
  60. package/dist/postgres/specification-result-sql.js +260 -0
  61. package/dist/postgres/specification-result-sql.js.map +1 -0
  62. package/dist/postgres/specification-sql.d.ts +3 -0
  63. package/dist/postgres/specification-sql.js +119 -0
  64. package/dist/postgres/specification-sql.js.map +1 -0
  65. package/dist/postgres/sql.d.ts +10 -0
  66. package/dist/postgres/sql.js +396 -0
  67. package/dist/postgres/sql.js.map +1 -0
  68. package/dist/util/fn.d.ts +6 -0
  69. package/dist/util/fn.js +81 -0
  70. package/dist/util/fn.js.map +1 -0
  71. package/dist/util/promise.d.ts +1 -0
  72. package/dist/util/promise.js +10 -0
  73. package/dist/util/promise.js.map +1 -0
  74. package/docs/registrations.sql +22 -0
  75. package/docs/specification.txt +41 -0
  76. package/docs/sql-generator.gv +25 -0
  77. package/integration-test/docker-compose.yaml +13 -0
  78. package/integration-test/jinaga-test/Dockerfile +12 -0
  79. package/integration-test/jinaga-test/jinaga.test.js +425 -0
  80. package/integration-test/jinaga-test/package-lock.json +6767 -0
  81. package/integration-test/jinaga-test/package.json +25 -0
  82. package/integration-test/postgres/0-init-app-db.sh +16 -0
  83. package/integration-test/postgres/1-setup.sql +219 -0
  84. package/integration-test/postgres/2-grant.sh +17 -0
  85. package/integration-test/postgres/Dockerfile +5 -0
  86. package/integration-test/run.sh +17 -0
  87. package/integration-test/start_db.sh +2 -0
  88. package/integration-test/stop_db.sh +3 -0
  89. package/integration-test/test.sh +8 -0
  90. package/interactive/index.js +56 -0
  91. package/jest.config.js +12 -0
  92. package/package.json +51 -0
  93. package/scripts/combined.sql +46 -0
  94. package/scripts/cte.sql +55 -0
  95. package/scripts/separate.sql +27 -0
  96. package/setup.sh +34 -0
  97. package/setup.sql +329 -0
  98. package/src/authentication/authentication-device.ts +68 -0
  99. package/src/authentication/authentication-impl.ts +59 -0
  100. package/src/authentication/authentication-session.ts +95 -0
  101. package/src/authentication/authentication.ts +6 -0
  102. package/src/authentication.ts +45 -0
  103. package/src/authorization/authorization-keystore.ts +67 -0
  104. package/src/http/node-http.ts +106 -0
  105. package/src/http/router.ts +237 -0
  106. package/src/index.ts +1 -0
  107. package/src/jinaga-server.ts +125 -0
  108. package/src/keystore.ts +10 -0
  109. package/src/memory/memory-keystore.ts +93 -0
  110. package/src/postgres/connection.ts +73 -0
  111. package/src/postgres/edge-record.ts +36 -0
  112. package/src/postgres/maps.ts +89 -0
  113. package/src/postgres/postgres-keystore.ts +167 -0
  114. package/src/postgres/postgres-store.ts +874 -0
  115. package/src/postgres/query-description-builder.ts +116 -0
  116. package/src/postgres/query-description.ts +385 -0
  117. package/src/postgres/specification-result-sql.ts +362 -0
  118. package/src/postgres/specification-sql.ts +138 -0
  119. package/src/postgres/sql.ts +482 -0
  120. package/src/util/fn.ts +63 -0
  121. package/src/util/promise.ts +5 -0
  122. package/test/authorization/authorizationSpec.ts +209 -0
  123. package/test/postgres/postgresSpec.ts +385 -0
  124. package/test/postgres/postgresSpecificationSpec.ts +742 -0
  125. package/test/reporter.js +25 -0
  126. package/tsconfig.json +25 -0
  127. package/upgrade.sh +21 -0
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sqlFromSteps = void 0;
4
+ const jinaga_1 = require("jinaga");
5
+ const maps_1 = require("./maps");
6
+ function sqlFromSteps(start, steps, factTypes, roleMap) {
7
+ const builder = new QueryBuilder(factTypes, roleMap);
8
+ return builder.buildQuery(start, steps);
9
+ }
10
+ exports.sqlFromSteps = sqlFromSteps;
11
+ ;
12
+ class QueryBuilder {
13
+ constructor(factTypes, roleMap) {
14
+ this.factTypes = factTypes;
15
+ this.roleMap = roleMap;
16
+ this.nextEdge = 1;
17
+ this.nextFact = 2;
18
+ this.shouldEmitFacts = true;
19
+ this.queryParts = {
20
+ joins: [],
21
+ existentialClauses: []
22
+ };
23
+ this.roleIds = [];
24
+ this.factTypeNames = [];
25
+ }
26
+ buildQuery(start, steps) {
27
+ if (steps.length === 0) {
28
+ return null;
29
+ }
30
+ const startTypeId = (0, maps_1.getFactTypeId)(this.factTypes, start.type);
31
+ const startState = {
32
+ state: 'start',
33
+ typeId: startTypeId,
34
+ typeName: start.type
35
+ };
36
+ const finalState = steps.reduce((state, step) => {
37
+ return this.matchStep(state, step);
38
+ }, startState);
39
+ this.end(finalState);
40
+ if (finalState.state === 'empty') {
41
+ return {
42
+ empty: true,
43
+ sql: '',
44
+ parameters: [],
45
+ pathLength: 0,
46
+ factTypeNames: []
47
+ };
48
+ }
49
+ const factAliases = this.queryParts.joins
50
+ .filter(j => j.table === 'fact')
51
+ .map(j => j.factAlias);
52
+ const hashes = factAliases.map(a => `f${a}.hash as hash${a}`).join(', ');
53
+ const joins = this.buildJoins(this.queryParts.joins, 'f1.fact_id');
54
+ const whereClause = this.buildWhereClause(this.queryParts.existentialClauses);
55
+ const sql = `SELECT ${hashes} FROM public.fact f1${joins} WHERE f1.fact_type_id = $1 AND f1.hash = $2${whereClause}`;
56
+ return {
57
+ empty: false,
58
+ sql,
59
+ parameters: [startTypeId, start.hash, ...this.roleIds],
60
+ pathLength: factAliases.length,
61
+ factTypeNames: this.factTypeNames
62
+ };
63
+ }
64
+ buildJoins(joins, priorFactId) {
65
+ const clauses = joins.reduce((joins, join) => {
66
+ if (join.table === 'edge') {
67
+ if (join.direction === 'successor') {
68
+ const clause = ` JOIN public.edge e${join.edgeAlias} ` +
69
+ `ON e${join.edgeAlias}.predecessor_fact_id = ${joins.priorFactId} ` +
70
+ `AND e${join.edgeAlias}.role_id = $${join.roleParameter}`;
71
+ return {
72
+ priorFactId: `e${join.edgeAlias}.successor_fact_id`,
73
+ clauses: [...joins.clauses, clause]
74
+ };
75
+ }
76
+ else {
77
+ const clause = ` JOIN public.edge e${join.edgeAlias} ` +
78
+ `ON e${join.edgeAlias}.successor_fact_id = ${joins.priorFactId} ` +
79
+ `AND e${join.edgeAlias}.role_id = $${join.roleParameter}`;
80
+ return {
81
+ priorFactId: `e${join.edgeAlias}.predecessor_fact_id`,
82
+ clauses: [...joins.clauses, clause]
83
+ };
84
+ }
85
+ }
86
+ else {
87
+ const clause = ` JOIN public.fact f${join.factAlias} ON f${join.factAlias}.fact_id = ${joins.priorFactId}`;
88
+ return {
89
+ priorFactId: joins.priorFactId,
90
+ clauses: [...joins.clauses, clause]
91
+ };
92
+ }
93
+ }, {
94
+ priorFactId,
95
+ clauses: []
96
+ }).clauses;
97
+ return clauses.join('');
98
+ }
99
+ buildWhereClause(existentialClauses) {
100
+ if (existentialClauses.length === 0) {
101
+ return '';
102
+ }
103
+ const clauses = existentialClauses.map(clause => {
104
+ const quantifierSql = clause.quantifier === jinaga_1.Quantifier.Exists ? 'EXISTS' : 'NOT EXISTS';
105
+ const [first, ...rest] = clause.query.joins;
106
+ const firstHeadFactId = first.direction === 'predecessor'
107
+ ? `e${first.edgeAlias}.predecessor_fact_id`
108
+ : `e${first.edgeAlias}.successor_fact_id`;
109
+ const firstTailFactId = first.direction === 'predecessor'
110
+ ? `e${first.edgeAlias}.successor_fact_id`
111
+ : `e${first.edgeAlias}.predecessor_fact_id`;
112
+ const joins = this.buildJoins(rest, firstHeadFactId);
113
+ const priorFactId = clause.priorEdgeJoin.direction === 'predecessor'
114
+ ? `e${clause.priorEdgeJoin.edgeAlias}.predecessor_fact_id`
115
+ : `e${clause.priorEdgeJoin.edgeAlias}.successor_fact_id`;
116
+ const whereClause = this.buildWhereClause(clause.query.existentialClauses);
117
+ return ` AND ${quantifierSql} (SELECT 1 FROM public.edge e${first.edgeAlias}${joins} ` +
118
+ `WHERE ${firstTailFactId} = ${priorFactId} ` +
119
+ `AND e${first.edgeAlias}.role_id = $${first.roleParameter}${whereClause})`;
120
+ });
121
+ return clauses.join('');
122
+ }
123
+ buildNestedSql(typeId, typeName, steps) {
124
+ // Push a new query to the stack.
125
+ const parentQuery = this.queryParts;
126
+ const parentShouldEmitFact = this.shouldEmitFacts;
127
+ this.shouldEmitFacts = false;
128
+ this.queryParts = {
129
+ joins: [],
130
+ existentialClauses: []
131
+ };
132
+ const startState = {
133
+ state: 'predecessor-type',
134
+ typeId: typeId,
135
+ typeName: typeName
136
+ };
137
+ const finalState = steps.reduce((state, step) => {
138
+ return this.matchStep(state, step);
139
+ }, startState);
140
+ this.end(finalState);
141
+ // Pop the stack and return the nested query.
142
+ const nestedQuery = this.queryParts;
143
+ this.shouldEmitFacts = parentShouldEmitFact;
144
+ this.queryParts = parentQuery;
145
+ // If the nested query cannot match any results, return null.
146
+ if (finalState.state === 'empty') {
147
+ return null;
148
+ }
149
+ return nestedQuery;
150
+ }
151
+ matchStep(state, step) {
152
+ switch (state.state) {
153
+ case 'start':
154
+ return this.matchStepStart(state, step);
155
+ case 'predecessor-type':
156
+ return this.matchStepPredecessorType(state, step);
157
+ case 'predecessor-join':
158
+ return this.matchStepPredecessorJoin(state, step);
159
+ case 'successor-join':
160
+ return this.matchStepSuccessorJoin(state, step);
161
+ case 'successor-type':
162
+ return this.matchStepSuccessorType(state, step);
163
+ case 'empty':
164
+ return state;
165
+ default:
166
+ throw new Error(`Unknown state: ${state.state}`);
167
+ }
168
+ }
169
+ matchStepStart(state, step) {
170
+ if (step instanceof jinaga_1.PropertyCondition) {
171
+ if (step.name !== 'type') {
172
+ throw new Error(`Property condition on non-type property ${step.name}`);
173
+ }
174
+ const typeId = (0, maps_1.getFactTypeId)(this.factTypes, step.value);
175
+ if (typeId !== state.typeId) {
176
+ throw new Error(`Two property conditions in a row on different types, ending in ${step.value}`);
177
+ }
178
+ return state;
179
+ }
180
+ else if (step instanceof jinaga_1.Join) {
181
+ if (step.direction === jinaga_1.Direction.Predecessor) {
182
+ const roleId = (0, maps_1.getRoleId)(this.roleMap, state.typeId, step.role);
183
+ if (!roleId) {
184
+ return {
185
+ state: 'empty'
186
+ };
187
+ }
188
+ this.emitEdge('predecessor', roleId);
189
+ return {
190
+ state: 'predecessor-join',
191
+ position: `${state.typeName}.${step.role}`
192
+ };
193
+ }
194
+ if (step.direction === jinaga_1.Direction.Successor) {
195
+ return {
196
+ state: 'successor-join',
197
+ role: step.role
198
+ };
199
+ }
200
+ }
201
+ else if (step instanceof jinaga_1.ExistentialCondition) {
202
+ return this.pushExistentialCondition(state.typeId, state.typeName, state, step);
203
+ }
204
+ else {
205
+ throw new Error(`Unknown step ${step.constructor.name}`);
206
+ }
207
+ }
208
+ matchStepPredecessorType(state, step) {
209
+ if (step instanceof jinaga_1.PropertyCondition) {
210
+ if (step.name !== 'type') {
211
+ throw new Error(`Property condition on non-type property ${step.name}`);
212
+ }
213
+ const typeId = (0, maps_1.getFactTypeId)(this.factTypes, step.value);
214
+ if (typeId !== state.typeId) {
215
+ throw new Error(`Two property conditions in a row on different types, ending in ${step.value}`);
216
+ }
217
+ return state;
218
+ }
219
+ else if (step instanceof jinaga_1.Join) {
220
+ if (step.direction === jinaga_1.Direction.Predecessor) {
221
+ const roleId = (0, maps_1.getRoleId)(this.roleMap, state.typeId, step.role);
222
+ if (!roleId) {
223
+ return {
224
+ state: 'empty'
225
+ };
226
+ }
227
+ this.emitFact(state.typeName);
228
+ this.emitEdge('predecessor', roleId);
229
+ return {
230
+ state: 'predecessor-join',
231
+ position: `${state.typeName}.${step.role}`
232
+ };
233
+ }
234
+ if (step.direction === jinaga_1.Direction.Successor) {
235
+ this.emitFact(state.typeName);
236
+ return {
237
+ state: 'successor-join',
238
+ role: step.role
239
+ };
240
+ }
241
+ }
242
+ else if (step instanceof jinaga_1.ExistentialCondition) {
243
+ return this.pushExistentialCondition(state.typeId, state.typeName, state, step);
244
+ }
245
+ else {
246
+ throw new Error(`Unknown step ${step.constructor.name}`);
247
+ }
248
+ }
249
+ matchStepPredecessorJoin(state, step) {
250
+ if (step instanceof jinaga_1.PropertyCondition) {
251
+ if (step.name !== 'type') {
252
+ throw new Error(`Property condition on non-type property ${step.name}`);
253
+ }
254
+ const typeId = (0, maps_1.getFactTypeId)(this.factTypes, step.value);
255
+ if (!typeId) {
256
+ return {
257
+ state: 'empty'
258
+ };
259
+ }
260
+ return {
261
+ state: 'predecessor-type',
262
+ typeId,
263
+ typeName: step.value
264
+ };
265
+ }
266
+ else {
267
+ throw new Error(`Missing type of "${state.position}"`);
268
+ }
269
+ }
270
+ matchStepSuccessorJoin(state, step) {
271
+ if (step instanceof jinaga_1.PropertyCondition) {
272
+ if (step.name !== 'type') {
273
+ throw new Error(`Property condition on non-type property ${step.name}`);
274
+ }
275
+ const typeId = (0, maps_1.getFactTypeId)(this.factTypes, step.value);
276
+ if (!typeId) {
277
+ return {
278
+ state: 'empty'
279
+ };
280
+ }
281
+ const roleId = (0, maps_1.getRoleId)(this.roleMap, typeId, state.role);
282
+ if (!roleId) {
283
+ return {
284
+ state: 'empty'
285
+ };
286
+ }
287
+ this.emitEdge('successor', roleId);
288
+ return {
289
+ state: 'successor-type',
290
+ typeId: typeId,
291
+ typeName: step.value
292
+ };
293
+ }
294
+ else {
295
+ throw new Error(`Missing type for role ${state.role}`);
296
+ }
297
+ }
298
+ matchStepSuccessorType(state, step) {
299
+ if (step instanceof jinaga_1.PropertyCondition) {
300
+ if (step.name !== 'type') {
301
+ throw new Error(`Property condition on non-type property ${step.name}`);
302
+ }
303
+ const typeId = (0, maps_1.getFactTypeId)(this.factTypes, step.value);
304
+ if (typeId !== state.typeId) {
305
+ throw new Error(`Two property conditions in a row on different types, ending in ${step.value}`);
306
+ }
307
+ return state;
308
+ }
309
+ else if (step instanceof jinaga_1.Join) {
310
+ if (step.direction === jinaga_1.Direction.Predecessor) {
311
+ const roleId = (0, maps_1.getRoleId)(this.roleMap, state.typeId, step.role);
312
+ if (!roleId) {
313
+ return {
314
+ state: 'empty'
315
+ };
316
+ }
317
+ this.emitFact(state.typeName);
318
+ this.emitEdge('predecessor', roleId);
319
+ return {
320
+ state: 'predecessor-join',
321
+ position: `${state.typeName}.${step.role}`
322
+ };
323
+ }
324
+ else {
325
+ this.emitFact(state.typeName);
326
+ return {
327
+ state: 'successor-join',
328
+ role: step.role
329
+ };
330
+ }
331
+ }
332
+ else if (step instanceof jinaga_1.ExistentialCondition) {
333
+ return this.pushExistentialCondition(state.typeId, state.typeName, state, step);
334
+ }
335
+ else {
336
+ throw new Error(`Unknown step ${step.constructor.name}`);
337
+ }
338
+ }
339
+ end(finalState) {
340
+ if (finalState.state === 'successor-join') {
341
+ throw new Error(`Missing type for role ${finalState.role}`);
342
+ }
343
+ else if (finalState.state === 'predecessor-join') {
344
+ throw new Error(`Missing type of "${finalState.position}"`);
345
+ }
346
+ else if (finalState.state === 'predecessor-type' || finalState.state === 'successor-type') {
347
+ this.emitFact(finalState.typeName);
348
+ }
349
+ }
350
+ emitEdge(direction, roleId) {
351
+ const edgeAlias = this.nextEdge++;
352
+ this.roleIds.push(roleId);
353
+ this.queryParts.joins.push({
354
+ table: 'edge',
355
+ direction: direction,
356
+ edgeAlias: edgeAlias,
357
+ roleParameter: edgeAlias + 2
358
+ });
359
+ }
360
+ emitFact(factTypeName) {
361
+ if (this.shouldEmitFacts) {
362
+ const factAlias = this.nextFact++;
363
+ this.queryParts.joins.push({
364
+ table: 'fact',
365
+ factAlias: factAlias
366
+ });
367
+ this.factTypeNames.push(factTypeName);
368
+ }
369
+ }
370
+ pushExistentialCondition(typeId, typeName, state, step) {
371
+ const nested = this.buildNestedSql(typeId, typeName, step.steps);
372
+ if (!nested) {
373
+ if (step.quantifier === jinaga_1.Quantifier.Exists) {
374
+ // An empty positive existential condition cannot match any facts.
375
+ return {
376
+ state: 'empty'
377
+ };
378
+ }
379
+ else {
380
+ // An empty negative existential condition cannot exclude any facts.
381
+ return state;
382
+ }
383
+ }
384
+ const lastJoin = this.queryParts.joins[this.queryParts.joins.length - 1];
385
+ if (lastJoin.table !== 'edge') {
386
+ throw new Error(`Existential condition on non-edge table ${lastJoin.table}`);
387
+ }
388
+ this.queryParts.existentialClauses.push({
389
+ quantifier: step.quantifier,
390
+ priorEdgeJoin: lastJoin,
391
+ query: nested
392
+ });
393
+ return state;
394
+ }
395
+ }
396
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/postgres/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function flattenAsync<T, U>(collection: T[], selector: (element: T) => Promise<U[]>): Promise<U[]>;
2
+ export declare function flatten<T, U>(collection: T[], selector: (element: T) => U[]): U[];
3
+ export declare function mapAsync<T, U>(collection: T[], action: (element: T) => Promise<U>): Promise<Awaited<U>[]>;
4
+ export declare function filterAsync<T>(collection: T[], predicate: (element: T) => Promise<boolean>): Promise<T[]>;
5
+ export declare function findIndex<T>(array: T[], predicate: ((element: T) => boolean)): number;
6
+ export declare function distinct<T>(value: T, index: number, self: T[]): boolean;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.distinct = exports.findIndex = exports.filterAsync = exports.mapAsync = exports.flatten = exports.flattenAsync = void 0;
13
+ function safeFlatten(results) {
14
+ const flat = results.reduce((a, b) => (!a || a.length === 0) ? b :
15
+ (!b || b.length === 0) ? a :
16
+ a.concat(b));
17
+ return flat ? flat : [];
18
+ }
19
+ function flattenAsync(collection, selector) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ if (collection.length === 0) {
22
+ return [];
23
+ }
24
+ else {
25
+ const results = yield Promise.all(collection.map(selector));
26
+ return safeFlatten(results);
27
+ }
28
+ });
29
+ }
30
+ exports.flattenAsync = flattenAsync;
31
+ function flatten(collection, selector) {
32
+ if (collection.length === 0) {
33
+ return [];
34
+ }
35
+ else {
36
+ return safeFlatten(collection.map(selector));
37
+ }
38
+ }
39
+ exports.flatten = flatten;
40
+ function mapAsync(collection, action) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ if (collection.length === 0) {
43
+ return [];
44
+ }
45
+ else {
46
+ return yield Promise.all(collection.map(action));
47
+ }
48
+ });
49
+ }
50
+ exports.mapAsync = mapAsync;
51
+ function filterAsync(collection, predicate) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ if (collection.length === 0) {
54
+ return [];
55
+ }
56
+ else {
57
+ const filters = yield Promise.all(collection.map((element) => __awaiter(this, void 0, void 0, function* () {
58
+ return ({
59
+ include: yield predicate(element),
60
+ element
61
+ });
62
+ })));
63
+ return filters.filter(f => f.include).map(f => f.element);
64
+ }
65
+ });
66
+ }
67
+ exports.filterAsync = filterAsync;
68
+ function findIndex(array, predicate) {
69
+ for (let index = 0; index < array.length; index++) {
70
+ if (predicate(array[index])) {
71
+ return index;
72
+ }
73
+ }
74
+ return -1;
75
+ }
76
+ exports.findIndex = findIndex;
77
+ function distinct(value, index, self) {
78
+ return self.indexOf(value) === index;
79
+ }
80
+ exports.distinct = distinct;
81
+ //# sourceMappingURL=fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../../src/util/fn.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAS,WAAW,CAAI,OAAc;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,SAAsB,YAAY,CAAO,UAAe,EAAE,QAAsC;;QAC5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO,EAAE,CAAC;SACb;aACI;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;SAC/B;IACL,CAAC;CAAA;AARD,oCAQC;AAED,SAAgB,OAAO,CAAO,UAAe,EAAE,QAA6B;IACxE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,EAAE,CAAC;KACb;SACI;QACD,OAAO,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;KAChD;AACL,CAAC;AAPD,0BAOC;AAED,SAAsB,QAAQ,CAAO,UAAe,EAAE,MAAkC;;QACpF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO,EAAE,CAAC;SACb;aACI;YACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;SACpD;IACL,CAAC;CAAA;AAPD,4BAOC;AAED,SAAsB,WAAW,CAAI,UAAe,EAAE,SAA2C;;QAC7F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO,EAAE,CAAC;SACb;aACI;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAM,OAAO,EAAC,EAAE;gBAAC,OAAA,CAAC;oBAC/D,OAAO,EAAE,MAAM,SAAS,CAAC,OAAO,CAAC;oBACjC,OAAO;iBACV,CAAC,CAAA;cAAA,CAAC,CAAC,CAAC;YAEL,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SAC7D;IACL,CAAC;CAAA;AAZD,kCAYC;AAED,SAAgB,SAAS,CAAI,KAAU,EAAE,SAAoC;IACzE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/C,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;YACzB,OAAO,KAAK,CAAC;SAChB;KACJ;IAED,OAAO,CAAC,CAAC,CAAC;AACd,CAAC;AARD,8BAQC;AAED,SAAgB,QAAQ,CAAI,KAAQ,EAAE,KAAa,EAAE,IAAS;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACzC,CAAC;AAFD,4BAEC"}
@@ -0,0 +1 @@
1
+ export declare function delay(ms: number): Promise<void>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.delay = void 0;
4
+ function delay(ms) {
5
+ return new Promise((resolve, reject) => {
6
+ setTimeout(() => resolve(), ms);
7
+ });
8
+ }
9
+ exports.delay = delay;
10
+ //# sourceMappingURL=promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise.js","sourceRoot":"","sources":["../../src/util/promise.ts"],"names":[],"mappings":";;;AAAA,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,sBAIC"}
@@ -0,0 +1,22 @@
1
+ SELECT F3.HASH AS HASH3,
2
+ F4.HASH AS HASH4,
3
+ F6.HASH AS HASH6,
4
+ sort(array[F3.FACT_ID, F4.FACT_ID, F6.FACT_ID], 'desc') as bookmark
5
+ FROM PUBLIC.FACT F1
6
+ JOIN PUBLIC.EDGE E1 ON E1.PREDECESSOR_FACT_ID = F1.FACT_ID
7
+ AND E1.ROLE_ID = 44
8
+ JOIN PUBLIC.FACT F3 ON F3.FACT_ID = E1.SUCCESSOR_FACT_ID
9
+ JOIN PUBLIC.EDGE E2 ON E2.PREDECESSOR_FACT_ID = F3.FACT_ID
10
+ AND e2.ROLE_ID = 46
11
+ JOIN PUBLIC.FACT F4 ON F4.FACT_ID = E2.SUCCESSOR_FACT_ID
12
+ JOIN PUBLIC.EDGE E4 ON E4.PREDECESSOR_FACT_ID = F4.FACT_ID
13
+ AND E4.ROLE_ID = 18
14
+ JOIN PUBLIC.FACT F6 ON F6.FACT_ID = E4.SUCCESSOR_FACT_ID
15
+ JOIN PUBLIC.EDGE E5 ON E5.SUCCESSOR_FACT_ID = F6.FACT_ID
16
+ AND E5.ROLE_ID = 23
17
+ JOIN PUBLIC.FACT F2 ON F2.FACT_ID = E5.PREDECESSOR_FACT_ID
18
+ WHERE F1.FACT_TYPE_ID = 35
19
+ AND F1.HASH = '5kIRDvVO/wP4v7G9vhDAPMVi2q0cXsZtp9YuyAjan7yyDUhFFPiwwNnzTor6jFdkC11CYnDmoZueMAqxF9MPTQ=='
20
+ AND F2.FACT_TYPE_ID = 24
21
+ AND F2.HASH = '0WWlFbZH+gMoP3QGXO7/mf6hIQC/2iN7wd0peEQKFVvnJMp3gTVvi4eXfVd3DSa81MSzAVp7zVxXIiRnJTF0Kw=='
22
+ ORDER BY bookmark ASC
@@ -0,0 +1,41 @@
1
+ let user: Jinaga.User = me
2
+ let semester: ImprovingU.Semester = #Ws6RWV8bWmP7ibBlzwL2UoKKwg6E1iItQPFpX/mvU5u6FLwHJAbRd0SbH+P1hoMn4QndhArLqJqVReRqJdoyBg==
3
+
4
+ (semester: ImprovingU.Semester, user: Jinaga.User) {
5
+ catalog: ImprovingU.Catalog [
6
+ catalog->_in:ImprovingU.Semester = semester
7
+ ]
8
+ } => {
9
+ office = catalog.office
10
+ courses = {
11
+ course: ImprovingU.Course [
12
+ course->_in:ImprovingU.Catalog = catalog
13
+ !E {
14
+ delete: ImprovingU.Course.Delete [
15
+ delete->course:ImprovingU.Course = course
16
+ ]
17
+ }
18
+ ]
19
+ } => {
20
+ titles = {
21
+ title: ImprovingU.Course.Title [
22
+ title->course: ImprovingU.Course = course
23
+ !E {
24
+ next: ImprovingU.Course.Title [
25
+ next->prior: ImprovingU.Course.Title = title
26
+ ]
27
+ }
28
+ ]
29
+ } => title.value
30
+ instructors = {
31
+ instructor: ImprovingU.Course.Instructor [
32
+ instructor->course: ImprovingU.Course = course
33
+ !E {
34
+ next: ImprovingU.Course.Instructor [
35
+ next->prior: ImprovingU.Course.Instructor = instructor
36
+ ]
37
+ }
38
+ ]
39
+ } => instructor.value
40
+ }
41
+ }
@@ -0,0 +1,25 @@
1
+ digraph {
2
+ subgraph cluster_states {
3
+ color=transparent
4
+ PredecessorType -> PredecessorJoin [label="Predecessor\nemit edge"]
5
+ PredecessorJoin -> PredecessorType [label="Type"]
6
+ PredecessorType -> SuccessorJoin [label="Successor" constraint=false]
7
+
8
+ SuccessorType -> SuccessorJoin [label="Successor"]
9
+ SuccessorJoin -> SuccessorType [label="Type\nemit edge"]
10
+ SuccessorType -> PredecessorJoin [label="Predecessor\nemit fact\nemit edge" constraint=false]
11
+ }
12
+
13
+ subgraph cluster_terminal {
14
+ color=transparent
15
+ success
16
+ error
17
+ }
18
+
19
+ SuccessorJoin -> error [label="end"]
20
+ SuccessorType -> success [label="end\nemit fact"]
21
+ PredecessorType -> success [label="end\nemit fact"]
22
+ PredecessorJoin -> success [label="end\nemit fact"]
23
+
24
+ // {rank=same; SuccessorType; success }
25
+ }
@@ -0,0 +1,13 @@
1
+ version: "3.9"
2
+ services:
3
+ jinaga-test:
4
+ image: jinaga-test
5
+ db:
6
+ image: jinaga-postgres-fact-keystore
7
+ environment:
8
+ - POSTGRES_PASSWORD=superuser
9
+ - APP_USERNAME=dev
10
+ - APP_PASSWORD=devpw
11
+ - APP_DATABASE=integrationtest
12
+ ports:
13
+ - "5432:5432"
@@ -0,0 +1,12 @@
1
+ FROM node:alpine3.12
2
+
3
+ WORKDIR /root
4
+
5
+ COPY package.json .
6
+ COPY package-lock.json .
7
+ RUN npm install
8
+
9
+ COPY jinaga/ jinaga/
10
+ COPY jinaga.test.js .
11
+
12
+ ENTRYPOINT [ "npm", "test" ]