@xyo-network/diviner-temporal-indexing-memory 2.84.6 → 2.84.8

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 (89) hide show
  1. package/dist/browser/DivinerQueryToIndexQueryDiviner/Diviner.d.cts.map +1 -1
  2. package/dist/browser/DivinerQueryToIndexQueryDiviner/Diviner.d.mts.map +1 -1
  3. package/dist/browser/DivinerQueryToIndexQueryDiviner/Diviner.d.ts.map +1 -1
  4. package/dist/browser/IndexCandidateToIndexDiviner/Diviner.d.cts.map +1 -1
  5. package/dist/browser/IndexCandidateToIndexDiviner/Diviner.d.mts.map +1 -1
  6. package/dist/browser/IndexCandidateToIndexDiviner/Diviner.d.ts.map +1 -1
  7. package/dist/browser/index.cjs +24 -71
  8. package/dist/browser/index.cjs.map +1 -1
  9. package/dist/browser/index.js +22 -59
  10. package/dist/browser/index.js.map +1 -1
  11. package/dist/node/DivinerQueryToIndexQueryDiviner/Diviner.d.cts.map +1 -1
  12. package/dist/node/DivinerQueryToIndexQueryDiviner/Diviner.d.mts.map +1 -1
  13. package/dist/node/DivinerQueryToIndexQueryDiviner/Diviner.d.ts.map +1 -1
  14. package/dist/node/IndexCandidateToIndexDiviner/Diviner.d.cts.map +1 -1
  15. package/dist/node/IndexCandidateToIndexDiviner/Diviner.d.mts.map +1 -1
  16. package/dist/node/IndexCandidateToIndexDiviner/Diviner.d.ts.map +1 -1
  17. package/dist/node/index.cjs +24 -71
  18. package/dist/node/index.cjs.map +1 -1
  19. package/dist/node/index.js +22 -59
  20. package/dist/node/index.js.map +1 -1
  21. package/package.json +27 -28
  22. package/src/DivinerQueryToIndexQueryDiviner/Diviner.ts +5 -6
  23. package/src/IndexCandidateToIndexDiviner/Diviner.ts +12 -14
  24. package/src/StateToIndexCandidateDiviner/Diviner.ts +2 -2
  25. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.cts +0 -47
  26. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.cts.map +0 -1
  27. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.mts +0 -47
  28. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.mts.map +0 -1
  29. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.ts +0 -47
  30. package/dist/browser/IndexCandidateToIndexDiviner/_Diviner.d.ts.map +0 -1
  31. package/dist/browser/jsonpath/index.d.cts +0 -4
  32. package/dist/browser/jsonpath/index.d.cts.map +0 -1
  33. package/dist/browser/jsonpath/index.d.mts +0 -4
  34. package/dist/browser/jsonpath/index.d.mts.map +0 -1
  35. package/dist/browser/jsonpath/index.d.ts +0 -4
  36. package/dist/browser/jsonpath/index.d.ts.map +0 -1
  37. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.cts +0 -10
  38. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.cts.map +0 -1
  39. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.mts +0 -10
  40. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.mts.map +0 -1
  41. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.ts +0 -10
  42. package/dist/browser/jsonpath/jsonPathToTransformersDictionary.d.ts.map +0 -1
  43. package/dist/browser/jsonpath/reducePayloads.d.cts +0 -27
  44. package/dist/browser/jsonpath/reducePayloads.d.cts.map +0 -1
  45. package/dist/browser/jsonpath/reducePayloads.d.mts +0 -27
  46. package/dist/browser/jsonpath/reducePayloads.d.mts.map +0 -1
  47. package/dist/browser/jsonpath/reducePayloads.d.ts +0 -27
  48. package/dist/browser/jsonpath/reducePayloads.d.ts.map +0 -1
  49. package/dist/browser/jsonpath/toPayloadTransformer.d.cts +0 -8
  50. package/dist/browser/jsonpath/toPayloadTransformer.d.cts.map +0 -1
  51. package/dist/browser/jsonpath/toPayloadTransformer.d.mts +0 -8
  52. package/dist/browser/jsonpath/toPayloadTransformer.d.mts.map +0 -1
  53. package/dist/browser/jsonpath/toPayloadTransformer.d.ts +0 -8
  54. package/dist/browser/jsonpath/toPayloadTransformer.d.ts.map +0 -1
  55. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.cts +0 -47
  56. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.cts.map +0 -1
  57. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.mts +0 -47
  58. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.mts.map +0 -1
  59. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.ts +0 -47
  60. package/dist/node/IndexCandidateToIndexDiviner/_Diviner.d.ts.map +0 -1
  61. package/dist/node/jsonpath/index.d.cts +0 -4
  62. package/dist/node/jsonpath/index.d.cts.map +0 -1
  63. package/dist/node/jsonpath/index.d.mts +0 -4
  64. package/dist/node/jsonpath/index.d.mts.map +0 -1
  65. package/dist/node/jsonpath/index.d.ts +0 -4
  66. package/dist/node/jsonpath/index.d.ts.map +0 -1
  67. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.cts +0 -10
  68. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.cts.map +0 -1
  69. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.mts +0 -10
  70. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.mts.map +0 -1
  71. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.ts +0 -10
  72. package/dist/node/jsonpath/jsonPathToTransformersDictionary.d.ts.map +0 -1
  73. package/dist/node/jsonpath/reducePayloads.d.cts +0 -27
  74. package/dist/node/jsonpath/reducePayloads.d.cts.map +0 -1
  75. package/dist/node/jsonpath/reducePayloads.d.mts +0 -27
  76. package/dist/node/jsonpath/reducePayloads.d.mts.map +0 -1
  77. package/dist/node/jsonpath/reducePayloads.d.ts +0 -27
  78. package/dist/node/jsonpath/reducePayloads.d.ts.map +0 -1
  79. package/dist/node/jsonpath/toPayloadTransformer.d.cts +0 -8
  80. package/dist/node/jsonpath/toPayloadTransformer.d.cts.map +0 -1
  81. package/dist/node/jsonpath/toPayloadTransformer.d.mts +0 -8
  82. package/dist/node/jsonpath/toPayloadTransformer.d.mts.map +0 -1
  83. package/dist/node/jsonpath/toPayloadTransformer.d.ts +0 -8
  84. package/dist/node/jsonpath/toPayloadTransformer.d.ts.map +0 -1
  85. package/src/IndexCandidateToIndexDiviner/_Diviner.ts +0 -135
  86. package/src/jsonpath/index.ts +0 -3
  87. package/src/jsonpath/jsonPathToTransformersDictionary.ts +0 -21
  88. package/src/jsonpath/reducePayloads.ts +0 -50
  89. package/src/jsonpath/toPayloadTransformer.ts +0 -23
