README.md 2.3 KB

munge

A JavaScript data munging pipeline based on the MongoDB aggregation framework.

exports

TODO: document the major exports and a little about each here

Deviations

Here is a list of the major items where I have deviated from the MongoDB code and why:

  • Pipeline Expressions
    • Value class
      • DESIGN: Value now provides static helpers rather than instance helpers since that seems to make more sense here
      • NAMING: Value#get{TYPE} methods have been renamed to Value.verify{TYPE} since that seemed to make more sense given what they're really doing for us as statics
      • DESIGN: Value.coerceToDate static returns a JavaScript Date object rather than milliseconds since that seems to make more sense where possible
    • NAMING: The Expression{FOO} classes have all been renamed to {FOO}Expression to satisfy my naming OCD.
    • DESIGN: The {FOO}Expression classes do not provide create statics since calling new is easy enough
      • DESIGN: To further this, the CompareExpression class doesn't provide any of it's additional create{FOO} helpers so instead I'm binding the appropriate args to the ctor
    • TESTING: Most of the expression tests have been written without the expression test base classes
  • Document sources
    • we have implemented a 'reset' method for all document sources so that we can reuse them against different streams of data

TODO

Here is a list of global items that I know about that may need to be done in the future:

  • Go through the TODOs....
  • getOpName should be static!
  • Need a method by which consumers can provide their own extensions
  • Move expression name to the ctor? or at least a const prototype property or something
  • NAMING: need to go back through and make sure that places referencing in the C++ code are represented here by referencing a var called "doc" or similar
  • Currently using JS types but may need to support BSON types to do everything properly; affects handling of ObjectId, ISODate, and Timestamp
  • Go through test cases and try to turn assert.equal() calls into assert.strictEqual() calls
  • Replace exports = module.exports = with module.exports = only
  • Go through uses of throw and make them actually use UserException vs SystemException (or whatever they're called)