1 | module.exports= function (dyn)
|
2 | {
|
3 | var finder= {};
|
4 |
|
5 | finder.canFind= function (query)
|
6 | {
|
7 | return !!query.cond._id&&!(query.cond._id instanceof RegExp);
|
8 | };
|
9 |
|
10 | finder.find= function (query)
|
11 | {
|
12 | if (query.opts.hints)
|
13 | console.log(('PK on '+query.table.name+' for '+JSON.stringify(query.cond,null,2)).green);
|
14 |
|
15 | query.$filter= {};
|
16 |
|
17 | var p= dyn.promise(['results','count','end'],'notfound','consumed'),
|
18 | _triggerError= query.count ? function (err)
|
19 | {
|
20 | if (err.code=='notfound')
|
21 | p.trigger.count(0);
|
22 | else
|
23 | p.trigger.error(err);
|
24 | } : p.trigger.error;
|
25 |
|
26 | if (query.cond._pos!==undefined)
|
27 | dyn.table(query.table.name)
|
28 | .hash('_id',query.cond._id)
|
29 | .range('_pos',query.cond._pos)
|
30 | .get(function (item)
|
31 | {
|
32 | if (query.count)
|
33 | p.trigger.count(1);
|
34 | else
|
35 | {
|
36 | p.trigger.results([item]);
|
37 | p.trigger.end();
|
38 | }
|
39 | },{ attrs: query.projection.include, consistent: query.$consistent })
|
40 | .consumed(p.trigger.consumed)
|
41 | .error(_triggerError);
|
42 | else
|
43 | if (query.limit==1)
|
44 | dyn.table(query.table.name)
|
45 | .hash('_id',query.cond._id)
|
46 | .range('_pos',0)
|
47 | .query(query.count ? p.trigger.count : p.trigger.results,
|
48 | { attrs: query.projection.include, count: query.count, consistent: query.$consistent })
|
49 | .error(_triggerError)
|
50 | .consumed(p.trigger.consumed)
|
51 | .end(p.trigger.end);
|
52 | else
|
53 | dyn.table(query.table.name)
|
54 | .hash('_id',query.cond._id)
|
55 | .query(query.count ? p.trigger.count : p.trigger.results,
|
56 | { attrs: query.projection.include, limit: query.limit, count: query.count, consistent: query.$consistent })
|
57 | .error(_triggerError)
|
58 | .consumed(p.trigger.consumed)
|
59 | .end(p.trigger.end);
|
60 |
|
61 | return p;
|
62 | };
|
63 |
|
64 | return finder;
|
65 | };
|