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,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resultSqlFromSpecification = exports.ResultComposer = void 0;
4
+ const maps_1 = require("./maps");
5
+ const query_description_1 = require("./query-description");
6
+ const query_description_builder_1 = require("./query-description-builder");
7
+ class ResultComposer {
8
+ constructor(sqlQuery, resultProjection, parentFactIdLength, childResultComposers) {
9
+ this.sqlQuery = sqlQuery;
10
+ this.resultProjection = resultProjection;
11
+ this.parentFactIdLength = parentFactIdLength;
12
+ this.childResultComposers = childResultComposers;
13
+ }
14
+ getSqlQueries() {
15
+ const childQueries = [];
16
+ for (const childResultComposer of this.childResultComposers) {
17
+ childQueries.push((Object.assign({ name: childResultComposer.name }, childResultComposer.resultComposer.getSqlQueries())));
18
+ }
19
+ return {
20
+ sqlQuery: this.sqlQuery,
21
+ childQueries
22
+ };
23
+ }
24
+ compose(resultSets) {
25
+ const childResults = this.composeInternal(resultSets);
26
+ if (childResults.length === 0) {
27
+ return [];
28
+ }
29
+ else {
30
+ return childResults[0].results;
31
+ }
32
+ }
33
+ composeInternal(resultSets) {
34
+ const rows = resultSets.resultSet;
35
+ if (rows.length === 0) {
36
+ return [];
37
+ }
38
+ // Project all rows and their identifiers
39
+ const identifiedResults = rows.map(row => ({
40
+ factIds: this.identifierOf(row),
41
+ result: this.projectionOf(row)
42
+ }));
43
+ // Compose child results
44
+ for (const childResultComposer of this.childResultComposers) {
45
+ const childResultSet = resultSets.childResultSets.find(childResultSet => childResultSet.name === childResultComposer.name);
46
+ if (!childResultSet) {
47
+ const availableNames = resultSets.childResultSets.map(childResultSet => childResultSet.name);
48
+ throw new Error(`Child result set ${childResultComposer.name} not found in (${availableNames.join(", ")})`);
49
+ }
50
+ const composedResults = childResultComposer.resultComposer.composeInternal(childResultSet);
51
+ // Add the child results
52
+ let index = 0;
53
+ for (const identifiedResult of identifiedResults) {
54
+ let results = [];
55
+ if (index < composedResults.length && idsEqual(identifiedResult.factIds, composedResults[index].parentFactIds)) {
56
+ results = composedResults[index].results;
57
+ index++;
58
+ }
59
+ identifiedResult.result = Object.assign(Object.assign({}, identifiedResult.result), { [childResultComposer.name]: results });
60
+ }
61
+ }
62
+ // Group the results by their parent identifiers
63
+ const childResults = [];
64
+ let parentFactIds = identifiedResults[0].factIds.slice(0, this.parentFactIdLength);
65
+ let results = [identifiedResults[0].result];
66
+ for (const identifiedResult of identifiedResults.slice(1)) {
67
+ const nextParentFactIds = identifiedResult.factIds.slice(0, this.parentFactIdLength);
68
+ if (idsEqual(nextParentFactIds, parentFactIds)) {
69
+ results.push(identifiedResult.result);
70
+ }
71
+ else {
72
+ childResults.push({
73
+ parentFactIds,
74
+ results
75
+ });
76
+ parentFactIds = nextParentFactIds;
77
+ results = [identifiedResult.result];
78
+ }
79
+ }
80
+ childResults.push({
81
+ parentFactIds,
82
+ results
83
+ });
84
+ return childResults;
85
+ }
86
+ identifierOf(row) {
87
+ return this.sqlQuery.labels.map(label => row[`id${label.index}`]);
88
+ }
89
+ projectionOf(row) {
90
+ if (!Array.isArray(this.resultProjection)) {
91
+ return this.singularValue(this.resultProjection, row);
92
+ }
93
+ else if (this.resultProjection.length === 0 && this.childResultComposers.length === 0) {
94
+ return this.sqlQuery.labels
95
+ .slice(this.parentFactIdLength)
96
+ .reduce((acc, label) => (Object.assign(Object.assign({}, acc), { [label.name]: row[`data${label.index}`].fields })), {});
97
+ }
98
+ else {
99
+ return this.resultProjection.reduce((acc, elementProjection) => (Object.assign(Object.assign({}, acc), { [elementProjection.name]: this.elementValue(elementProjection, row) })), {});
100
+ }
101
+ }
102
+ elementValue(projection, row) {
103
+ const label = this.getLabel(projection.label);
104
+ if (projection.type === "field") {
105
+ return row[`data${label.index}`].fields[projection.field];
106
+ }
107
+ else if (projection.type === "hash") {
108
+ return row[`hash${label.index}`];
109
+ }
110
+ }
111
+ singularValue(projection, row) {
112
+ const label = this.getLabel(projection.label);
113
+ return row[`data${label.index}`].fields[projection.field];
114
+ }
115
+ getLabel(name) {
116
+ const label = this.sqlQuery.labels.find(label => label.name === name);
117
+ if (!label) {
118
+ throw new Error(`Label ${name} not found. Known labels: ${this.sqlQuery.labels.map(label => label.name).join(", ")}`);
119
+ }
120
+ return label;
121
+ }
122
+ }
123
+ exports.ResultComposer = ResultComposer;
124
+ class ResultDescriptionBuilder extends query_description_builder_1.QueryDescriptionBuilder {
125
+ constructor(factTypes, roleMap) {
126
+ super(factTypes, roleMap);
127
+ }
128
+ buildDescription(start, specification) {
129
+ // Verify that the number of start facts equals the number of inputs
130
+ if (start.length !== specification.given.length) {
131
+ throw new Error(`The number of start facts (${start.length}) does not equal the number of inputs (${specification.given.length})`);
132
+ }
133
+ // Verify that the input type matches the start fact type
134
+ for (let i = 0; i < start.length; i++) {
135
+ if (start[i].type !== specification.given[i].type) {
136
+ throw new Error(`The type of start fact ${i} (${start[i].type}) does not match the type of input ${i} (${specification.given[i].type})`);
137
+ }
138
+ }
139
+ // Allocate a fact table for each given.
140
+ // While the fact type and hash parameters are zero, the join will not be written.
141
+ const inputs = specification.given
142
+ .map((label, i) => ({
143
+ label: label.name,
144
+ factIndex: i + 1,
145
+ factTypeId: (0, maps_1.getFactTypeId)(this.factTypes, label.type),
146
+ factHash: start[i].hash,
147
+ factTypeParameter: 0,
148
+ factHashParameter: 0
149
+ }));
150
+ const facts = specification.given
151
+ .map((label, i) => ({
152
+ factIndex: i + 1,
153
+ type: label.type
154
+ }));
155
+ const givenFacts = specification.given.reduce((knownFacts, label, i) => (Object.assign(Object.assign({}, knownFacts), { [label.name]: facts[i] })), {});
156
+ // The QueryDescription is an immutable data type.
157
+ // Initialize it with the inputs and facts.
158
+ // The DescriptionBuilder will branch at various points, and
159
+ // build on the current query description along each branch.
160
+ const initialQueryDescription = new query_description_1.QueryDescription(inputs, [], [], facts, [], []);
161
+ return this.createResultDescription(initialQueryDescription, specification.matches, specification.childProjections, givenFacts, []);
162
+ }
163
+ createResultDescription(queryDescription, matches, childProjections, knownFacts, path) {
164
+ ({ queryDescription, knownFacts } = this.addEdges(queryDescription, knownFacts, path, matches));
165
+ if (!queryDescription.isSatisfiable()) {
166
+ // Abort the branch if the query is not satisfiable
167
+ return {
168
+ queryDescription,
169
+ resultProjection: [],
170
+ childResultDescriptions: []
171
+ };
172
+ }
173
+ const childResultDescriptions = [];
174
+ if (Array.isArray(childProjections)) {
175
+ const specificationProjections = childProjections
176
+ .filter(projection => projection.type === "specification");
177
+ const elementProjections = childProjections
178
+ .filter(projection => projection.type === "field" || projection.type === "hash");
179
+ for (const child of specificationProjections) {
180
+ const childResultDescription = this.createResultDescription(queryDescription, child.matches, child.childProjections, knownFacts, []);
181
+ childResultDescriptions.push(Object.assign({ name: child.name }, childResultDescription));
182
+ }
183
+ return {
184
+ queryDescription,
185
+ resultProjection: elementProjections,
186
+ childResultDescriptions
187
+ };
188
+ }
189
+ else {
190
+ return {
191
+ queryDescription,
192
+ resultProjection: childProjections,
193
+ childResultDescriptions: []
194
+ };
195
+ }
196
+ }
197
+ addEdges(queryDescription, knownFacts, path, matches) {
198
+ for (const match of matches) {
199
+ for (const condition of match.conditions) {
200
+ if (condition.type === "path") {
201
+ ({ queryDescription, knownFacts } = this.addPathCondition(queryDescription, knownFacts, path, match.unknown, "", condition));
202
+ }
203
+ else if (condition.type === "existential") {
204
+ if (condition.exists) {
205
+ // Include the edges of the existential condition into the current
206
+ // query description.
207
+ ({ queryDescription } = this.addEdges(queryDescription, knownFacts, path, condition.matches));
208
+ }
209
+ else {
210
+ // Apply the where clause and continue with the tuple where it is true.
211
+ // The path describes which not-exists condition we are currently building on.
212
+ // Because the path is not empty, labeled facts will be included in the output.
213
+ const { query: queryDescriptionWithNotExist, path: conditionalPath } = queryDescription.withNotExistsCondition(path);
214
+ const { queryDescription: queryDescriptionConditional } = this.addEdges(queryDescriptionWithNotExist, knownFacts, conditionalPath, condition.matches);
215
+ // If the negative existential condition is not satisfiable, then
216
+ // that means that the condition will always be true.
217
+ // We can therefore skip the branch for the negative existential condition.
218
+ if (queryDescriptionConditional.isSatisfiable()) {
219
+ queryDescription = queryDescriptionConditional;
220
+ }
221
+ }
222
+ }
223
+ if (!queryDescription.isSatisfiable()) {
224
+ break;
225
+ }
226
+ }
227
+ if (!queryDescription.isSatisfiable()) {
228
+ break;
229
+ }
230
+ }
231
+ return {
232
+ queryDescription,
233
+ knownFacts
234
+ };
235
+ }
236
+ }
237
+ function idsEqual(a, b) {
238
+ return a.every((value, index) => value === b[index]);
239
+ }
240
+ function resultSqlFromSpecification(start, specification, factTypes, roleMap) {
241
+ const descriptionBuilder = new ResultDescriptionBuilder(factTypes, roleMap);
242
+ const description = descriptionBuilder.buildDescription(start, specification);
243
+ if (!description.queryDescription.isSatisfiable()) {
244
+ return null;
245
+ }
246
+ return createResultComposer(description, 0);
247
+ }
248
+ exports.resultSqlFromSpecification = resultSqlFromSpecification;
249
+ function createResultComposer(description, parentFactIdLength) {
250
+ const sqlQuery = description.queryDescription.generateResultSqlQuery();
251
+ const resultProjection = description.resultProjection;
252
+ const childResultComposers = description.childResultDescriptions
253
+ .filter(child => child.queryDescription.isSatisfiable())
254
+ .map(child => ({
255
+ name: child.name,
256
+ resultComposer: createResultComposer(child, description.queryDescription.outputLength())
257
+ }));
258
+ return new ResultComposer(sqlQuery, resultProjection, parentFactIdLength, childResultComposers);
259
+ }
260
+ //# sourceMappingURL=specification-result-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification-result-sql.js","sourceRoot":"","sources":["../../src/postgres/specification-result-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FactBookmark, FactReference, Specification } from "jinaga";
2
+ import { SpecificationSqlQuery } from "./query-description";
3
+ export declare function sqlFromSpecification(start: FactReference[], bookmarks: FactBookmark[], limit: number, specification: Specification, factTypes: Map<string, number>, roleMap: Map<number, Map<string, number>>): SpecificationSqlQuery[];
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sqlFromSpecification = void 0;
4
+ const maps_1 = require("./maps");
5
+ const query_description_1 = require("./query-description");
6
+ const query_description_builder_1 = require("./query-description-builder");
7
+ class DescriptionBuilder extends query_description_builder_1.QueryDescriptionBuilder {
8
+ constructor(factTypes, roleMap) { super(factTypes, roleMap); }
9
+ buildDescriptions(start, specification) {
10
+ // Verify that the number of start facts equals the number of inputs
11
+ if (start.length !== specification.given.length) {
12
+ throw new Error(`The number of start facts (${start.length}) does not equal the number of inputs (${specification.given.length})`);
13
+ }
14
+ // Verify that the input type matches the start fact type
15
+ for (let i = 0; i < start.length; i++) {
16
+ if (start[i].type !== specification.given[i].type) {
17
+ throw new Error(`The type of start fact ${i} (${start[i].type}) does not match the type of input ${i} (${specification.given[i].type})`);
18
+ }
19
+ }
20
+ // Allocate a fact table for each given.
21
+ // While the fact type and hash parameters are zero, the join will not be written.
22
+ const inputs = specification.given
23
+ .map((label, i) => ({
24
+ label: label.name,
25
+ factIndex: i + 1,
26
+ factTypeId: (0, maps_1.getFactTypeId)(this.factTypes, label.type),
27
+ factHash: start[i].hash,
28
+ factTypeParameter: 0,
29
+ factHashParameter: 0
30
+ }));
31
+ const facts = specification.given
32
+ .map((label, i) => ({
33
+ factIndex: i + 1,
34
+ type: label.type
35
+ }));
36
+ const givenFacts = specification.given.reduce((knownFacts, label, i) => (Object.assign(Object.assign({}, knownFacts), { [label.name]: facts[i] })), {});
37
+ // The QueryDescription is an immutable data type.
38
+ // Initialize it with the inputs and facts.
39
+ // The DescriptionBuilder will branch at various points, and
40
+ // build on the current query description along each branch.
41
+ const initialQueryDescription = new query_description_1.QueryDescription(inputs, [], [], facts, [], []);
42
+ const { queryDescriptions, knownFacts } = this.addEdges(initialQueryDescription, givenFacts, [], "", specification.matches);
43
+ // The final query description represents the complete tuple.
44
+ // Build projections onto that one.
45
+ const finalQueryDescription = queryDescriptions[queryDescriptions.length - 1];
46
+ if (Array.isArray(specification.childProjections)) {
47
+ const queryDescriptionsWithProjections = this.addProjections(finalQueryDescription, knownFacts, specification.childProjections);
48
+ return [...queryDescriptions, ...queryDescriptionsWithProjections];
49
+ }
50
+ else {
51
+ return queryDescriptions;
52
+ }
53
+ }
54
+ addEdges(queryDescription, knownFacts, path, prefix, matches) {
55
+ const queryDescriptions = [];
56
+ for (const match of matches) {
57
+ for (const condition of match.conditions) {
58
+ if (condition.type === "path") {
59
+ ({ queryDescription, knownFacts } = this.addPathCondition(queryDescription, knownFacts, path, match.unknown, prefix, condition));
60
+ }
61
+ else if (condition.type === "existential") {
62
+ if (condition.exists) {
63
+ // Include the edges of the existential condition into the current
64
+ // query description.
65
+ const { queryDescriptions: newQueryDescriptions } = this.addEdges(queryDescription, knownFacts, path, prefix, condition.matches);
66
+ const last = newQueryDescriptions.length - 1;
67
+ queryDescriptions.push(...newQueryDescriptions.slice(0, last));
68
+ queryDescription = newQueryDescriptions[last];
69
+ }
70
+ else {
71
+ // Branch from the current query description and follow the
72
+ // edges of the existential condition.
73
+ // This will produce tuples that prove the condition false.
74
+ const { queryDescriptions: newQueryDescriptions } = this.addEdges(queryDescription, knownFacts, path, prefix, condition.matches);
75
+ // Then apply the where clause and continue with the tuple where it is true.
76
+ // The path describes which not-exists condition we are currently building on.
77
+ // Because the path is not empty, labeled facts will be included in the output.
78
+ const { query: queryDescriptionWithNotExist, path: conditionalPath } = queryDescription.withNotExistsCondition(path);
79
+ const { queryDescriptions: newQueryDescriptionsWithNotExists } = this.addEdges(queryDescriptionWithNotExist, knownFacts, conditionalPath, prefix, condition.matches);
80
+ const last = newQueryDescriptionsWithNotExists.length - 1;
81
+ const queryDescriptionConditional = newQueryDescriptionsWithNotExists[last];
82
+ // If the negative existential condition is not satisfiable, then
83
+ // that means that the condition will always be true.
84
+ // We can therefore skip the branch for the negative existential condition.
85
+ if (queryDescriptionConditional.isSatisfiable()) {
86
+ queryDescriptions.push(...newQueryDescriptions);
87
+ queryDescriptions.push(...newQueryDescriptionsWithNotExists.slice(0, last));
88
+ queryDescription = queryDescriptionConditional;
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ queryDescriptions.push(queryDescription);
95
+ return { queryDescriptions, knownFacts };
96
+ }
97
+ addProjections(queryDescription, knownFacts, projections) {
98
+ const queryDescriptions = [];
99
+ projections.forEach(projection => {
100
+ if (projection.type === "specification") {
101
+ // Produce more facts in the tuple, and prefix the labels with the projection name.
102
+ const prefix = projection.name + ".";
103
+ const { queryDescriptions: queryDescriptionsWithEdges } = this.addEdges(queryDescription, knownFacts, [], prefix, projection.matches);
104
+ queryDescriptions.push(...queryDescriptionsWithEdges);
105
+ }
106
+ });
107
+ return queryDescriptions;
108
+ }
109
+ }
110
+ function sqlFromSpecification(start, bookmarks, limit, specification, factTypes, roleMap) {
111
+ const descriptionBuilder = new DescriptionBuilder(factTypes, roleMap);
112
+ const descriptions = descriptionBuilder.buildDescriptions(start, specification);
113
+ // Only generate SQL for satisfiable queries.
114
+ return descriptions
115
+ .filter(description => description.isSatisfiable())
116
+ .map(description => description.generateSqlQuery(bookmarks, limit));
117
+ }
118
+ exports.sqlFromSpecification = sqlFromSpecification;
119
+ //# sourceMappingURL=specification-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification-sql.js","sourceRoot":"","sources":["../../src/postgres/specification-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FactReference, Step } from "jinaga";
2
+ import { FactTypeMap, RoleMap } from "./maps";
3
+ export declare type SqlQuery = {
4
+ empty: boolean;
5
+ sql: string;
6
+ parameters: any[];
7
+ pathLength: number;
8
+ factTypeNames: string[];
9
+ };
10
+ export declare function sqlFromSteps(start: FactReference, steps: Step[], factTypes: FactTypeMap, roleMap: RoleMap): SqlQuery;