refactor: Rename UriUtil into TermUtil.

This commit is contained in:
Ruben Verborgh 2021-01-02 23:11:57 +01:00
parent ae06e99067
commit 2e188551f7
7 changed files with 27 additions and 28 deletions

View File

@ -199,6 +199,6 @@ export * from './util/QuadUtil';
export * from './util/RecordObject'; export * from './util/RecordObject';
export * from './util/SequenceHandler'; export * from './util/SequenceHandler';
export * from './util/StreamUtil'; export * from './util/StreamUtil';
export * from './util/UriUtil'; export * from './util/TermUtil';
export * from './util/Vocabularies'; export * from './util/Vocabularies';
export * from './util/WaterfallHandler'; export * from './util/WaterfallHandler';

View File

@ -1,7 +1,7 @@
import { DataFactory, Store } from 'n3'; import { DataFactory, Store } from 'n3';
import type { BlankNode, Literal, NamedNode, Quad, Term } from 'rdf-js'; import type { BlankNode, Literal, NamedNode, Quad, Term } from 'rdf-js';
import { getLoggerFor } from '../../logging/LogUtil'; import { getLoggerFor } from '../../logging/LogUtil';
import { toObjectTerm, toCachedNamedNode, isTerm } from '../../util/UriUtil'; import { toObjectTerm, toCachedNamedNode, isTerm } from '../../util/TermUtil';
import { CONTENT_TYPE_TERM } from '../../util/Vocabularies'; import { CONTENT_TYPE_TERM } from '../../util/Vocabularies';
import type { ResourceIdentifier } from './ResourceIdentifier'; import type { ResourceIdentifier } from './ResourceIdentifier';
import { isResourceIdentifier } from './ResourceIdentifier'; import { isResourceIdentifier } from './ResourceIdentifier';

View File

@ -16,7 +16,7 @@ import type { Guarded } from '../../util/GuardedStream';
import { isContainerIdentifier } from '../../util/PathUtil'; import { isContainerIdentifier } from '../../util/PathUtil';
import { parseQuads, pushQuad, serializeQuads } from '../../util/QuadUtil'; import { parseQuads, pushQuad, serializeQuads } from '../../util/QuadUtil';
import { generateContainmentQuads, generateResourceQuads } from '../../util/ResourceUtil'; import { generateContainmentQuads, generateResourceQuads } from '../../util/ResourceUtil';
import { toLiteral } from '../../util/UriUtil'; import { toLiteral } from '../../util/TermUtil';
import { CONTENT_TYPE, DC, LDP, POSIX, RDF, XSD } from '../../util/Vocabularies'; import { CONTENT_TYPE, DC, LDP, POSIX, RDF, XSD } from '../../util/Vocabularies';
import type { FileIdentifierMapper, ResourceLink } from '../mapping/FileIdentifierMapper'; import type { FileIdentifierMapper, ResourceLink } from '../mapping/FileIdentifierMapper';
import type { DataAccessor } from './DataAccessor'; import type { DataAccessor } from './DataAccessor';

View File

