rdf-test-suite 2.1.6 → 2.2.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.
- package/README.md +2 -2
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/Util.js +2 -0
- package/lib/Util.js.map +1 -1
- package/lib/testcase/TestCaseHandlers.js +2 -1
- package/lib/testcase/TestCaseHandlers.js.map +1 -1
- package/lib/testcase/sparql/IQueryEngine.d.ts +1 -0
- package/lib/testcase/sparql/IQueryEngine.js.map +1 -1
- package/lib/testcase/sparql/TestCaseCsvResultFormat.d.ts +45 -0
- package/lib/testcase/sparql/TestCaseCsvResultFormat.js +163 -0
- package/lib/testcase/sparql/TestCaseCsvResultFormat.js.map +1 -0
- package/lib/testcase/sparql/TestCaseQueryEvaluation.d.ts +12 -0
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js +84 -0
- package/lib/testcase/sparql/TestCaseQueryEvaluation.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -297,8 +297,8 @@ $ rdf-test-suite myengine.js https://w3c.github.io/rdf-tests/sparql/sparql11/man
|
|
|
297
297
|
| [SPARQL 1.0 tests](https://w3c.github.io/rdf-tests/sparql/sparql10/) | [SPARQL 1.0](https://www.w3.org/TR/rdf-sparql-query/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | https://w3c.github.io/rdf-tests/sparql/sparql10/manifest.ttl |
|
|
298
298
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Query](http://www.w3.org/TR/sparql11-query/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
299
299
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Update](http://www.w3.org/TR/sparql11-update/) | [`IUpdateEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IUpdateEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
300
|
-
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results CSV/TSV](http://www.w3.org/TR/sparql11-results-csv-tsv/) |
|
|
301
|
-
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results JSON](http://www.w3.org/TR/sparql11-results-json/) |
|
|
300
|
+
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results CSV/TSV](http://www.w3.org/TR/sparql11-results-csv-tsv/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
301
|
+
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Results JSON](http://www.w3.org/TR/sparql11-results-json/) | [`IQueryEngine`](https://github.com/rubensworks/rdf-test-suite.js/blob/master/lib/testcase/sparql/IQueryEngine.ts) | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
302
302
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Federated Query](http://www.w3.org/TR/sparql11-federated-query/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
303
303
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Entailment](http://www.w3.org/TR/sparql11-entailment/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
|
304
304
|
| [SPARQL 1.1 tests](https://w3c.github.io/rdf-tests/sparql/sparql11/) | [SPARQL 1.1 Service Description](http://www.w3.org/TR/sparql11-service-description/) | ✖ | http://w3c.github.io/rdf-tests/sparql/sparql11/manifest-all.ttl |
|
package/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from './lib/testcase/sparql/IUpdateEngine';
|
|
|
14
14
|
export * from './lib/testcase/sparql/QueryResultBindings';
|
|
15
15
|
export * from './lib/testcase/sparql/QueryResultBoolean';
|
|
16
16
|
export * from './lib/testcase/sparql/QueryResultQuads';
|
|
17
|
+
export * from './lib/testcase/sparql/TestCaseCsvResultFormat';
|
|
17
18
|
export * from './lib/testcase/sparql/TestCaseNegativeSyntax';
|
|
18
19
|
export * from './lib/testcase/sparql/TestCasePositiveSyntax';
|
|
19
20
|
export * from './lib/testcase/sparql/TestCaseQueryEvaluation';
|
package/index.js
CHANGED
|
@@ -30,6 +30,7 @@ __exportStar(require("./lib/testcase/sparql/IUpdateEngine"), exports);
|
|
|
30
30
|
__exportStar(require("./lib/testcase/sparql/QueryResultBindings"), exports);
|
|
31
31
|
__exportStar(require("./lib/testcase/sparql/QueryResultBoolean"), exports);
|
|
32
32
|
__exportStar(require("./lib/testcase/sparql/QueryResultQuads"), exports);
|
|
33
|
+
__exportStar(require("./lib/testcase/sparql/TestCaseCsvResultFormat"), exports);
|
|
33
34
|
__exportStar(require("./lib/testcase/sparql/TestCaseNegativeSyntax"), exports);
|
|
34
35
|
__exportStar(require("./lib/testcase/sparql/TestCasePositiveSyntax"), exports);
|
|
35
36
|
__exportStar(require("./lib/testcase/sparql/TestCaseQueryEvaluation"), exports);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wFAAsE;AACtE,uFAAqE;AACrE,sFAAoE;AACpE,8FAA4E;AAC5E,wEAAsD;AACtD,0EAAwD;AACxD,mEAAiD;AACjD,uEAAqD;AACrD,kFAAgE;AAChE,8EAA4D;AAC5D,qEAAmD;AACnD,wEAAsD;AACtD,sEAAoD;AACpD,4EAA0D;AAC1D,2EAAyD;AACzD,yEAAuD;AACvD,gFAA8D;AAC9D,+EAA6D;AAC7D,+EAA6D;AAC7D,gFAA8D;AAC9D,iFAA+D;AAC/D,2DAAyC;AACzC,kEAAgD;AAChD,qEAAmD;AACnD,kDAAgC;AAChC,uDAAqC;AACrC,wDAAsC;AACtC,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,6DAA2C;AAC3C,oEAAkD","sourcesContent":["export * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nexport * from './lib/testcase/rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nexport * from './lib/testcase/rdfsyntax/TestCaseEval';\nexport * from './lib/testcase/rdfsyntax/TestCaseSyntax';\nexport * from './lib/testcase/rdfsyntax/IParser';\nexport * from './lib/testcase/rdfsyntax/ISerializer';\nexport * from './lib/testcase/rdfsyntax/ITestCaseFromRdfSyntax';\nexport * from './lib/testcase/rdfsyntax/ITestCaseRdfSyntax';\nexport * from './lib/testcase/sparql/IQueryEngine';\nexport * from './lib/testcase/sparql/ITestCaseSparql';\nexport * from './lib/testcase/sparql/IUpdateEngine';\nexport * from './lib/testcase/sparql/QueryResultBindings';\nexport * from './lib/testcase/sparql/QueryResultBoolean';\nexport * from './lib/testcase/sparql/QueryResultQuads';\nexport * from './lib/testcase/sparql/TestCaseCsvResultFormat';\nexport * from './lib/testcase/sparql/TestCaseNegativeSyntax';\nexport * from './lib/testcase/sparql/TestCasePositiveSyntax';\nexport * from './lib/testcase/sparql/TestCaseQueryEvaluation';\nexport * from './lib/testcase/sparql/TestCaseUpdateEvaluation';\nexport * from './lib/testcase/ITestCase';\nexport * from './lib/testcase/ITestCaseHandler';\nexport * from './lib/testcase/TestCaseUnsupported';\nexport * from './lib/IManifest';\nexport * from './lib/ManifestLoader';\nexport * from './lib/TestSuiteRunner';\nexport * from './lib/Util';\nexport * from './lib/ErrorSkipped';\nexport * from './lib/ErrorTest';\nexport * from './lib/DocumentLoaderCached';\nexport * from './lib/testcase/TestCaseMediaTypes';\n"]}
|
package/lib/Util.js
CHANGED
|
@@ -226,11 +226,13 @@ Util.colorMagenta = '\x1B[35m';
|
|
|
226
226
|
Util.colorCyan = '\x1B[36m';
|
|
227
227
|
Util.colorGray = '\x1B[90m';
|
|
228
228
|
Util.extensionToContentType = {
|
|
229
|
+
csv: 'text/csv',
|
|
229
230
|
jsonld: 'application/ld+json',
|
|
230
231
|
nq: 'application/n-quads',
|
|
231
232
|
nt: 'application/n-triples',
|
|
232
233
|
srj: 'application/sparql-results+json',
|
|
233
234
|
srx: 'application/sparql-results+xml',
|
|
235
|
+
tsv: 'text/tab-separated-values',
|
|
234
236
|
ttl: 'text/turtle',
|
|
235
237
|
};
|
|
236
238
|
//# sourceMappingURL=Util.js.map
|
package/lib/Util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Util.js","sourceRoot":"","sources":["Util.ts"],"names":[],"mappings":"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","sourcesContent":["import { createReadStream, createWriteStream, existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { PassThrough } from 'node:stream';\nimport type * as RDF from '@rdfjs/types';\n\n// eslint-disable-next-line ts/no-require-imports\nimport isStream = require('is-stream');\nimport { JsonLdParser } from 'jsonld-streaming-parser';\nimport { RdfXmlParser } from 'rdfxml-streaming-parser';\nimport { ReadableWebToNodeStream } from 'readable-web-to-node-stream';\nimport { DocumentLoaderCached } from './DocumentLoaderCached';\nimport { GeneralizedN3StreamParser } from './GeneralizedN3StreamParser';\n\n/**\n * Utility functions\n */\n// eslint-disable-next-line ts/no-extraneous-class\nexport class Util {\n public static colorReset = '\\x1B[0m';\n public static colorRed = '\\x1B[31m';\n public static colorGreen = '\\x1B[32m';\n public static colorYellow = '\\x1B[33m';\n public static colorBlue = '\\x1B[34m';\n public static colorMagenta = '\\x1B[35m';\n public static colorCyan = '\\x1B[36m';\n public static colorGray = '\\x1B[90m';\n\n protected static readonly extensionToContentType: Record<string, string> = {\n jsonld: 'application/ld+json',\n nq: 'application/n-quads',\n nt: 'application/n-triples',\n srj: 'application/sparql-results+json',\n srx: 'application/sparql-results+xml',\n ttl: 'text/turtle',\n };\n\n /**\n * Determine the content type of the given URL based on the headers.\n * @param {string} url The URL to get the content type from.\n * @param {Headers} headers The headers of the given URL.\n * @return {string} The content type.\n */\n public static identifyContentType(url: string, headers: Headers): string {\n const contentType = headers.get('Content-Type');\n return (contentType && !contentType.includes('application/octet-stream') ? contentType : false) ||\n Util.extensionToContentType[url.slice(url.lastIndexOf('.') + 1)] ||\n 'unknown';\n }\n\n /**\n * Convert https to http\n * @param {string} url A URL.\n * @return {string} An http URL.\n */\n public static normalizeBaseUrl(url: string): string {\n if (url.startsWith('https://')) {\n return url.replace('https', 'http');\n }\n return url;\n }\n\n /**\n * Fetch the given RDF document and parse it.\n * @param {string} url A URL.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Promise<[string , Stream]>} A promise resolving to a pair of a URL and a parsed RDF stream.\n */\n public static async fetchRdf(url: string, options: IFetchOptions = {}): Promise<[string, RDF.Stream]> {\n const response = await Util.fetchCached(url, options);\n const contentType = Util.identifyContentType(response.url, response.headers);\n const baseIri = options.normalizeUrl ? Util.normalizeBaseUrl(response.url) : response.url;\n return [ response.url, Util.parseRdfRaw(contentType, baseIri, response.body, options) ];\n }\n\n /**\n * Parses RDF based on the content type.\n * @param {string} contentType The content type of the given text stream.\n * @param {string} baseIRI The base IRI of the stream.\n * @param {NodeJS.ReadableStream} data Text stream in a certain RDF serialization.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Stream} A parsed RDF stream.\n */\n public static parseRdfRaw(\n contentType: string,\n baseIRI: string,\n data: NodeJS.ReadableStream,\n options: IFetchOptions = {},\n ): RDF.Stream {\n if (contentType.includes('application/x-turtle') ||\n contentType.includes('text/turtle') ||\n contentType.includes('application/n-triples') ||\n contentType.includes('application/n-quads') ||\n contentType.includes('application/trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: contentType }));\n }\n if (contentType.includes('application/rdf+xml')) {\n return data.pipe(new RdfXmlParser({ baseIRI }));\n }\n if (contentType.includes('application/ld+json')) {\n const documentLoader = new DocumentLoaderCached(options);\n return data.pipe(new JsonLdParser({ baseIRI, documentLoader }));\n }\n if (baseIRI.endsWith('.ttl')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'text/turtle' }));\n }\n if (baseIRI.endsWith('.trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'application/trig' }));\n }\n\n throw new Error(`Could not parse the RDF serialization ${contentType} on ${baseIRI}`);\n }\n\n /**\n * Fetch the given URL or retrieve it from a local file cache.\n * @param {string} url The URL to fetch.\n * @param {IFetchOptions} options Options for fetching.\n * @param {RequestInit} init Fetch init options.\n * @return {Promise<IFetchResponse>} A promise resolving to the response.\n */\n public static async fetchCached(\n url: string,\n options: IFetchOptions = {},\n init?: RequestInit,\n ): Promise<IFetchResponse> {\n // First check local file mappings\n if (options.urlToFileMappings) {\n for (const urlToFileMapping of options.urlToFileMappings) {\n if (url.startsWith(urlToFileMapping.url)) {\n let pathSuffix = url.slice(urlToFileMapping.url.length);\n\n // Remove hashes from path\n const hashPos = pathSuffix.indexOf('#');\n if (hashPos >= 0) {\n pathSuffix = pathSuffix.slice(0, Math.max(0, hashPos));\n }\n\n // Resolve file path\n const filePath = urlToFileMapping.path + pathSuffix;\n if (!existsSync(filePath)) {\n throw new Error(`Could not find file ${filePath}`);\n }\n return {\n body: createReadStream(filePath),\n headers: new Headers({}),\n url: urlToFileMapping.url + pathSuffix,\n };\n }\n }\n }\n\n const encodedUrl = encodeURIComponent(url);\n const cachePathLocal: string = options.cachePath && encodedUrl.length <= 255 ?\n options.cachePath + encodedUrl :\n null;\n if (cachePathLocal && existsSync(cachePathLocal)) {\n // Read from cache\n return {\n body: createReadStream(cachePathLocal),\n headers: new Headers(JSON.parse(readFileSync(`${cachePathLocal}.headers`, { encoding: 'utf8' })) as HeadersInit),\n url: readFileSync(`${cachePathLocal}.url`, { encoding: 'utf8' }),\n };\n }\n // Do actual fetch\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Could not find ${url}`);\n }\n /* istanbul ignore next */\n const body: NodeJS.ReadableStream = isStream(response.body) || response.body === null ?\n response.body as unknown as NodeJS.ReadableStream :\n new ReadableWebToNodeStream(response.body);\n const body1 = body.pipe(new PassThrough());\n const body2 = body.pipe(new PassThrough());\n\n // Remove unneeded headers (copy to make sure the Headers object is not immutable)\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n headers.delete('content-encoding');\n\n if (cachePathLocal) {\n // Save in cache\n const writeStream = createWriteStream(cachePathLocal, 'utf8');\n body1.pipe(writeStream);\n // To fix the problem of files being empty sometimes\n await new Promise(resolve => setImmediate(resolve));\n try {\n writeFileSync(`${cachePathLocal}.url`, response.url || url);\n const headersRaw: Record<string, string> = {};\n for (const [ key, value ] of headers) {\n headersRaw[key] = value;\n }\n writeFileSync(`${cachePathLocal}.headers`, JSON.stringify(headersRaw));\n } catch (error) {\n // Silently ignore errors if name is too long\n if ((error as NodeJS.ErrnoException).code === 'ENAMETOOLONG') {\n // eslint-disable-next-line no-console\n console.error(String(error));\n } else {\n throw error;\n }\n }\n }\n\n return {\n body: body2,\n headers,\n url: response.url || url,\n };\n }\n\n /**\n * Resolve all values in a hash.\n * @param {{[p: string]: Promise<T>}} data A hash with promise values.\n * @return {Promise<{[p: string]: T}>} A hash with resolved promise values.\n */\n public static async promiseValues<T>(data: Record<string, Promise<T>>): Promise<Record<string, T>> {\n const newData: Record<string, T> = {};\n for (const key in data) {\n newData[key] = await data[key];\n }\n return newData;\n }\n\n /**\n * Convert a license string to a URI.\n * @param {string} license A license string.\n * @return {string} A license URI.\n */\n public static licenseToUri(license: string): string {\n // TODO: make this more error-prone like here:\n // https://github.com/LinkedSoftwareDependencies/npm-extraction-server/blob/master/lib/npm/NpmContext.js#L151\n return `http://opensource.org/licenses/${license}`;\n }\n\n /**\n * Return a string in a given color\n * @param str The string that should be printed in\n * @param color A given color\n */\n public static withColor(str: any, color: string): string {\n return `${color}${str}${Util.colorReset}`;\n }\n}\n\n/**\n * A fetch response.\n */\nexport interface IFetchResponse {\n body: NodeJS.ReadableStream;\n headers: Headers;\n url: string;\n}\n\nexport interface IFetchOptions {\n /**\n * The base directory to cache files in. If falsy, then no cache will be used.\n */\n cachePath?: string;\n /**\n * If the base URL should be converted from https to http.\n */\n normalizeUrl?: boolean;\n /**\n * URL to local path mapping.\n */\n urlToFileMappings?: { url: string; path: string }[];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Util.js","sourceRoot":"","sources":["Util.ts"],"names":[],"mappings":"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","sourcesContent":["import { createReadStream, createWriteStream, existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { PassThrough } from 'node:stream';\nimport type * as RDF from '@rdfjs/types';\n\n// eslint-disable-next-line ts/no-require-imports\nimport isStream = require('is-stream');\nimport { JsonLdParser } from 'jsonld-streaming-parser';\nimport { RdfXmlParser } from 'rdfxml-streaming-parser';\nimport { ReadableWebToNodeStream } from 'readable-web-to-node-stream';\nimport { DocumentLoaderCached } from './DocumentLoaderCached';\nimport { GeneralizedN3StreamParser } from './GeneralizedN3StreamParser';\n\n/**\n * Utility functions\n */\n// eslint-disable-next-line ts/no-extraneous-class\nexport class Util {\n public static colorReset = '\\x1B[0m';\n public static colorRed = '\\x1B[31m';\n public static colorGreen = '\\x1B[32m';\n public static colorYellow = '\\x1B[33m';\n public static colorBlue = '\\x1B[34m';\n public static colorMagenta = '\\x1B[35m';\n public static colorCyan = '\\x1B[36m';\n public static colorGray = '\\x1B[90m';\n\n protected static readonly extensionToContentType: Record<string, string> = {\n csv: 'text/csv',\n jsonld: 'application/ld+json',\n nq: 'application/n-quads',\n nt: 'application/n-triples',\n srj: 'application/sparql-results+json',\n srx: 'application/sparql-results+xml',\n tsv: 'text/tab-separated-values',\n ttl: 'text/turtle',\n };\n\n /**\n * Determine the content type of the given URL based on the headers.\n * @param {string} url The URL to get the content type from.\n * @param {Headers} headers The headers of the given URL.\n * @return {string} The content type.\n */\n public static identifyContentType(url: string, headers: Headers): string {\n const contentType = headers.get('Content-Type');\n return (contentType && !contentType.includes('application/octet-stream') ? contentType : false) ||\n Util.extensionToContentType[url.slice(url.lastIndexOf('.') + 1)] ||\n 'unknown';\n }\n\n /**\n * Convert https to http\n * @param {string} url A URL.\n * @return {string} An http URL.\n */\n public static normalizeBaseUrl(url: string): string {\n if (url.startsWith('https://')) {\n return url.replace('https', 'http');\n }\n return url;\n }\n\n /**\n * Fetch the given RDF document and parse it.\n * @param {string} url A URL.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Promise<[string , Stream]>} A promise resolving to a pair of a URL and a parsed RDF stream.\n */\n public static async fetchRdf(url: string, options: IFetchOptions = {}): Promise<[string, RDF.Stream]> {\n const response = await Util.fetchCached(url, options);\n const contentType = Util.identifyContentType(response.url, response.headers);\n const baseIri = options.normalizeUrl ? Util.normalizeBaseUrl(response.url) : response.url;\n return [ response.url, Util.parseRdfRaw(contentType, baseIri, response.body, options) ];\n }\n\n /**\n * Parses RDF based on the content type.\n * @param {string} contentType The content type of the given text stream.\n * @param {string} baseIRI The base IRI of the stream.\n * @param {NodeJS.ReadableStream} data Text stream in a certain RDF serialization.\n * @param {IFetchOptions} options Options for fetching.\n * @return {Stream} A parsed RDF stream.\n */\n public static parseRdfRaw(\n contentType: string,\n baseIRI: string,\n data: NodeJS.ReadableStream,\n options: IFetchOptions = {},\n ): RDF.Stream {\n if (contentType.includes('application/x-turtle') ||\n contentType.includes('text/turtle') ||\n contentType.includes('application/n-triples') ||\n contentType.includes('application/n-quads') ||\n contentType.includes('application/trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: contentType }));\n }\n if (contentType.includes('application/rdf+xml')) {\n return data.pipe(new RdfXmlParser({ baseIRI }));\n }\n if (contentType.includes('application/ld+json')) {\n const documentLoader = new DocumentLoaderCached(options);\n return data.pipe(new JsonLdParser({ baseIRI, documentLoader }));\n }\n if (baseIRI.endsWith('.ttl')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'text/turtle' }));\n }\n if (baseIRI.endsWith('.trig')) {\n return data.pipe(new GeneralizedN3StreamParser({ baseIRI, format: 'application/trig' }));\n }\n\n throw new Error(`Could not parse the RDF serialization ${contentType} on ${baseIRI}`);\n }\n\n /**\n * Fetch the given URL or retrieve it from a local file cache.\n * @param {string} url The URL to fetch.\n * @param {IFetchOptions} options Options for fetching.\n * @param {RequestInit} init Fetch init options.\n * @return {Promise<IFetchResponse>} A promise resolving to the response.\n */\n public static async fetchCached(\n url: string,\n options: IFetchOptions = {},\n init?: RequestInit,\n ): Promise<IFetchResponse> {\n // First check local file mappings\n if (options.urlToFileMappings) {\n for (const urlToFileMapping of options.urlToFileMappings) {\n if (url.startsWith(urlToFileMapping.url)) {\n let pathSuffix = url.slice(urlToFileMapping.url.length);\n\n // Remove hashes from path\n const hashPos = pathSuffix.indexOf('#');\n if (hashPos >= 0) {\n pathSuffix = pathSuffix.slice(0, Math.max(0, hashPos));\n }\n\n // Resolve file path\n const filePath = urlToFileMapping.path + pathSuffix;\n if (!existsSync(filePath)) {\n throw new Error(`Could not find file ${filePath}`);\n }\n return {\n body: createReadStream(filePath),\n headers: new Headers({}),\n url: urlToFileMapping.url + pathSuffix,\n };\n }\n }\n }\n\n const encodedUrl = encodeURIComponent(url);\n const cachePathLocal: string = options.cachePath && encodedUrl.length <= 255 ?\n options.cachePath + encodedUrl :\n null;\n if (cachePathLocal && existsSync(cachePathLocal)) {\n // Read from cache\n return {\n body: createReadStream(cachePathLocal),\n headers: new Headers(JSON.parse(readFileSync(`${cachePathLocal}.headers`, { encoding: 'utf8' })) as HeadersInit),\n url: readFileSync(`${cachePathLocal}.url`, { encoding: 'utf8' }),\n };\n }\n // Do actual fetch\n const response = await fetch(url, init);\n if (!response.ok) {\n throw new Error(`Could not find ${url}`);\n }\n /* istanbul ignore next */\n const body: NodeJS.ReadableStream = isStream(response.body) || response.body === null ?\n response.body as unknown as NodeJS.ReadableStream :\n new ReadableWebToNodeStream(response.body);\n const body1 = body.pipe(new PassThrough());\n const body2 = body.pipe(new PassThrough());\n\n // Remove unneeded headers (copy to make sure the Headers object is not immutable)\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n headers.delete('content-encoding');\n\n if (cachePathLocal) {\n // Save in cache\n const writeStream = createWriteStream(cachePathLocal, 'utf8');\n body1.pipe(writeStream);\n // To fix the problem of files being empty sometimes\n await new Promise(resolve => setImmediate(resolve));\n try {\n writeFileSync(`${cachePathLocal}.url`, response.url || url);\n const headersRaw: Record<string, string> = {};\n for (const [ key, value ] of headers) {\n headersRaw[key] = value;\n }\n writeFileSync(`${cachePathLocal}.headers`, JSON.stringify(headersRaw));\n } catch (error) {\n // Silently ignore errors if name is too long\n if ((error as NodeJS.ErrnoException).code === 'ENAMETOOLONG') {\n // eslint-disable-next-line no-console\n console.error(String(error));\n } else {\n throw error;\n }\n }\n }\n\n return {\n body: body2,\n headers,\n url: response.url || url,\n };\n }\n\n /**\n * Resolve all values in a hash.\n * @param {{[p: string]: Promise<T>}} data A hash with promise values.\n * @return {Promise<{[p: string]: T}>} A hash with resolved promise values.\n */\n public static async promiseValues<T>(data: Record<string, Promise<T>>): Promise<Record<string, T>> {\n const newData: Record<string, T> = {};\n for (const key in data) {\n newData[key] = await data[key];\n }\n return newData;\n }\n\n /**\n * Convert a license string to a URI.\n * @param {string} license A license string.\n * @return {string} A license URI.\n */\n public static licenseToUri(license: string): string {\n // TODO: make this more error-prone like here:\n // https://github.com/LinkedSoftwareDependencies/npm-extraction-server/blob/master/lib/npm/NpmContext.js#L151\n return `http://opensource.org/licenses/${license}`;\n }\n\n /**\n * Return a string in a given color\n * @param str The string that should be printed in\n * @param color A given color\n */\n public static withColor(str: any, color: string): string {\n return `${color}${str}${Util.colorReset}`;\n }\n}\n\n/**\n * A fetch response.\n */\nexport interface IFetchResponse {\n body: NodeJS.ReadableStream;\n headers: Headers;\n url: string;\n}\n\nexport interface IFetchOptions {\n /**\n * The base directory to cache files in. If falsy, then no cache will be used.\n */\n cachePath?: string;\n /**\n * If the base URL should be converted from https to http.\n */\n normalizeUrl?: boolean;\n /**\n * URL to local path mapping.\n */\n urlToFileMappings?: { url: string; path: string }[];\n}\n"]}
|
|
@@ -7,6 +7,7 @@ const TestCaseJsonLdToRdf_1 = require("./rdfsyntax/jsonld/TestCaseJsonLdToRdf");
|
|
|
7
7
|
const TestCaseJsonLdToRdfNegative_1 = require("./rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative");
|
|
8
8
|
const TestCaseEval_1 = require("./rdfsyntax/TestCaseEval");
|
|
9
9
|
const TestCaseSyntax_1 = require("./rdfsyntax/TestCaseSyntax");
|
|
10
|
+
const TestCaseCsvResultFormat_1 = require("./sparql/TestCaseCsvResultFormat");
|
|
10
11
|
const TestCaseNegativeSyntax_1 = require("./sparql/TestCaseNegativeSyntax");
|
|
11
12
|
const TestCasePositiveSyntax_1 = require("./sparql/TestCasePositiveSyntax");
|
|
12
13
|
const TestCaseQueryEvaluation_1 = require("./sparql/TestCaseQueryEvaluation");
|
|
@@ -25,7 +26,7 @@ module.exports = {
|
|
|
25
26
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest11': new TestCaseNegativeSyntax_1.TestCaseNegativeSyntaxHandler(),
|
|
26
27
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11': new TestCasePositiveSyntax_1.TestCasePositiveSyntaxHandler(),
|
|
27
28
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest': new TestCaseUpdateEvaluation_1.TestCaseUpdateEvaluationHandler(),
|
|
28
|
-
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest': new
|
|
29
|
+
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest': new TestCaseCsvResultFormat_1.TestCaseCsvResultFormatHandler(),
|
|
29
30
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:ServiceDescriptionTest'), // TODO: implement
|
|
30
31
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement
|
|
31
32
|
'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest': new TestCaseUnsupported_1.TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":";;AAAA,oFAAwF;AACxF,oGAAwG;AACxG,kFAAsF;AACtF,gFAAoF;AACpF,gGAAoG;AACpG,2DAA+D;AAC/D,+DAAmE;AACnE,4EAAgF;AAChF,4EAAgF;AAChF,8EAAkF;AAClF,gFAAoF;AACpF,+DAAmE;AAEnE,MAAM,CAAC,OAAO,GAAG;IACf,oCAAoC;IACpC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,6EAA6E,EAC3E,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,mFAAmF,EACjF,IAAI,sDAA6B,EAAE;IACrC,8EAA8E,EAC5E,IAAI,wDAA8B,EAAE;IAEtC,wBAAwB;IACxB,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,qFAAqF,EACnF,IAAI,sDAA6B,EAAE;IACrC,+EAA+E,EAC7E,IAAI,0DAA+B,EAAE;IACvC,8EAA8E,EAC5E,IAAI,
|
|
1
|
+
{"version":3,"file":"TestCaseHandlers.js","sourceRoot":"","sources":["TestCaseHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { TestCaseJsonLdFromRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdf';\nimport { TestCaseJsonLdFromRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdFromRdfNegative';\nimport { TestCaseJsonLdSyntaxHandler } from './rdfsyntax/jsonld/TestCaseJsonLdSyntax';\nimport { TestCaseJsonLdToRdfHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdf';\nimport { TestCaseJsonLdToRdfNegativeHandler } from './rdfsyntax/jsonld/TestCaseJsonLdToRdfNegative';\nimport { TestCaseEvalHandler } from './rdfsyntax/TestCaseEval';\nimport { TestCaseSyntaxHandler } from './rdfsyntax/TestCaseSyntax';\nimport { TestCaseCsvResultFormatHandler } from './sparql/TestCaseCsvResultFormat';\nimport { TestCaseNegativeSyntaxHandler } from './sparql/TestCaseNegativeSyntax';\nimport { TestCasePositiveSyntaxHandler } from './sparql/TestCasePositiveSyntax';\nimport { TestCaseQueryEvaluationHandler } from './sparql/TestCaseQueryEvaluation';\nimport { TestCaseUpdateEvaluationHandler } from './sparql/TestCaseUpdateEvaluation';\nimport { TestCaseUnsupportedHandler } from './TestCaseUnsupported';\n\nmodule.exports = {\n // SPARQL 1.0, SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest':\n new TestCaseQueryEvaluationHandler(),\n\n // SPARQL 1.1 test suite\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#NegativeUpdateSyntaxTest11':\n new TestCaseNegativeSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#PositiveUpdateSyntaxTest11':\n new TestCasePositiveSyntaxHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#UpdateEvaluationTest':\n new TestCaseUpdateEvaluationHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest':\n new TestCaseCsvResultFormatHandler(),\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ServiceDescriptionTest':\n new TestCaseUnsupportedHandler('sparql:ServiceDescriptionTest'), // TODO: implement\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#ProtocolTest':\n new TestCaseUnsupportedHandler('sparql:ProtocolTest'), // TODO: implement\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#GraphStoreProtocolTest':\n new TestCaseUnsupportedHandler('sparql:GraphStoreProtocolTest'), // TODO: implement\n\n // RDF/XML test suite\n 'http://www.w3.org/ns/rdftest#TestXMLEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestXMLNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Triples test suite\n 'http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNTriplesNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // N-Quads test suite\n 'http://www.w3.org/ns/rdftest#TestNQuadsPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestNQuadsNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n\n // Turtle test suite\n 'http://www.w3.org/ns/rdftest#TestTurtleEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTurtleNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // TriG test suite\n 'http://www.w3.org/ns/rdftest#TestTrigEval':\n new TestCaseEvalHandler(),\n 'http://www.w3.org/ns/rdftest#TestTrigPositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'http://www.w3.org/ns/rdftest#TestTrigNegativeEval':\n new TestCaseSyntaxHandler(false),\n\n // JSON-LD test suite\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdToRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveSyntaxTest':\n new TestCaseJsonLdSyntaxHandler(true),\n 'https://w3c.github.io/json-ld-api/tests/vocab#ToRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdToRdfNegativeHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#PositiveEvaluationTest':\n new TestCaseJsonLdFromRdfHandler(),\n 'https://w3c.github.io/json-ld-api/tests/vocab#FromRDFTest https://w3c.github.io/json-ld-api/tests/vocab#NegativeEvaluationTest':\n new TestCaseJsonLdFromRdfNegativeHandler(),\n\n // RDFa test suite\n 'http://rdfa.info/vocabs/rdfa-test#PositiveEvaluationTest':\n new TestCaseEvalHandler(),\n 'http://rdfa.info/vocabs/rdfa-test#NegativeEvaluationTest':\n new TestCaseSyntaxHandler(true), // RDFa test suite never expect errors, just empty documents\n\n // Microdata-RDF test suite\n 'http://www.w3.org/ns/rdftest#TestMicrodataEval':\n new TestCaseEvalHandler({ normalizeUrl: true }),\n 'http://www.w3.org/ns/rdftest#TestMicrodataNegativeSyntax':\n new TestCaseSyntaxHandler(true), // Microdata-RDF test suite never expect errors, just empty documents\n\n // N3 test suite\n 'https://w3c.github.io/N3/tests/test.n3#TestN3PositiveSyntax':\n new TestCaseSyntaxHandler(true),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3NegativeSyntax':\n new TestCaseSyntaxHandler(false),\n 'https://w3c.github.io/N3/tests/test.n3#TestN3Eval':\n new TestCaseEvalHandler(),\n\n};\n"]}
|
|
@@ -5,6 +5,7 @@ import type * as RDF from '@rdfjs/types';
|
|
|
5
5
|
export interface IQueryEngine {
|
|
6
6
|
parse: (queryString: string, options: Record<string, any>) => Promise<void>;
|
|
7
7
|
query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;
|
|
8
|
+
queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Super type for all query result types.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IQueryEngine.js","sourceRoot":"","sources":["IQueryEngine.ts"],"names":[],"mappings":"","sourcesContent":["import type * as RDF from '@rdfjs/types';\n\n/**\n * A query engine handler.\n */\nexport interface IQueryEngine {\n parse: (queryString: string, options: Record<string, any>) => Promise<void>;\n query: (data: RDF.Quad[], queryString: string, options: Record<string, any>) => Promise<IQueryResult>;\n queryResultFormat?: (data: RDF.Quad[], queryString: string, mediaType: string, options: Record<string, any>) => Promise<NodeJS.ReadableStream>;\n}\n\n/**\n * Super type for all query result types.\n */\nexport type IQueryResult = IQueryResultBoolean | IQueryResultQuads | IQueryResultBindings;\n\n/**\n * Holds a boolean query result.\n */\nexport interface IQueryResultBoolean {\n type: 'boolean';\n value: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds quad-based query results.\n */\nexport interface IQueryResultQuads {\n type: 'quads';\n value: RDF.Quad[];\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n\n/**\n * Holds bindings-based query results.\n */\nexport interface IQueryResultBindings {\n type: 'bindings';\n variables: string[];\n value: Record<string, RDF.Term>[];\n checkOrder: boolean;\n equals: (that: IQueryResult, laxCardinality?: boolean) => boolean;\n toString: () => string;\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type * as RDF from '@rdfjs/types';
|
|
2
|
+
import type { Resource } from 'rdf-object';
|
|
3
|
+
import type { IFetchOptions, IFetchResponse } from '../../Util';
|
|
4
|
+
import type { ITestCaseData } from '../ITestCase';
|
|
5
|
+
import type { ITestCaseHandler } from '../ITestCaseHandler';
|
|
6
|
+
import type { IQueryEngine } from './IQueryEngine';
|
|
7
|
+
import type { ITestCaseSparql } from './ITestCaseSparql';
|
|
8
|
+
import type { IQueryDataLink } from './TestCaseQueryEvaluation';
|
|
9
|
+
/**
|
|
10
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TestCaseCsvResultFormatHandler implements ITestCaseHandler<TestCaseCsvResultFormat> {
|
|
13
|
+
resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseCsvResultFormat>;
|
|
14
|
+
}
|
|
15
|
+
export interface ITestCaseCsvResultFormatProps {
|
|
16
|
+
baseIRI: string;
|
|
17
|
+
queryString: string;
|
|
18
|
+
queryData: RDF.Quad[];
|
|
19
|
+
expectedResult: string;
|
|
20
|
+
resultSource: IFetchResponse;
|
|
21
|
+
queryDataLinks: IQueryDataLink[];
|
|
22
|
+
}
|
|
23
|
+
export declare class TestCaseCsvResultFormat implements ITestCaseSparql {
|
|
24
|
+
readonly type = "sparql";
|
|
25
|
+
readonly approval: string;
|
|
26
|
+
readonly approvedBy: string;
|
|
27
|
+
readonly comment: string;
|
|
28
|
+
readonly types: string[];
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly uri: string;
|
|
31
|
+
readonly baseIRI: string;
|
|
32
|
+
readonly queryString: string;
|
|
33
|
+
readonly queryData: RDF.Quad[];
|
|
34
|
+
readonly expectedResult: string;
|
|
35
|
+
readonly resultSource: IFetchResponse;
|
|
36
|
+
readonly queryDataLinks: IQueryDataLink[];
|
|
37
|
+
constructor(testCaseData: ITestCaseData, props: ITestCaseCsvResultFormatProps);
|
|
38
|
+
static parseCsv(result: string): {
|
|
39
|
+
variables: string[];
|
|
40
|
+
rows: Record<string, string>[];
|
|
41
|
+
};
|
|
42
|
+
private static matchRows;
|
|
43
|
+
static csvResultsEqual(expected: string, actual: string): boolean;
|
|
44
|
+
test(engine: IQueryEngine, injectArguments: any): Promise<void>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TestCaseCsvResultFormat = exports.TestCaseCsvResultFormatHandler = void 0;
|
|
13
|
+
const papaparse_1 = require("papaparse");
|
|
14
|
+
const ErrorTest_1 = require("../../ErrorTest");
|
|
15
|
+
const Util_1 = require("../../Util");
|
|
16
|
+
const TestCaseQueryEvaluation_1 = require("./TestCaseQueryEvaluation");
|
|
17
|
+
// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires
|
|
18
|
+
const stringifyStream = require('stream-to-string');
|
|
19
|
+
/**
|
|
20
|
+
* Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest.
|
|
21
|
+
*/
|
|
22
|
+
class TestCaseCsvResultFormatHandler {
|
|
23
|
+
resourceToTestCase(resource, testCaseData, options) {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
const action = resource.property.action;
|
|
26
|
+
if (!action) {
|
|
27
|
+
throw new Error(`Missing mf:action in ${resource}`);
|
|
28
|
+
}
|
|
29
|
+
if (!resource.property.result) {
|
|
30
|
+
throw new Error(`Missing mf:result in ${resource}`);
|
|
31
|
+
}
|
|
32
|
+
if (!action.property.query) {
|
|
33
|
+
throw new Error(`Missing qt:query in mf:action of ${resource}`);
|
|
34
|
+
}
|
|
35
|
+
const queryDataLinks = TestCaseQueryEvaluation_1.TestCaseQueryEvaluationHandler.getQueryDataLinks(action);
|
|
36
|
+
const queryData = yield TestCaseQueryEvaluation_1.TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);
|
|
37
|
+
const resultSource = yield Util_1.Util.fetchCached(resource.property.result.value, options);
|
|
38
|
+
return new TestCaseCsvResultFormat(testCaseData, {
|
|
39
|
+
baseIRI: Util_1.Util.normalizeBaseUrl(action.property.query.value),
|
|
40
|
+
expectedResult: yield stringifyStream(resultSource.body),
|
|
41
|
+
queryDataLinks,
|
|
42
|
+
queryData,
|
|
43
|
+
queryString: yield stringifyStream((yield Util_1.Util.fetchCached(action.property.query.value, options)).body),
|
|
44
|
+
resultSource,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.TestCaseCsvResultFormatHandler = TestCaseCsvResultFormatHandler;
|
|
50
|
+
class TestCaseCsvResultFormat {
|
|
51
|
+
constructor(testCaseData, props) {
|
|
52
|
+
this.type = 'sparql';
|
|
53
|
+
Object.assign(this, testCaseData);
|
|
54
|
+
Object.assign(this, props);
|
|
55
|
+
}
|
|
56
|
+
static parseCsv(result) {
|
|
57
|
+
const parsed = (0, papaparse_1.parse)(result, {
|
|
58
|
+
header: true,
|
|
59
|
+
skipEmptyLines: true,
|
|
60
|
+
});
|
|
61
|
+
const strictErrors = parsed.errors.filter(e => e.code !== 'UndetectableDelimiter');
|
|
62
|
+
if (strictErrors.length > 0) {
|
|
63
|
+
const error = strictErrors[0];
|
|
64
|
+
throw new Error(`Invalid CSV result (Row ${error.row}): ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
if (!parsed.meta.fields || parsed.meta.fields.length === 0) {
|
|
67
|
+
throw new Error('Invalid CSV result: Missing header row.');
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
variables: parsed.meta.fields,
|
|
71
|
+
rows: parsed.data,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
static matchRows(expectedRows, actualRows, bNodeMapping = {}) {
|
|
75
|
+
if (expectedRows.length === 0) {
|
|
76
|
+
return actualRows.length === 0;
|
|
77
|
+
}
|
|
78
|
+
const expectedRow = expectedRows[0];
|
|
79
|
+
const remainingExpected = expectedRows.slice(1);
|
|
80
|
+
for (let i = 0; i < actualRows.length; i++) {
|
|
81
|
+
const actualRow = actualRows[i];
|
|
82
|
+
const newMapping = Object.assign({}, bNodeMapping);
|
|
83
|
+
let rowMatches = true;
|
|
84
|
+
for (const [variable, expectedVal] of Object.entries(expectedRow)) {
|
|
85
|
+
const actualVal = actualRow[variable];
|
|
86
|
+
if (expectedVal && expectedVal.startsWith('_:')) {
|
|
87
|
+
if (!actualVal || !actualVal.startsWith('_:')) {
|
|
88
|
+
rowMatches = false;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (newMapping[expectedVal]) {
|
|
92
|
+
if (newMapping[expectedVal] !== actualVal) {
|
|
93
|
+
rowMatches = false;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
if (Object.values(newMapping).includes(actualVal)) {
|
|
99
|
+
rowMatches = false;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
newMapping[expectedVal] = actualVal;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (expectedVal !== actualVal) {
|
|
106
|
+
rowMatches = false;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (rowMatches) {
|
|
111
|
+
const remainingActual = [...actualRows.slice(0, i), ...actualRows.slice(i + 1)];
|
|
112
|
+
if (this.matchRows(remainingExpected, remainingActual, newMapping)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
static csvResultsEqual(expected, actual) {
|
|
120
|
+
try {
|
|
121
|
+
const expectedData = TestCaseCsvResultFormat.parseCsv(expected);
|
|
122
|
+
const actualData = TestCaseCsvResultFormat.parseCsv(actual);
|
|
123
|
+
if (expectedData.rows.length !== actualData.rows.length) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const expectedVars = expectedData.variables;
|
|
127
|
+
const actualVars = actualData.variables;
|
|
128
|
+
const expectedSorted = [...expectedVars].sort().join(',');
|
|
129
|
+
const actualSorted = [...actualVars].sort().join(',');
|
|
130
|
+
if (expectedSorted !== actualSorted) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
return TestCaseCsvResultFormat.matchRows(expectedData.rows, actualData.rows);
|
|
134
|
+
}
|
|
135
|
+
catch (_a) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
test(engine, injectArguments) {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
if (!engine.queryResultFormat) {
|
|
142
|
+
throw new ErrorTest_1.ErrorTest('CSV result format tests require queryResultFormat to be implemented by the query engine.');
|
|
143
|
+
}
|
|
144
|
+
const result = yield stringifyStream(yield engine.queryResultFormat(this.queryData, this.queryString, 'text/csv', Object.assign({ baseIRI: this.baseIRI }, injectArguments)));
|
|
145
|
+
if (!TestCaseCsvResultFormat.csvResultsEqual(this.expectedResult, result)) {
|
|
146
|
+
throw new ErrorTest_1.ErrorTest(`Invalid CSV result format
|
|
147
|
+
|
|
148
|
+
Query:\n\n${this.queryString}
|
|
149
|
+
|
|
150
|
+
Data links: ${TestCaseQueryEvaluation_1.TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}
|
|
151
|
+
|
|
152
|
+
Result Source: ${this.resultSource.url}
|
|
153
|
+
|
|
154
|
+
Expected:\n${this.expectedResult}
|
|
155
|
+
|
|
156
|
+
Got:\n${result}
|
|
157
|
+
`);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.TestCaseCsvResultFormat = TestCaseCsvResultFormat;
|
|
163
|
+
//# sourceMappingURL=TestCaseCsvResultFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestCaseCsvResultFormat.js","sourceRoot":"","sources":["TestCaseCsvResultFormat.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { parse } from 'papaparse';\nimport type { Resource } from 'rdf-object';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { TestCaseQueryEvaluation, TestCaseQueryEvaluationHandler } from './TestCaseQueryEvaluation';\nimport type { IQueryDataLink } from './TestCaseQueryEvaluation';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#CSVResultFormatTest.\n */\nexport class TestCaseCsvResultFormatHandler implements ITestCaseHandler<TestCaseCsvResultFormat> {\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseCsvResultFormat> {\n const action = resource.property.action;\n if (!action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const resultSource: IFetchResponse = await Util.fetchCached(resource.property.result.value, options);\n\n return new TestCaseCsvResultFormat(\n testCaseData,\n {\n baseIRI: Util.normalizeBaseUrl(action.property.query.value),\n expectedResult: await stringifyStream(resultSource.body),\n queryDataLinks,\n queryData,\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource,\n },\n );\n }\n}\n\nexport interface ITestCaseCsvResultFormatProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n expectedResult: string;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport class TestCaseCsvResultFormat implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly expectedResult: string;\n public readonly resultSource: IFetchResponse;\n public readonly queryDataLinks: IQueryDataLink[];\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseCsvResultFormatProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static parseCsv(result: string) {\n const parsed = parse<Record<string, string>>(result, {\n header: true,\n skipEmptyLines: true,\n });\n\n const strictErrors = parsed.errors.filter(e => e.code !== 'UndetectableDelimiter');\n\n if (strictErrors.length > 0) {\n const error = strictErrors[0];\n throw new Error(`Invalid CSV result (Row ${error.row}): ${error.message}`);\n }\n\n if (!parsed.meta.fields || parsed.meta.fields.length === 0) {\n throw new Error('Invalid CSV result: Missing header row.');\n }\n\n return {\n variables: parsed.meta.fields,\n rows: parsed.data,\n };\n }\n\n private static matchRows(\n expectedRows: Record<string, string>[],\n actualRows: Record<string, string>[],\n bNodeMapping: Record<string, string> = {},\n ): boolean {\n if (expectedRows.length === 0) {\n return actualRows.length === 0;\n }\n\n const expectedRow = expectedRows[0];\n const remainingExpected = expectedRows.slice(1);\n\n for (let i = 0; i < actualRows.length; i++) {\n const actualRow = actualRows[i];\n const newMapping = { ...bNodeMapping };\n let rowMatches = true;\n\n for (const [ variable, expectedVal ] of Object.entries(expectedRow)) {\n const actualVal = actualRow[variable];\n\n if (expectedVal && expectedVal.startsWith('_:')) {\n if (!actualVal || !actualVal.startsWith('_:')) {\n rowMatches = false;\n break;\n }\n\n if (newMapping[expectedVal]) {\n if (newMapping[expectedVal] !== actualVal) {\n rowMatches = false;\n break;\n }\n } else {\n if (Object.values(newMapping).includes(actualVal)) {\n rowMatches = false;\n break;\n }\n newMapping[expectedVal] = actualVal;\n }\n } else if (expectedVal !== actualVal) {\n rowMatches = false;\n break;\n }\n }\n\n if (rowMatches) {\n const remainingActual = [ ...actualRows.slice(0, i), ...actualRows.slice(i + 1) ];\n if (this.matchRows(remainingExpected, remainingActual, newMapping)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n public static csvResultsEqual(expected: string, actual: string): boolean {\n try {\n const expectedData = TestCaseCsvResultFormat.parseCsv(expected);\n const actualData = TestCaseCsvResultFormat.parseCsv(actual);\n\n if (expectedData.rows.length !== actualData.rows.length) {\n return false;\n }\n\n const expectedVars = expectedData.variables;\n const actualVars = actualData.variables;\n\n const expectedSorted = [ ...expectedVars ].sort().join(',');\n const actualSorted = [ ...actualVars ].sort().join(',');\n\n if (expectedSorted !== actualSorted) {\n return false;\n }\n\n return TestCaseCsvResultFormat.matchRows(expectedData.rows, actualData.rows);\n } catch {\n return false;\n }\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n if (!engine.queryResultFormat) {\n throw new ErrorTest('CSV result format tests require queryResultFormat to be implemented by the query engine.');\n }\n\n const result = await stringifyStream(await engine.queryResultFormat(\n this.queryData,\n this.queryString,\n 'text/csv',\n { baseIRI: this.baseIRI, ...injectArguments },\n ));\n\n if (!TestCaseCsvResultFormat.csvResultsEqual(this.expectedResult, result)) {\n throw new ErrorTest(`Invalid CSV result format\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected:\\n${this.expectedResult}\n\n Got:\\n${result}\n`);\n }\n }\n}\n"]}
|
|
@@ -38,6 +38,18 @@ export declare class TestCaseQueryEvaluationHandler implements ITestCaseHandler<
|
|
|
38
38
|
* @return {Promise<IQueryResultBindings>} A promise resolving to a bindings results object.
|
|
39
39
|
*/
|
|
40
40
|
static parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings>;
|
|
41
|
+
/**
|
|
42
|
+
* Parses query results from a SPARQL TSV stream.
|
|
43
|
+
* @param {NodeJS.ReadableStream} data The data stream to parse.
|
|
44
|
+
* @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.
|
|
45
|
+
*/
|
|
46
|
+
static parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Parse a single field from a SPARQL TSV result into an RDF term.
|
|
49
|
+
* @param {string} term The TSV field value.
|
|
50
|
+
* @return {RDF.Term} The corresponding RDF term.
|
|
51
|
+
*/
|
|
52
|
+
static parseTsvTerm(term: string): RDF.Term;
|
|
41
53
|
/**
|
|
42
54
|
* Obtain all data links for the given query test action.
|
|
43
55
|
* @param action A query test action.
|
|
@@ -14,6 +14,7 @@ const arrayify_stream_1 = require("arrayify-stream");
|
|
|
14
14
|
const rdf_data_factory_1 = require("rdf-data-factory");
|
|
15
15
|
const rdf_object_1 = require("rdf-object");
|
|
16
16
|
const rdf_string_1 = require("rdf-string");
|
|
17
|
+
const rdf_string_ttl_1 = require("rdf-string-ttl");
|
|
17
18
|
const rdf_terms_1 = require("rdf-terms");
|
|
18
19
|
const sparqljson_parse_1 = require("sparqljson-parse");
|
|
19
20
|
const sparqlxml_parse_1 = require("sparqlxml-parse");
|
|
@@ -60,6 +61,9 @@ class TestCaseQueryEvaluationHandler {
|
|
|
60
61
|
if (contentType.includes('application/sparql-results+json')) {
|
|
61
62
|
queryResult = yield TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);
|
|
62
63
|
}
|
|
64
|
+
if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {
|
|
65
|
+
queryResult = yield TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);
|
|
66
|
+
}
|
|
63
67
|
if (!queryResult) {
|
|
64
68
|
throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);
|
|
65
69
|
}
|
|
@@ -179,6 +183,86 @@ class TestCaseQueryEvaluationHandler {
|
|
|
179
183
|
return new QueryResultBindings_1.QueryResultBindings(variables, value, checkOrder);
|
|
180
184
|
});
|
|
181
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Parses query results from a SPARQL TSV stream.
|
|
188
|
+
* @param {NodeJS.ReadableStream} data The data stream to parse.
|
|
189
|
+
* @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.
|
|
190
|
+
*/
|
|
191
|
+
static parseSparqlTsvResults(data) {
|
|
192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
const text = yield stringifyStream(data);
|
|
194
|
+
const lines = text.replace(/\r?\n$/u, '').split(/\r?\n/u);
|
|
195
|
+
if (lines.length === 1) {
|
|
196
|
+
const singleLine = lines[0].trim().toLowerCase();
|
|
197
|
+
if (singleLine === 'true') {
|
|
198
|
+
return new QueryResultBoolean_1.QueryResultBoolean(true);
|
|
199
|
+
}
|
|
200
|
+
if (singleLine === 'false') {
|
|
201
|
+
return new QueryResultBoolean_1.QueryResultBoolean(false);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const variables = [];
|
|
205
|
+
if (lines[0].trim() !== '') {
|
|
206
|
+
const rawVariables = lines[0].split('\t');
|
|
207
|
+
for (const raw of rawVariables) {
|
|
208
|
+
const variable = raw.trim();
|
|
209
|
+
if (variable === '') {
|
|
210
|
+
throw new Error('Invalid TSV result: Empty column on the first row.');
|
|
211
|
+
}
|
|
212
|
+
if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {
|
|
213
|
+
throw new Error(`Invalid TSV variable: ${variable}`);
|
|
214
|
+
}
|
|
215
|
+
if (variables.includes(variable)) {
|
|
216
|
+
throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);
|
|
217
|
+
}
|
|
218
|
+
variables.push(variable);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const value = [];
|
|
222
|
+
for (let i = 1; i < lines.length; i++) {
|
|
223
|
+
const fields = lines[i].split('\t');
|
|
224
|
+
const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';
|
|
225
|
+
if (fields.length !== variables.length && !isZeroVariableResultRow) {
|
|
226
|
+
throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);
|
|
227
|
+
}
|
|
228
|
+
const binding = {};
|
|
229
|
+
for (const [j, variable] of variables.entries()) {
|
|
230
|
+
const field = fields[j].trim();
|
|
231
|
+
if (field.length > 0) {
|
|
232
|
+
try {
|
|
233
|
+
binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
throw new Error(`Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +
|
|
237
|
+
`Invalid Turtle syntax in "${field}".\nOriginal error: ${error.message}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
value.push(binding);
|
|
242
|
+
}
|
|
243
|
+
return new QueryResultBindings_1.QueryResultBindings(variables, value, false);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Parse a single field from a SPARQL TSV result into an RDF term.
|
|
248
|
+
* @param {string} term The TSV field value.
|
|
249
|
+
* @return {RDF.Term} The corresponding RDF term.
|
|
250
|
+
*/
|
|
251
|
+
static parseTsvTerm(term) {
|
|
252
|
+
if (/^[+-]?[0-9]+$/u.test(term)) {
|
|
253
|
+
return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));
|
|
254
|
+
}
|
|
255
|
+
if (/^[+-]?([0-9]+\.[0-9]*|\.[0-9]+)$/u.test(term)) {
|
|
256
|
+
return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));
|
|
257
|
+
}
|
|
258
|
+
if (/^[+-]?([0-9]+\.[0-9]*|\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {
|
|
259
|
+
return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));
|
|
260
|
+
}
|
|
261
|
+
if (term === 'true' || term === 'false') {
|
|
262
|
+
return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));
|
|
263
|
+
}
|
|
264
|
+
return (0, rdf_string_ttl_1.stringToTerm)(term);
|
|
265
|
+
}
|
|
182
266
|
/**
|
|
183
267
|
* Obtain all data links for the given query test action.
|
|
184
268
|
* @param action A query test action.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings>} A promise resolving to a bindings results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings> {\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(graphData.property.label.value)),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(graphData.value)),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, { ...options, normalizeUrl: true }))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value ===\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {\n laxCardinality = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: Util.normalizeBaseUrl(action.property.query.value),\n queryDataLinks,\n laxCardinality,\n queryData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const result: IQueryResult = await engine.query(this.queryData, this.queryString, { baseIRI: this.baseIRI, ...injectArguments });\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestCaseQueryEvaluation.js","sourceRoot":"","sources":["TestCaseQueryEvaluation.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,qDAAiD;AACjD,uDAA+C;AAE/C,2CAA6C;AAC7C,2CAA0C;AAC1C,mDAAiE;AAEjE,yCAAqC;AACrC,uDAAoD;AACpD,qDAAkD;AAClD,+CAA4C;AAE5C,qCAAkC;AAKlC,+DAA4D;AAC5D,6DAA0D;AAC1D,yDAAsD;AAEtD,qEAAqE;AACrE,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEpD,MAAM,EAAE,GAAG,IAAI,8BAAW,EAAE,CAAC;AAE7B;;GAEG;AACH,MAAa,8BAA8B;IACzC;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAO,gBAAgB,CAAC,WAAmB,EAAE,GAAW,EAAE,IAA2B;;YAChG,IAAI,WAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAe,WAAI,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvE,WAAW,GAAG,IAAI,mCAAgB,CAAC,MAAM,IAAA,gCAAc,EAAC,SAAS,CAAC,CAAC,CAAC;YACtE,CAAC;YAAC,WAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,gCAAgC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnF,WAAW,GAAG,gCAAgC,CAAC;gBAC/C,WAAW,GAAG,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;gBAC5D,WAAW,GAAG,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9E,WAAW,GAAG,MAAM,8BAA8B,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,sDAAsD,WAAW,OAAO,GAAG,EAAE,CAAC,CAAC;YACjG,CAAC;YAED,4BAA4B;YAC5B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC9D,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,iDAAiD;gBAC1F,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,iEAAiE,EAAE,CAAC;gBAC1G,OAAO,MAAM,8BAA8B,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;KAAA;IAED;;;;;OAKG;IACI,MAAM,CAAO,kBAAkB,CAAC,IAAoB,EAAE,IAA2B;;YACtF,IAAI,cAAgC,CAAC;YACrC,IAAI,cAAqC,CAAC;YAC1C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACrD,cAAc,GAAG,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAI,iCAAe,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzE,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACpD,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,eAAe,GAA0D,OAAO,CAAC,GAAG,CAAC;gBACzF,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;oBACtC,cAAc;yBACX,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;yBACxB,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,CAAC,CAAC;gBACF,IAAA,gCAAc,EAAC,cAAc,CAAC;aAC/B,CAAC,CAAC;YAEH,iDAAiD;YACjD,IAAI,aAAa,GAAU,IAAI,CAAC;YAChC,IAAI,YAAY,GAAU,IAAI,CAAC;YAC/B,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAO,EAAE;oBAC9B,YAAY,GAAG,CAAC,CAAC;oBACjB,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;gBACF,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAO,EAAE;oBAC/B,aAAa,GAAG,CAAC,CAAC;oBAClB,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,uCAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,IAAI,yCAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAsB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1I,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCACT,aAAa,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;KAAA;IAED;;;;;OAKG;IACI,MAAM,CAAO,kBAAkB,CAAC,KAAiB;;YACtD,gEAAgE;YAChE,MAAM,YAAY,GAAG,IAAI,4BAAe,CAAC;gBACvC,OAAO,EAAE;oBACP,MAAM,EAAE,wDAAwD;oBAChE,QAAQ,EAAE,gBAAgB;oBAC1B,KAAK,EAAE,cAAc;oBACrB,eAAe,EAAE,uBAAuB;oBACxC,SAAS,EAAE,iBAAiB;oBAC5B,KAAK,EAAE,cAAc;oBACrB,QAAQ,EAAE,iBAAiB;iBAC5B;aACF,CAAC,CAAC;YACH,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,SAAS,GAAa,IAAI,CAAC;YAC/B,KAAK,MAAM,YAAY,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAClD,IAAI,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC;qBACrC,GAAG,CAAC,IAAA,yBAAY,EAAC,iEAAiE,CAAC,CAAC,EAAE,CAAC;oBACxF,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAa,SAAS,CAAC,UAAU,CAAC,eAAe;iBAC7D,GAAG,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAErD,kCAAkC;YAClC,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACzC,KAAK,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAC5B,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,gDAAgD;YAChD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,SAAS,CAAC,IAAI,CAAC,CAAC,SAAmB,EAAE,SAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1K,CAAC;YAED,iCAAiC;YACjC,MAAM,KAAK,GAA+B,SAAS,CAAC,GAAG,CAAC,CAAC,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAa,EAAE,OAAiB,EAAE,EAAE;gBACvJ,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9E,OAAO,QAAQ,CAAC;YAClB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAER,OAAO,IAAI,yCAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;KAAA;IAED;;;;OAIG;IACI,MAAM,CAAO,qBAAqB,CAAC,IAA2B;;YACnE,MAAM,IAAI,GAAW,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACjD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;oBAC1B,OAAO,IAAI,uCAAkB,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,OAAO,IAAI,uCAAkB,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE1C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;oBAE5B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;wBACpB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;oBACxE,CAAC;oBAED,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpF,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;oBACvD,CAAC;oBAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,qBAAqB,CAAC,CAAC;oBACrF,CAAC;oBAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAA+B,EAAE,CAAC;YAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEpC,MAAM,uBAAuB,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBAElG,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,qBAAqB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtH,CAAC;gBAED,MAAM,OAAO,GAA6B,EAAE,CAAC;gBAE7C,KAAK,MAAM,CAAE,CAAC,EAAE,QAAQ,CAAE,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,IAAI,CAAC;4BACH,OAAO,CAAC,QAAQ,CAAC,GAAG,8BAA8B,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBACzE,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BACpB,MAAM,IAAI,KAAK,CACjB,qCAAqC,CAAC,GAAG,CAAC,aAAa,QAAQ,KAAK;gCACpE,6BAA6B,KAAK,uBAAuB,KAAK,CAAC,OAAO,EAAE,CACrE,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,yCAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;KAAA;IAED;;;;OAIG;IACI,MAAM,CAAC,YAAY,CAAC,IAAY;QACrC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,IAAA,6BAAe,EAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAgB;QAC9C,MAAM,cAAc,GAAqB,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,cAAc,CAAC,IAAI,CAAC;gBAClB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK;aACpC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC7B,cAAc,CAAC,IAAI,CAAC;oBAClB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;oBACvC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBAC/E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,IAAI,CAAC;oBAClB,OAAO,EAAE,SAAS,CAAC,KAAK;oBACxB,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAO,qBAAqB,CAAC,cAAgC,EAAE,OAAuB;;YACjG,IAAI,SAAS,GAAe,EAAE,CAAC;YAC/B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;gBAC3C,IAAI,aAAa,GAAe,MAAM,IAAA,gCAAc,EAAC,CAAC,MAAM,WAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,kCAAO,OAAO,KAAE,YAAY,EAAE,IAAI,IAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1I,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;oBAC5B,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,oBAAQ,EAAC,IAAI,EAAE,CAAC,KAAe,EAAE,GAAiB,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvJ,CAAC;gBACD,SAAS,GAAG,CAAE,GAAG,SAAS,EAAE,GAAG,aAAa,CAAE,CAAC;YACjD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEY,kBAAkB,CAAC,QAAkB,EAAE,YAA2B,EAAE,OAAuB;;YACtG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,0BAA0B;YAC1B,MAAM,cAAc,GAAqB,8BAA8B,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAElG,qCAAqC;YACrC,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK;gBAClF,yEAAyE,EAAE,CAAC;gBAC5E,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAe,MAAM,8BAA8B,CAAC,qBAAqB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAElH,MAAM,aAAa,GAAG,MAAM,WAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtF,OAAO,IAAI,uBAAuB,CAChC,YAAY,EACZ;gBACE,OAAO,EAAE,WAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC3D,cAAc;gBACd,cAAc;gBACd,SAAS;gBACT,WAAW,EAAE,MAAM,8BAA8B,CAAC,gBAAgB,CAChE,WAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,EAClE,aAAa,CAAC,GAAG,EACjB,aAAa,CAAC,IAAI,CACnB;gBACD,WAAW,EAAE,MAAM,eAAe,CAAC,CAAC,MAAM,WAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvG,YAAY,EAAE,aAAa;aAC5B,CACF,CAAC;QACJ,CAAC;KAAA;CACF;AA1VD,wEA0VC;AAiBD,MAAa,uBAAuB;IAiBlC,YAAY,YAA2B,EAAE,KAAoC;QAhB7D,SAAI,GAAG,QAAQ,CAAC;QAiB9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,sBAAsB,CAAC,cAAgC;QACnE,OAAO,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,aAAa,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1K,CAAC;IAEY,IAAI,CAAC,MAAoB,EAAE,eAAoB;;YAC1D,MAAM,MAAM,GAAiB,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,kBAAI,OAAO,EAAE,IAAI,CAAC,OAAO,IAAK,eAAe,EAAG,CAAC;YACjI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,qBAAS,CAAC;;cAEZ,IAAI,CAAC,WAAW;;gBAEd,uBAAuB,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC;;mBAEhE,IAAI,CAAC,YAAY,CAAC,GAAG;;cAE1B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;YAE7B,MAAM,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;YACC,CAAC;QACH,CAAC;KAAA;CACF;AA3CD,0DA2CC","sourcesContent":["import type * as RDF from '@rdfjs/types';\nimport { arrayifyStream } from 'arrayify-stream';\nimport { DataFactory } from 'rdf-data-factory';\nimport type { Resource } from 'rdf-object';\nimport { RdfObjectLoader } from 'rdf-object';\nimport { stringToTerm } from 'rdf-string';\nimport { stringToTerm as stringToTtlTerm } from 'rdf-string-ttl';\nimport type { QuadTermName } from 'rdf-terms';\nimport { mapTerms } from 'rdf-terms';\nimport { SparqlJsonParser } from 'sparqljson-parse';\nimport { SparqlXmlParser } from 'sparqlxml-parse';\nimport { ErrorTest } from '../../ErrorTest';\nimport type { IFetchOptions, IFetchResponse } from '../../Util';\nimport { Util } from '../../Util';\nimport type { ITestCaseData } from '../ITestCase';\nimport type { ITestCaseHandler } from '../ITestCaseHandler';\nimport type { IQueryEngine, IQueryResult, IQueryResultBindings } from './IQueryEngine';\nimport type { ITestCaseSparql } from './ITestCaseSparql';\nimport { QueryResultBindings } from './QueryResultBindings';\nimport { QueryResultBoolean } from './QueryResultBoolean';\nimport { QueryResultQuads } from './QueryResultQuads';\n\n// eslint-disable-next-line ts/no-require-imports, ts/no-var-requires\nconst stringifyStream = require('stream-to-string');\n\nconst DF = new DataFactory();\n\n/**\n * Test case handler for http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#QueryEvaluationTest.\n */\nexport class TestCaseQueryEvaluationHandler implements ITestCaseHandler<TestCaseQueryEvaluation> {\n /**\n * Parse SPARQL query results in any of the following content types:\n * * application/sparql-results+xml (bindings/ask)\n * * application/sparql-results+json (bindings/ask)\n * * Any RDF serialization (quads)\n *\n * If the results has as first triple '[] a <http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet>',\n * the it will be considered as a DAWG result set, and parsed as such. (bindings)\n *\n * @param {string} contentType The content type.\n * @param {string} url The base IRI.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseQueryResult(contentType: string, url: string, data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let queryResult: IQueryResult;\n try {\n const rdfStream: RDF.Stream = Util.parseRdfRaw(contentType, url, data);\n queryResult = new QueryResultQuads(await arrayifyStream(rdfStream));\n } catch {\n // Fallthrough to the next cases\n }\n if (contentType.includes('application/sparql-results+xml') || url.endsWith('.srx')) {\n contentType = 'application/sparql-results+xml';\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('xml', data);\n }\n if (contentType.includes('application/sparql-results+json')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlResults('json', data);\n }\n if (contentType.includes('text/tab-separated-values') || url.endsWith('.tsv')) {\n queryResult = await TestCaseQueryEvaluationHandler.parseSparqlTsvResults(data);\n }\n\n if (!queryResult) {\n throw new Error(`Could not parse the query result with content type ${contentType} at ${url}`);\n }\n\n // Discover DAWG result sets\n if (queryResult.type === 'quads' && queryResult.value.length > 0 &&\n queryResult.value[0].predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' &&\n queryResult.value[0].object.value === 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet') {\n return await TestCaseQueryEvaluationHandler.parseDawgResultSet(queryResult.value);\n }\n\n return queryResult;\n }\n\n /**\n * Parses query results in either SPARQL/JSON or SPARQL/XML query results syntax.\n * @param {string} type json or xml\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlResults(type: 'json' | 'xml', data: NodeJS.ReadableStream): Promise<IQueryResult> {\n let booleanPromise: Promise<boolean>;\n let bindingsStream: NodeJS.ReadableStream;\n if (type === 'json') {\n const parser = new SparqlJsonParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseJsonBooleanStream(data);\n bindingsStream = parser.parseJsonResultsStream(data);\n } else {\n const parser = new SparqlXmlParser({ prefixVariableQuestionMark: true });\n booleanPromise = parser.parseXmlBooleanStream(data);\n bindingsStream = parser.parseXmlResultsStream(data);\n }\n const bindingsPromise: Promise<[RDF.Variable[], Record<string, RDF.Term>[]]> = Promise.all([\n new Promise<RDF.Variable[]>((resolve) => {\n bindingsStream\n .on('variables', resolve)\n .on('end', _ => resolve([]));\n }),\n arrayifyStream(bindingsStream),\n ]);\n\n // Parse both in parallel, and silence the errors\n let bindingsError: Error = null;\n let booleanError: Error = null;\n const parsingResults = await Promise.all([\n booleanPromise.catch((e): any => {\n booleanError = e;\n return null;\n }),\n bindingsPromise.catch((e): any => {\n bindingsError = e;\n return null;\n }),\n ]);\n\n if (!booleanError) {\n return new QueryResultBoolean(parsingResults[0]);\n }\n if (!bindingsError) {\n return new QueryResultBindings(parsingResults[1][0].map((variable: RDF.Variable) => `?${variable.value}`), parsingResults[1][1], false);\n }\n throw new Error(`Found no valid ASK or SELECT query.\\n${\n bindingsError.message}\\n${booleanError.message}`);\n }\n\n /**\n * Parses query results in the DAWG vocabulary.\n * https://www.w3.org/2001/sw/DataAccess/tests/test-dawg.n3\n * @param {Quad[]} quads An array of quads.\n * @return {Promise<IQueryResultBindings>} A promise resolving to a bindings results object.\n */\n public static async parseDawgResultSet(quads: RDF.Quad[]): Promise<IQueryResultBindings> {\n // Construct resources for easier interpretation of the bindings\n const objectLoader = new RdfObjectLoader({\n context: {\n result: 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#',\n bindings: 'result:binding',\n index: 'result:index',\n resultVariables: 'result:resultVariable',\n solutions: 'result:solution',\n value: 'result:value',\n variable: 'result:variable',\n },\n });\n await objectLoader.importArray(quads);\n let resultSet: Resource = null;\n for (const resourceName in objectLoader.resources) {\n if (objectLoader.resources[resourceName]\n .isA(stringToTerm('http://www.w3.org/2001/sw/DataAccess/tests/result-set#ResultSet'))) {\n resultSet = objectLoader.resources[resourceName];\n break;\n }\n }\n\n if (!resultSet) {\n throw new Error(`No valid DAWG result set was found in ${quads}`);\n }\n\n // Get the variable names\n const variables: string[] = resultSet.properties.resultVariables\n .map((resource: Resource) => `?${resource.value}`);\n\n // Check if any binding has .index\n let checkOrder = false;\n const s = resultSet.properties.solutions;\n for (const solution of s) {\n if (solution.property.index) {\n checkOrder = true;\n break;\n }\n }\n\n // Ensure that the solutions are sorted by index\n const solutions = resultSet.properties.solutions;\n if (checkOrder) {\n solutions.sort((solution1: Resource, solution2: Resource) => Number.parseInt(solution1.property.index.value, 10) - Number.parseInt(solution2.property.index.value, 10));\n }\n\n // Collect the bindings as object\n const value: Record<string, RDF.Term>[] = solutions.map((solution: Resource) => solution.properties.bindings.reduce((bindings: any, binding: Resource) => {\n bindings[`?${binding.property.variable.value}`] = binding.property.value.term;\n return bindings;\n }, {}));\n\n return new QueryResultBindings(variables, value, checkOrder);\n }\n\n /**\n * Parses query results from a SPARQL TSV stream.\n * @param {NodeJS.ReadableStream} data The data stream to parse.\n * @return {Promise<IQueryResult>} A promise resolving to a SPARQL query result.\n */\n public static async parseSparqlTsvResults(data: NodeJS.ReadableStream): Promise<IQueryResult> {\n const text: string = await stringifyStream(data);\n const lines = text.replace(/\\r?\\n$/u, '').split(/\\r?\\n/u);\n\n if (lines.length === 1) {\n const singleLine = lines[0].trim().toLowerCase();\n if (singleLine === 'true') {\n return new QueryResultBoolean(true);\n }\n if (singleLine === 'false') {\n return new QueryResultBoolean(false);\n }\n }\n\n const variables: string[] = [];\n\n if (lines[0].trim() !== '') {\n const rawVariables = lines[0].split('\\t');\n\n for (const raw of rawVariables) {\n const variable = raw.trim();\n\n if (variable === '') {\n throw new Error('Invalid TSV result: Empty column on the first row.');\n }\n\n if ((!variable.startsWith('?') && !variable.startsWith('$')) || variable.length < 2) {\n throw new Error(`Invalid TSV variable: ${variable}`);\n }\n\n if (variables.includes(variable)) {\n throw new Error(`Invalid TSV result: The variable ${variable} is declared twice.`);\n }\n\n variables.push(variable);\n }\n }\n\n const value: Record<string, RDF.Term>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const fields = lines[i].split('\\t');\n\n const isZeroVariableResultRow = variables.length === 0 && fields.length === 1 && fields[0] === '';\n\n if (fields.length !== variables.length && !isZeroVariableResultRow) {\n throw new Error(`Invalid TSV row (Line ${i + 1}): expected ${variables.length} fields but found ${fields.length}.`);\n }\n\n const binding: Record<string, RDF.Term> = {};\n\n for (const [ j, variable ] of variables.entries()) {\n const field = fields[j].trim();\n\n if (field.length > 0) {\n try {\n binding[variable] = TestCaseQueryEvaluationHandler.parseTsvTerm(field);\n } catch (error: any) {\n throw new Error(\n `Failed to parse TSV value on Line ${i + 1}, Column '${variable}': ` +\n `Invalid Turtle syntax in \"${field}\".\\nOriginal error: ${error.message}`,\n );\n }\n }\n }\n value.push(binding);\n }\n\n return new QueryResultBindings(variables, value, false);\n }\n\n /**\n * Parse a single field from a SPARQL TSV result into an RDF term.\n * @param {string} term The TSV field value.\n * @return {RDF.Term} The corresponding RDF term.\n */\n public static parseTsvTerm(term: string): RDF.Term {\n if (/^[+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#integer'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+)$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#decimal'));\n }\n if (/^[+-]?([0-9]+\\.[0-9]*|\\.[0-9]+|[0-9]+)[eE][+-]?[0-9]+$/u.test(term)) {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#double'));\n }\n if (term === 'true' || term === 'false') {\n return DF.literal(term, DF.namedNode('http://www.w3.org/2001/XMLSchema#boolean'));\n }\n\n return stringToTtlTerm(term);\n }\n\n /**\n * Obtain all data links for the given query test action.\n * @param action A query test action.\n */\n public static getQueryDataLinks(action: Resource): IQueryDataLink[] {\n const queryDataLinks: IQueryDataLink[] = [];\n if (action.property.data) {\n queryDataLinks.push({\n dataUri: action.property.data.value,\n });\n }\n for (const graphData of action.properties.graphData) {\n if (graphData.property.graph) {\n queryDataLinks.push({\n dataUri: graphData.property.graph.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(graphData.property.label.value)),\n });\n } else {\n queryDataLinks.push({\n dataUri: graphData.value,\n dataGraph: DF.namedNode(Util.normalizeBaseUrl(graphData.value)),\n });\n }\n }\n return queryDataLinks;\n }\n\n /**\n * Determine the quads for the given query data links.\n * @param queryDataLinks Links to query data.\n * @param options Fetch options.\n */\n public static async resolveQueryDataLinks(queryDataLinks: IQueryDataLink[], options?: IFetchOptions): Promise<RDF.Quad[]> {\n let queryData: RDF.Quad[] = [];\n for (const queryDataLink of queryDataLinks) {\n let queryDataThis: RDF.Quad[] = await arrayifyStream((await Util.fetchRdf(queryDataLink.dataUri, { ...options, normalizeUrl: true }))[1]);\n if (queryDataLink.dataGraph) {\n queryDataThis = queryDataThis.map(quad => mapTerms(quad, (value: RDF.Term, key: QuadTermName) => key === 'graph' ? queryDataLink.dataGraph : value));\n }\n queryData = [ ...queryData, ...queryDataThis ];\n }\n return queryData;\n }\n\n public async resourceToTestCase(resource: Resource, testCaseData: ITestCaseData, options?: IFetchOptions): Promise<TestCaseQueryEvaluation> {\n if (!resource.property.action) {\n throw new Error(`Missing mf:action in ${resource}`);\n }\n if (!resource.property.result) {\n throw new Error(`Missing mf:result in ${resource}`);\n }\n const action = resource.property.action;\n if (!action.property.query) {\n throw new Error(`Missing qt:query in mf:action of ${resource}`);\n }\n\n // Determine links to data\n const queryDataLinks: IQueryDataLink[] = TestCaseQueryEvaluationHandler.getQueryDataLinks(action);\n\n // Check for lax cardinality property\n let laxCardinality = false;\n if (resource.property.resultCardinality && resource.property.resultCardinality.value ===\n 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#LaxCardinality') {\n laxCardinality = true;\n }\n\n // Collect all query data\n const queryData: RDF.Quad[] = await TestCaseQueryEvaluationHandler.resolveQueryDataLinks(queryDataLinks, options);\n\n const queryResponse = await Util.fetchCached(resource.property.result.value, options);\n return new TestCaseQueryEvaluation(\n testCaseData,\n {\n baseIRI: Util.normalizeBaseUrl(action.property.query.value),\n queryDataLinks,\n laxCardinality,\n queryData,\n queryResult: await TestCaseQueryEvaluationHandler.parseQueryResult(\n Util.identifyContentType(queryResponse.url, queryResponse.headers),\n queryResponse.url,\n queryResponse.body,\n ),\n queryString: await stringifyStream((await Util.fetchCached(action.property.query.value, options)).body),\n resultSource: queryResponse,\n },\n );\n }\n}\n\nexport interface ITestCaseQueryEvaluationProps {\n baseIRI: string;\n queryString: string;\n queryData: RDF.Quad[];\n queryResult: IQueryResult;\n laxCardinality: boolean;\n resultSource: IFetchResponse;\n queryDataLinks: IQueryDataLink[];\n}\n\nexport interface IQueryDataLink {\n dataUri: string;\n dataGraph?: RDF.NamedNode;\n}\n\nexport class TestCaseQueryEvaluation implements ITestCaseSparql {\n public readonly type = 'sparql';\n public readonly approval: string;\n public readonly approvedBy: string;\n public readonly comment: string;\n public readonly types: string[];\n public readonly name: string;\n public readonly uri: string;\n\n public readonly baseIRI: string;\n public readonly queryString: string;\n public readonly queryData: RDF.Quad[];\n public readonly queryResult: IQueryResult;\n public readonly laxCardinality: boolean;\n public readonly queryDataLinks: IQueryDataLink[];\n public readonly resultSource: IFetchResponse;\n\n constructor(testCaseData: ITestCaseData, props: ITestCaseQueryEvaluationProps) {\n Object.assign(this, testCaseData);\n Object.assign(this, props);\n }\n\n public static queryDataLinksToString(queryDataLinks: IQueryDataLink[]): string {\n return queryDataLinks.map(queryDataLink => queryDataLink.dataUri + (queryDataLink.dataGraph ? ` (named graph: ${queryDataLink.dataGraph.value})` : '')).join(',\\n ');\n }\n\n public async test(engine: IQueryEngine, injectArguments: any): Promise<void> {\n const result: IQueryResult = await engine.query(this.queryData, this.queryString, { baseIRI: this.baseIRI, ...injectArguments });\n if (!this.queryResult.equals(result, this.laxCardinality)) {\n throw new ErrorTest(`Invalid query evaluation\n\n Query:\\n\\n${this.queryString}\n\n Data links: ${TestCaseQueryEvaluation.queryDataLinksToString(this.queryDataLinks)}\n\n Result Source: ${this.resultSource.url}\n\n Expected: ${this.queryResult.toString()}\n\n Got: \\n ${result.toString()}\n`);\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rdf-test-suite",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e",
|
|
5
5
|
"description": "Executes the RDF and SPARQL test suites.",
|
|
6
6
|
"typings": "index",
|
|
@@ -98,12 +98,14 @@
|
|
|
98
98
|
"log-symbols": "^4.0.0",
|
|
99
99
|
"minimist": "^1.2.0",
|
|
100
100
|
"n3": "^2.0.3",
|
|
101
|
+
"papaparse": "^5.5.3",
|
|
101
102
|
"rdf-data-factory": "^2.0.0",
|
|
102
103
|
"rdf-isomorphic": "^2.0.0",
|
|
103
104
|
"rdf-literal": "^2.0.0",
|
|
104
105
|
"rdf-object": "^3.0.0",
|
|
105
106
|
"rdf-quad": "^2.0.0",
|
|
106
107
|
"rdf-string": "^2.0.1",
|
|
108
|
+
"rdf-string-ttl": "^2.0.1",
|
|
107
109
|
"rdf-terms": "^2.0.0",
|
|
108
110
|
"rdfxml-streaming-parser": "^3.0.0",
|
|
109
111
|
"readable-web-to-node-stream": "^3.0.2",
|
|
@@ -118,6 +120,7 @@
|
|
|
118
120
|
"@comunica/query-sparql": "^4.0.2",
|
|
119
121
|
"@rubensworks/eslint-config": "^3.1.0",
|
|
120
122
|
"@types/jest": "^30.0.0",
|
|
123
|
+
"@types/papaparse": "^5.5.2",
|
|
121
124
|
"coveralls": "^3.0.0",
|
|
122
125
|
"eslint": "^8",
|
|
123
126
|
"jest": "^30.0.0",
|