@@ -14,53 +14,15 @@ var TemporalIndexingDiviner = class extends IndexingDiviner {
14
14
 
15
15
  // src/DivinerQueryToIndexQueryDiviner/Diviner.ts
16
16
  import { AbstractDiviner } from "@xyo-network/abstract-diviner";
17
+ import { jsonPathToTransformersDictionary, reducePayloads } from "@xyo-network/diviner-jsonpath-aggregate-memory";
17
18
  import { DivinerConfigSchema as DivinerConfigSchema2 } from "@xyo-network/diviner-model";
18
19
  import { PayloadDivinerQuerySchema } from "@xyo-network/diviner-payload-model";
19
20
  import {
20
21
  TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema,
21
22
  TemporalIndexingDivinerResultIndexSchema
22
23
  } from "@xyo-network/diviner-temporal-indexing-model";
23
- import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
24
- import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
25
-
26
- // src/jsonpath/toPayloadTransformer.ts
27
- import jsonpath from "jsonpath";
28
- var toPayloadTransformer = (transformExpression) => {
29
- const { defaultValue, destinationField, sourcePathExpression } = transformExpression;
30
- const transformer = (x) => {
31
- const source = jsonpath.value(x, sourcePathExpression);
32
- const transformed = {};
33
- const destinationValue = source === void 0 ? defaultValue : source;
34
- if (destinationValue !== void 0)
35
- transformed[destinationField] = destinationValue;
36
- return transformed;
37
- };
38
- return transformer;
39
- };
40
-
41
- // src/jsonpath/jsonPathToTransformersDictionary.ts
42
- var jsonPathToTransformersDictionary = (schemaTransforms) => {
43
- return Object.fromEntries(
44
- Object.entries(schemaTransforms).map(([schema, jsonPathTransformerExpressions]) => {
45
- const transformers = jsonPathTransformerExpressions.map(toPayloadTransformer);
46
- return [schema, transformers];
47
- })
48
- );
49
- };
50
-
51
- // src/jsonpath/reducePayloads.ts
52
- import { PayloadHasher } from "@xyo-network/hash";
53
24
  import { PayloadBuilder } from "@xyo-network/payload-builder";
54
- var reducePayloads = async (payloads, payloadTransformers, destinationSchema) => {
55
- const indexFields = payloads.map((payload) => {
56
- const transformers = payloadTransformers[payload.schema];
57
- return transformers ? transformers.map((transform) => transform(payload)) : [];
58
- }).flat();
59
- const sources = (await PayloadHasher.hashPairs([...payloads])).map(([, hash]) => hash);
60
- return await new PayloadBuilder({ schema: destinationSchema }).fields(Object.assign({ sources }, ...indexFields)).build();
61
- };
62
-
63
- // src/DivinerQueryToIndexQueryDiviner/Diviner.ts
25
+ import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
64
26
  var TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner = class extends AbstractDiviner {
65
27
  static configSchema = TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema;
66
28
  static configSchemas = [DivinerConfigSchema2, TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema];
@@ -92,7 +54,7 @@ var TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner = class extends Abstr
92
54
  */
93
55
  get indexableSchemas() {
94
56
  if (!this._indexableSchemas)
95
- this._indexableSchemas = [...Object.keys(this.schemaTransforms)];
57
+ this._indexableSchemas = Object.keys(this.schemaTransforms);
96
58
  return this._indexableSchemas;
97
59
  }
98
60
  /**
@@ -132,7 +94,7 @@ var TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner = class extends Abstr
132
94
  }
133
95
  async divineHandler(payloads = []) {
134
96
  const queries = payloads.filter(isPayloadOfSchemaType(this.divinerQuerySchema));
135
- if (queries.length) {
97
+ if (queries.length > 0) {
136
98
  const results = await Promise.all(
137
99
  queries.map(async (query) => {
138
100
  const fields = await reducePayloads(
@@ -142,12 +104,12 @@ var TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner = class extends Abstr
142
104
  );
143
105
  fields.schemas = [this.indexSchema];
144
106
  delete fields.sources;
145
- return await new PayloadBuilder2({ schema: this.indexQuerySchema }).fields(fields).build();
107
+ return await new PayloadBuilder({ schema: this.indexQuerySchema }).fields(fields).build();
146
108
  })
147
109
  );
148
110
  return results;
149
111
  }
150
- return Promise.resolve([]);
112
+ return [];
151
113
  }
152
114
  };
153
115
 
@@ -157,13 +119,14 @@ import { assertEx } from "@xylabs/assert";
157
119
  import { exists } from "@xylabs/exists";
158
120
  import { AbstractDiviner as AbstractDiviner2 } from "@xyo-network/abstract-diviner";
159
121
  import { isBoundWitness } from "@xyo-network/boundwitness-model";
122
+ import { jsonPathToTransformersDictionary as jsonPathToTransformersDictionary2 } from "@xyo-network/diviner-jsonpath-aggregate-memory";
160
123
  import { DivinerConfigSchema as DivinerConfigSchema3 } from "@xyo-network/diviner-model";
161
124
  import {
162
125
  TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema,
163
126
  TemporalIndexingDivinerResultIndexSchema as TemporalIndexingDivinerResultIndexSchema2
164
127
  } from "@xyo-network/diviner-temporal-indexing-model";
165
- import { PayloadHasher as PayloadHasher2 } from "@xyo-network/hash";
166
- import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
128
+ import { PayloadHasher } from "@xyo-network/hash";
129
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
167
130
  var moduleName = "TemporalIndexingDivinerIndexCandidateToIndexDiviner";
168
131
  var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends AbstractDiviner2 {
169
132
  static configSchema = TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema;
@@ -178,7 +141,7 @@ var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends Abstract
178
141
  */
179
142
  get indexableSchemas() {
180
143
  if (!this._indexableSchemas)
181
- this._indexableSchemas = [...Object.keys(this.schemaTransforms)];
144
+ this._indexableSchemas = Object.keys(this.schemaTransforms);
182
145
  return this._indexableSchemas;
183
146
  }
184
147
  /**
@@ -187,7 +150,7 @@ var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends Abstract
187
150
  */
188
151
  get payloadTransformers() {
189
152
  if (!this._payloadTransformers)
190
- this._payloadTransformers = jsonPathToTransformersDictionary(this.schemaTransforms);
153
+ this._payloadTransformers = jsonPathToTransformersDictionary2(this.schemaTransforms);
191
154
  return this._payloadTransformers;
192
155
  }
193
156
  /**
@@ -201,8 +164,8 @@ var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends Abstract
201
164
  async divineHandler(payloads = []) {
202
165
  const bws = payloads.filter(isBoundWitness);
203
166
  const indexablePayloads = payloads.filter((p) => this.isIndexablePayload(p));
204
- if (bws.length && indexablePayloads.length) {
205
- const payloadDictionary = await PayloadHasher2.toMap(payloads);
167
+ if (bws.length > 0 && indexablePayloads.length > 0) {
168
+ const payloadDictionary = await PayloadHasher.toMap(payloads);
206
169
  const validIndexableTuples = bws.reduce((indexableTuples, bw) => {
207
170
  if (!containsAll(bw.payload_schemas, this.indexableSchemas))
208
171
  return indexableTuples;
@@ -218,17 +181,17 @@ var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends Abstract
218
181
  }, []);
219
182
  const indexes = await Promise.all(
220
183
  validIndexableTuples.map(async ([bw, ...sourcePayloads]) => {
221
- const indexFields = sourcePayloads.map((payload) => {
184
+ const indexFields = sourcePayloads.flatMap((payload) => {
222
185
  const transformers = this.payloadTransformers[payload.schema];
223
186
  return transformers ? transformers.map((transform) => transform(payload)) : [];
224
- }).flat();
225
- const sources = Object.keys(await PayloadHasher2.toMap([bw, ...sourcePayloads]));
226
- return await new PayloadBuilder3({ schema: TemporalIndexingDivinerResultIndexSchema2 }).fields(Object.assign({ sources }, ...indexFields)).build();
187
+ });
188
+ const sources = Object.keys(await PayloadHasher.toMap([bw, ...sourcePayloads]));
189
+ return await new PayloadBuilder2({ schema: TemporalIndexingDivinerResultIndexSchema2 }).fields(Object.assign({ sources }, ...indexFields)).build();
227
190
  })
228
191
  );
229
192
  return indexes.flat();
230
193
  }
231
- return Promise.resolve([]);
194
+ return [];
232
195
  }
233
196
  /**
234
197
  * Identifies if a payload is one that is indexed by this diviner
@@ -244,7 +207,7 @@ var TemporalIndexingDivinerIndexCandidateToIndexDiviner = class extends Abstract
244
207
  * @returns True if this schema is one indexed by this diviner, false otherwise
245
208
  */
246
209
  isIndexableSchema = (schema) => {
247
- return this.indexableSchemas.some((s) => s === schema);
210
+ return typeof schema === "string" ? this.indexableSchemas.includes(schema) : false;
248
211
  };
249
212
  };
250
213
 
@@ -278,7 +241,7 @@ import {
278
241
  } from "@xyo-network/diviner-temporal-indexing-model";
279
242
  import { DivinerWrapper } from "@xyo-network/diviner-wrapper";
280
243
  import { isModuleState, ModuleStateSchema } from "@xyo-network/module-model";
281
- import { PayloadBuilder as PayloadBuilder4 } from "@xyo-network/payload-builder";
244
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
282
245
  import { isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/payload-model";
283
246
  import { TimestampSchema } from "@xyo-network/witness-timestamp";
284
247
  var order = "asc";
@@ -308,7 +271,7 @@ var TemporalIndexingDivinerStateToIndexCandidateDiviner = class extends Abstract
308
271
  const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
309
272
  if (!boundWitnessDiviner)
310
273
  return [lastState];
311
- const query = await new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas: this.payload_schemas }).build();
274
+ const query = await new PayloadBuilder3({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas: this.payload_schemas }).build();
312
275
  const batch = await boundWitnessDiviner.divine([query]);
