123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- "use strict";
- var ProjectDocumentSource = module.exports = (function(){
- // CONSTRUCTOR
- /**
- * A base class for filter document sources
- *
- * @class ProjectDocumentSource
- * @namespace munge.pipeline.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._raw = undefined;
- }, base = require('./DocumentSource'), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
- // DEPENDENCIES
- var Expression = require('../expressions/Expression');
- var ObjectExpression = require('../expressions/ObjectExpression');
- var Value = require('../Value');
- /**
- * Returns the name of project
- *
- * @return {string} the name of project
- **/
- klass.projectName = "$project";
- proto.getSourceName = function getSourceName() {
- return klass.projectName;
- };
- /**
- * Returns the object that was used to construct the ProjectDocumentSource
- *
- * @return {object} the object that was used to construct the ProjectDocumentSource
- **/
- proto.getRaw = function getRaw() {
- return this._raw;
- };
- /**
- * Calls base document source eof()
- *
- * @return {bool} The result of base.pSource.eof()
- **/
- proto.eof = function eof() {
- return this.pSource.eof();
- };
- /**
- * Calls base document source advance()
- *
- * @return {bool} The result of base.pSource.advance()
- **/
- proto.advance = function advance() {
- return this.pSource.advance();
- };
- /**
- * Builds a new document(object) that represents this base document
- *
- * @return {object} A document that represents this base document
- **/
- proto.getCurrent = function getCurrent() {
- var inDocument = this.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) {
- var insides = this.EO.toJson(true);
- builder[this.getSourceName()] = insides;
- };
- /**
- * Builds a new ProjectDocumentSource from an object
- *
- * @method createFromJson
- * @return {ProjectDocmentSource} a ProjectDocumentSource instance
- **/
- klass.createFromJson = function(jsonElement, expCtx) {
- if(!(jsonElement instanceof Object) || jsonElement.constructor !== Object) {
- throw new Error('Error 15969. Specification must be an object but was ' + typeof jsonElement);
- }
- var objectContext = new Expression.ObjectCtx({
- isDocumentOk:true,
- isTopLevel:true,
- isInclusionOk:true
- });
- var project = new ProjectDocumentSource();
- project._raw = jsonElement;
- var parsed = Expression.parseObject(jsonElement, objectContext);
- var exprObj = parsed;
- if(! exprObj instanceof ObjectExpression) {
- 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;
- };
-
- /**
- * Reset the document source so that it is ready for a new stream of data.
- * Note that this is a deviation from the mongo implementation.
- *
- * @method reset
- **/
- proto.reset = function reset(){
-
- };
- return klass;
- })();
|