浏览代码

refs #1004 Ported DocumentSourceProject. No test cases yet.

http://source.rd.rcg.local/trac/eagle6/changeset/1332/Eagle6_SVN
Jared Hall 12 年之前
父节点
当前提交
9a64e26895
共有 1 个文件被更改,包括 130 次插入0 次删除
  1. 130 0
      lib/pipeline/documentSources/ProjectDocumentSource.js

+ 130 - 0
lib/pipeline/documentSources/ProjectDocumentSource.js

@@ -0,0 +1,130 @@
+var ProjectDocumentSource = module.exports = (function(){
+	// CONSTRUCTOR
+	/**
+	 * A base class for filter document sources
+	 * 
+	 * @class ProjectDocumentSource
+	 * @namespace munge.pipepline.documentsource
+	 * @module munge
+	 * @constructor
+	 * @param	{ExpressionContext}	
+	**/
+	var klass = module.exports = ProjectDocumentSource = function ProjectDocumentSource(/*pCtx*/){
+		if(arguments.length !== 0) throw new Error("zero args expected");
+		base.call(this);
+		this.EO = new ObjectExpression();
+		this.projectName = "$project";
+	}, base = require('./DocumentSource'), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+
+	// DEPENDENCIES
+	var ObjectExpression = require('../expressions/OjectExpression');
+	var Value = require('../Value');
+	var Expression = require('../expressions/Expresssion');
+
+
+	/**
+	 *	Returns the name of project
+	 *	
+	 *	@return {string} the name of project
+	**/
+	proto.getSourceName = function getSourceName() {
+        return this.projectName;
+    };
+
+	/**
+	*	Calls base document source eof()
+	*	
+	*	@return {bool} The result of base.pSource.eof()
+	**/
+	proto.eof = function eof() {
+        return this.base.pSource.eof();
+    };
+
+	/**
+	*	Calls base document source advance()
+	*	
+	*	@return {bool} The result of base.pSource.advance()
+	**/
+	proto.advance = function advance() {
+        return this.base.pSource.advance();
+    };
+
+
+	/**
+	*	Builds a new document(object) that represents this base document
+	*	
+	*	@return A document that represents this base document
+	**/
+	proto.getCurrent = function getCurrent() {
+		inDocument = base.pSource.getCurrent();
+		if (!inDocument) {
+			throw new Error('inDocument must be an object');
+		}
+
+		var resultDocument = {};
+		this.EO.addToDocument(resultDocument, inDocument, /*root=*/inDocument);
+        return resultDocument;
+    };
+
+	/**
+	 * Optimizes the internal ObjectExpression
+	 *
+	 * @return
+	**/
+	proto.optimize = function optimize() {
+		this.EO.optimize();
+    };
+
+	/**
+	 * Places a $project key inside the builder object with value of this.EO
+	 *
+	 * @method sourceToJson
+	 * @param {builder} An object (was ported from BsonBuilder)
+	 * @return
+	**/
+	proto.sourceToJson = function sourceToJson(builder, explain) {
+        builder[this.projectName] = this.EO;
+    };
+
+	/**
+	 * Builds a new ProjectDocumentSource from an object
+	 *
+	 * @method createFromJson
+	 * @return a ProjectDocumentSource instance
+	**/
+	proto.createFromJson = function(jsonElement, expCtx) {
+		if(! jsonElement instanceof Object) {
+			throw new Error('Error 15969. Specification must be an object but was ' + typeof jsonElement);
+		}
+		var objectContext = Expression.ObjectCtx({
+			isDocumentOk:true,
+			isTopLevel:true,
+			isInclusionOk:true
+		});
+		var project = new ProjectDocumentSource();
+		var parsed = Expression.parseObject(jsonElement, objectContext);
+		var exprObj = parsed; 
+		if(!exprObj) {
+			throw new Error("16402, parseObject() returned wrong type of Expression");
+		}
+		if(!exprObj.getFieldCount()) {
+			throw new Error("16403, $projection requires at least one output field");
+		}
+		project.EO = exprObj;
+		return project;
+	};
+
+	/**
+	*	Adds dependencies to the contained ObjectExpression
+	*
+	*	@param {deps} An object that is treated as a set of strings
+	*	@return A string that is part of the GetDepsReturn enum
+	**/
+	proto.getDependencies = function getDependencies(deps) {
+        var path = [];
+        this.EO.addDependencies(deps, path);
+        return base.GetDepsReturn.EXHAUSTIVE;
+    };
+
+	return klass;
+})();