313
276
  if (batch.length === 0)
314
277
  return [lastState];
@@ -358,7 +321,7 @@ var TemporalIndexingDivinerStateToIndexCandidateDiviner = class extends Abstract
358
321
  const results = await archivist.get(hashes);
359
322
  const indexCandidateIdentityFunctions = this.payload_schemas.map(isPayloadOfSchemaType2);
360
323
  const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is));
361
- if (filteredResults.some((f) => f === void 0))
324
+ if (filteredResults.includes(void 0))
362
325
  return void 0;
363
326
  const indexCandidates = filteredResults.filter(exists2);
364
327
  return [bw, ...indexCandidates];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Diviner.ts","../../src/DivinerQueryToIndexQueryDiviner/Diviner.ts","../../src/jsonpath/toPayloadTransformer.ts","../../src/jsonpath/jsonPathToTransformersDictionary.ts","../../src/jsonpath/reducePayloads.ts","../../src/IndexCandidateToIndexDiviner/Diviner.ts","../../src/IndexQueryResponseToDivinerQueryResponseDiviner/Diviner.ts","../../src/StateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing-memory'\nimport { IndexingDivinerConfigSchema } from '@xyo-network/diviner-indexing-model'\nimport { DivinerConfigSchema, DivinerModule, DivinerModuleEventData } from '@xyo-network/diviner-model'\nimport { TemporalIndexingDivinerConfigSchema, TemporalIndexingDivinerParams } from '@xyo-network/diviner-temporal-indexing-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport class TemporalIndexingDiviner<\n TParams extends TemporalIndexingDivinerParams = TemporalIndexingDivinerParams,\n TIn extends Payload = Payload,\n TOut extends Payload = Payload,\n TEventData extends DivinerModuleEventData<DivinerModule<TParams>, TIn, TOut> = DivinerModuleEventData<DivinerModule<TParams>, TIn, TOut>,\n> extends IndexingDiviner<TParams, TIn, TOut, TEventData> {\n static override readonly configSchema = TemporalIndexingDivinerConfigSchema\n static override readonly configSchemas: string[] = [TemporalIndexingDivinerConfigSchema, IndexingDivinerConfigSchema, DivinerConfigSchema]\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n return true\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport {\n SchemaToJsonPathTransformExpressionsDictionary,\n SchemaToPayloadTransformersDictionary,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams,\n TemporalIndexingDivinerResultIndexSchema,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { Labels } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nimport { jsonPathToTransformersDictionary, reducePayloads } from '../jsonpath'\n\n/**\n * A diviner that converts diviner query to index query\n */\nexport class TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner<\n TParams extends TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams = TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchema = TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n\n private _indexableSchemas: string[] | undefined\n private _payloadTransformers: SchemaToPayloadTransformersDictionary | undefined\n\n /**\n * The schema of the diviner query payloads\n */\n protected get divinerQuerySchema(): string {\n return this.config.divinerQuerySchema ?? PayloadDivinerQuerySchema\n }\n\n /**\n * The schema of the index query payloads\n */\n protected get indexQuerySchema(): string {\n return this.config.indexQuerySchema ?? PayloadDivinerQuerySchema\n }\n\n /**\n * The schema of the index payloads\n */\n protected get indexSchema(): string {\n return this.config.indexSchema ?? TemporalIndexingDivinerResultIndexSchema\n }\n\n /**\n * List of indexable schemas for this diviner\n */\n protected get indexableSchemas(): string[] {\n if (!this._indexableSchemas) this._indexableSchemas = [...Object.keys(this.schemaTransforms)]\n return this._indexableSchemas\n }\n\n /**\n * Dictionary of schemas to payload transformers for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get payloadTransformers(): SchemaToPayloadTransformersDictionary {\n if (!this._payloadTransformers) this._payloadTransformers = jsonPathToTransformersDictionary(this.schemaTransforms)\n return this._payloadTransformers\n }\n\n /**\n * The dictionary of schemas to JSON Path transform expressions for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get schemaTransforms(): SchemaToJsonPathTransformExpressionsDictionary {\n return (\n this.config?.schemaTransforms ?? {\n [this.divinerQuerySchema]: [\n {\n defaultValue: 1,\n destinationField: 'limit',\n sourcePathExpression: '$.limit',\n },\n {\n defaultValue: 0,\n destinationField: 'offset',\n sourcePathExpression: '$.offset',\n },\n {\n defaultValue: 'desc',\n destinationField: 'order',\n sourcePathExpression: '$.order',\n },\n ],\n }\n )\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n const queries = payloads.filter(isPayloadOfSchemaType<PayloadDivinerQueryPayload>(this.divinerQuerySchema))\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const fields = await reducePayloads<PayloadDivinerQueryPayload & { sources?: string[] }>(\n [query],\n this.payloadTransformers,\n this.indexQuerySchema,\n )\n // TODO: Make index schema configurable\n fields.schemas = [this.indexSchema]\n // TODO: Make sources not need to be deleted\n delete fields.sources\n // TODO: Add support for additional filters\n return await new PayloadBuilder<Payload>({ schema: this.indexQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { JsonPathTransformExpression, PayloadTransformer } from '@xyo-network/diviner-temporal-indexing-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport jsonpath from 'jsonpath'\n\n/**\n * Converts a JSON Path transform expression to a payload transformer\n * @param transformExpression The transform expression to convert\n * @returns The payload transformer for the JSON Path transform expression\n */\nexport const toPayloadTransformer = (transformExpression: JsonPathTransformExpression) => {\n const { defaultValue, destinationField, sourcePathExpression } = transformExpression\n const transformer: PayloadTransformer = (x: Payload) => {\n // eslint-disable-next-line import/no-named-as-default-member\n const source = jsonpath.value(x, sourcePathExpression)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformed = {} as { [key: string]: any }\n // Assign the source value to the destination field or the default value if the source is undefined\n const destinationValue = source === undefined ? defaultValue : source\n if (destinationValue !== undefined) transformed[destinationField] = destinationValue\n return transformed\n }\n return transformer\n}\n","import { SchemaToJsonPathTransformExpressionsDictionary, SchemaToPayloadTransformersDictionary } from '@xyo-network/diviner-temporal-indexing-model'\n\nimport { toPayloadTransformer } from './toPayloadTransformer'\n\n/**\n * Materializes the JSON-path expressions into memoized functions by converting a\n * dictionary of schema to JSON Path transform expressions to a dictionary\n * of schema to payload transformers\n * @param schemaTransforms The schema transforms to convert\n * @returns A dictionary of schema to payload transformers\n */\nexport const jsonPathToTransformersDictionary = (\n schemaTransforms: SchemaToJsonPathTransformExpressionsDictionary,\n): SchemaToPayloadTransformersDictionary => {\n return Object.fromEntries(\n Object.entries(schemaTransforms).map(([schema, jsonPathTransformerExpressions]) => {\n const transformers = jsonPathTransformerExpressions.map(toPayloadTransformer)\n return [schema, transformers]\n }),\n )\n}\n","import { SchemaToPayloadTransformersDictionary } from '@xyo-network/diviner-temporal-indexing-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadFields } from '@xyo-network/payload-model'\n\n/**\n * Reduces the payloads to a single payload using the supplied transformers\n * @param payloads The payloads to reduce\n * @param payloadTransformers The transformers to use to convert the payloads to the destination payload\n * @param destinationSchema The schema of the destination payload\n * @returns The reduced payload\n */\nexport const reducePayloads = async <T extends Payload = Payload>(\n payloads: Payload[],\n payloadTransformers: SchemaToPayloadTransformersDictionary,\n destinationSchema: string,\n): Promise<T> => {\n // Use the payload transformers to convert the fields from the source payloads to the destination fields\n const indexFields = payloads\n .map<PayloadFields[]>((payload) => {\n // Find the transformers for this payload\n const transformers = payloadTransformers[payload.schema]\n // If transformers exist, apply them to the payload otherwise return an empty array\n return transformers ? transformers.map((transform) => transform(payload)) : []\n })\n .flat()\n // Include all the sources for reference\n const sources = (await PayloadHasher.hashPairs([...payloads])).map(([, hash]) => hash)\n // Build and return the index\n return await new PayloadBuilder<T>({ schema: destinationSchema }).fields(Object.assign({ sources }, ...indexFields)).build()\n}\n\n/**\n * Reduces the arrays of payload arrays to an array of payloads using the supplied transformers\n * @param payloadsArray The arrays of payloads to reduce\n * @param payloadTransformers The transformers to use to convert the payloads to the destination payloads\n * @param destinationSchema The schema of the destination payloads\n * @returns The reduced payloads\n */\nexport const reducePayloadsArray = async <T extends Payload = Payload>(\n payloadsArray: Payload[][],\n payloadTransformers: SchemaToPayloadTransformersDictionary,\n destinationSchema: string,\n): Promise<T[]> => {\n return await Promise.all(\n payloadsArray.map(async (payloads) => {\n return await reducePayloads<T>(payloads, payloadTransformers, destinationSchema)\n }),\n )\n}\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n SchemaToJsonPathTransformExpressionsDictionary,\n SchemaToPayloadTransformersDictionary,\n TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema,\n TemporalIndexingDivinerIndexCandidateToIndexDivinerParams,\n TemporalIndexingDivinerResultIndex,\n TemporalIndexingDivinerResultIndexSchema,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Labels } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadFields } from '@xyo-network/payload-model'\n\nimport { jsonPathToTransformersDictionary } from '../jsonpath'\n\nexport type IndexablePayloads = [BoundWitness, ...Payload[]]\n\nconst moduleName = 'TemporalIndexingDivinerIndexCandidateToIndexDiviner'\n\n/**\n * Diviner which transforms index candidates to indexes using JSON Path to map\n * source properties in the supplied payloads to destination fields in the\n * resultant index\n */\nexport class TemporalIndexingDivinerIndexCandidateToIndexDiviner<\n TParams extends TemporalIndexingDivinerIndexCandidateToIndexDivinerParams = TemporalIndexingDivinerIndexCandidateToIndexDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override configSchema = TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n private _indexableSchemas: string[] | undefined\n private _payloadTransformers: SchemaToPayloadTransformersDictionary | undefined\n\n /**\n * List of indexable schemas for this diviner\n */\n protected get indexableSchemas(): string[] {\n if (!this._indexableSchemas) this._indexableSchemas = [...Object.keys(this.schemaTransforms)]\n return this._indexableSchemas\n }\n\n /**\n * Dictionary of schemas to payload transformers for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get payloadTransformers(): SchemaToPayloadTransformersDictionary {\n if (!this._payloadTransformers) this._payloadTransformers = jsonPathToTransformersDictionary(this.schemaTransforms)\n return this._payloadTransformers\n }\n\n /**\n * The dictionary of schemas to JSON Path transform expressions for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get schemaTransforms(): SchemaToJsonPathTransformExpressionsDictionary {\n return assertEx(this.config?.schemaTransforms, () => `${moduleName}: Missing config.schemaTransforms section`)\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const indexablePayloads: Payload[] = payloads.filter((p) => this.isIndexablePayload(p))\n if (bws.length && indexablePayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\n const validIndexableTuples: IndexablePayloads[] = bws.reduce<IndexablePayloads[]>((indexableTuples, bw) => {\n // If this Bound Witness doesn't contain all the required schemas don't index it\n if (!containsAll(bw.payload_schemas, this.indexableSchemas)) return indexableTuples\n // Find the remaining indexable payloads\n const indexablePayloadPositions = this.indexableSchemas.map((schema) => bw.payload_schemas.indexOf(schema))\n const indexablePayloadHashes = indexablePayloadPositions.map((index) => bw.payload_hashes?.[index])\n const indexablePayloads = indexablePayloadHashes.map((hash) => payloadDictionary[hash]).filter(exists)\n // If we found a timestamp and the right amount of indexable payloads (of the\n // correct schema as checked above) in this BW, then index it\n if (indexablePayloads.length === this.indexableSchemas.length) indexableTuples.push([bw, ...indexablePayloads])\n return indexableTuples\n }, [])\n // Create the indexes from the tuples\n const indexes = await Promise.all(\n validIndexableTuples.map<Promise<TemporalIndexingDivinerResultIndex>>(async ([bw, ...sourcePayloads]) => {\n // Use the payload transformers to convert the fields from the source payloads to the destination fields\n const indexFields = sourcePayloads\n .map<PayloadFields[]>((payload) => {\n // Find the transformers for this payload\n const transformers = this.payloadTransformers[payload.schema]\n // If transformers exist, apply them to the payload otherwise return an empty array\n return transformers ? transformers.map((transform) => transform(payload)) : []\n })\n .flat()\n // Include all the sources for reference\n const sources = Object.keys(await PayloadHasher.toMap([bw, ...sourcePayloads]))\n // Build and return the index\n return await new PayloadBuilder<TemporalIndexingDivinerResultIndex>({ schema: TemporalIndexingDivinerResultIndexSchema })\n .fields(Object.assign({ sources }, ...indexFields))\n .build()\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n\n /**\n * Identifies if a payload is one that is indexed by this diviner\n * @param x The candidate payload\n * @returns True if the payload is one indexed by this diviner, false otherwise\n */\n protected isIndexablePayload = (x: Payload) => {\n return this.indexableSchemas.includes(x?.schema)\n }\n\n /**\n * Identifies if a schema is one that is indexed by this diviner\n * @param schema The candidate schema\n * @returns True if this schema is one indexed by this diviner, false otherwise\n */\n protected isIndexableSchema = (schema?: string | null) => {\n return this.indexableSchemas.some((s) => s === schema)\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { isPayloadDivinerQueryPayload } from '@xyo-network/diviner-payload-model'\nimport { TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema } from '@xyo-network/diviner-temporal-indexing-model'\nimport { Labels } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner extends AbstractDiviner {\n static override readonly configSchema = TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n // NOTE: We're not doing anything with the query payloads but some diviners\n // might want to use this to transform from the query to the response (for example\n // if we use a plaintext value in the query to generate a hash key in the index)\n // const queries = payloads.filter(isPayloadDivinerQueryPayload)\n const responses = payloads.filter((p) => !isPayloadDivinerQueryPayload(p))\n return await Promise.resolve(responses)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { IndexingDivinerState } from '@xyo-network/diviner-indexing-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema,\n TemporalIndexingDivinerStateToIndexCandidateDivinerParams,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { isModuleState, Labels, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\nimport { TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\n/**\n * All Payload types involved in index candidates for indexing\n */\nexport type IndexCandidate = BoundWitness | Payload | TimeStamp\n\n/**\n * The response from the TemporalStateToIndexCandidateDiviner\n */\nexport type TemporalStateToIndexCandidateDivinerResponse = [\n /**\n * The next state of the diviner\n */\n nextState: ModuleState<IndexingDivinerState>,\n /**\n * The index candidates\n */\n ...IndexCandidate[],\n]\n\n/**\n * The default order to search Bound Witnesses to identify index candidates\n */\nconst order = 'asc'\n\n/**\n * The name of the module (for logging purposes)\n */\nconst moduleName = 'TemporalIndexingDivinerStateToIndexCandidateDiviner'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class TemporalIndexingDivinerStateToIndexCandidateDiviner<\n TParams extends TemporalIndexingDivinerStateToIndexCandidateDivinerParams = TemporalIndexingDivinerStateToIndexCandidateDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchema = TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\n }\n\n /**\n * The required payload_schemas within BoundWitnesses to identify index candidates\n */\n protected get payload_schemas(): string[] {\n const schemas = this.config.filter?.payload_schemas\n return [TimestampSchema, ...(schemas ?? [])]\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<[ModuleState, ...IndexCandidate[]]> {\n // Retrieve the last state from what was passed in\n const lastState = payloads.find(isModuleState<IndexingDivinerState>)\n // If there is no last state, start from the beginning\n if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n if (!boundWitnessDiviner) return [lastState]\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas: this.payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n if (!sourceArchivist) return [lastState]\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(batch.filter(isBoundWitness).map((bw) => this.getPayloadsInBoundWitness(bw, sourceArchivist)))\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\n }\n /**\n * Retrieves the archivist for the payloadStore\n * @returns The archivist for the payloadStore or undefined if not resolvable\n */\n protected async getArchivistForStore(): Promise<ArchivistWrapper | undefined> {\n // It should be defined, so we'll error if it's not\n const name: string = assertEx(this.config?.payloadStore?.archivist, () => `${moduleName}: Config for payloadStore.archivist not specified`)\n // It might not be resolvable (yet), so we'll return undefined if it's not\n const mod = await this.resolve(name)\n if (!mod) return undefined\n // Return the wrapped archivist\n return ArchivistWrapper.wrap(mod, this.account)\n }\n\n /**\n * Retrieves the BoundWitness Diviner for the payloadStore\n * @returns The BoundWitness Diviner for the payloadStore or undefined if not resolvable\n */\n protected async getBoundWitnessDivinerForStore(): Promise<DivinerWrapper | undefined> {\n // It should be defined, so we'll error if it's not\n const name: string = assertEx(\n this.config?.payloadStore?.boundWitnessDiviner,\n () => `${moduleName}: Config for payloadStore.boundWitnessDiviner not specified`,\n )\n // It might not be resolvable (yet), so we'll return undefined if it's not\n const mod = await this.resolve(name)\n if (!mod) return undefined\n // Return the wrapped diviner\n return DivinerWrapper.wrap(mod, this.account)\n }\n\n protected async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = this.payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const indexCandidateIdentityFunctions = this.payload_schemas.map(isPayloadOfSchemaType)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\n return [bw, ...indexCandidates]\n }\n}\n"],"mappings":"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","names":["DivinerConfigSchema","PayloadBuilder","DivinerConfigSchema","PayloadBuilder","AbstractDiviner","DivinerConfigSchema","TemporalIndexingDivinerResultIndexSchema","PayloadHasher","PayloadBuilder","AbstractDiviner","DivinerConfigSchema","PayloadHasher","indexablePayloads","PayloadBuilder","TemporalIndexingDivinerResultIndexSchema","AbstractDiviner","DivinerConfigSchema","assertEx","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","PayloadBuilder","isPayloadOfSchemaType","moduleName"]}
1
+ {"version":3,"sources":["../../src/Diviner.ts","../../src/DivinerQueryToIndexQueryDiviner/Diviner.ts","../../src/IndexCandidateToIndexDiviner/Diviner.ts","../../src/IndexQueryResponseToDivinerQueryResponseDiviner/Diviner.ts","../../src/StateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing-memory'\nimport { IndexingDivinerConfigSchema } from '@xyo-network/diviner-indexing-model'\nimport { DivinerConfigSchema, DivinerModule, DivinerModuleEventData } from '@xyo-network/diviner-model'\nimport { TemporalIndexingDivinerConfigSchema, TemporalIndexingDivinerParams } from '@xyo-network/diviner-temporal-indexing-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport class TemporalIndexingDiviner<\n TParams extends TemporalIndexingDivinerParams = TemporalIndexingDivinerParams,\n TIn extends Payload = Payload,\n TOut extends Payload = Payload,\n TEventData extends DivinerModuleEventData<DivinerModule<TParams>, TIn, TOut> = DivinerModuleEventData<DivinerModule<TParams>, TIn, TOut>,\n> extends IndexingDiviner<TParams, TIn, TOut, TEventData> {\n static override readonly configSchema = TemporalIndexingDivinerConfigSchema\n static override readonly configSchemas: string[] = [TemporalIndexingDivinerConfigSchema, IndexingDivinerConfigSchema, DivinerConfigSchema]\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n return true\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { jsonPathToTransformersDictionary, reducePayloads } from '@xyo-network/diviner-jsonpath-aggregate-memory'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport {\n SchemaToJsonPathTransformExpressionsDictionary,\n SchemaToPayloadTransformersDictionary,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema,\n TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams,\n TemporalIndexingDivinerResultIndexSchema,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { Labels } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n// TODO: Inherit from JsonPathAggregateDiviner\n/**\n * A diviner that converts diviner query to index query\n */\nexport class TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner<\n TParams extends TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams = TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchema = TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerDivinerQueryToIndexQueryDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n\n private _indexableSchemas: string[] | undefined\n private _payloadTransformers: SchemaToPayloadTransformersDictionary | undefined\n\n /**\n * The schema of the diviner query payloads\n */\n protected get divinerQuerySchema(): string {\n return this.config.divinerQuerySchema ?? PayloadDivinerQuerySchema\n }\n\n /**\n * The schema of the index query payloads\n */\n protected get indexQuerySchema(): string {\n return this.config.indexQuerySchema ?? PayloadDivinerQuerySchema\n }\n\n /**\n * The schema of the index payloads\n */\n protected get indexSchema(): string {\n return this.config.indexSchema ?? TemporalIndexingDivinerResultIndexSchema\n }\n\n /**\n * List of indexable schemas for this diviner\n */\n protected get indexableSchemas(): string[] {\n if (!this._indexableSchemas) this._indexableSchemas = Object.keys(this.schemaTransforms)\n return this._indexableSchemas\n }\n\n /**\n * Dictionary of schemas to payload transformers for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get payloadTransformers(): SchemaToPayloadTransformersDictionary {\n if (!this._payloadTransformers) this._payloadTransformers = jsonPathToTransformersDictionary(this.schemaTransforms)\n return this._payloadTransformers\n }\n\n /**\n * The dictionary of schemas to JSON Path transform expressions for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get schemaTransforms(): SchemaToJsonPathTransformExpressionsDictionary {\n return (\n this.config?.schemaTransforms ?? {\n [this.divinerQuerySchema]: [\n {\n defaultValue: 1,\n destinationField: 'limit',\n sourcePathExpression: '$.limit',\n },\n {\n defaultValue: 0,\n destinationField: 'offset',\n sourcePathExpression: '$.offset',\n },\n {\n defaultValue: 'desc',\n destinationField: 'order',\n sourcePathExpression: '$.order',\n },\n ],\n }\n )\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n const queries = payloads.filter(isPayloadOfSchemaType<PayloadDivinerQueryPayload>(this.divinerQuerySchema))\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const fields = await reducePayloads<PayloadDivinerQueryPayload & { sources?: string[] }>(\n [query],\n this.payloadTransformers,\n this.indexQuerySchema,\n )\n // TODO: Make index schema configurable\n fields.schemas = [this.indexSchema]\n // TODO: Make sources not need to be deleted\n delete fields.sources\n // TODO: Add support for additional filters\n return await new PayloadBuilder<Payload>({ schema: this.indexQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { containsAll } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { jsonPathToTransformersDictionary } from '@xyo-network/diviner-jsonpath-aggregate-memory'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n SchemaToJsonPathTransformExpressionsDictionary,\n SchemaToPayloadTransformersDictionary,\n TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema,\n TemporalIndexingDivinerIndexCandidateToIndexDivinerParams,\n TemporalIndexingDivinerResultIndex,\n TemporalIndexingDivinerResultIndexSchema,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Labels } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, PayloadFields } from '@xyo-network/payload-model'\n\nexport type IndexablePayloads = [BoundWitness, ...Payload[]]\n\nconst moduleName = 'TemporalIndexingDivinerIndexCandidateToIndexDiviner'\n\n/**\n * Diviner which transforms index candidates to indexes using JSON Path to map\n * source properties in the supplied payloads to destination fields in the\n * resultant index\n */\nexport class TemporalIndexingDivinerIndexCandidateToIndexDiviner<\n TParams extends TemporalIndexingDivinerIndexCandidateToIndexDivinerParams = TemporalIndexingDivinerIndexCandidateToIndexDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override configSchema = TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerIndexCandidateToIndexDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n private _indexableSchemas: string[] | undefined\n private _payloadTransformers: SchemaToPayloadTransformersDictionary | undefined\n\n /**\n * List of indexable schemas for this diviner\n */\n protected get indexableSchemas(): string[] {\n if (!this._indexableSchemas) this._indexableSchemas = Object.keys(this.schemaTransforms)\n return this._indexableSchemas\n }\n\n /**\n * Dictionary of schemas to payload transformers for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get payloadTransformers(): SchemaToPayloadTransformersDictionary {\n if (!this._payloadTransformers) this._payloadTransformers = jsonPathToTransformersDictionary(this.schemaTransforms)\n return this._payloadTransformers\n }\n\n /**\n * The dictionary of schemas to JSON Path transform expressions for creating indexes\n * from the payloads within a Bound Witness\n */\n protected get schemaTransforms(): SchemaToJsonPathTransformExpressionsDictionary {\n return assertEx(this.config?.schemaTransforms, () => `${moduleName}: Missing config.schemaTransforms section`)\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const indexablePayloads: Payload[] = payloads.filter((p) => this.isIndexablePayload(p))\n if (bws.length > 0 && indexablePayloads.length > 0) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const validIndexableTuples: IndexablePayloads[] = bws.reduce<IndexablePayloads[]>((indexableTuples, bw) => {\n // If this Bound Witness doesn't contain all the required schemas don't index it\n if (!containsAll(bw.payload_schemas, this.indexableSchemas)) return indexableTuples\n // Find the remaining indexable payloads\n const indexablePayloadPositions = this.indexableSchemas.map((schema) => bw.payload_schemas.indexOf(schema))\n const indexablePayloadHashes = indexablePayloadPositions.map((index) => bw.payload_hashes?.[index])\n const indexablePayloads = indexablePayloadHashes.map((hash) => payloadDictionary[hash]).filter(exists)\n // If we found a timestamp and the right amount of indexable payloads (of the\n // correct schema as checked above) in this BW, then index it\n if (indexablePayloads.length === this.indexableSchemas.length) indexableTuples.push([bw, ...indexablePayloads])\n return indexableTuples\n }, [])\n // Create the indexes from the tuples\n const indexes = await Promise.all(\n validIndexableTuples.map<Promise<TemporalIndexingDivinerResultIndex>>(async ([bw, ...sourcePayloads]) => {\n // Use the payload transformers to convert the fields from the source payloads to the destination fields\n const indexFields = sourcePayloads.flatMap<PayloadFields[]>((payload) => {\n // Find the transformers for this payload\n const transformers = this.payloadTransformers[payload.schema]\n // If transformers exist, apply them to the payload otherwise return an empty array\n return transformers ? transformers.map((transform) => transform(payload)) : []\n })\n // Include all the sources for reference\n const sources = Object.keys(await PayloadHasher.toMap([bw, ...sourcePayloads]))\n // Build and return the index\n return await new PayloadBuilder<TemporalIndexingDivinerResultIndex>({ schema: TemporalIndexingDivinerResultIndexSchema })\n .fields(Object.assign({ sources }, ...indexFields))\n .build()\n }),\n )\n return indexes.flat()\n }\n return []\n }\n\n /**\n * Identifies if a payload is one that is indexed by this diviner\n * @param x The candidate payload\n * @returns True if the payload is one indexed by this diviner, false otherwise\n */\n protected isIndexablePayload = (x: Payload) => {\n return this.indexableSchemas.includes(x?.schema)\n }\n\n /**\n * Identifies if a schema is one that is indexed by this diviner\n * @param schema The candidate schema\n * @returns True if this schema is one indexed by this diviner, false otherwise\n */\n protected isIndexableSchema = (schema?: string | null) => {\n return typeof schema === 'string' ? this.indexableSchemas.includes(schema) : false\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { isPayloadDivinerQueryPayload } from '@xyo-network/diviner-payload-model'\nimport { TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema } from '@xyo-network/diviner-temporal-indexing-model'\nimport { Labels } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDiviner extends AbstractDiviner {\n static override readonly configSchema = TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerIndexQueryResponseToDivinerQueryResponseDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n // NOTE: We're not doing anything with the query payloads but some diviners\n // might want to use this to transform from the query to the response (for example\n // if we use a plaintext value in the query to generate a hash key in the index)\n // const queries = payloads.filter(isPayloadDivinerQueryPayload)\n const responses = payloads.filter((p) => !isPayloadDivinerQueryPayload(p))\n return await Promise.resolve(responses)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { IndexingDivinerState } from '@xyo-network/diviner-indexing-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema,\n TemporalIndexingDivinerStateToIndexCandidateDivinerParams,\n} from '@xyo-network/diviner-temporal-indexing-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { isModuleState, Labels, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\nimport { TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\n/**\n * All Payload types involved in index candidates for indexing\n */\nexport type IndexCandidate = BoundWitness | Payload | TimeStamp\n\n/**\n * The response from the TemporalStateToIndexCandidateDiviner\n */\nexport type TemporalStateToIndexCandidateDivinerResponse = [\n /**\n * The next state of the diviner\n */\n nextState: ModuleState<IndexingDivinerState>,\n /**\n * The index candidates\n */\n ...IndexCandidate[],\n]\n\n/**\n * The default order to search Bound Witnesses to identify index candidates\n */\nconst order = 'asc'\n\n/**\n * The name of the module (for logging purposes)\n */\nconst moduleName = 'TemporalIndexingDivinerStateToIndexCandidateDiviner'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class TemporalIndexingDivinerStateToIndexCandidateDiviner<\n TParams extends TemporalIndexingDivinerStateToIndexCandidateDivinerParams = TemporalIndexingDivinerStateToIndexCandidateDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchema = TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema\n static override configSchemas = [DivinerConfigSchema, TemporalIndexingDivinerStateToIndexCandidateDivinerConfigSchema]\n static labels: Labels = {\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n /**\n * The required payload_schemas within BoundWitnesses to identify index candidates\n */\n protected get payload_schemas(): string[] {\n const schemas = this.config.filter?.payload_schemas\n return [TimestampSchema, ...(schemas ?? [])]\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<[ModuleState, ...IndexCandidate[]]> {\n // Retrieve the last state from what was passed in\n const lastState = payloads.find(isModuleState<IndexingDivinerState>)\n // If there is no last state, start from the beginning\n if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n if (!boundWitnessDiviner) return [lastState]\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas: this.payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n if (!sourceArchivist) return [lastState]\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(batch.filter(isBoundWitness).map((bw) => this.getPayloadsInBoundWitness(bw, sourceArchivist)))\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\n }\n /**\n * Retrieves the archivist for the payloadStore\n * @returns The archivist for the payloadStore or undefined if not resolvable\n */\n protected async getArchivistForStore(): Promise<ArchivistWrapper | undefined> {\n // It should be defined, so we'll error if it's not\n const name: string = assertEx(this.config?.payloadStore?.archivist, () => `${moduleName}: Config for payloadStore.archivist not specified`)\n // It might not be resolvable (yet), so we'll return undefined if it's not\n const mod = await this.resolve(name)\n if (!mod) return undefined\n // Return the wrapped archivist\n return ArchivistWrapper.wrap(mod, this.account)\n }\n\n /**\n * Retrieves the BoundWitness Diviner for the payloadStore\n * @returns The BoundWitness Diviner for the payloadStore or undefined if not resolvable\n */\n protected async getBoundWitnessDivinerForStore(): Promise<DivinerWrapper | undefined> {\n // It should be defined, so we'll error if it's not\n const name: string = assertEx(\n this.config?.payloadStore?.boundWitnessDiviner,\n () => `${moduleName}: Config for payloadStore.boundWitnessDiviner not specified`,\n )\n // It might not be resolvable (yet), so we'll return undefined if it's not\n const mod = await this.resolve(name)\n if (!mod) return undefined\n // Return the wrapped diviner\n return DivinerWrapper.wrap(mod, this.account)\n }\n\n protected async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = this.payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const indexCandidateIdentityFunctions = this.payload_schemas.map(isPayloadOfSchemaType)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\n return [bw, ...indexCandidates]\n }\n}\n"],"mappings":"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","names":["DivinerConfigSchema","AbstractDiviner","jsonPathToTransformersDictionary","DivinerConfigSchema","TemporalIndexingDivinerResultIndexSchema","PayloadBuilder","indexablePayloads","AbstractDiviner","DivinerConfigSchema","assertEx","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","PayloadBuilder","isPayloadOfSchemaType","moduleName"]}
package/package.json CHANGED
@@ -13,36 +13,35 @@
13
13
  "@xylabs/array": "^2.13.20",
14
14
  "@xylabs/assert": "^2.13.20",
15
15
  "@xylabs/exists": "^2.13.20",
16
- "@xyo-network/abstract-diviner": "~2.84.6",
17
- "@xyo-network/archivist-model": "~2.84.6",
18
- "@xyo-network/archivist-wrapper": "~2.84.6",
19
- "@xyo-network/boundwitness-model": "~2.84.6",
20
- "@xyo-network/diviner-boundwitness-model": "~2.84.6",
21
- "@xyo-network/diviner-indexing-memory": "~2.84.6",
22
- "@xyo-network/diviner-indexing-model": "~2.84.6",
23
- "@xyo-network/diviner-model": "~2.84.6",
24
- "@xyo-network/diviner-payload-model": "~2.84.6",
25
- "@xyo-network/diviner-temporal-indexing-model": "~2.84.6",
26
- "@xyo-network/diviner-wrapper": "~2.84.6",
27
- "@xyo-network/hash": "~2.84.6",
28
- "@xyo-network/module-model": "~2.84.6",
29
- "@xyo-network/payload-builder": "~2.84.6",
30
- "@xyo-network/payload-model": "~2.84.6",
31
- "@xyo-network/witness-timestamp": "~2.84.6",
32
- "jsonpath": "^1.1.1"
16
+ "@xyo-network/abstract-diviner": "~2.84.8",
17
+ "@xyo-network/archivist-model": "~2.84.8",
18
+ "@xyo-network/archivist-wrapper": "~2.84.8",
19
+ "@xyo-network/boundwitness-model": "~2.84.8",
20
+ "@xyo-network/diviner-boundwitness-model": "~2.84.8",
21
+ "@xyo-network/diviner-indexing-memory": "~2.84.8",
22
+ "@xyo-network/diviner-indexing-model": "~2.84.8",
23
+ "@xyo-network/diviner-model": "~2.84.8",
24
+ "@xyo-network/diviner-payload-model": "~2.84.8",
25
+ "@xyo-network/diviner-temporal-indexing-model": "~2.84.8",
26
+ "@xyo-network/diviner-wrapper": "~2.84.8",
27
+ "@xyo-network/hash": "~2.84.8",
28
+ "@xyo-network/module-model": "~2.84.8",
29
+ "@xyo-network/payload-builder": "~2.84.8",
30
+ "@xyo-network/payload-model": "~2.84.8",
31
+ "@xyo-network/witness-timestamp": "~2.84.8"
33
32
  },
34
33
  "devDependencies": {
35
- "@types/jsonpath": "^0.2.4",
36
34
  "@xylabs/delay": "^2.13.20",
37
- "@xylabs/ts-scripts-yarn3": "^3.2.19",
38
- "@xylabs/tsconfig": "^3.2.19",
39
- "@xyo-network/account": "~2.84.6",
40
- "@xyo-network/boundwitness-builder": "~2.84.6",
41
- "@xyo-network/diviner-boundwitness-memory": "~2.84.6",
42
- "@xyo-network/diviner-payload-memory": "~2.84.6",
43
- "@xyo-network/manifest": "~2.84.6",
44
- "@xyo-network/memory-archivist": "~2.84.6",
45
- "@xyo-network/node-memory": "~2.84.6",
35
+ "@xylabs/ts-scripts-yarn3": "^3.2.24",
36
+ "@xylabs/tsconfig": "^3.2.24",
37
+ "@xyo-network/account": "~2.84.8",
38
+ "@xyo-network/boundwitness-builder": "~2.84.8",
39
+ "@xyo-network/diviner-boundwitness-memory": "~2.84.8",
40
+ "@xyo-network/diviner-jsonpath-aggregate-memory": "~2.84.8",
41
+ "@xyo-network/diviner-payload-memory": "~2.84.8",
42
+ "@xyo-network/manifest": "~2.84.8",
43
+ "@xyo-network/memory-archivist": "~2.84.8",
44
+ "@xyo-network/node-memory": "~2.84.8",
46
45
  "typescript": "^5.3.3"
47
46
  },
48
47
  "description": "Primary SDK for using XYO Protocol 2.0",
@@ -84,6 +83,6 @@
84
83
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
85
84
  },
86
85
  "sideEffects": false,
87
- "version": "2.84.6",
86
+ "version": "2.84.8",
88
87
  "type": "module"
89
88
  }
@@ -1,4 +1,5 @@
1
1
  import { AbstractDiviner } from '@xyo-network/abstract-diviner'
2
+ import { jsonPathToTransformersDictionary, reducePayloads } from '@xyo-network/diviner-jsonpath-aggregate-memory'
2
3
  import { DivinerConfigSchema } from '@xyo-network/diviner-model'
3
4
  import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'
4
5
  import {
@@ -11,9 +12,7 @@ import {
11
12
  import { Labels } from '@xyo-network/module-model'
12
13
  import { PayloadBuilder } from '@xyo-network/payload-builder'
13
14
  import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'
14
-
15
- import { jsonPathToTransformersDictionary, reducePayloads } from '../jsonpath'
16
-
15
+ // TODO: Inherit from JsonPathAggregateDiviner
17
16
  /**
18
17
  * A diviner that converts diviner query to index query
19
18
  */
@@ -54,7 +53,7 @@ export class TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner<
54
53
  * List of indexable schemas for this diviner
55
54
  */
56
55
  protected get indexableSchemas(): string[] {
57
- if (!this._indexableSchemas) this._indexableSchemas = [...Object.keys(this.schemaTransforms)]
56
+ if (!this._indexableSchemas) this._indexableSchemas = Object.keys(this.schemaTransforms)
58
57
  return this._indexableSchemas
59
58
  }
60
59
 
@@ -97,7 +96,7 @@ export class TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner<
97
96
 
98
97
  protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {
99
98
  const queries = payloads.filter(isPayloadOfSchemaType<PayloadDivinerQueryPayload>(this.divinerQuerySchema))
100
- if (queries.length) {
99
+ if (queries.length > 0) {
101
100
  const results = await Promise.all(
102
101
  queries.map(async (query) => {
103
102
  const fields = await reducePayloads<PayloadDivinerQueryPayload & { sources?: string[] }>(
@@ -115,6 +114,6 @@ export class TemporalIndexingDivinerDivinerQueryToIndexQueryDiviner<
115
114
  )
116
115
  return results
117
116
  }
118
- return Promise.resolve([])
117
+ return []
119
118
  }
120
119
  }
@@ -3,6 +3,7 @@ import { assertEx } from '@xylabs/assert'
3
3
  import { exists } from '@xylabs/exists'
4
4
  import { AbstractDiviner } from '@xyo-network/abstract-diviner'
5
5
  import { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'
6
+ import { jsonPathToTransformersDictionary } from '@xyo-network/diviner-jsonpath-aggregate-memory'
6
7
  import { DivinerConfigSchema } from '@xyo-network/diviner-model'
7
8
  import {
8
9
  SchemaToJsonPathTransformExpressionsDictionary,
@@ -17,8 +18,6 @@ import { Labels } from '@xyo-network/module-model'
17
18
  import { PayloadBuilder } from '@xyo-network/payload-builder'
18
19
  import { Payload, PayloadFields } from '@xyo-network/payload-model'
19
20
 
20
- import { jsonPathToTransformersDictionary } from '../jsonpath'
21
-
22
21
  export type IndexablePayloads = [BoundWitness, ...Payload[]]
23
22
 
24
23
  const moduleName = 'TemporalIndexingDivinerIndexCandidateToIndexDiviner'
@@ -44,7 +43,7 @@ export class TemporalIndexingDivinerIndexCandidateToIndexDiviner<
44
43
  * List of indexable schemas for this diviner
45
44
  */
46
45
  protected get indexableSchemas(): string[] {
47
- if (!this._indexableSchemas) this._indexableSchemas = [...Object.keys(this.schemaTransforms)]
46
+ if (!this._indexableSchemas) this._indexableSchemas = Object.keys(this.schemaTransforms)
48
47
  return this._indexableSchemas
49
48
  }
50
49
 
@@ -68,8 +67,9 @@ export class TemporalIndexingDivinerIndexCandidateToIndexDiviner<
68
67
  protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {
69
68
  const bws: BoundWitness[] = payloads.filter(isBoundWitness)
70
69
  const indexablePayloads: Payload[] = payloads.filter((p) => this.isIndexablePayload(p))
71
- if (bws.length && indexablePayloads.length) {
70
+ if (bws.length > 0 && indexablePayloads.length > 0) {
72
71
  const payloadDictionary = await PayloadHasher.toMap(payloads)
72
+ // eslint-disable-next-line unicorn/no-array-reduce
73
73
  const validIndexableTuples: IndexablePayloads[] = bws.reduce<IndexablePayloads[]>((indexableTuples, bw) => {
74
74
  // If this Bound Witness doesn't contain all the required schemas don't index it
75
75
  if (!containsAll(bw.payload_schemas, this.indexableSchemas)) return indexableTuples
@@ -86,14 +86,12 @@ export class TemporalIndexingDivinerIndexCandidateToIndexDiviner<
86
86
  const indexes = await Promise.all(
87
87
  validIndexableTuples.map<Promise<TemporalIndexingDivinerResultIndex>>(async ([bw, ...sourcePayloads]) => {
88
88
  // Use the payload transformers to convert the fields from the source payloads to the destination fields
89
- const indexFields = sourcePayloads
90
- .map<PayloadFields[]>((payload) => {
91
- // Find the transformers for this payload
92
- const transformers = this.payloadTransformers[payload.schema]
93
- // If transformers exist, apply them to the payload otherwise return an empty array
94
- return transformers ? transformers.map((transform) => transform(payload)) : []
95
- })
96
- .flat()
89
+ const indexFields = sourcePayloads.flatMap<PayloadFields[]>((payload) => {
90
+ // Find the transformers for this payload
91
+ const transformers = this.payloadTransformers[payload.schema]
92
+ // If transformers exist, apply them to the payload otherwise return an empty array
93
+ return transformers ? transformers.map((transform) => transform(payload)) : []
94
+ })
97
95
  // Include all the sources for reference
98
96
  const sources = Object.keys(await PayloadHasher.toMap([bw, ...sourcePayloads]))
99
97
  // Build and return the index
@@ -104,7 +102,7 @@ export class TemporalIndexingDivinerIndexCandidateToIndexDiviner<
104
102
  )
105
103
  return indexes.flat()
106
104
  }
107
- return Promise.resolve([])
105
+ return []
108
106
  }
109
107
 
110
108
  /**
@@ -122,6 +120,6 @@ export class TemporalIndexingDivinerIndexCandidateToIndexDiviner<
122
120
  * @returns True if this schema is one indexed by this diviner, false otherwise
123
121
  */
124
122
  protected isIndexableSchema = (schema?: string | null) => {
125
- return this.indexableSchemas.some((s) => s === schema)
123
+ return typeof schema === 'string' ? this.indexableSchemas.includes(schema) : false
126
124
  }
127
125
  }
@@ -59,7 +59,7 @@ export class TemporalIndexingDivinerStateToIndexCandidateDiviner<
59
59
  }
60
60
 
61
61
  get payloadDivinerLimit() {
62
- return this.config.payloadDivinerLimit ?? 1_000
62
+ return this.config.payloadDivinerLimit ?? 1000
63
63
  }
64
64
 
65
65
  /**
@@ -133,7 +133,7 @@ export class TemporalIndexingDivinerStateToIndexCandidateDiviner<
133
133
  const results = await archivist.get(hashes)
134
134
  const indexCandidateIdentityFunctions = this.payload_schemas.map(isPayloadOfSchemaType)
135
135
  const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))
136
- if (filteredResults.some((f) => f === undefined)) return undefined
136
+ if (filteredResults.includes(undefined)) return undefined
137
137
  const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]
138
138
  return [bw, ...indexCandidates]
139
139
  }
@@ -1,47 +0,0 @@
1
- import { AbstractDiviner } from '@xyo-network/abstract-diviner';
2
- import { BoundWitness } from '@xyo-network/boundwitness-model';
3
- import { SchemaToJsonPathTransformExpressionsDictionary, SchemaToPayloadTransformersDictionary, TemporalIndexingDivinerIndexCandidateToIndexDivinerParams } from '@xyo-network/diviner-temporal-indexing-model';
4
- import { Labels } from '@xyo-network/module-model';
5
- import { Payload } from '@xyo-network/payload-model';
6
- import { TimeStamp } from '@xyo-network/witness-timestamp';
7
- export type IndexablePayloads = [BoundWitness, TimeStamp, ...Payload[]];
8
- /**
9
- * Diviner which transforms index candidates to indexes using JSON Path to map
10
- * source properties in the supplied payloads to destination fields in the
11
- * resultant index
12
- */
13
- export declare class TemporalIndexingDivinerIndexCandidateToIndexDiviner<TParams extends TemporalIndexingDivinerIndexCandidateToIndexDivinerParams = TemporalIndexingDivinerIndexCandidateToIndexDivinerParams> extends AbstractDiviner<TParams> {
14
- static configSchema: "network.xyo.diviner.indexing.temporal.stage.indexCandidateToIndexDiviner.config";
15
- static configSchemas: ("network.xyo.diviner.config" | "network.xyo.diviner.indexing.temporal.stage.indexCandidateToIndexDiviner.config")[];
16
- static labels: Labels;
17
- private _indexableSchemas;
18
- private _payloadTransformers;
19
- /**
20
- * List of indexable schemas for this diviner
21
- */
22
- protected get indexableSchemas(): string[];
23
- /**
24
- * Dictionary of schemas to payload transformers for creating indexes
25
- * from the payloads within a Bound Witness
26
- */
27
- protected get payloadTransformers(): SchemaToPayloadTransformersDictionary;
28
- /**
29
- * The dictionary of schemas to JSON Path transform expressions for creating indexes
30
- * from the payloads within a Bound Witness
31
- */
32
- protected get schemaTransforms(): SchemaToJsonPathTransformExpressionsDictionary;
33
- protected divineHandler(payloads?: Payload[]): Promise<Payload[]>;
34
- /**
35
- * Identifies if a payload is one that is indexed by this diviner
36
- * @param x The candidate payload
37
- * @returns True if the payload is one indexed by this diviner, false otherwise
38
- */
39
- protected isIndexablePayload: (x: Payload) => boolean;
40
- /**
41
- * Identifies if a schema is one that is indexed by this diviner
42
- * @param schema The candidate schema
43
- * @returns True if this schema is one indexed by this diviner, false otherwise
44
- */
45
- protected isIndexableSchema: (schema?: string | null) => boolean;
46
- }
47
- //# sourceMappingURL=_Diviner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_Diviner.d.ts","sourceRoot":"","sources":["../../../src/IndexCandidateToIndexDiviner/_Diviner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAkB,MAAM,iCAAiC,CAAA;AAE9E,OAAO,EACL,8CAA8C,EAC9C,qCAAqC,EAErC,yDAAyD,EAG1D,MAAM,8CAA8C,CAAA;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAiB,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAAe,SAAS,EAAmB,MAAM,gCAAgC,CAAA;AAIxF,MAAM,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;AAIvE;;;;GAIG;AACH,qBAAa,mDAAmD,CAC9D,OAAO,SAAS,yDAAyD,GAAG,yDAAyD,CACrI,SAAQ,eAAe,CAAC,OAAO,CAAC;IAChC,OAAgB,YAAY,oFAAkE;IAC9F,OAAgB,aAAa,uHAAyF;IACtH,MAAM,CAAC,MAAM,EAAE,MAAM,CAEpB;IAED,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,oBAAoB,CAAmD;IAE/E;;OAEG;IACH,SAAS,KAAK,gBAAgB,IAAI,MAAM,EAAE,CAGzC;IAED;;;OAGG;IACH,SAAS,KAAK,mBAAmB,IAAI,qCAAqC,CAGzE;IAED;;;OAGG;IACH,SAAS,KAAK,gBAAgB,IAAI,8CAA8C,CAE/E;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAiDpF;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,MAAO,OAAO,aAEzC;IAED;;;;OAIG;IACH,SAAS,CAAC,iBAAiB,YAAa,MAAM,GAAG,IAAI,aAEpD;CACF"}