Browse Source

Refs #2378: moved setSource of input to last

This was to fix bugs in extensions where setSource is used to optimize the input source, similar to what PipelineD does in the original code.
Kyle P Davis 12 years ago
parent
commit
37bc8befd5
1 changed files with 19 additions and 19 deletions
  1. 19 19
      lib/pipeline/Pipeline.js

+ 19 - 19
lib/pipeline/Pipeline.js

@@ -185,19 +185,20 @@ var Pipeline = module.exports = (function(){
 		if(inputSource && !(inputSource instanceof DocumentSource)) throw new Error("arg `inputSource` must be an instance of DocumentSource");
 		if(!callback) throw new Error("arg `callback` required");
 		var self = this;
-		inputSource.setSource(undefined, function(err){	//TODO: HACK: temp solution to the fact that we need to initialize our source since we're using setSource as a workaround for the lack of real async cursors
-			if(err) return callback(err);
-			// chain together the sources we found
-			async.eachSeries(self.sourceVector,
-				function eachSrc(item, next){
-					item.setSource(inputSource, function(err){
-						if(err) return next(err);
-						inputSource = item;
-						return next();
-					});
-				},
-				function doneSrcs(err){ //source is left pointing at the last source in the chain
-					if(err) return callback(err);
+		// chain together the sources we found
+		var source = inputSource;
+		async.eachSeries(self.sourceVector,
+			function eachSrc(temp, next){
+				temp.setSource(source, function(err){
+					if (err) return next(err);
+					source = temp;
+					return next();
+				});
+			},
+			function doneSrcs(err){ //source is left pointing at the last source in the chain
+				if (err) return callback(err);
+				inputSource.setSource(undefined, function(err){	//TODO: HACK: temp solution to the fact that we need to initialize our source since we're using setSource as a workaround for the lack of real async cursors
+					if (err) return callback(err);
 					/*
 					Iterate through the resulting documents, and add them to the result.
 					We do this even if we're doing an explain, in order to capture the document counts and other stats.
@@ -206,10 +207,9 @@ var Pipeline = module.exports = (function(){
 					// the array in which the aggregation results reside
 					var resultArray = [];
 					try{
-						for(var hasDoc = !inputSource.eof(); hasDoc; hasDoc = inputSource.advance()) {
-							var document = inputSource.getCurrent();
+						for(var hasDoc = !source.eof(); hasDoc; hasDoc = source.advance()) {
+							var document = source.getCurrent();
 							resultArray.push(document);	// add the document to the result set
-
 							//Commenting out this assertion for munge.  MUHAHAHA!!!
 							// object will be too large, assert. the extra 1KB is for headers
 							//if(resultArray.len() < BSONObjMaxUserSize - 1024) throw new Error("aggregation result exceeds maximum document size (" + BSONObjMaxUserSize / (1024 * 1024) + "MB); code 16389");
@@ -222,9 +222,9 @@ var Pipeline = module.exports = (function(){
 //						,ok: true;	//not actually in here... where does this come from?
 					};
 					return callback(null, result);
-				}
-			);
-		});
+				});
+			}
+		);
 	};
 
 	return klass;