@comunica/actor-query-source-identify-hypermedia 4.5.0 → 5.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.
@@ -3,7 +3,7 @@
3
3
  "https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
4
4
  {
5
5
  "npmd": "https://linkedsoftwaredependencies.org/bundles/npm/",
6
- "caqsih": "npmd:@comunica/actor-query-source-identify-hypermedia/^4.0.0/",
6
+ "caqsih": "npmd:@comunica/actor-query-source-identify-hypermedia/^5.0.0/",
7
7
  "ActorQuerySourceIdentifyHypermedia": {
8
8
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia",
9
9
  "@prefix": true,
@@ -14,26 +14,11 @@
14
14
  "args_maxIterators": {
15
15
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_maxIterators"
16
16
  },
17
- "args_aggregateTraversalStore": {
18
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_aggregateTraversalStore"
19
- },
20
- "args_emitPartialCardinalities": {
21
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_emitPartialCardinalities"
22
- },
23
- "args_mediatorDereferenceRdf": {
24
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorDereferenceRdf"
25
- },
26
- "args_mediatorMetadata": {
27
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadata"
28
- },
29
- "args_mediatorMetadataExtract": {
30
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadataExtract"
31
- },
32
17
  "args_mediatorMetadataAccumulate": {
33
18
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadataAccumulate"
34
19
  },
35
- "args_mediatorQuerySourceIdentifyHypermedia": {
36
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorQuerySourceIdentifyHypermedia"
20
+ "args_mediatorQuerySourceDereferenceLink": {
21
+ "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorQuerySourceDereferenceLink"
37
22
  },
38
23
  "args_mediatorRdfResolveHypermediaLinks": {
39
24
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorRdfResolveHypermediaLinks"
@@ -63,26 +48,11 @@
63
48
  "maxIterators": {
64
49
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_maxIterators"
65
50
  },
66
- "aggregateTraversalStore": {
67
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_aggregateTraversalStore"
68
- },
69
- "emitPartialCardinalities": {
70
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_emitPartialCardinalities"
71
- },
72
- "mediatorDereferenceRdf": {
73
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorDereferenceRdf"
74
- },
75
- "mediatorMetadata": {
76
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadata"
77
- },
78
- "mediatorMetadataExtract": {
79
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadataExtract"
80
- },
81
51
  "mediatorMetadataAccumulate": {
82
52
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorMetadataAccumulate"
83
53
  },
84
- "mediatorQuerySourceIdentifyHypermedia": {
85
- "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorQuerySourceIdentifyHypermedia"
54
+ "mediatorQuerySourceDereferenceLink": {
55
+ "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorQuerySourceDereferenceLink"
86
56
  },
87
57
  "mediatorRdfResolveHypermediaLinks": {
88
58
  "@id": "caqsih:components/ActorQuerySourceIdentifyHypermedia.jsonld#ActorQuerySourceIdentifyHypermedia_args_mediatorRdfResolveHypermediaLinks"
@@ -126,38 +96,17 @@
126
96
  "maxIterators": {
127
97
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_maxIterators"
128
98
  },
129
- "aggregateStore": {
130
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_aggregateStore"
131
- },
132
- "emitPartialCardinalities": {
133
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_emitPartialCardinalities"
134
- },
135
- "logWarning": {
136
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_logWarning"
137
- },
138
99
  "bindingsFactory": {
139
100
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_bindingsFactory"
140
101
  },
141
- "forceSourceType": {
142
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_forceSourceType"
143
- },
144
- "mediators_mediatorDereferenceRdf": {
145
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorDereferenceRdf"
102
+ "mediators_mediatorMetadataAccumulate": {
103
+ "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataAccumulate"
146
104
  },
147
105
  "dataFactory": {
148
106
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_dataFactory"
149
107
  },
150
- "mediators_mediatorMetadata": {
151
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadata"
152
- },
153
- "mediators_mediatorMetadataExtract": {
154
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataExtract"
155
- },
156
- "mediators_mediatorMetadataAccumulate": {
157
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataAccumulate"
158
- },
159
- "mediators_mediatorQuerySourceIdentifyHypermedia": {
160
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorQuerySourceIdentifyHypermedia"
108
+ "mediators_mediatorQuerySourceDereferenceLink": {
109
+ "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorQuerySourceDereferenceLink"
161
110
  },
162
111
  "mediators_mediatorRdfResolveHypermediaLinks": {
163
112
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorRdfResolveHypermediaLinks"
@@ -168,38 +117,17 @@
168
117
  "rs": {
169
118
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_maxIterators"
170
119
  },
171
- "tore": {
172
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_aggregateStore"
173
- },
174
- "lCardinalities": {
175
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_emitPartialCardinalities"
176
- },
177
- "": {
178
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_logWarning"
179
- },
180
120
  "ctory": {
181
121
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_bindingsFactory"
182
122
  },
183
- "eType": {
184
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_forceSourceType"
185
- },
186
- "mediatorDereferenceRdf": {
187
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorDereferenceRdf"
123
+ "mediatorMetadataAccumulate": {
124
+ "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataAccumulate"
188
125
  },
189
126
  "y": {
190
127
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_dataFactory"
191
128
  },
192
- "mediatorMetadata": {
193
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadata"
194
- },
195
- "mediatorMetadataExtract": {
196
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataExtract"
197
- },
198
- "mediatorMetadataAccumulate": {
199
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorMetadataAccumulate"
200
- },
201
- "mediatorQuerySourceIdentifyHypermedia": {
202
- "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorQuerySourceIdentifyHypermedia"
129
+ "mediatorQuerySourceDereferenceLink": {
130
+ "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorQuerySourceDereferenceLink"
203
131
  },
204
132
  "mediatorRdfResolveHypermediaLinks": {
205
133
  "@id": "caqsih:components/QuerySourceHypermedia.jsonld#QuerySourceHypermedia_mediators_mediatorRdfResolveHypermediaLinks"
@@ -1,11 +1,8 @@
1
- import type { MediatorDereferenceRdf } from '@comunica/bus-dereference-rdf';
2
1
  import type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';
2
+ import type { MediatorQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';
3
3
  import { ActorQuerySourceIdentify } from '@comunica/bus-query-source-identify';
4
4
  import type { IActionQuerySourceIdentify, IActorQuerySourceIdentifyOutput, IActorQuerySourceIdentifyArgs } from '@comunica/bus-query-source-identify';
5
- import type { MediatorQuerySourceIdentifyHypermedia } from '@comunica/bus-query-source-identify-hypermedia';
6
- import type { MediatorRdfMetadata } from '@comunica/bus-rdf-metadata';
7
5
  import type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';
8
- import type { MediatorRdfMetadataExtract } from '@comunica/bus-rdf-metadata-extract';
9
6
  import type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';
10
7
  import type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';
11
8
  import type { IActorTest, TestResult } from '@comunica/core';
@@ -13,18 +10,13 @@ import type { IActorTest, TestResult } from '@comunica/core';
13
10
  * A comunica Hypermedia Query Source Identify Actor.
14
11
  */
15
12
  export declare class ActorQuerySourceIdentifyHypermedia extends ActorQuerySourceIdentify {
16
- readonly mediatorDereferenceRdf: MediatorDereferenceRdf;
17
- readonly mediatorMetadata: MediatorRdfMetadata;
18
- readonly mediatorMetadataExtract: MediatorRdfMetadataExtract;
19
13
  readonly mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;
20
- readonly mediatorQuerySourceIdentifyHypermedia: MediatorQuerySourceIdentifyHypermedia;
14
+ readonly mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;
21
15
  readonly mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;
22
16
  readonly mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;
23
17
  readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;
24
18
  readonly cacheSize: number;
25
19
  readonly maxIterators: number;
26
- readonly aggregateTraversalStore: boolean;
27
- readonly emitPartialCardinalities: boolean;
28
20
  constructor(args: IActorQuerySourceIdentifyHypermediaArgs);
29
21
  test(action: IActionQuerySourceIdentify): Promise<TestResult<IActorTest>>;
30
22
  run(action: IActionQuerySourceIdentify): Promise<IActorQuerySourceIdentifyOutput>;
@@ -41,42 +33,14 @@ export interface IActorQuerySourceIdentifyHypermediaArgs extends IActorQuerySour
41
33
  * @default {64}
42
34
  */
43
35
  maxIterators: number;
44
- /**
45
- * If all discovered quads across all links from a traversal source should be indexed in an aggregated store,
46
- * to speed up later calls.
47
- * This only applies to sources annotated with KeysQuerySourceIdentify.traverse.
48
- * @default {true}
49
- */
50
- aggregateTraversalStore: boolean;
51
- /**
52
- * Indicates whether the {@link StreamingStoreMetadata} should emit updated partial
53
- * cardinalities for each matching quad.
54
- *
55
- * Note: Enabling this option may degrade performance due to frequent
56
- * {@link MetadataValidationState} invalidations and updates.
57
- * @default {false}
58
- */
59
- emitPartialCardinalities: boolean;
60
- /**
61
- * The RDF dereference mediator
62
- */
63
- mediatorDereferenceRdf: MediatorDereferenceRdf;
64
- /**
65
- * The metadata mediator
66
- */
67
- mediatorMetadata: MediatorRdfMetadata;
68
- /**
69
- * The metadata extract mediator
70
- */
71
- mediatorMetadataExtract: MediatorRdfMetadataExtract;
72
36
  /**
73
37
  * The metadata accumulate mediator
74
38
  */
75
- mediatorMetadataAccumulate?: MediatorRdfMetadataAccumulate;
39
+ mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;
76
40
  /**
77
- * The hypermedia resolve mediator
41
+ * The mediator for resolving hypermedia sources
78
42
  */
79
- mediatorQuerySourceIdentifyHypermedia: MediatorQuerySourceIdentifyHypermedia;
43
+ mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;
80
44
  /**
81
45
  * The hypermedia links resolve mediator
82
46
  */
@@ -10,8 +10,22 @@ const QuerySourceHypermedia_1 = require("./QuerySourceHypermedia");
10
10
  * A comunica Hypermedia Query Source Identify Actor.
11
11
  */
12
12
  class ActorQuerySourceIdentifyHypermedia extends bus_query_source_identify_1.ActorQuerySourceIdentify {
13
+ mediatorMetadataAccumulate;
14
+ mediatorQuerySourceDereferenceLink;
15
+ mediatorRdfResolveHypermediaLinks;
16
+ mediatorRdfResolveHypermediaLinksQueue;
17
+ mediatorMergeBindingsContext;
18
+ cacheSize;
19
+ maxIterators;
13
20
  constructor(args) {
14
21
  super(args);
22
+ this.mediatorMetadataAccumulate = args.mediatorMetadataAccumulate;
23
+ this.mediatorQuerySourceDereferenceLink = args.mediatorQuerySourceDereferenceLink;
24
+ this.mediatorRdfResolveHypermediaLinks = args.mediatorRdfResolveHypermediaLinks;
25
+ this.mediatorRdfResolveHypermediaLinksQueue = args.mediatorRdfResolveHypermediaLinksQueue;
26
+ this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;
27
+ this.cacheSize = args.cacheSize;
28
+ this.maxIterators = args.maxIterators;
15
29
  }
16
30
  async test(action) {
17
31
  if (typeof action.querySourceUnidentified.value !== 'string') {
@@ -20,20 +34,17 @@ class ActorQuerySourceIdentifyHypermedia extends bus_query_source_identify_1.Act
20
34
  return (0, core_1.passTestVoid)();
21
35
  }
22
36
  async run(action) {
37
+ const querySourceContext = action.querySourceUnidentified.context ?? new core_1.ActionContext();
23
38
  const dataFactory = action.context.getSafe(context_entries_1.KeysInitQuery.dataFactory);
24
39
  return {
25
40
  querySource: {
26
- source: new QuerySourceHypermedia_1.QuerySourceHypermedia(this.cacheSize, action.querySourceUnidentified.value, action.querySourceUnidentified.type, this.maxIterators, this.aggregateTraversalStore &&
27
- Boolean(action.querySourceUnidentified.context?.get(context_entries_1.KeysQuerySourceIdentify.traverse)), this.emitPartialCardinalities, {
28
- mediatorMetadata: this.mediatorMetadata,
29
- mediatorMetadataExtract: this.mediatorMetadataExtract,
41
+ source: new QuerySourceHypermedia_1.QuerySourceHypermedia(this.cacheSize, { url: action.querySourceUnidentified.value, forceSourceType: action.querySourceUnidentified.type }, this.maxIterators, {
30
42
  mediatorMetadataAccumulate: this.mediatorMetadataAccumulate,
31
- mediatorDereferenceRdf: this.mediatorDereferenceRdf,
32
- mediatorQuerySourceIdentifyHypermedia: this.mediatorQuerySourceIdentifyHypermedia,
43
+ mediatorQuerySourceDereferenceLink: this.mediatorQuerySourceDereferenceLink,
33
44
  mediatorRdfResolveHypermediaLinks: this.mediatorRdfResolveHypermediaLinks,
34
45
  mediatorRdfResolveHypermediaLinksQueue: this.mediatorRdfResolveHypermediaLinksQueue,
35
- }, warningMessage => this.logWarn(action.context, warningMessage), dataFactory, await utils_bindings_factory_1.BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory)),
36
- context: action.querySourceUnidentified.context ?? new core_1.ActionContext(),
46
+ }, dataFactory, await utils_bindings_factory_1.BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory)),
47
+ context: querySourceContext,
37
48
  },
38
49
  };
39
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ActorQuerySourceIdentifyHypermedia.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermedia.ts"],"names":[],"mappings":";;;AAEA,mFAA+E;AAY/E,+DAAmF;AACnF,yCAAuE;AAGvE,6EAAmE;AACnE,mEAAgE;AAEhE;;GAEG;AACH,MAAa,kCAAmC,SAAQ,oDAAwB;IAc9E,YAAmB,IAA6C;QAC9D,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAkC;QAClD,IAAI,OAAO,MAAM,CAAC,uBAAuB,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,IAAA,eAAQ,EAAC,GAAG,IAAI,CAAC,IAAI,gFAAgF,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAA,mBAAY,GAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAkC;QACjD,MAAM,WAAW,GAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,CAAC;QAC3F,OAAO;YACL,WAAW,EAAE;gBACX,MAAM,EAAE,IAAI,6CAAqB,CAC/B,IAAI,CAAC,SAAS,EACL,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAC7C,MAAM,CAAC,uBAAuB,CAAC,IAAI,EACnC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,uBAAuB;oBAC5B,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,yCAAuB,CAAC,QAAQ,CAAC,CAAC,EACtF,IAAI,CAAC,wBAAwB,EAC7B;oBACE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;oBACvC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;oBACrD,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;oBAC3D,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;oBACnD,qCAAqC,EAAE,IAAI,CAAC,qCAAqC;oBACjF,iCAAiC,EAAE,IAAI,CAAC,iCAAiC;oBACzE,sCAAsC,EAAE,IAAI,CAAC,sCAAsC;iBACpF,EACD,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9D,WAAW,EACX,MAAM,wCAAe,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAC7F;gBACD,OAAO,EAAE,MAAM,CAAC,uBAAuB,CAAC,OAAO,IAAI,IAAI,oBAAa,EAAE;aACvE;SACF,CAAC;IACJ,CAAC;CACF;AAtDD,gFAsDC","sourcesContent":["import type { MediatorDereferenceRdf } from '@comunica/bus-dereference-rdf';\nimport type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';\nimport { ActorQuerySourceIdentify } from '@comunica/bus-query-source-identify';\nimport type {\n IActionQuerySourceIdentify,\n IActorQuerySourceIdentifyOutput,\n IActorQuerySourceIdentifyArgs,\n} from '@comunica/bus-query-source-identify';\nimport type { MediatorQuerySourceIdentifyHypermedia } from '@comunica/bus-query-source-identify-hypermedia';\nimport type { MediatorRdfMetadata } from '@comunica/bus-rdf-metadata';\nimport type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfMetadataExtract } from '@comunica/bus-rdf-metadata-extract';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport { KeysInitQuery, KeysQuerySourceIdentify } from '@comunica/context-entries';\nimport { ActionContext, failTest, passTestVoid } from '@comunica/core';\nimport type { IActorTest, TestResult } from '@comunica/core';\nimport type { ComunicaDataFactory } from '@comunica/types';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { QuerySourceHypermedia } from './QuerySourceHypermedia';\n\n/**\n * A comunica Hypermedia Query Source Identify Actor.\n */\nexport class ActorQuerySourceIdentifyHypermedia extends ActorQuerySourceIdentify {\n public readonly mediatorDereferenceRdf: MediatorDereferenceRdf;\n public readonly mediatorMetadata: MediatorRdfMetadata;\n public readonly mediatorMetadataExtract: MediatorRdfMetadataExtract;\n public readonly mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n public readonly mediatorQuerySourceIdentifyHypermedia: MediatorQuerySourceIdentifyHypermedia;\n public readonly mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n public readonly mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n public readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n public readonly cacheSize: number;\n public readonly maxIterators: number;\n public readonly aggregateTraversalStore: boolean;\n public readonly emitPartialCardinalities: boolean;\n\n public constructor(args: IActorQuerySourceIdentifyHypermediaArgs) {\n super(args);\n }\n\n public async test(action: IActionQuerySourceIdentify): Promise<TestResult<IActorTest>> {\n if (typeof action.querySourceUnidentified.value !== 'string') {\n return failTest(`${this.name} requires a single query source with a URL value to be present in the context.`);\n }\n return passTestVoid();\n }\n\n public async run(action: IActionQuerySourceIdentify): Promise<IActorQuerySourceIdentifyOutput> {\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n return {\n querySource: {\n source: new QuerySourceHypermedia(\n this.cacheSize,\n <string> action.querySourceUnidentified.value,\n action.querySourceUnidentified.type,\n this.maxIterators,\n this.aggregateTraversalStore &&\n Boolean(action.querySourceUnidentified.context?.get(KeysQuerySourceIdentify.traverse)),\n this.emitPartialCardinalities,\n {\n mediatorMetadata: this.mediatorMetadata,\n mediatorMetadataExtract: this.mediatorMetadataExtract,\n mediatorMetadataAccumulate: this.mediatorMetadataAccumulate,\n mediatorDereferenceRdf: this.mediatorDereferenceRdf,\n mediatorQuerySourceIdentifyHypermedia: this.mediatorQuerySourceIdentifyHypermedia,\n mediatorRdfResolveHypermediaLinks: this.mediatorRdfResolveHypermediaLinks,\n mediatorRdfResolveHypermediaLinksQueue: this.mediatorRdfResolveHypermediaLinksQueue,\n },\n warningMessage => this.logWarn(action.context, warningMessage),\n dataFactory,\n await BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory),\n ),\n context: action.querySourceUnidentified.context ?? new ActionContext(),\n },\n };\n }\n}\n\nexport interface IActorQuerySourceIdentifyHypermediaArgs extends IActorQuerySourceIdentifyArgs {\n /**\n * The maximum number of entries in the LRU cache, set to 0 to disable.\n * @range {integer}\n * @default {100}\n */\n cacheSize: number;\n /**\n * The maximum number of links that can be followed in parallel.\n * @default {64}\n */\n maxIterators: number;\n /**\n * If all discovered quads across all links from a traversal source should be indexed in an aggregated store,\n * to speed up later calls.\n * This only applies to sources annotated with KeysQuerySourceIdentify.traverse.\n * @default {true}\n */\n aggregateTraversalStore: boolean;\n /**\n * Indicates whether the {@link StreamingStoreMetadata} should emit updated partial\n * cardinalities for each matching quad.\n *\n * Note: Enabling this option may degrade performance due to frequent\n * {@link MetadataValidationState} invalidations and updates.\n * @default {false}\n */\n emitPartialCardinalities: boolean;\n /**\n * The RDF dereference mediator\n */\n mediatorDereferenceRdf: MediatorDereferenceRdf;\n /**\n * The metadata mediator\n */\n mediatorMetadata: MediatorRdfMetadata;\n /**\n * The metadata extract mediator\n */\n mediatorMetadataExtract: MediatorRdfMetadataExtract;\n /**\n * The metadata accumulate mediator\n */\n mediatorMetadataAccumulate?: MediatorRdfMetadataAccumulate;\n /**\n * The hypermedia resolve mediator\n */\n mediatorQuerySourceIdentifyHypermedia: MediatorQuerySourceIdentifyHypermedia;\n /**\n * The hypermedia links resolve mediator\n */\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n /**\n * The hypermedia links queue resolve mediator\n */\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n /**\n * A mediator for creating binding context merge handlers\n */\n mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n}\n"]}
1
+ {"version":3,"file":"ActorQuerySourceIdentifyHypermedia.js","sourceRoot":"","sources":["ActorQuerySourceIdentifyHypermedia.ts"],"names":[],"mappings":";;;AAEA,mFAA+E;AAS/E,+DAA0D;AAC1D,yCAAuE;AAGvE,6EAAmE;AACnE,mEAAgE;AAEhE;;GAEG;AACH,MAAa,kCAAmC,SAAQ,oDAAwB;IAC9D,0BAA0B,CAAgC;IAC1D,kCAAkC,CAAqC;IACvE,iCAAiC,CAAoC;IACrE,sCAAsC,CAAyC;IAC/E,4BAA4B,CAA+B;IAC3D,SAAS,CAAS;IAClB,YAAY,CAAS;IAErC,YAAmB,IAA6C;QAC9D,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,CAAC;QAClE,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,kCAAkC,CAAC;QAClF,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,iCAAiC,CAAC;QAChF,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,sCAAsC,CAAC;QAC1F,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAkC;QAClD,IAAI,OAAO,MAAM,CAAC,uBAAuB,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,IAAA,eAAQ,EAAC,GAAG,IAAI,CAAC,IAAI,gFAAgF,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,IAAA,mBAAY,GAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,MAAkC;QACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAC,OAAO,IAAI,IAAI,oBAAa,EAAE,CAAC;QACzF,MAAM,WAAW,GAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,+BAAa,CAAC,WAAW,CAAC,CAAC;QAC3F,OAAO;YACL,WAAW,EAAE;gBACX,MAAM,EAAE,IAAI,6CAAqB,CAC/B,IAAI,CAAC,SAAS,EACd,EAAE,GAAG,EAAW,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,EAC5G,IAAI,CAAC,YAAY,EACjB;oBACE,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;oBAC3D,kCAAkC,EAAE,IAAI,CAAC,kCAAkC;oBAC3E,iCAAiC,EAAE,IAAI,CAAC,iCAAiC;oBACzE,sCAAsC,EAAE,IAAI,CAAC,sCAAsC;iBACpF,EACD,WAAW,EACX,MAAM,wCAAe,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAC7F;gBACD,OAAO,EAAE,kBAAkB;aAC5B;SACF,CAAC;IACJ,CAAC;CACF;AAjDD,gFAiDC","sourcesContent":["import type { MediatorMergeBindingsContext } from '@comunica/bus-merge-bindings-context';\nimport type { MediatorQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport { ActorQuerySourceIdentify } from '@comunica/bus-query-source-identify';\nimport type {\n IActionQuerySourceIdentify,\n IActorQuerySourceIdentifyOutput,\n IActorQuerySourceIdentifyArgs,\n} from '@comunica/bus-query-source-identify';\nimport type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';\nimport type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';\nimport type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport { KeysInitQuery } from '@comunica/context-entries';\nimport { ActionContext, failTest, passTestVoid } from '@comunica/core';\nimport type { IActorTest, TestResult } from '@comunica/core';\nimport type { ComunicaDataFactory } from '@comunica/types';\nimport { BindingsFactory } from '@comunica/utils-bindings-factory';\nimport { QuerySourceHypermedia } from './QuerySourceHypermedia';\n\n/**\n * A comunica Hypermedia Query Source Identify Actor.\n */\nexport class ActorQuerySourceIdentifyHypermedia extends ActorQuerySourceIdentify {\n public readonly mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n public readonly mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n public readonly mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n public readonly mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n public readonly mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n public readonly cacheSize: number;\n public readonly maxIterators: number;\n\n public constructor(args: IActorQuerySourceIdentifyHypermediaArgs) {\n super(args);\n this.mediatorMetadataAccumulate = args.mediatorMetadataAccumulate;\n this.mediatorQuerySourceDereferenceLink = args.mediatorQuerySourceDereferenceLink;\n this.mediatorRdfResolveHypermediaLinks = args.mediatorRdfResolveHypermediaLinks;\n this.mediatorRdfResolveHypermediaLinksQueue = args.mediatorRdfResolveHypermediaLinksQueue;\n this.mediatorMergeBindingsContext = args.mediatorMergeBindingsContext;\n this.cacheSize = args.cacheSize;\n this.maxIterators = args.maxIterators;\n }\n\n public async test(action: IActionQuerySourceIdentify): Promise<TestResult<IActorTest>> {\n if (typeof action.querySourceUnidentified.value !== 'string') {\n return failTest(`${this.name} requires a single query source with a URL value to be present in the context.`);\n }\n return passTestVoid();\n }\n\n public async run(action: IActionQuerySourceIdentify): Promise<IActorQuerySourceIdentifyOutput> {\n const querySourceContext = action.querySourceUnidentified.context ?? new ActionContext();\n const dataFactory: ComunicaDataFactory = action.context.getSafe(KeysInitQuery.dataFactory);\n return {\n querySource: {\n source: new QuerySourceHypermedia(\n this.cacheSize,\n { url: <string> action.querySourceUnidentified.value, forceSourceType: action.querySourceUnidentified.type },\n this.maxIterators,\n {\n mediatorMetadataAccumulate: this.mediatorMetadataAccumulate,\n mediatorQuerySourceDereferenceLink: this.mediatorQuerySourceDereferenceLink,\n mediatorRdfResolveHypermediaLinks: this.mediatorRdfResolveHypermediaLinks,\n mediatorRdfResolveHypermediaLinksQueue: this.mediatorRdfResolveHypermediaLinksQueue,\n },\n dataFactory,\n await BindingsFactory.create(this.mediatorMergeBindingsContext, action.context, dataFactory),\n ),\n context: querySourceContext,\n },\n };\n }\n}\n\nexport interface IActorQuerySourceIdentifyHypermediaArgs extends IActorQuerySourceIdentifyArgs {\n /**\n * The maximum number of entries in the LRU cache, set to 0 to disable.\n * @range {integer}\n * @default {100}\n */\n cacheSize: number;\n /**\n * The maximum number of links that can be followed in parallel.\n * @default {64}\n */\n maxIterators: number;\n /**\n * The metadata accumulate mediator\n */\n mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate;\n /**\n * The mediator for resolving hypermedia sources\n */\n mediatorQuerySourceDereferenceLink: MediatorQuerySourceDereferenceLink;\n /**\n * The hypermedia links resolve mediator\n */\n mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks;\n /**\n * The hypermedia links queue resolve mediator\n */\n mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue;\n /**\n * A mediator for creating binding context merge handlers\n */\n mediatorMergeBindingsContext: MediatorMergeBindingsContext;\n}\n"]}
@@ -1,15 +1,14 @@
1
- import type { ILinkQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';
2
- import type { ILink, IQuerySource, IActionContext, MetadataBindings, IQueryBindingsOptions } from '@comunica/types';
1
+ import type { IActionQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';
2
+ import type { ILink, IQuerySource, IActionContext, MetadataBindings, IQueryBindingsOptions, ILinkQueue, ICachePolicy } from '@comunica/types';
3
+ import type { Algebra } from '@comunica/utils-algebra';
3
4
  import type * as RDF from '@rdfjs/types';
4
5
  import type { BufferedIteratorOptions } from 'asynciterator';
5
6
  import { BufferedIterator } from 'asynciterator';
6
- import type { Algebra } from 'sparqlalgebrajs';
7
7
  export declare abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedIterator<RDF.Bindings> {
8
8
  protected readonly operation: Algebra.Operation;
9
9
  protected readonly queryBindingsOptions: IQueryBindingsOptions | undefined;
10
10
  protected readonly context: IActionContext;
11
- private readonly cacheSize;
12
- protected readonly firstUrl: string;
11
+ protected readonly firstLink: ILink;
13
12
  private readonly maxIterators;
14
13
  private readonly sourceStateGetter;
15
14
  protected started: boolean;
@@ -18,7 +17,7 @@ export declare abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedI
18
17
  private iteratorsPendingTermination;
19
18
  private accumulatedMetadata;
20
19
  private preflightMetadata;
21
- constructor(cacheSize: number, operation: Algebra.Operation, queryBindingsOptions: IQueryBindingsOptions | undefined, context: IActionContext, firstUrl: string, maxIterators: number, sourceStateGetter: SourceStateGetter, options?: BufferedIteratorOptions);
20
+ constructor(operation: Algebra.Operation, queryBindingsOptions: IQueryBindingsOptions | undefined, context: IActionContext, firstLink: ILink, maxIterators: number, sourceStateGetter: SourceStateGetter, options?: BufferedIteratorOptions);
22
21
  /**
23
22
  * Start filling the buffer of this iterator.
24
23
  */
@@ -85,5 +84,9 @@ export interface ISourceState {
85
84
  * All dataset identifiers that have been passed for this source.
86
85
  */
87
86
  handledDatasets: Record<string, boolean>;
87
+ /**
88
+ * The cache policy of the request's response.
89
+ */
90
+ cachePolicy?: ICachePolicy<IActionQuerySourceDereferenceLink>;
88
91
  }
89
92
  export type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;
@@ -5,20 +5,26 @@ const context_entries_1 = require("@comunica/context-entries");
5
5
  const utils_metadata_1 = require("@comunica/utils-metadata");
6
6
  const asynciterator_1 = require("asynciterator");
7
7
  class LinkedRdfSourcesAsyncRdfIterator extends asynciterator_1.BufferedIterator {
8
- constructor(cacheSize, operation, queryBindingsOptions, context, firstUrl, maxIterators, sourceStateGetter, options) {
8
+ operation;
9
+ queryBindingsOptions;
10
+ context;
11
+ firstLink;
12
+ maxIterators;
13
+ sourceStateGetter;
14
+ started = false;
15
+ currentIterators = [];
16
+ iteratorsPendingCreation = 0;
17
+ iteratorsPendingTermination = 0;
18
+ // eslint-disable-next-line unicorn/no-useless-undefined
19
+ accumulatedMetadata = Promise.resolve(undefined);
20
+ preflightMetadata;
21
+ constructor(operation, queryBindingsOptions, context, firstLink, maxIterators, sourceStateGetter, options) {
9
22
  super({ autoStart: false, ...options });
10
- this.started = false;
11
- this.currentIterators = [];
12
- this.iteratorsPendingCreation = 0;
13
- this.iteratorsPendingTermination = 0;
14
- // eslint-disable-next-line unicorn/no-useless-undefined
15
- this.accumulatedMetadata = Promise.resolve(undefined);
16
23
  this._reading = false;
17
- this.cacheSize = cacheSize;
18
24
  this.operation = operation;
19
25
  this.queryBindingsOptions = queryBindingsOptions;
20
26
  this.context = context;
21
- this.firstUrl = firstUrl;
27
+ this.firstLink = firstLink;
22
28
  this.maxIterators = maxIterators;
23
29
  this.sourceStateGetter = sourceStateGetter;
24
30
  if (this.maxIterators <= 0) {
@@ -39,7 +45,7 @@ class LinkedRdfSourcesAsyncRdfIterator extends asynciterator_1.BufferedIterator
39
45
  // iterator. This way, we keep the iterator lazy.
40
46
  if (!this.preflightMetadata) {
41
47
  this.preflightMetadata = new Promise((resolve, reject) => {
42
- this.sourceStateGetter({ url: this.firstUrl }, {})
48
+ this.sourceStateGetter(this.firstLink, {})
43
49
  .then((sourceState) => {
44
50
  // Don't pass query options, as we don't want to consume any passed iterators
45
51
  const bindingsStream = sourceState.source.queryBindings(this.operation, this.context);
@@ -99,21 +105,18 @@ class LinkedRdfSourcesAsyncRdfIterator extends asynciterator_1.BufferedIterator
99
105
  // We can safely ignore skip catching the error, since we are guaranteed to have
100
106
  // successfully got the source for this.firstUrl before.
101
107
  // eslint-disable-next-line ts/no-floating-promises
102
- this.sourceStateGetter({ url: this.firstUrl }, {})
108
+ this.sourceStateGetter(this.firstLink, {})
103
109
  .then((sourceState) => {
104
110
  this.startIteratorsForNextUrls(sourceState.handledDatasets, false);
105
- done();
106
111
  });
107
112
  }
108
- else {
109
- done();
110
- }
113
+ done();
111
114
  }
112
115
  else {
113
116
  // The first time this is called, prepare the first source
114
117
  this.started = true;
115
118
  // Await the source to be set, and start the source iterator
116
- this.sourceStateGetter({ url: this.firstUrl }, {})
119
+ this.sourceStateGetter(this.firstLink, {})
117
120
  .then((sourceState) => {
118
121
  this.startIterator(sourceState);
119
122
  done();
@@ -1 +1 @@
1
- {"version":3,"file":"LinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["LinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ILinkQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';\nimport { KeysStatistics } from '@comunica/context-entries';\nimport type {\n ILink,\n IQuerySource,\n IActionContext,\n MetadataBindings,\n IQueryBindingsOptions,\n IStatisticBase,\n} from '@comunica/types';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator, BufferedIteratorOptions } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\nimport type { Algebra } from 'sparqlalgebrajs';\n\nexport abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedIterator<RDF.Bindings> {\n protected readonly operation: Algebra.Operation;\n protected readonly queryBindingsOptions: IQueryBindingsOptions | undefined;\n protected readonly context: IActionContext;\n\n private readonly cacheSize: number;\n protected readonly firstUrl: string;\n private readonly maxIterators: number;\n private readonly sourceStateGetter: SourceStateGetter;\n\n protected started = false;\n private readonly currentIterators: AsyncIterator<RDF.Bindings>[] = [];\n private iteratorsPendingCreation = 0;\n private iteratorsPendingTermination = 0;\n // eslint-disable-next-line unicorn/no-useless-undefined\n private accumulatedMetadata: Promise<MetadataBindings | undefined> = Promise.resolve(undefined);\n private preflightMetadata: Promise<MetadataBindings> | undefined;\n\n public constructor(\n cacheSize: number,\n operation: Algebra.Operation,\n queryBindingsOptions: IQueryBindingsOptions | undefined,\n context: IActionContext,\n firstUrl: string,\n maxIterators: number,\n sourceStateGetter: SourceStateGetter,\n options?: BufferedIteratorOptions,\n ) {\n super({ autoStart: false, ...options });\n this._reading = false;\n this.cacheSize = cacheSize;\n this.operation = operation;\n this.queryBindingsOptions = queryBindingsOptions;\n this.context = context;\n this.firstUrl = firstUrl;\n this.maxIterators = maxIterators;\n this.sourceStateGetter = sourceStateGetter;\n\n if (this.maxIterators <= 0) {\n throw new Error(`LinkedRdfSourcesAsyncRdfIterator.maxIterators must be larger than zero, but got ${this.maxIterators}`);\n }\n }\n\n /**\n * Start filling the buffer of this iterator.\n */\n public kickstart(): void {\n if (!this.started) {\n this._fillBufferAsync();\n }\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n if (propertyName === 'metadata' && !this.started) {\n // If the iterator has not started yet, forcefully fetch the metadata from the source without starting the\n // iterator. This way, we keep the iterator lazy.\n if (!this.preflightMetadata) {\n this.preflightMetadata = new Promise((resolve, reject) => {\n this.sourceStateGetter({ url: this.firstUrl }, {})\n .then((sourceState) => {\n // Don't pass query options, as we don't want to consume any passed iterators\n const bindingsStream = sourceState.source.queryBindings(this.operation, this.context);\n bindingsStream.getProperty('metadata', (metadata: MetadataBindings) => {\n metadata.state = new MetadataValidationState();\n bindingsStream.destroy();\n this.accumulateMetadata(sourceState.metadata, metadata)\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...sourceState.metadata, ...metadata, ...accumulatedMetadata };\n resolve(returnMetadata);\n })\n .catch(() => {\n resolve({\n ...sourceState.metadata,\n state: new MetadataValidationState(),\n });\n });\n });\n })\n .catch(reject);\n });\n }\n this.preflightMetadata\n .then(metadata => this.setProperty('metadata', metadata))\n .catch(e => this.emit('error', e));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.currentIterators) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n /**\n * Get the internal link queue.\n * The returned instance must always be the same.\n */\n public abstract getLinkQueue(): Promise<ILinkQueue>;\n\n /**\n * Determine the links to be followed from the current source given its metadata.\n * @param metadata The metadata of a source.\n */\n protected abstract getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]>;\n\n public override _read(count: number, done: () => void): void {\n if (this.started) {\n // Read from all current iterators\n for (const iterator of this.currentIterators) {\n while (count > 0) {\n const read = iterator.read();\n if (read === null) {\n break;\n } else {\n count--;\n this._push(read);\n }\n }\n if (count <= 0) {\n break;\n }\n }\n\n // Schedule new iterators if needed\n if (count >= 0 && this.canStartNewIterator()) {\n // We can safely ignore skip catching the error, since we are guaranteed to have\n // successfully got the source for this.firstUrl before.\n // eslint-disable-next-line ts/no-floating-promises\n this.sourceStateGetter({ url: this.firstUrl }, {})\n .then((sourceState) => {\n this.startIteratorsForNextUrls(sourceState.handledDatasets, false);\n done();\n });\n } else {\n done();\n }\n } else {\n // The first time this is called, prepare the first source\n this.started = true;\n\n // Await the source to be set, and start the source iterator\n this.sourceStateGetter({ url: this.firstUrl }, {})\n .then((sourceState) => {\n this.startIterator(sourceState);\n done();\n })\n // Destroy should be async because it can be called before it is listened to\n .catch(error => setTimeout(() => this.destroy(error)));\n }\n }\n\n protected canStartNewIterator(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) <\n this.maxIterators && (!this.canStartNewIteratorConsiderReadable() || !this.readable);\n }\n\n protected canStartNewIteratorConsiderReadable(): boolean {\n return true;\n }\n\n protected areIteratorsRunning(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) > 0;\n }\n\n /**\n * Append the fields from appendingMetadata into accumulatedMetadata.\n * @param accumulatedMetadata The fields to append to.\n * @param appendingMetadata The fields to append.\n * @protected\n */\n protected abstract accumulateMetadata(\n accumulatedMetadata: MetadataBindings,\n appendingMetadata: MetadataBindings,\n ): Promise<MetadataBindings>;\n\n /**\n * Start a new iterator for the given source.\n * Once the iterator is done, it will either determine a new source, or it will close the linked iterator.\n * @param {ISourceState} startSource The start source state.\n */\n protected startIterator(startSource: ISourceState): void {\n // Delegate the quad pattern query to the given source\n try {\n const iterator = startSource.source.queryBindings(this.operation, this.context, this.queryBindingsOptions);\n this.currentIterators.push(iterator);\n let receivedEndEvent = false;\n let receivedMetadata = false;\n\n // Attach readers to the newly created iterator\n (<any>iterator)._destination = this;\n iterator.on('error', (error: Error) => this.destroy(error));\n iterator.on('readable', () => this._fillBuffer());\n iterator.on('end', () => {\n this.currentIterators.splice(this.currentIterators.indexOf(iterator), 1);\n\n // Indicate that this iterator still needs to flush its next-links.\n // Without this, the linked iterator could sometimes be closed before next-links are obtained.\n receivedEndEvent = true;\n if (!receivedMetadata) {\n this.iteratorsPendingTermination++;\n }\n\n // If the metadata was already received, handle the next URL in the queue\n if (receivedMetadata) {\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }\n });\n\n // Listen for the metadata of the source\n // The metadata property is guaranteed to be set\n iterator.getProperty('metadata', (metadata: MetadataBindings) => {\n // Accumulate the metadata object\n this.accumulatedMetadata = this.accumulatedMetadata\n .then(previousMetadata => (async() => {\n if (!previousMetadata) {\n previousMetadata = startSource.metadata;\n }\n return this.accumulateMetadata(previousMetadata, metadata);\n })()\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...startSource.metadata, ...metadata, ...accumulatedMetadata };\n\n // Create new metadata state\n returnMetadata.state = new MetadataValidationState();\n\n // Emit metadata, and invalidate any metadata that was set before\n this.updateMetadata(returnMetadata);\n\n // Invalidate any preflight metadata\n if (this.preflightMetadata) {\n this.preflightMetadata\n .then(metadataIn => metadataIn.state.invalidate())\n .catch(() => {\n // Ignore errors\n });\n }\n\n // Determine next urls, which will eventually become a next-next source.\n this.getSourceLinks(returnMetadata, startSource)\n .then((nextUrls: ILink[]) => Promise.all(nextUrls))\n .then(async(nextUrls: ILink[]) => {\n // Append all next URLs to our queue\n const linkQueue = await this.getLinkQueue();\n for (const nextUrl of nextUrls) {\n linkQueue.push(nextUrl, startSource.link);\n }\n\n receivedMetadata = true;\n if (receivedEndEvent) {\n this.iteratorsPendingTermination--;\n }\n\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }).catch(error => this.destroy(error));\n\n return returnMetadata;\n })).catch((error) => {\n this.destroy(error);\n return <MetadataBindings>{};\n });\n });\n } catch (syncError: unknown) {\n this.destroy(<Error> syncError);\n }\n }\n\n protected updateMetadata(metadataNew: MetadataBindings): void {\n const metadataToInvalidate = this.getProperty<MetadataBindings>('metadata');\n this.setProperty('metadata', metadataNew);\n metadataToInvalidate?.state.invalidate();\n }\n\n protected isRunning(): boolean {\n return !this.done;\n }\n\n /**\n * Check if a next URL is in the queue.\n * If yes, start a new iterator.\n * If no, close this iterator.\n * @param handledDatasets\n * @param canClose\n */\n protected startIteratorsForNextUrls(handledDatasets: Record<string, boolean>, canClose: boolean): void {\n this.getLinkQueue()\n .then((linkQueue) => {\n // Create as many new iterators as possible\n while (this.canStartNewIterator() && this.isRunning()) {\n const nextLink = linkQueue.pop();\n if (nextLink) {\n this.iteratorsPendingCreation++;\n this.sourceStateGetter(nextLink, handledDatasets)\n .then((nextSourceState) => {\n // If we find a statistic tracking dereference events we emit the relevant data\n const statisticDereferenceLinks: IStatisticBase<ILink> | undefined = this.context.get(\n KeysStatistics.dereferencedLinks,\n );\n if (statisticDereferenceLinks) {\n statisticDereferenceLinks.updateStatistic(\n {\n url: nextSourceState.link.url,\n metadata: { ...nextSourceState.metadata, ...nextSourceState.link.metadata },\n },\n nextSourceState.source,\n );\n }\n\n this.iteratorsPendingCreation--;\n this.startIterator(nextSourceState);\n })\n .catch(error => this.emit('error', error));\n } else {\n break;\n }\n }\n\n // Close, only if no other iterators are still running\n if (canClose && this.isCloseable(linkQueue, true)) {\n this.close();\n }\n })\n .catch(error => this.destroy(error));\n }\n\n protected isCloseable(linkQueue: ILinkQueue, _requireQueueEmpty: boolean): boolean {\n return linkQueue.isEmpty() && !this.areIteratorsRunning();\n }\n}\n\n/**\n * The current state of a source.\n * This is needed for following links within a source.\n */\nexport interface ISourceState {\n /**\n * The link to this source.\n */\n link: ILink;\n /**\n * A source.\n */\n source: IQuerySource;\n /**\n * The source's initial metadata.\n */\n metadata: MetadataBindings;\n /**\n * All dataset identifiers that have been passed for this source.\n */\n handledDatasets: Record<string, boolean>;\n}\n\nexport type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;\n"]}
1
+ {"version":3,"file":"LinkedRdfSourcesAsyncRdfIterator.js","sourceRoot":"","sources":["LinkedRdfSourcesAsyncRdfIterator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IActionQuerySourceDereferenceLink } from '@comunica/bus-query-source-dereference-link';\nimport { KeysStatistics } from '@comunica/context-entries';\nimport type {\n ILink,\n IQuerySource,\n IActionContext,\n MetadataBindings,\n IQueryBindingsOptions,\n IStatisticBase,\n ILinkQueue,\n ICachePolicy,\n} from '@comunica/types';\nimport type { Algebra } from '@comunica/utils-algebra';\nimport { MetadataValidationState } from '@comunica/utils-metadata';\nimport type * as RDF from '@rdfjs/types';\nimport type { AsyncIterator, BufferedIteratorOptions } from 'asynciterator';\nimport { BufferedIterator } from 'asynciterator';\n\nexport abstract class LinkedRdfSourcesAsyncRdfIterator extends BufferedIterator<RDF.Bindings> {\n protected readonly operation: Algebra.Operation;\n protected readonly queryBindingsOptions: IQueryBindingsOptions | undefined;\n protected readonly context: IActionContext;\n\n protected readonly firstLink: ILink;\n private readonly maxIterators: number;\n private readonly sourceStateGetter: SourceStateGetter;\n\n protected started = false;\n private readonly currentIterators: AsyncIterator<RDF.Bindings>[] = [];\n private iteratorsPendingCreation = 0;\n private iteratorsPendingTermination = 0;\n // eslint-disable-next-line unicorn/no-useless-undefined\n private accumulatedMetadata: Promise<MetadataBindings | undefined> = Promise.resolve(undefined);\n private preflightMetadata: Promise<MetadataBindings> | undefined;\n\n public constructor(\n operation: Algebra.Operation,\n queryBindingsOptions: IQueryBindingsOptions | undefined,\n context: IActionContext,\n firstLink: ILink,\n maxIterators: number,\n sourceStateGetter: SourceStateGetter,\n options?: BufferedIteratorOptions,\n ) {\n super({ autoStart: false, ...options });\n this._reading = false;\n this.operation = operation;\n this.queryBindingsOptions = queryBindingsOptions;\n this.context = context;\n this.firstLink = firstLink;\n this.maxIterators = maxIterators;\n this.sourceStateGetter = sourceStateGetter;\n\n if (this.maxIterators <= 0) {\n throw new Error(`LinkedRdfSourcesAsyncRdfIterator.maxIterators must be larger than zero, but got ${this.maxIterators}`);\n }\n }\n\n /**\n * Start filling the buffer of this iterator.\n */\n public kickstart(): void {\n if (!this.started) {\n this._fillBufferAsync();\n }\n }\n\n public override getProperty<P>(propertyName: string, callback?: (value: P) => void): P | undefined {\n if (propertyName === 'metadata' && !this.started) {\n // If the iterator has not started yet, forcefully fetch the metadata from the source without starting the\n // iterator. This way, we keep the iterator lazy.\n if (!this.preflightMetadata) {\n this.preflightMetadata = new Promise((resolve, reject) => {\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n // Don't pass query options, as we don't want to consume any passed iterators\n const bindingsStream = sourceState.source.queryBindings(this.operation, this.context);\n bindingsStream.getProperty('metadata', (metadata: MetadataBindings) => {\n metadata.state = new MetadataValidationState();\n bindingsStream.destroy();\n this.accumulateMetadata(sourceState.metadata, metadata)\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...sourceState.metadata, ...metadata, ...accumulatedMetadata };\n resolve(returnMetadata);\n })\n .catch(() => {\n resolve({\n ...sourceState.metadata,\n state: new MetadataValidationState(),\n });\n });\n });\n })\n .catch(reject);\n });\n }\n this.preflightMetadata\n .then(metadata => this.setProperty('metadata', metadata))\n .catch(e => this.emit('error', e));\n }\n return super.getProperty(propertyName, callback);\n }\n\n protected override _end(destroy?: boolean): void {\n // Close all running iterators\n for (const it of this.currentIterators) {\n it.destroy();\n }\n\n super._end(destroy);\n }\n\n /**\n * Get the internal link queue.\n * The returned instance must always be the same.\n */\n public abstract getLinkQueue(): Promise<ILinkQueue>;\n\n /**\n * Determine the links to be followed from the current source given its metadata.\n * @param metadata The metadata of a source.\n */\n protected abstract getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]>;\n\n public override _read(count: number, done: () => void): void {\n if (this.started) {\n // Read from all current iterators\n for (const iterator of this.currentIterators) {\n while (count > 0) {\n const read = iterator.read();\n if (read === null) {\n break;\n } else {\n count--;\n this._push(read);\n }\n }\n if (count <= 0) {\n break;\n }\n }\n\n // Schedule new iterators if needed\n if (count >= 0 && this.canStartNewIterator()) {\n // We can safely ignore skip catching the error, since we are guaranteed to have\n // successfully got the source for this.firstUrl before.\n // eslint-disable-next-line ts/no-floating-promises\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIteratorsForNextUrls(sourceState.handledDatasets, false);\n });\n }\n done();\n } else {\n // The first time this is called, prepare the first source\n this.started = true;\n\n // Await the source to be set, and start the source iterator\n this.sourceStateGetter(this.firstLink, {})\n .then((sourceState) => {\n this.startIterator(sourceState);\n done();\n })\n // Destroy should be async because it can be called before it is listened to\n .catch(error => setTimeout(() => this.destroy(error)));\n }\n }\n\n protected canStartNewIterator(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) <\n this.maxIterators && (!this.canStartNewIteratorConsiderReadable() || !this.readable);\n }\n\n protected canStartNewIteratorConsiderReadable(): boolean {\n return true;\n }\n\n protected areIteratorsRunning(): boolean {\n return (this.currentIterators.length + this.iteratorsPendingCreation + this.iteratorsPendingTermination) > 0;\n }\n\n /**\n * Append the fields from appendingMetadata into accumulatedMetadata.\n * @param accumulatedMetadata The fields to append to.\n * @param appendingMetadata The fields to append.\n * @protected\n */\n protected abstract accumulateMetadata(\n accumulatedMetadata: MetadataBindings,\n appendingMetadata: MetadataBindings,\n ): Promise<MetadataBindings>;\n\n /**\n * Start a new iterator for the given source.\n * Once the iterator is done, it will either determine a new source, or it will close the linked iterator.\n * @param {ISourceState} startSource The start source state.\n */\n protected startIterator(startSource: ISourceState): void {\n // Delegate the quad pattern query to the given source\n try {\n const iterator = startSource.source.queryBindings(this.operation, this.context, this.queryBindingsOptions);\n this.currentIterators.push(iterator);\n let receivedEndEvent = false;\n let receivedMetadata = false;\n\n // Attach readers to the newly created iterator\n (<any>iterator)._destination = this;\n iterator.on('error', (error: Error) => this.destroy(error));\n iterator.on('readable', () => this._fillBuffer());\n iterator.on('end', () => {\n this.currentIterators.splice(this.currentIterators.indexOf(iterator), 1);\n\n // Indicate that this iterator still needs to flush its next-links.\n // Without this, the linked iterator could sometimes be closed before next-links are obtained.\n receivedEndEvent = true;\n if (!receivedMetadata) {\n this.iteratorsPendingTermination++;\n }\n\n // If the metadata was already received, handle the next URL in the queue\n if (receivedMetadata) {\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }\n });\n\n // Listen for the metadata of the source\n // The metadata property is guaranteed to be set\n iterator.getProperty('metadata', (metadata: MetadataBindings) => {\n // Accumulate the metadata object\n this.accumulatedMetadata = this.accumulatedMetadata\n .then(previousMetadata => (async() => {\n if (!previousMetadata) {\n previousMetadata = startSource.metadata;\n }\n return this.accumulateMetadata(previousMetadata, metadata);\n })()\n .then((accumulatedMetadata) => {\n // Also merge fields that were not explicitly accumulated\n const returnMetadata = { ...startSource.metadata, ...metadata, ...accumulatedMetadata };\n\n // Create new metadata state\n returnMetadata.state = new MetadataValidationState();\n\n // Emit metadata, and invalidate any metadata that was set before\n this.updateMetadata(returnMetadata);\n\n // Invalidate any preflight metadata\n if (this.preflightMetadata) {\n this.preflightMetadata\n .then(metadataIn => metadataIn.state.invalidate())\n .catch(() => {\n // Ignore errors\n });\n }\n\n // Determine next urls, which will eventually become a next-next source.\n this.getSourceLinks(returnMetadata, startSource)\n .then((nextUrls: ILink[]) => Promise.all(nextUrls))\n .then(async(nextUrls: ILink[]) => {\n // Append all next URLs to our queue\n const linkQueue = await this.getLinkQueue();\n for (const nextUrl of nextUrls) {\n linkQueue.push(nextUrl, startSource.link);\n }\n\n receivedMetadata = true;\n if (receivedEndEvent) {\n this.iteratorsPendingTermination--;\n }\n\n this.startIteratorsForNextUrls(startSource.handledDatasets, true);\n }).catch(error => this.destroy(error));\n\n return returnMetadata;\n })).catch((error) => {\n this.destroy(error);\n return <MetadataBindings>{};\n });\n });\n } catch (syncError: unknown) {\n this.destroy(<Error> syncError);\n }\n }\n\n protected updateMetadata(metadataNew: MetadataBindings): void {\n const metadataToInvalidate = this.getProperty<MetadataBindings>('metadata');\n this.setProperty('metadata', metadataNew);\n metadataToInvalidate?.state.invalidate();\n }\n\n protected isRunning(): boolean {\n return !this.done;\n }\n\n /**\n * Check if a next URL is in the queue.\n * If yes, start a new iterator.\n * If no, close this iterator.\n * @param handledDatasets\n * @param canClose\n */\n protected startIteratorsForNextUrls(handledDatasets: Record<string, boolean>, canClose: boolean): void {\n this.getLinkQueue()\n .then((linkQueue) => {\n // Create as many new iterators as possible\n while (this.canStartNewIterator() && this.isRunning()) {\n const nextLink = linkQueue.pop();\n if (nextLink) {\n this.iteratorsPendingCreation++;\n this.sourceStateGetter(nextLink, handledDatasets)\n .then((nextSourceState) => {\n // If we find a statistic tracking dereference events we emit the relevant data\n const statisticDereferenceLinks: IStatisticBase<ILink> | undefined = this.context.get(\n KeysStatistics.dereferencedLinks,\n );\n if (statisticDereferenceLinks) {\n statisticDereferenceLinks.updateStatistic(\n {\n url: nextSourceState.link.url,\n metadata: { ...nextSourceState.metadata, ...nextSourceState.link.metadata },\n },\n nextSourceState.source,\n );\n }\n\n this.iteratorsPendingCreation--;\n this.startIterator(nextSourceState);\n })\n .catch(error => this.emit('error', error));\n } else {\n break;\n }\n }\n\n // Close, only if no other iterators are still running\n if (canClose && this.isCloseable(linkQueue, true)) {\n this.close();\n }\n })\n .catch(error => this.destroy(error));\n }\n\n protected isCloseable(linkQueue: ILinkQueue, _requireQueueEmpty: boolean): boolean {\n return linkQueue.isEmpty() && !this.areIteratorsRunning();\n }\n}\n\n/**\n * The current state of a source.\n * This is needed for following links within a source.\n */\nexport interface ISourceState {\n /**\n * The link to this source.\n */\n link: ILink;\n /**\n * A source.\n */\n source: IQuerySource;\n /**\n * The source's initial metadata.\n */\n metadata: MetadataBindings;\n /**\n * All dataset identifiers that have been passed for this source.\n */\n handledDatasets: Record<string, boolean>;\n /**\n * The cache policy of the request's response.\n */\n cachePolicy?: ICachePolicy<IActionQuerySourceDereferenceLink>;\n}\n\nexport type SourceStateGetter = (link: ILink, handledDatasets: Record<string, boolean>) => Promise<ISourceState>;\n"]}
@@ -1,12 +1,12 @@
1
1
  import type { MediatorRdfMetadataAccumulate } from '@comunica/bus-rdf-metadata-accumulate';
2
2
  import type { MediatorRdfResolveHypermediaLinks } from '@comunica/bus-rdf-resolve-hypermedia-links';
3
- import type { ILinkQueue, MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';
4
- import type { ComunicaDataFactory, IActionContext, IAggregatedStore, IQueryBindingsOptions, MetadataBindings, ILink } from '@comunica/types';
5
- import type { Algebra, Factory } from 'sparqlalgebrajs';
3
+ import type { MediatorRdfResolveHypermediaLinksQueue } from '@comunica/bus-rdf-resolve-hypermedia-links-queue';
4
+ import type { IActionContext, IQueryBindingsOptions, MetadataBindings, ILink, ILinkQueue } from '@comunica/types';
5
+ import type { Algebra } from '@comunica/utils-algebra';
6
6
  import type { SourceStateGetter, ISourceState } from './LinkedRdfSourcesAsyncRdfIterator';
7
7
  import { LinkedRdfSourcesAsyncRdfIterator } from './LinkedRdfSourcesAsyncRdfIterator';
8
8
  /**
9
- * An quad iterator that can iterate over consecutive RDF sources
9
+ * A quad iterator that can iterate over consecutive RDF sources
10
10
  * that are determined using the rdf-resolve-hypermedia-links bus.
11
11
  *
12
12
  * @see LinkedRdfSourcesAsyncRdfIterator
@@ -15,23 +15,11 @@ export declare class MediatedLinkedRdfSourcesAsyncRdfIterator extends LinkedRdfS
15
15
  private readonly mediatorMetadataAccumulate;
16
16
  private readonly mediatorRdfResolveHypermediaLinks;
17
17
  private readonly mediatorRdfResolveHypermediaLinksQueue;
18
- private readonly forceSourceType?;
19
18
  private readonly handledUrls;
20
- private readonly aggregatedStore;
21
- private readonly dataFactory;
22
- private readonly algebraFactory;
23
19
  private linkQueue;
24
- private wasForcefullyClosed;
25
- constructor(cacheSize: number, operation: Algebra.Operation, queryBindingsOptions: IQueryBindingsOptions | undefined, context: IActionContext, forceSourceType: string | undefined, firstUrl: string, maxIterators: number, sourceStateGetter: SourceStateGetter, aggregatedStore: IAggregatedStore | undefined, mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate, mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks, mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue, dataFactory: ComunicaDataFactory, algebraFactory: Factory);
26
- close(): void;
27
- destroy(cause?: Error): void;
20
+ constructor(operation: Algebra.Operation, queryBindingsOptions: IQueryBindingsOptions | undefined, context: IActionContext, firstLink: ILink, maxIterators: number, sourceStateGetter: SourceStateGetter, mediatorMetadataAccumulate: MediatorRdfMetadataAccumulate, mediatorRdfResolveHypermediaLinks: MediatorRdfResolveHypermediaLinks, mediatorRdfResolveHypermediaLinksQueue: MediatorRdfResolveHypermediaLinksQueue);
28
21
  protected isCloseable(linkQueue: ILinkQueue, requireQueueEmpty: boolean): boolean;
29
- protected canStartNewIterator(): boolean;
30
- protected canStartNewIteratorConsiderReadable(): boolean;
31
- protected isRunning(): boolean;
32
22
  getLinkQueue(): Promise<ILinkQueue>;
33
23
  protected getSourceLinks(metadata: Record<string, any>, startSource: ISourceState): Promise<ILink[]>;
34
- protected startIterator(startSource: ISourceState): void;
35
24
  accumulateMetadata(accumulatedMetadata: MetadataBindings, appendingMetadata: MetadataBindings): Promise<MetadataBindings>;
36
- protected updateMetadata(metadataNew: MetadataBindings): void;
37
25
  }