UNPKG

reshuffle-eidr-connector

Version:
280 lines 11.5 kB
"use strict"; 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', 'Credits/Actor/SortName'], director: ['Credits/Director/DisplayName', 'Credits/Director/SortName'], 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