reshuffle-eidr-connector
Version:
Reshuffle connectors for eidr.org
280 lines • 11.4 kB
JavaScript
;
exports.__esModule = true;
exports.buildJsonQuery = void 0;
var validate_1 = require("./validate");
function assertSingleProperty(obj) {
if (typeof obj !== 'object') {
throw new Error("Not an object: ".concat(JSON.stringify(obj)));
}
if (Object.keys(obj).length !== 1) {
throw new Error("Object must have one single property: ".concat(JSON.stringify(obj)));
}
return [Object.keys(obj)[0], Object.values(obj)[0]];
}
function nary(op, expressions) {
op = op.toUpperCase();
if (!Array.isArray(expressions)) {
throw new Error("".concat(op, " requires an array: ").concat(expressions));
}
for (var _i = 0, expressions_1 = expressions; _i < expressions_1.length; _i++) {
var expression = expressions_1[_i];
if (typeof expression !== 'string' || expression.trim().length === 0) {
throw new Error("".concat(op, " requires string expressions: ").concat(expression));
}
}
var many = 1 < expressions.length;
return "".concat(many ? '(' : '').concat(expressions.map(function (e) { return e.trim(); }).join(" ".concat(op, " "))).concat(many ? ')' : '');
}
function OR(expressions) {
return nary('or', expressions);
}
function NOT(expression) {
if (typeof expression !== 'string' || expression.trim().length === 0) {
throw new Error("NOT requires a string expression: ".concat(expression));
}
return "(NOT ".concat(expression, ")");
}
var textElements = {
title: ['ResourceName'],
alttitle: ['AlternateResourceName'],
anytitle: ['ResourceName', 'AlternateResourceName'],
coo: ['CountryOfOrigin'],
struct: ['StructuralType'],
reftype: ['ReferentType'],
lang: ['OriginalLanguage'],
aoname: ['AssociatedOrg/DisplayName'],
aoaltname: ['Associatedorg/AlternateName'],
aoanyname: ['AssociatedOrg/DisplayName', 'AssociatedOrg/AlternateName'],
aoid: ['AssociatedOrg@organizationID'],
actor: ['Credits/Actor/DisplayName'],
director: ['Credits/Director/DisplayName'],
contributor: ['Credits/Director/DisplayName', 'Credits/Actor/DisplayName'],
altid: ['AlternateID'],
altidtype: ['AlternateID@type'],
altiddomain: ['AlternateID@domain']
};
function textQuery(key, obj) {
var _a = assertSingleProperty(obj), op = _a[0], list = _a[1];
if (typeof list !== 'string') {
throw new Error("Invalid text query word list: ".concat(list));
}
var words = list.split(' ').filter(function (s) { return 0 < s.length; });
if (words.length === 0) {
throw new Error("Empty text query word list: ".concat(list));
}
var te = textElements[key].map(function (p) { return "/FullMetadata/BaseObjectData/".concat(p); });
switch (op) {
case 'words':
return OR(te.map(function (p) { return words.map(function (w) { return "(".concat(p, " ").concat(w, ")"); }); }).flat());
case 'contains':
return OR(te.map(function (p) { return "(".concat(p, " \"").concat(words.join(' '), "\")"); }));
case 'exact':
return OR(te.map(function (p) { return "(".concat(p, " IS \"").concat(words.join(' '), "\")"); }));
default:
throw new Error("Invalid text query operation: ".concat(op));
}
}
function idQuery(obj) {
var _a = assertSingleProperty(obj), op = _a[0], list = _a[1];
if (typeof list !== 'string') {
throw new Error("Invalid ID list: ".concat(list));
}
var ids = list.split(' ').filter(function (s) { return 0 < s.length; });
if (ids.length === 0) {
throw new Error("Empty ID list: ".concat(list));
}
for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
var id = ids_1[_i];
if (!(0, validate_1.validateId)(id)) {
throw new Error("Invalid ID: ".concat(id));
}
}
switch (op) {
case 'words':
return OR(ids.map(function (id) { return "/FullMetadata/BaseObjectData/ID ".concat(id); }));
case 'exact':
if (ids.length !== 1) {
throw new Error("Excat ID expect single ID, but found ".concat(ids.length));
}
return "(/FullMetadata/BaseObjectData/ID ".concat(ids[0], ")");
default:
throw new Error("Invalid ID query operation: ".concat(op));
}
}
function dateQuery(obj) {
var _a = assertSingleProperty(obj), op = _a[0], date = _a[1];
if (typeof date !== 'string' || date.trim().length === 0) {
throw new Error("Invalid date: ".concat(date));
}
switch (op) {
case 'date':
return "(/FullMetadata/BaseObjectData/ReleaseDate ".concat(date, ")");
case 'before':
return "(/FullMetadata/BaseObjectData/ReleaseDate <= ".concat(date, ")");
case 'after':
return "(/FullMetadata/BaseObjectData/ReleaseDate >= ".concat(date, ")");
default:
throw new Error("Invalid date query operation: ".concat(op));
}
}
function lengthQuery(obj) {
var _a = assertSingleProperty(obj), op = _a[0], length = _a[1];
if (typeof length !== 'string' || length.trim().length === 0) {
throw new Error("Invalid length: ".concat(length));
}
switch (op) {
case 'length':
return "(/FullMetadata/BaseObjectData/ApproximateLength ".concat(length, ")");
case 'maxlength':
return "(/FullMetadata/BaseObjectData/ApproximateLength <= ".concat(length, ")");
case 'minlength':
return "(/FullMetadata/BaseObjectData/ApproximateLength >= ".concat(length, ")");
default:
throw new Error("Invalid length query operation: ".concat(op));
}
}
function existsQuery(element) {
if (element === 'date') {
return '(/FullMetadata/BaseObjectData/ReleaseDate EXISTS)';
}
if (element === 'length') {
return '(/FullMetadata/BaseObjectData/ApproximateLength EXISTS)';
}
if (!(element in textElements)) {
throw new Error("Invalid element: ".concat(element));
}
if (textElements[element].length !== 1) {
throw new Error("Invalid element for EXISTS query: ".concat(element));
}
return "(/FullMetadata/BaseObjectData/".concat(textElements[element][0], " EXISTS)");
}
function isRootQuery(value) {
if (typeof value !== 'boolean') {
throw new Error("isroot value must be boolean: ".concat(value));
}
var notRootQuery = OR([
'(/FullMetadata/ExtraObjectMetadata/SeasonInfo EXISTS)',
'(/FullMetadata/ExtraObjectMetadata/ClipInfo EXISTS)',
'(/FullMetadata/ExtraObjectMetadata/ManifestationInfo EXISTS)',
'(/FullMetadata/ExtraObjectMetadata/EpisodeInfo EXISTS)',
'(/FullMetadata/ExtraObjectMetadata/EditInfo EXISTS)',
]);
return value ? NOT(notRootQuery) : notRootQuery;
}
function parentQuery(id) {
if (!(0, validate_1.validateId)(id)) {
throw new Error("Invalida parent ID: ".concat(id));
}
return OR([
"(/FullMetadata/ExtraObjectMetadata/SeasonInfo/Parent ".concat(id, ")"),
"(/FullMetadata/ExtraObjectMetadata/ClipInfo/Parent ".concat(id, ")"),
"(/FullMetadata/ExtraObjectMetadata/ManifestationInfo/Parent ".concat(id, ")"),
"(/FullMetadata/ExtraObjectMetadata/EpisodeInfo/Parent ".concat(id, ")"),
"(/FullMetadata/ExtraObjectMetadata/EditInfo/Parent ".concat(id, ")"),
]);
}
function buildJsonQuery(obj) {
var _a = assertSingleProperty(obj), element = _a[0], value = _a[1];
if (element === 'and' || element === 'or') {
return nary(element, value.map(buildJsonQuery));
}
if (element === 'not') {
return NOT(buildJsonQuery(value));
}
if (element in textElements) {
return textQuery(element, value);
}
if (element === 'id') {
return idQuery(value);
}
if (element === 'date') {
return dateQuery(value);
}
if (element === 'length') {
return lengthQuery(value);
}
if (element === 'exists') {
return existsQuery(value);
}
if (element === 'isroot') {
return isRootQuery(value);
}
if (element === 'parent') {
return parentQuery(value);
}
throw new Error("Invalid element: ".concat(element));
}
exports.buildJsonQuery = buildJsonQuery;
// const qs = query(event.req.body)
// console.log(qs)
// await app.getConnector('eidr').query(qs)
// return event.res.send(qs)
// Tests:
// { title: { words: 'star wars' }, length: 3 }
// Error: Object must have one single property
// { title: { words: 'star wars' } }
// (
// (/FullMetadata/BaseObjectData/ResourceName star) OR
// (/FullMetadata/BaseObjectData/ResourceName wars)
// )
// { alltitles: { words: 'star wars' } }
// (
// (/FullMetadata/BaseObjectData/ResourceName star) OR
// (/FullMetadata/BaseObjectData/ResourceName wars) OR
// (/FullMetadata/BaseObjectData/AlternateResourceName star) OR
// (/FullMetadata/BaseObjectData/AlternateResourceName wars)
// )
// { and: [{ title: { contains: 'star wars' } }, { coo: { exact: 'us' } }] }
// (
// (/FullMetadata/BaseObjectData/ResourceName "star wars") AND
// (/FullMetadata/BaseObjectData/CountryOfOrigin IS "us")
// )
// { or: [{ title: { contains: 'star wars' } }, { coo: { exact: 'us' } }] }
// (
// (/FullMetadata/BaseObjectData/ResourceName "star wars") OR
// (/FullMetadata/BaseObjectData/CountryOfOrigin IS "us")
// )
// { not: { title: { contains: 'star wars' } } }
// (NOT (/FullMetadata/BaseObjectData/ResourceName "star wars"))
// { date: { date: '2000' } }
// (/FullMetadata/BaseObjectData/ReleaseDate 2000)
// { date: { before: '2000' } }
// (/FullMetadata/BaseObjectData/ReleaseDate <= 2000)
// { date: { after: '2000' } }
// (/FullMetadata/BaseObjectData/ReleaseDate >= 2000)
// { length: { length: 'PT23M' } }
// (/FullMetadata/BaseObjectData/ApproximateLength PT23M)
// { length: { maxlength: 'PT23M' } }
// (/FullMetadata/BaseObjectData/ApproximateLength <= PT23M)
// { length: { minlength: 'PT23M' } }
// (/FullMetadata/BaseObjectData/ApproximateLength >= PT23M)
// { exists: 'actor' }
// (/FullMetadata/BaseObjectData/Credits/Actor/DisplayName EXISTS)
// { isroot: true }
// (NOT (
// (/FullMetadata/ExtraObjectMetadata/SeasonInfo EXISTS) OR
// (/FullMetadata/ExtraObjectMetadata/ClipInfo EXISTS) OR
// (/FullMetadata/ExtraObjectMetadata/ManifestationInfo EXISTS) OR
// (/FullMetadata/ExtraObjectMetadata/EpisodeInfo EXISTS) OR
// (/FullMetadata/ExtraObjectMetadata/EditInfo EXISTS))
// )
// { parent: '10.5240/75C0-4663-9D6D-C864-1D9B-I' }
// (
// (
// /FullMetadata/ExtraObjectMetadata/SeasonInfo/Parent
// 10.5240/75C0-4663-9D6D-C864-1D9B-I
// ) OR (
// /FullMetadata/ExtraObjectMetadata/ClipInfo/Parent
// 10.5240/75C0-4663-9D6D-C864-1D9B-I
// ) OR (
// /FullMetadata/ExtraObjectMetadata/ManifestationInfo/Parent
// 10.5240/75C0-4663-9D6D-C864-1D9B-I
// ) OR (
// /FullMetadata/ExtraObjectMetadata/EpisodeInfo/Parent
// 10.5240/75C0-4663-9D6D-C864-1D9B-I
// ) OR (
// /FullMetadata/ExtraObjectMetadata/EditInfo/Parent
// 10.5240/75C0-4663-9D6D-C864-1D9B-I
// )
// )
//# sourceMappingURL=jsonQuery.js.map