Skip to content

Commit bb359a1

Browse files
committed
fix: don't consume first document when calling hasNext on cursor
NODE-2454
1 parent c56ff72 commit bb359a1

File tree

2 files changed

+8
-58
lines changed

2 files changed

+8
-58
lines changed

lib/cursor.js

+7-21
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ class Cursor extends CoreCursor {
124124
state: CursorState.INIT,
125125
// Promise library
126126
promiseLibrary,
127-
// Current doc
128-
currentDoc: null,
129127
// explicitlyIgnoreSession
130128
explicitlyIgnoreSession: !!options.explicitlyIgnoreSession
131129
};
@@ -197,20 +195,18 @@ class Cursor extends CoreCursor {
197195
hasNext(callback) {
198196
return maybePromise(callback, cb => {
199197
const cursor = this;
200-
if (cursor.s.currentDoc) {
201-
return cb(null, true);
202-
}
203-
204198
if (cursor.isNotified()) {
205199
return cb(null, false);
206200
}
207201

208-
nextObject(cursor, (err, doc) => {
202+
cursor._next((err, doc) => {
209203
if (err) return cb(err);
210-
if (cursor.s.state === Cursor.CLOSED || cursor.isDead()) return cb(null, false);
211-
if (!doc) return cb(null, false);
204+
if (doc == null || cursor.s.state === Cursor.CLOSED || cursor.isDead()) {
205+
return cb(null, false);
206+
}
212207

213-
cursor.s.currentDoc = doc;
208+
cursor.s.state = CursorState.OPEN;
209+
cursor.cursorState.cursorIndex--;
214210
cb(null, true);
215211
});
216212
});
@@ -225,17 +221,7 @@ class Cursor extends CoreCursor {
225221
*/
226222
next(callback) {
227223
return maybePromise(callback, cb => {
228-
const cursor = this;
229-
230-
// Return the currentDoc if someone called hasNext first
231-
if (cursor.s.currentDoc) {
232-
const doc = cursor.s.currentDoc;
233-
cursor.s.currentDoc = null;
234-
return cb(null, doc);
235-
}
236-
237-
// Return the next object
238-
nextObject(cursor, cb);
224+
nextObject(this, cb);
239225
});
240226
}
241227

lib/operations/cursor_ops.js

+1-37
Original file line numberDiff line numberDiff line change
@@ -106,34 +106,6 @@ function each(cursor, callback) {
106106
}
107107
}
108108

109-
/**
110-
* Check if there is any document still available in the cursor.
111-
*
112-
* @method
113-
* @param {Cursor} cursor The Cursor instance on which to run.
114-
* @param {Cursor~resultCallback} [callback] The result callback.
115-
*/
116-
function hasNext(cursor, callback) {
117-
if (cursor.s.currentDoc) {
118-
return callback(null, true);
119-
}
120-
121-
if (cursor.isNotified()) {
122-
return callback(null, false);
123-
}
124-
125-
nextObject(cursor, (err, doc) => {
126-
if (err) return callback(err, null);
127-
if (cursor.s.state === CursorState.CLOSED || cursor.isDead()) {
128-
return callback(null, false);
129-
}
130-
131-
if (!doc) return callback(null, false);
132-
cursor.s.currentDoc = doc;
133-
callback(null, true);
134-
});
135-
}
136-
137109
// Trampoline emptying the number of retrieved items
138110
// without incurring a nextTick operation
139111
function loop(cursor, callback) {
@@ -153,14 +125,6 @@ function loop(cursor, callback) {
153125
* @param {Cursor~resultCallback} [callback] The result callback.
154126
*/
155127
function next(cursor, callback) {
156-
// Return the currentDoc if someone called hasNext first
157-
if (cursor.s.currentDoc) {
158-
const doc = cursor.s.currentDoc;
159-
cursor.s.currentDoc = null;
160-
return callback(null, doc);
161-
}
162-
163-
// Return the next object
164128
nextObject(cursor, callback);
165129
}
166130

@@ -236,4 +200,4 @@ function toArray(cursor, callback) {
236200
fetchDocs();
237201
}
238202

239-
module.exports = { count, each, hasNext, next, toArray };
203+
module.exports = { count, each, next, toArray };

0 commit comments

Comments
 (0)