|
|
@@ -11,62 +11,65 @@
|
|
|
* @module mungedb-aggregate
|
|
|
* @constructor
|
|
|
* @param fieldPath the dotted field path string or non empty pre-split vector.
|
|
|
- **/
|
|
|
+ */
|
|
|
var FieldPath = module.exports = function FieldPath(path) {
|
|
|
- var fields = typeof path === "object" && typeof path.length === "number" ? path : path.split(".");
|
|
|
- if(fields.length === 0) throw new Error("FieldPath cannot be constructed from an empty vector (String or Array).; code 16409");
|
|
|
- for(var i = 0, n = fields.length; i < n; ++i){
|
|
|
- var field = fields[i];
|
|
|
- if(field.length === 0) throw new Error("FieldPath field names may not be empty strings; code 15998");
|
|
|
- if(field[0] == "$") throw new Error("FieldPath field names may not start with '$'; code 16410");
|
|
|
- if(field.indexOf("\0") != -1) throw new Error("FieldPath field names may not contain '\\0'; code 16411");
|
|
|
- if(field.indexOf(".") != -1) throw new Error("FieldPath field names may not contain '.'; code 16412");
|
|
|
+ var fieldNames = typeof path === "object" && typeof path.length === "number" ? path : path.split(".");
|
|
|
+ if (fieldNames.length === 0) throw new Error("FieldPath cannot be constructed from an empty vector (String or Array).; massert code 16409");
|
|
|
+ this.fieldNames = [];
|
|
|
+ for (var i = 0, n = fieldNames.length; i < n; ++i) {
|
|
|
+ this._pushFieldName(fieldNames[i]);
|
|
|
}
|
|
|
- this.path = path;
|
|
|
- this.fields = fields;
|
|
|
}, klass = FieldPath, base = Object, proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
|
|
|
|
|
|
-// STATIC MEMBERS
|
|
|
klass.PREFIX = "$";
|
|
|
|
|
|
-// PROTOTYPE MEMBERS
|
|
|
/**
|
|
|
* Get the full path.
|
|
|
- *
|
|
|
* @method getPath
|
|
|
* @param fieldPrefix whether or not to include the field prefix
|
|
|
* @returns the complete field path
|
|
|
- **/
|
|
|
-proto.getPath = function getPath(withPrefix) {
|
|
|
- return ( !! withPrefix ? FieldPath.PREFIX : "") + this.fields.join(".");
|
|
|
+ */
|
|
|
+proto.getPath = function getPath(fieldPrefix) {
|
|
|
+ return (!!fieldPrefix ? FieldPath.PREFIX : "") + this.fieldNames.join(".");
|
|
|
};
|
|
|
|
|
|
+//SKIPPED: writePath - merged into getPath
|
|
|
+
|
|
|
/**
|
|
|
* A FieldPath like this but missing the first element (useful for recursion). Precondition getPathLength() > 1.
|
|
|
- *
|
|
|
* @method tail
|
|
|
- **/
|
|
|
+ */
|
|
|
proto.tail = function tail() {
|
|
|
- return new FieldPath(this.fields.slice(1));
|
|
|
+ return new FieldPath(this.fieldNames.slice(1));
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Get a particular path element from the path.
|
|
|
- *
|
|
|
* @method getFieldName
|
|
|
* @param i the zero based index of the path element.
|
|
|
* @returns the path element
|
|
|
- **/
|
|
|
-proto.getFieldName = function getFieldName(i){ //TODO: eventually replace this with just using .fields[i] directly
|
|
|
- return this.fields[i];
|
|
|
+ */
|
|
|
+proto.getFieldName = function getFieldName(i) { //TODO: eventually replace this with just using .fieldNames[i] directly
|
|
|
+ return this.fieldNames[i];
|
|
|
+};
|
|
|
+
|
|
|
+klass._uassertValidFieldName = function _uassertValidFieldName(fieldName) {
|
|
|
+ if (fieldName.length === 0) throw new Error("FieldPath field names may not be empty strings; code 15998");
|
|
|
+ if (fieldName[0] === "$") throw new Error("FieldPath field names may not start with '$'; code 16410");
|
|
|
+ if (fieldName.indexOf("\0") !== -1) throw new Error("FieldPath field names may not contain '\\0'; code 16411");
|
|
|
+ if (fieldName.indexOf(".") !== -1) throw new Error("FieldPath field names may not contain '.'; code 16412");
|
|
|
+};
|
|
|
+
|
|
|
+proto._pushFieldName = function _pushFieldName(fieldName) {
|
|
|
+ klass._uassertValidFieldName(fieldName);
|
|
|
+ this.fieldNames.push(fieldName);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Get the number of path elements in the field path.
|
|
|
- *
|
|
|
* @method getPathLength
|
|
|
* @returns the number of path elements
|
|
|
- **/
|
|
|
+ */
|
|
|
proto.getPathLength = function getPathLength() {
|
|
|
- return this.fields.length;
|
|
|
+ return this.fieldNames.length;
|
|
|
};
|