UNPKG

data-pipeline-information-system-sparql

Version:

Sparql function to query/update RDF through SPARQL 1.1

80 lines (68 loc) 2.97 kB
import pointer from 'json-pointer'; function specificator(general: {[key: string] : any}, specific: {[key: string] : any}) { let out = {} _specificator(general || {}, specific || {}, out); return out; } // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#Implementing_basic_set_operations> function difference(setA: Set<string>, setB: Set<string>) { let _difference = new Set(setA); for (let elem of setB.values()) { _difference.delete(elem); } return _difference; } function _specificator(general: {[key: string] : any}, specific: {[key: string] : any}, out = {}, ...path: string[]) { let propgeneral = new Set(Object.getOwnPropertyNames(general)) let propspecific = new Set(Object.getOwnPropertyNames(specific)) // <https://stackoverflow.com/questions/2342749/is-there-a-library-for-a-set-data-type-in-javascript#answer-31931246> let commonProperties = new Set([...propspecific].filter(i => propgeneral.has(i))); let generalProperties = difference(propgeneral, commonProperties); let specificProperties = difference(propspecific, commonProperties); generalProperties.forEach((generalOnlyProp) => { let jsonPath = pointer.compile([...path, generalOnlyProp]); pointer(out).set(jsonPath, general[generalOnlyProp]); }); specificProperties.forEach((specificOnlyProp) => { let jsonPath = pointer.compile([...path, specificOnlyProp]); pointer(out).set(jsonPath, specific[specificOnlyProp]); }); commonProperties.forEach((cProp) => { if (general[cProp] !== null && typeof general[cProp] === 'object' && specific[cProp] !== null && typeof specific[cProp] === 'object') { _specificator(general[cProp], specific[cProp], out, ...[...path, cProp]); } else { if (specific[cProp] !== undefined) { let jsonPath = pointer.compile([...path, cProp]); pointer(out).set(jsonPath, specific[cProp]); } else { let jsonPath = pointer.compile([...path, cProp]); pointer(out).set(jsonPath, general[cProp]); } } }) } export function rollingHeredity(...objects: {[key: string] : any}[]) { let specificatedObject = {} switch (objects.length) { case 0: break; case 1: specificatedObject = objects[0]; break; case 2: specificatedObject = specificator(objects[0], objects[1]); break; default: let general = objects.shift(); specificatedObject = specificator(<{[key: string] : any}>general, rollingHeredity(...objects)); } return specificatedObject; } // export function forkedHeredity(array, ...objects) { // let common = rollingHeredity(...objects); // return array.map((item) => { // return specificator(common, item); // }) // } export default rollingHeredity;