reshuffle-eidr-connector
Version: 
Reshuffle connectors for eidr.org
280 lines • 11.5 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', '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