Browse Source

Changes to date and time expression classes

Jason Walton 11 years ago
parent
commit
251bb11294

+ 14 - 12
lib/pipeline/expressions/DayOfMonthExpression.js

@@ -8,23 +8,23 @@
  * @constructor
  **/
 var DayOfMonthExpression = module.exports = function DayOfMonthExpression() {
-    this.nargs = 1;
-    base.call(this);
-}, klass = DayOfMonthExpression,
-    base = require("./NaryExpression"),
-    proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-    });
+    //this.nargs = 1;
+    //base.call(this);
+}, klass = DayOfMonthExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass}});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
 
+// STATIC MEMBERS
+klass.extract = function extract(date) {
+    return date.getUTCDate();
+};
+
+klass.getOpName = "$dayOfMonth";
 
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-    return "$dayOfMonth";
+    return klass.getOpName;
 };
 
 /**
@@ -33,8 +33,10 @@ proto.getOpName = function getOpName() {
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
     var date = this.operands[0].evaluateInternal(vars);
-    return date.getUTCDate();
+
+    //NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+    return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$dayOfMonth", base.parse(DayOfMonthExpression));
+Expression.registerExpression(klass.getOpName, base.parse(klass));

+ 14 - 5
lib/pipeline/expressions/DayOfWeekExpression.js

@@ -8,13 +8,20 @@
  * @constructor
  **/
 var DayOfWeekExpression = module.exports = function DayOfWeekExpression(){
-	this.nargs = 1;
-	base.call(this);
-}, klass = DayOfWeekExpression, base = require("./NaryExpression"), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = DayOfWeekExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
 
+// STATIC MEMBERS
+klass.extract = function extract(date) {
+	return date.getUTCDay()+1;
+};
+
+klass.opName = "$dayOfWeek";
+
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName(){
 	return "$dayOfWeek";
@@ -26,8 +33,10 @@ proto.getOpName = function getOpName(){
  **/
 proto.evaluateInternal = function evaluateInternal(vars){
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCDay()+1;
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$dayOfWeek",base.parse(DayOfWeekExpression));
+Expression.registerExpression(klass.opName,base.parse(klass));

+ 19 - 13
lib/pipeline/expressions/DayOfYearExpression.js

@@ -8,16 +8,29 @@
  * @constructor
  **/
 var DayOfYearExpression = module.exports = function DayOfYearExpression(){
-	this.nargs = 1;
-	base.call(this);
-}, klass = DayOfYearExpression, base = require("./NaryExpression"), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = DayOfYearExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
 
+// STATIC MEMBERS
+klass.extract = function extract(date) {
+	return klass.getDateDayOfYear(date);
+};
+
+klass.opName = "$dayOfYear";
+
+klass.getDateDayOfYear = function getDateDayOfYear(d){
+    var y11 = new Date(d.getUTCFullYear(), 0, 1),       // same year, first month, first day; time omitted
+	ymd = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()+1);  // same y,m,d; time omitted, add 1 because days start at 1
+    return Math.ceil((ymd - y11) / 86400000);   //NOTE: 86400000 ms is 1 day
+};
+
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName(){
-    return "$dayOfYear";
+    return klass.opName;
 };
 
 /**
@@ -27,15 +40,8 @@ proto.getOpName = function getOpName(){
 proto.evaluateInternal = function evaluateInternal(vars){
 	//NOTE: the below silliness is to deal with the leap year scenario when we should be returning 366
     var date = this.operands[0].evaluateInternal(vars);
-    return klass.getDateDayOfYear(date);
-};
-
-// STATIC METHODS
-klass.getDateDayOfYear = function getDateDayOfYear(d){
-    var y11 = new Date(d.getUTCFullYear(), 0, 1),       // same year, first month, first day; time omitted
-	ymd = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()+1);  // same y,m,d; time omitted, add 1 because days start at 1
-    return Math.ceil((ymd - y11) / 86400000);   //NOTE: 86400000 ms is 1 day
+    return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$dayOfYear",base.parse(DayOfYearExpression));
+Expression.registerExpression(klass.opName,base.parse(klass));

+ 15 - 6
lib/pipeline/expressions/HourExpression.js

@@ -9,13 +9,20 @@
  * @constructor
  **/
 var HourExpression = module.exports = function HourExpression(){
-	this.nargs = 1;
-	base.call(this);
-}, klass = HourExpression, base = require("./NaryExpression"), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = HourExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor:{value:klass}});
+
+//STATIC MEMBERS
+klass.extract = function extract(date) {
+	return date.getUTCHours();
+};
+
+klass.opName = "$hour";
 
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName(){
-	return "$hour";
+	return klass.opName;
 };
 
 // DEPENDENCIES