@ -5,7 +5,7 @@ import type { Literal, NamedNode, Quad } from 'rdf-js';
import streamifyArray from 'streamify-array'; import streamifyArray from 'streamify-array';
import type { Guarded } from './GuardedStream'; import type { Guarded } from './GuardedStream';
import { pipeSafely } from './StreamUtil'; import { pipeSafely } from './StreamUtil';
import { toSubjectTerm, toPredicateTerm, toObjectTerm } from './UriUtil'; import { toSubjectTerm, toPredicateTerm, toObjectTerm } from './TermUtil';
/** /**
* Generates a quad with the given subject/predicate/object and pushes it to the given array. * Generates a quad with the given subject/predicate/object and pushes it to the given array.

View File

@ -10,33 +10,32 @@ const shorthands: Record<string, NamedNode> = {
}; };
// Caches named node conversions // Caches named node conversions
const termMap: Record<string, NamedNode> = {}; const cachedNamedNodes: Record<string, NamedNode> = {
...shorthands,
};
/** /**
* @param input - Checks if this is a {@link Term}. * Converts the incoming name (URI or shorthand) to a named node.
*/ * The generated terms get cached to reduce the number of created nodes,
export const isTerm = (input?: any): input is Term => input?.termType;
/**
* Converts the incoming name to a named node if needed.
* In case of string, first checks if it is a shorthand, if not a new named node gets made.
* The generated terms get cached to prevent the amount of named nodes that get created,
* so only use this for internal constants! * so only use this for internal constants!
* @param name - Predicate to potentially transform. * @param name - Predicate to potentially transform.
*/ */
export const toCachedNamedNode = (name: NamedNode | string): NamedNode => { export const toCachedNamedNode = (name: NamedNode | string): NamedNode => {
if (typeof name === 'string') { if (typeof name !== 'string') {
if (shorthands[name]) { return name;
return shorthands[name];
}
if (!termMap[name]) {
termMap[name] = namedNode(name);
}
return termMap[name];
} }
return name; if (!(name in cachedNamedNodes)) {
cachedNamedNodes[name] = namedNode(name);
}
return cachedNamedNodes[name];
}; };
/**
* @param input - Checks if this is a {@link Term}.
*/
export const isTerm = (input?: any): input is Term =>
input && typeof input.termType === 'string';
/** /**
* Converts a subject to a named node when needed. * Converts a subject to a named node when needed.
* @param subject - Subject to potentially transform. * @param subject - Subject to potentially transform.
@ -64,4 +63,4 @@ export const toObjectTerm = <T extends Term>(object: T | string, preferLiteral =
* @param dataType - Object data type (as string). * @param dataType - Object data type (as string).
*/ */
export const toLiteral = (object: string | number, dataType: NamedNode): Literal => export const toLiteral = (object: string | number, dataType: NamedNode): Literal =>
DataFactory.literal(object, toCachedNamedNode(dataType)); literal(object, dataType);

View File

@ -12,7 +12,7 @@ import type { SystemError } from '../../../../src/util/errors/SystemError';
import { UnsupportedMediaTypeHttpError } from '../../../../src/util/errors/UnsupportedMediaTypeHttpError'; import { UnsupportedMediaTypeHttpError } from '../../../../src/util/errors/UnsupportedMediaTypeHttpError';
import type { Guarded } from '../../../../src/util/GuardedStream'; import type { Guarded } from '../../../../src/util/GuardedStream';
import { guardedStreamFrom, readableToString } from '../../../../src/util/StreamUtil'; import { guardedStreamFrom, readableToString } from '../../../../src/util/StreamUtil';
import { toLiteral } from '../../../../src/util/UriUtil'; import { toLiteral } from '../../../../src/util/TermUtil';
import { CONTENT_TYPE, DC, LDP, POSIX, RDF, XSD } from '../../../../src/util/Vocabularies'; import { CONTENT_TYPE, DC, LDP, POSIX, RDF, XSD } from '../../../../src/util/Vocabularies';
import { mockFs } from '../../../util/Util'; import { mockFs } from '../../../util/Util';

View File

@ -7,10 +7,10 @@ import {
toObjectTerm, toObjectTerm,
toLiteral, toLiteral,
isTerm, isTerm,
} from '../../../src/util/UriUtil'; } from '../../../src/util/TermUtil';
import { CONTENT_TYPE, XSD } from '../../../src/util/Vocabularies'; import { CONTENT_TYPE_TERM, XSD } from '../../../src/util/Vocabularies';
describe('An UriUtil', (): void => { describe('TermUtil', (): void => {
describe('isTerm function', (): void => { describe('isTerm function', (): void => {
it('checks if any input is a Term.', async(): Promise<void> => { it('checks if any input is a Term.', async(): Promise<void> => {
expect(isTerm(namedNode('name'))).toBeTruthy(); expect(isTerm(namedNode('name'))).toBeTruthy();
@ -38,7 +38,7 @@ describe('An UriUtil', (): void => {
}); });
it('supports URI shorthands.', async(): Promise<void> => { it('supports URI shorthands.', async(): Promise<void> => {
expect(toCachedNamedNode('contentType')).toEqualRdfTerm(namedNode(CONTENT_TYPE)); expect(toCachedNamedNode('contentType')).toEqualRdfTerm(CONTENT_TYPE_TERM);
}); });
}); });