'use strict';
|
|
const Aspect = require('./operation').Aspect;
|
const defineAspects = require('./operation').defineAspects;
|
const handleCallback = require('../utils').handleCallback;
|
const CursorState = require('../core/cursor').CursorState;
|
const OperationBase = require('./operation').OperationBase;
|
const push = Array.prototype.push;
|
|
class ToArrayOperation extends OperationBase {
|
constructor(cursor) {
|
super();
|
|
this.cursor = cursor;
|
}
|
|
execute(callback) {
|
const cursor = this.cursor;
|
const items = [];
|
|
// Reset cursor
|
cursor.rewind();
|
cursor.s.state = CursorState.INIT;
|
|
// Fetch all the documents
|
const fetchDocs = () => {
|
cursor._next((err, doc) => {
|
if (err) {
|
return cursor._endSession
|
? cursor._endSession(() => handleCallback(callback, err))
|
: handleCallback(callback, err);
|
}
|
|
if (doc == null) {
|
return cursor.close({ skipKillCursors: true }, () =>
|
handleCallback(callback, null, items)
|
);
|
}
|
|
// Add doc to items
|
items.push(doc);
|
|
// Get all buffered objects
|
if (cursor.bufferedCount() > 0) {
|
let docs = cursor.readBufferedDocuments(cursor.bufferedCount());
|
|
// Transform the doc if transform method added
|
if (cursor.s.transforms && typeof cursor.s.transforms.doc === 'function') {
|
docs = docs.map(cursor.s.transforms.doc);
|
}
|
|
push.apply(items, docs);
|
}
|
|
// Attempt a fetch
|
fetchDocs();
|
});
|
};
|
|
fetchDocs();
|
}
|
}
|
|
defineAspects(ToArrayOperation, Aspect.SKIP_SESSION);
|
|
module.exports = ToArrayOperation;
|