@@ -27,9 +34,11 @@ var Expression = require("./Expression");
  **/
 proto.evaluateInternal = function evaluateInternal(vars){
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCHours();
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date);
 };
 
 
 /** Register Expression */
-Expression.registerExpression("$hour",base.parse(HourExpression));
+Expression.registerExpression(klass.opName,base.parse(klass));

+ 18 - 14
lib/pipeline/expressions/MillisecondExpression.js

@@ -9,22 +9,26 @@
  * @constructor
  **/
 var MillisecondExpression = module.exports = function MillisecondExpression() {
-	this.nargs = 1;
-	base.call(this);
-}, klass = MillisecondExpression,
-	base = require("./NaryExpression"),
-	proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-	});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = MillisecondExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass}});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
+var Value = require("./Value");
+
+// STATIC MEMBERS
+klass.extract = function extract(date) {
+	return date.getUTCMilliseconds();	//TODO: incorrect for last millisecond of leap year, need to fix...
+	// currently leap milliseconds are unsupported in v8
+	// http://code.google.com/p/v8/issues/detail?id=1944
+};
+
+klass.opName = "$millisecond";
 
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-	return "$millisecond";
+	return klass.opName;
 };
 
 /**
@@ -33,10 +37,10 @@ proto.getOpName = function getOpName() {
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCMilliseconds(); //TODO: incorrect for last millisecond of leap year, need to fix...
-	// currently leap milliseconds are unsupported in v8
-	// http://code.google.com/p/v8/issues/detail?id=1944
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date); 
 };
 
 /** Register Expression */
-Expression.registerExpression("$millisecond", base.parse(MillisecondExpression));
+Expression.registerExpression(klass.opName, base.parse(klass));

+ 15 - 12
lib/pipeline/expressions/MinuteExpression.js

@@ -9,22 +9,23 @@
  * @constructor
  **/
 var MinuteExpression = module.exports = function MinuteExpression() {
-	this.nargs = 1;
-	base.call(this);
-}, klass = MinuteExpression,
-	base = require("./NaryExpression"),
-	proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-	});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = MinuteExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
 
+//STATIC MEMBERS
+klass.extract = function extract(date) {
+	return date.getUTCMinutes();
+};
+
+klass.opName = "$minute";
+
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-	return "$minute";
+	return klass.opName;
 };
 
 /**
@@ -33,8 +34,10 @@ proto.getOpName = function getOpName() {
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCMinutes();
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$minute", base.parse(MinuteExpression));
+Expression.registerExpression(klass.opName, base.parse(klass));

+ 16 - 13
lib/pipeline/expressions/SecondExpression.js

@@ -9,22 +9,25 @@
  * @constructor
  **/
 var SecondExpression = module.exports = function SecondExpression() {
-	this.nargs = 1;
+	//this.nargs = 1;
 	base.call(this);
-}, klass = SecondExpression,
-	base = require("./NaryExpression"),
-	proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-	});
+}, klass = SecondExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass}});
 
 // DEPENDENCIES
 var Expression = require("./Expression");
 
