QueryChainer.js
2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
var sys = require("sys")
var QueryChainer = function(Helper) {
this.Helper = Helper
}
var instanceMethods = {
splitQueryHash: function(queryHash) {
var method = this.Helper.Array.without(this.Helper.Hash.keys(queryHash), "params")[0],
object = queryHash[method]
return { method: method, object: object }
},
splitArguments: function() {
var result = { queries: [], callback: null }
for(var i = 0; i < arguments.length; i++) {
var arg = arguments[i]
if(typeof arg == 'function') result.callback = arg
else if(Array.isArray(arg)) arg.forEach(function(o) { result.queries.push(o) })
else result.queries.push(arg)
}
return result
},
expandMultiQueries: function(queries) {
var self = this,
result = [],
multiQueries = []
queries.forEach(function(queryHash) {
var splittedQueryHash = self.splitQueryHash(queryHash),
method = splittedQueryHash.method,
object = splittedQueryHash.object
if(!Array.isArray(object))
result.push(queryHash)
else if(object.length > 0) {
for(var i = 0; i < object.length; i++) {
var newQueryHash = { params: queryHash.params }
newQueryHash[method] = object[i]
result.push(newQueryHash)
}
}
})
return result
},
executeQuery: function(queries, index, callback) {
var self = this,
queryHash = queries[index],
splittedQueryHash = this.splitQueryHash(queryHash),
method = splittedQueryHash.method,
object = splittedQueryHash.object
var iterator = function() {
if(queries.length > (index + 1)) self.executeQuery(queries, index + 1, callback)
else if (callback) callback()
}
object[method].apply(object, this.Helper.Array.join(queryHash.params || [], [iterator]))
},
chain: function() {
var self = this
var args = this.splitArguments.apply(this, arguments),
queries = args.queries,
callback = args.callback
var expandedQueries = this.expandMultiQueries(queries)
if(queries.length > 0) this.executeQuery(expandedQueries, 0, callback)
else if (callback) callback()
}
}
for(var methodName in instanceMethods)
QueryChainer.prototype[methodName] = instanceMethods[methodName]
module.exports.QueryChainer = QueryChainer