Browse Source

EAGLESIX-2892 ported ParsedDeps

Austin Meagher 11 năm trước cách đây
mục cha
commit
a12fabeba7
1 tập tin đã thay đổi với 82 bổ sung0 xóa
  1. 82 0
      lib/pipeline/ParsedDeps.js

+ 82 - 0
lib/pipeline/ParsedDeps.js

@@ -0,0 +1,82 @@
+"use strict";
+
+/**
+ * This class is designed to quickly extract the needed fields into a Document.
+ * It should only be created by a call to DepsTracker.toParsedDeps.
+ *
+ * @class ParsedDeps
+ * @namespace mungedb-aggregate.pipeline
+ * @module mungedb-aggregate
+ * @constructor
+ * @param {Object} fields    The fields needed in a Document
+ */
+var ParsedDeps = module.exports = function ParsedDeps(fields) {
+    this._fields = fields;
+}, klass = ParsedDeps, base = Object, proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+
+/**
+ * Extracts fields from the input into a new Document, based on the caller.
+ *
+ * @method extractFields
+ * @param {Object} input    The JSON object to extract from
+ * @return {Document}
+ */
+proto.extractFields = function extractFields(input) {
+    return proto._documentHelper(input, this._fields);
+};
+
+/**
+ * Private: Handles array-type values for extractFields()
+ *
+ * @method _arrayHelper
+ * @param {Object} json    Object to iterate over
+ * @param {Object} neededFields
+ * @return {Array}
+ */
+proto._arrayHelper = function _arrayHelper(json, neededFields) {
+    var iterator = json instanceof Array? json : Object.keys(json),
+        values = [];
+
+    iterator.sort().forEach(function (it) {
+        if (it instanceof Array)
+            values.push(_arrayHelper(it, neededFields));
+        else if (it instanceof Object)
+            values.push(proto._documentHelper(it, neededFields));
+    });
+
+    return values;
+};
+
+/**
+ * Private: Handles object-type values for extractFields()
+ *
+ * @method _documentHelper
+ * @param {Object} json    Object to iterate over and filter
+ * @param {Object} neededFields    Fields to not exclude
+ * @return {Document}
+ */
+proto._documentHelper = function _documentHelper(json, neededFields) {
+    var doc = {};
+
+    Object.keys(json).sort().forEach(function (it) {
+        var jsonElement = json[it],
+            isNeeded = neededFields[it];
+
+        if (!isNeeded)
+            return;
+
+        if (typeof(isNeeded) === 'boolean') {
+            doc[it] = jsonElement;
+            return;
+        }
+
+        if (typeof(isNeeded) === 'object') {
+            if (jsonElement instanceof Array)
+                doc[it] = proto._arrayHelper(jsonElement, isNeeded);
+            if (jsonElement instanceof Object)
+                doc[it] = proto._documentHelper(jsonElement, isNeeded);
+        }
+    });
+
+    return doc;
+};