(db, opts, callback)
| 218 | |
| 219 | // shim for P/CouchDB adapters that don't directly implement _bulk_get |
| 220 | function bulkGet(db, opts, callback) { |
| 221 | var requests = opts.docs; |
| 222 | |
| 223 | // consolidate into one request per doc if possible |
| 224 | var requestsById = new Map(); |
| 225 | requests.forEach(function (request) { |
| 226 | if (requestsById.has(request.id)) { |
| 227 | requestsById.get(request.id).push(request); |
| 228 | } else { |
| 229 | requestsById.set(request.id, [request]); |
| 230 | } |
| 231 | }); |
| 232 | |
| 233 | var numDocs = requestsById.size; |
| 234 | var numDone = 0; |
| 235 | var perDocResults = new Array(numDocs); |
| 236 | |
| 237 | function collapseResultsAndFinish() { |
| 238 | var results = []; |
| 239 | perDocResults.forEach(function (res) { |
| 240 | res.docs.forEach(function (info) { |
| 241 | results.push({ |
| 242 | id: res.id, |
| 243 | docs: [info] |
| 244 | }); |
| 245 | }); |
| 246 | }); |
| 247 | callback(null, {results}); |
| 248 | } |
| 249 | |
| 250 | function checkDone() { |
| 251 | if (++numDone === numDocs) { |
| 252 | collapseResultsAndFinish(); |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | function gotResult(docIndex, id, docs) { |
| 257 | perDocResults[docIndex] = {id, docs}; |
| 258 | checkDone(); |
| 259 | } |
| 260 | |
| 261 | var allRequests = []; |
| 262 | requestsById.forEach(function (value, key) { |
| 263 | allRequests.push(key); |
| 264 | }); |
| 265 | |
| 266 | var i = 0; |
| 267 | |
| 268 | function nextBatch() { |
| 269 | |
| 270 | if (i >= allRequests.length) { |
| 271 | return; |
| 272 | } |
| 273 | |
| 274 | var upTo = Math.min(i + MAX_NUM_CONCURRENT_REQUESTS, allRequests.length); |
| 275 | var batch = allRequests.slice(i, upTo); |
| 276 | processBatch(batch, i); |
| 277 | i += batch.length; |
no test coverage detected
searching dependent graphs…