+//STATIC MEMBERS
+klass.extract = function extract(date) {
+	return date.getUTCSeconds();	//TODO: incorrect for last second of leap year, need to fix...
+	// currently leap seconds are unsupported in v8
+	// http://code.google.com/p/v8/issues/detail?id=1944
+};
+
+klass.opName = "$second";
+
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-	return "$second";
+	return klass.opName;
 };
 
 /**
@@ -33,10 +36,10 @@ proto.getOpName = function getOpName() {
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCSeconds(); //TODO: incorrect for last second of leap year, need to fix...
-	// currently leap seconds are unsupported in v8
-	// http://code.google.com/p/v8/issues/detail?id=1944
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$second", base.parse(SecondExpression));
+Expression.registerExpression(klass.opName, base.parse(klass));

+ 23 - 18
lib/pipeline/expressions/WeekExpression.js

@@ -9,24 +9,32 @@
  * @constructor
  **/
 var WeekExpression = module.exports = function WeekExpression() {
-	this.nargs = 1;
-	base.call(this);
-}, klass = WeekExpression,
-	base = require("./NaryExpression"),
-	proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-	});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = WeekExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass}});
 
 // DEPENDENCIES
 var Value = require("../Value"),
 	DayOfYearExpression = require("./DayOfYearExpression"),
 	Expression = require("./Expression");
 
+// STATIC MEMBERS
+klass.extract = function extract(date) {
+	//note: copied from evaluateInternal
+	dayOfWeek = date.getUTCDay(),
+	dayOfYear = DayOfYearExpression.getDateDayOfYear(date),
+	prevSundayDayOfYear = dayOfYear - dayOfWeek, // may be negative
+	nextSundayDayOfYear = prevSundayDayOfYear + 7; // must be positive
+	// Return the zero based index of the week of the next sunday, equal to the one based index of the week of the previous sunday, which is to be returned.
+
+	return (nextSundayDayOfYear / 7) | 0; // also, the `| 0` here truncates this so that we return an integer
+};
+
+klass.opName = "$week";
+
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-	return "$week";
+	return klass.opName;
 };
 
 /**
@@ -37,14 +45,11 @@ proto.getOpName = function getOpName() {
  * @method evaluateInternal
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
-	var date = this.operands[0].evaluateInternal(vars),
-		dayOfWeek = date.getUTCDay(),
-		dayOfYear = DayOfYearExpression.getDateDayOfYear(date),
-		prevSundayDayOfYear = dayOfYear - dayOfWeek, // may be negative
-		nextSundayDayOfYear = prevSundayDayOfYear + 7; // must be positive
-	// Return the zero based index of the week of the next sunday, equal to the one based index of the week of the previous sunday, which is to be returned.
-	return (nextSundayDayOfYear / 7) | 0; // also, the `| 0` here truncates this so that we return an integer
+	var date = this.operands[0].evaluateInternal(vars);
+
+	//NOTE: DEVIATION FROM MONGO: need to return a Value object.  Our Value class only consists of static helpers at the moment.  We need a value instance to be consistent.
+	return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$week", base.parse(WeekExpression));
+Expression.registerExpression(klass.opName, base.parse(klass));

+ 12 - 12
lib/pipeline/expressions/YearExpression.js

@@ -9,25 +9,25 @@
  * @constructor
  **/
 var YearExpression = module.exports = function YearExpression() {
-	this.nargs = 1;
-	base.call(this);
-}, klass = YearExpression,
-	base = require("./NaryExpression"),
-	proto = klass.prototype = Object.create(base.prototype, {
-		constructor: {
-			value: klass
-		}
-	});
+	//this.nargs = 1;
+	//base.call(this);
+}, klass = YearExpression, base = require("./FixedArityExpressionT")(klass, 1), proto = klass.prototype = Object.create(base.prototype, {constructor: {value: klass}});
 
 // DEPENDENCIES
 var Value = require("../Value"),
 	DayOfYearExpression = require("./DayOfYearExpression"),
 	Expression = require("./Expression");
 
+// STATIC METHODS
+klass.extract = function extract(date) {
+	return date.getUTCFullYear();
+};
+
+klass.opName = "$year";
 
 // PROTOTYPE MEMBERS
 proto.getOpName = function getOpName() {
-	return "$year";
+	return klass.opName;
 };
 
 /**
@@ -36,8 +36,8 @@ proto.getOpName = function getOpName() {
  **/
 proto.evaluateInternal = function evaluateInternal(vars) {
 	var date = this.operands[0].evaluateInternal(vars);
-	return date.getUTCFullYear();
+	return klass.extract(date);
 };
 
 /** Register Expression */
-Expression.registerExpression("$year", base.parse(YearExpression));
+Expression.registerExpression(klass.opName, base.parse(klass));