Skip to content

Commit 45cae47

Browse files
committed
Updated: SchemaBuilderEntity can add new operation to current async queue.
1 parent 45bd8cb commit 45cae47

2 files changed

Lines changed: 173 additions & 99 deletions

File tree

builders.js

Lines changed: 114 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1948,71 +1948,131 @@ SchemaInstance.prototype.$async = function(callback, index) {
19481948

19491949
if (callback === undefined)
19501950
callback = NOOP;
1951+
19511952
self.$$async = [];
19521953
self.$$result = [];
19531954
self.$callback = callback;
1955+
19541956
setImmediate(function() {
1955-
self.$$async.async(function() {
1957+
async_queue(self.$$async, function() {
19561958
var result = self.$$result;
1957-
delete self.$$result;
19581959
delete self.$$async;
1960+
delete self.$$result;
1961+
delete self.$callback;
19591962
callback(null, index !== undefined ? result[index] : result);
19601963
});
19611964
});
1965+
19621966
return self;
19631967
};
19641968

1965-
SchemaInstance.prototype.$save = function(helper, callback) {
1969+
SchemaInstance.prototype.$push = function(type, name, helper, first) {
1970+
19661971
var self = this;
1972+
var fn;
1973+
1974+
if (type === 'save' || type === 'remove') {
1975+
1976+
helper = name;
1977+
name = undefined;
1978+
1979+
fn = function(next) {
1980+
self.$$schema[type](self, helper, function(err, result) {
1981+
self.$$result && self.$$result.push(err ? null : result);
1982+
if (!err)
1983+
return next();
1984+
next = null;
1985+
var result = self.$$result;
1986+
delete self.$$result;
1987+
delete self.$$async;
1988+
self.$callback(err, result);
1989+
});
1990+
};
1991+
1992+
} else if (type === 'query' || type === 'get' || type === 'read') {
1993+
1994+
helper = name;
1995+
name = undefined;
1996+
1997+
fn = function(next) {
1998+
self.$$schema[type](helper, function(err, result) {
1999+
self.$$result && self.$$result.push(err ? null : result);
2000+
if (!err)
2001+
return next();
2002+
next = null;
2003+
var result = self.$$result;
2004+
delete self.$$result;
2005+
delete self.$$async;
2006+
self.$callback(err, result);
2007+
});
2008+
};
2009+
2010+
} else {
2011+
2012+
fn = function(next) {
2013+
self.$$schema[type](name, self, helper, function(err, result) {
2014+
self.$$result && self.$$result.push(err ? null : result);
2015+
if (!err)
2016+
return next();
2017+
next = null;
2018+
var result = self.$$result;
2019+
delete self.$$result;
2020+
delete self.$$async;
2021+
self.$callback(err, result);
2022+
});
2023+
};
19672024

1968-
if (!self.$$async) {
1969-
self.$$schema.save(self, helper, callback);
1970-
return self;
19712025
}
19722026

1973-
self.$$async.push(function(next) {
1974-
self.$$schema.save(self, helper, function(err, result) {
2027+
if (first)
2028+
self.$$async.unshift(fn);
2029+
else
2030+
self.$$async.push(fn);
19752031

1976-
if (self.$$result)
1977-
self.$$result.push(err ? null : result);
2032+
return self;
2033+
};
19782034

1979-
if (!err)
1980-
return next();
1981-
next = null;
1982-
var result = self.$$result;
1983-
delete self.$$result;
1984-
delete self.$$async;
1985-
self.$callback(err, result);
1986-
});
1987-
});
2035+
SchemaInstance.prototype.$next = function(type, name, helper) {
2036+
return this.$push(type, name, helper, true);
2037+
};
2038+
2039+
SchemaInstance.prototype.$save = function(helper, callback) {
2040+
var self = this;
2041+
2042+
if (self.$$async)
2043+
return self.$push('save', helper);
19882044

2045+
self.$$schema.save(self, helper, callback);
19892046
return self;
19902047
};
19912048

1992-
SchemaInstance.prototype.$remove = function(helper, callback) {
2049+
SchemaInstance.prototype.$query = function(helper, callback) {
19932050
var self = this;
19942051

1995-
if (!self.$$async) {
1996-
self.$$schema.remove(helper, callback);
1997-
return self;
1998-
}
2052+
if (self.$$async)
2053+
return self.$push('query', helper);
19992054

2000-
self.$$async.push(function(next) {
2001-
self.$$schema.remove(self, helper, function(err, result) {
2055+
self.$$schema.query(self, helper, callback);
2056+
return self;
2057+
};
20022058

2003-
if (self.$$result)
2004-
self.$$result.push(err ? null : result);
2059+
SchemaInstance.prototype.$read = SchemaInstance.prototype.$get = function(helper, callback) {
2060+
var self = this;
20052061

2006-
if (!err)
2007-
return next();
2008-
next = null;
2009-
var result = self.$$result;
2010-
delete self.$$result;
2011-
delete self.$$async;
2012-
self.$callback(err, result);
2013-
});
2014-
});
2062+
if (self.$$async)
2063+
return self.$push('get', helper);
20152064

2065+
self.$$schema.get(self, helper, callback);
2066+
return self;
2067+
};
2068+
2069+
SchemaInstance.prototype.$remove = function(helper, callback) {
2070+
var self = this;
2071+
2072+
if (self.$$async)
2073+
return self.$push('remove', helper);
2074+
2075+
self.$$schema.remove(helper, callback);
20162076
return self;
20172077
};
20182078

@@ -2027,82 +2087,30 @@ SchemaInstance.prototype.$destroy = function() {
20272087
SchemaInstance.prototype.$transform = function(name, helper, callback) {
20282088
var self = this;
20292089

2030-
if (!self.$$async) {
2031-
self.$$schema.transform(name, self, helper, callback);
2032-
return self;
2033-
}
2034-
2035-
self.$$async.push(function(next) {
2036-
self.$$schema.transform(name, self, helper, function(err, result) {
2037-
2038-
if (self.$$result)
2039-
self.$$result.push(err ? null : result);
2040-
2041-
if (!err)
2042-
return next();
2043-
2044-
next = null;
2045-
var result = self.$$result;
2046-
delete self.$$result;
2047-
delete self.$$async;
2048-
self.$callback(err, result);
2049-
});
2050-
});
2090+
if (self.$$async)
2091+
return self.$push('transform', name, helper);
20512092

2093+
self.$$schema.transform(name, self, helper, callback);
20522094
return self;
20532095
};
20542096

20552097
SchemaInstance.prototype.$workflow = function(name, helper, callback) {
20562098
var self = this;
20572099

2058-
if (!self.$$async) {
2059-
self.$$schema.workflow(name, self, helper, callback);
2060-
return self;
2061-
}
2062-
2063-
self.$$async.push(function(next) {
2064-
self.$$schema.workflow(name, self, helper, function(err, result) {
2065-
2066-
if (self.$$result)
2067-
self.$$result.push(err ? null : result);
2068-
2069-
if (!err)
2070-
return next();
2071-
next = null;
2072-
var result = self.$$result;
2073-
delete self.$$result;
2074-
delete self.$$async;
2075-
self.$callback(err, result);
2076-
});
2077-
});
2100+
if (self.$$async)
2101+
return self.$push('workflow', name, helper);
20782102

2103+
self.$$schema.workflow(name, self, helper, callback);
20792104
return self;
20802105
};
20812106

20822107
SchemaInstance.prototype.$operation = function(name, helper, callback) {
20832108
var self = this;
20842109

2085-
if (!self.$$async) {
2086-
self.$$schema.operation(name, self, helper, callback);
2087-
return self;
2088-
}
2089-
2090-
self.$$async.push(function(next) {
2091-
self.$$schema.operation(name, self, helper, function(err, result) {
2092-
2093-
if (self.$$result)
2094-
self.$$result.push(err ? null : result);
2095-
2096-
if (!err)
2097-
return next();
2098-
next = null;
2099-
var result = self.$$result;
2100-
delete self.$$result;
2101-
delete self.$$async;
2102-
self.$callback(err, result);
2103-
});
2104-
});
2110+
if (!self.$$async)
2111+
return self.$push('operation', name, helper);
21052112

2113+
self.$$schema.operation(name, self, helper, callback);
21062114
return self;
21072115
};
21082116

@@ -3304,6 +3312,13 @@ TransformBuilder.setDefaultTransform = function(name) {
33043312
transforms['transformbuilder_default'] = name;
33053313
};
33063314

3315+
function async_queue(arr, callback) {
3316+
var item = arr.shift();
3317+
if (item === undefined)
3318+
return callback();
3319+
item(() => async_queue(arr, callback));
3320+
};
3321+
33073322
// ======================================================
33083323
// EXPORTS
33093324
// ======================================================
@@ -3322,4 +3337,4 @@ global.SchemaBuilder = SchemaBuilder;
33223337
exports.restart = function() {
33233338
schemas = {};
33243339
Object.keys(transforms).forEach(key => { transforms[key] = {}; });
3325-
};
3340+
};

test/test-builders.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,65 @@ function test_ErrorBuilder() {
460460
schema.define('created', Date);
461461
});
462462

463+
NEWSCHEMA('Async').make(function(schema) {
464+
465+
var arr = [];
466+
467+
schema.define('name', String);
468+
469+
schema.addWorkflow('1', function(error, model, options, callback) {
470+
arr.push('workflow1');
471+
model.$next('workflow', '2');
472+
callback();
473+
});
474+
475+
schema.addWorkflow('2', function(error, model, options, callback) {
476+
arr.push('workflow2');
477+
callback();
478+
});
479+
480+
schema.addWorkflow('3', function(error, model, options, callback) {
481+
arr.push('workflow3');
482+
callback();
483+
});
484+
485+
schema.addTransform('1', function(error, model, options, callback) {
486+
arr.push('transform1');
487+
model.$next('transform', '2');
488+
model.$push('transform', '4');
489+
callback();
490+
});
491+
492+
schema.addTransform('2', function(error, model, options, callback) {
493+
arr.push('transform2');
494+
callback();
495+
});
496+
497+
schema.addTransform('3', function(error, model, options, callback) {
498+
arr.push('transform3');
499+
callback();
500+
});
501+
502+
schema.addTransform('4', function(error, model, options, callback) {
503+
arr.push('transform4');
504+
callback();
505+
});
506+
507+
var model = schema.create();
508+
model.name = 'Peter';
509+
510+
var async = model.$async(function(err, response) {
511+
assert.ok(arr.indexOf('workflow2') === 1, 'SchemaBuilderEntit.$next()');
512+
assert.ok(arr.indexOf('transform2') === 4, 'SchemaBuilderEntit.$next()');
513+
assert.ok(arr.pop() === 'transform4', 'SchemaBuilderEntit.$push()');
514+
});
515+
516+
async.$workflow('1');
517+
async.$workflow('3');
518+
async.$transform('1');
519+
async.$transform('3');
520+
});
521+
463522
};
464523

465524
function test_TransformBuilder() {

0 commit comments

Comments
 (0)