123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- const filterMetadata = (o) => {
- const copy = {...o};
- delete copy._;
- return copy;
- };
-
- const flatten = (arr) => {
- return arr.reduce((c,v) => {
- if(Array.isArray(v)){
- return c.concat(flatten(v));
- }
- return c.concat(v);
- }, []);
- };
-
- function Query(db) {
- if(!(this instanceof Query)) {
- return new Query(db);
- }
- this.db = db;
- this.nodes = [];
- this.cursor = 0;
- this.ctx = void 0;
- }
-
- Query.prototype.add = function add(node) {
- this.cursor += 1;
- this.nodes.push(node);
- this.ctx = this.nodes[this.nodes.length - 1];
- };
-
- Query.prototype.getSet = function getSet() {
- const n = this.ctx.then(v => {
- if(Array.isArray(v)) {
- return v.map(filterMetadata);
- }
- return filterMetadata(v);
- })
- .then(r => {
- const getValues = (node) => {
- return Promise.all(Object.keys(node).map(k => this.db.get(k).then()));
- };
- if(Array.isArray(r)) {
- return Promise.all(r.map(getValues)).then(flatten);
- }
- return getValues(r);
- })
- this.add(n);
- return this;
- }
-
- Query.prototype.get = function get(path) {
- if(this.cursor === 0) {
- const node = this.db.get(path).then();
- this.add(node);
- return this;
- }
- const prev = this.nodes[this.cursor - 1];
- const pNode = prev.then(r => {
- if(Array.isArray(r)) {
- const nodes = r.map(v => {
- if(v[path] && v[path]["#"]) {
- return this.db.get(v[path]["#"]).then();
- }
- return v[path] ? Promise.resolve(v[path]) : "";
- });
- return Promise.all(nodes.filter(v => v));
- }
- if(r[path] && r[path]["#"]) {
- return this.db.get(r[path]["#"]).then();
- }
- return r[path] ? Promise.resolve(r[path]) : "";
- });
- this.add(pNode);
- return this;
- };
-
- Query.prototype.data = function data(cb) {
- return this.ctx.then(v => {
- if(Array.isArray(v)) {
- return Promise.all(v);
- }
- return v;
- });
- };
- export {Query}
|