Skip to content

Instantly share code, notes, and snippets.

@SethVandebrooke
Last active March 30, 2018 19:35
Show Gist options
  • Save SethVandebrooke/9cba9dc2d2b7f0df949e310a45b51fe7 to your computer and use it in GitHub Desktop.
Save SethVandebrooke/9cba9dc2d2b7f0df949e310a45b51fe7 to your computer and use it in GitHub Desktop.
3D Relational Object Mapping
function TDROM() {
var THIS = this;
THIS.data = [];
THIS.props = {};
THIS.vals = {};
THIS.map = [];
THIS.add = function(obj) {
var index = THIS.data.push(obj) - 1, p, v, k;
for (k in obj) {
p = THIS.props[k] = THIS.props[k] === undefined ?
Object.keys(THIS.props).length :
THIS.props[k];
v = THIS.vals[obj[k]] = THIS.vals[obj[k]] === undefined ?
Object.keys(THIS.vals).length :
THIS.vals[obj[k]];
THIS.map[p] = !THIS.map[p] ? [] : THIS.map[p];
THIS.map[p][v] = !THIS.map[p][v] ? [] : THIS.map[p][v];
THIS.map[p][v].push(index);
}
};
THIS.fetch = function(obj) {
var bucket = null, results = [], k, v, objs, i, sect1, sect2;
for (k in obj) {
v = obj[k];
try {
objs = THIS.map[THIS.props[k]][THIS.vals[v]];
} catch (e) {
console.error("Could not find object with:",obj);
}
if (objs != undefined) {
if (bucket == null) {
bucket = "ready";
results = objs;
continue;
}
bucket = ([]).concat(results);
results = [];
for (i in objs) {
if (bucket.includes(objs[i])) {
results.push(objs[i]);
}
}
} else { return -1; }
return results.length > 0 ? results : -1;
}
return results;
};
THIS.get = function(obj) {
var results = [];
var fetch = THIS.fetch(obj);
if (fetch) {
for (var i in fetch) {
results.push(THIS.data[fetch[i]]);
}
} else {
return false;
}
return results;
};
THIS.update = function(obj,changes) {
var objs = THIS.fetch(obj);
if (objs != -1) {
objs = ([]).concat(objs);
for (var i in objs) {
for (var key in changes) {
var d = THIS.map[THIS.props[key]][THIS.vals[THIS.data[objs[i]][key]]];
if (d.length > 0) {
d.splice(d.indexOf(i),1);
}
if (!(changes[key] in THIS.vals)) {
THIS.vals[changes[key]] = Object.keys(THIS.vals).length;
}
if (!(key in THIS.props)) {
THIS.props[key] = Object.keys(THIS.props).length;
}
var c = THIS.map[THIS.props[key]][THIS.vals[changes[key]]];
if (c) {
c.push(objs[i])
} else {
THIS.map[THIS.props[key]][THIS.vals[changes[key]]] = [objs[i]];
}
THIS.data[objs[i]][key] = changes[key];
}
}
return true;
} else {
return false;
}
};
THIS.remove = function(obj) {
var objs = THIS.fetch(obj);
if (objs != -1) {
objs = ([]).concat(objs);
for (var i in objs) {
var obj = THIS.data[objs[i]];
var index = objs[i];
for (var k in obj) {
var v = obj[k];
THIS.map[THIS.props[k]][THIS.vals[v]].splice(
THIS.map[THIS.props[k]][THIS.vals[v]].indexOf(index)
,1);
}
THIS.data.splice(objs[i],1);
}
return true;
} else {
return false;
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment