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