Add start value to PYSON Date and DateTime

This enable the customization of the starting point for delta operations.

issue8561
review264041002
This commit is contained in:
Cédric Krier
2019-09-20 11:36:05 +02:00
parent 1de6685654
commit 397cd88db9
2 changed files with 117 additions and 12 deletions
+36 -10
View File
@@ -658,7 +658,8 @@
delta_days);
};
Sao.PYSON.Date = Sao.class_(Sao.PYSON.PYSON, {
init: function(year, month, day, delta_years, delta_months, delta_days)
init: function(
year, month, day, delta_years, delta_months, delta_days, start)
{
Sao.PYSON.Date._super.init.call(this);
if (year === undefined) year = null;
@@ -681,6 +682,7 @@
this._delta_years = delta_years;
this._delta_months = delta_months;
this._delta_days = delta_days;
this._start = start || null;
},
pyson: function() {
return {
@@ -690,7 +692,8 @@
'd': this._day,
'dy': this._delta_years,
'dM': this._delta_months,
'dd': this._delta_days
'dd': this._delta_days,
'start': this._start,
};
},
types: function() {
@@ -710,19 +713,29 @@
},
__string_params__: function() {
return [this._year, this._month, this._day, this._delta_years,
this._delta_months, this._delta_days];
this._delta_months, this._delta_days, this._start];
}
});
Sao.PYSON.Date.eval_ = function(value, context) {
var date = Sao.Date(value.y, value.M && value.M - 1, value.d);
var date = value.start;
if (date && date.isDateTime) {
date = Sao.Date(date.year(), date.month(), date.date());
}
if (!date || !date.isDate) {
date = Sao.Date();
}
if (value.y) date.year(value.y);
if (value.M) date.month(value.M - 1);
if (value.d) date.date(value.d);
if (value.dy) date.add(value.dy, 'y');
if (value.dM) date.add(value.dM, 'M');
if (value.dd) date.add(value.dd, 'd');
return date;
};
Sao.PYSON.Date.init_from_object = function(obj) {
return new Sao.PYSON.Date(obj.y, obj.M, obj.d, obj.dy, obj.dM, obj.dd);
return new Sao.PYSON.Date(
obj.y, obj.M, obj.d, obj.dy, obj.dM, obj.dd, obj.start);
};
Sao.PYSON.eval.DateTime = function(year, month, day, hour, minute, second,
@@ -735,9 +748,9 @@
Sao.PYSON.DateTime = Sao.class_(Sao.PYSON.Date, {
init: function(year, month, day, hour, minute, second, microsecond,
delta_years, delta_months, delta_days, delta_hours,
delta_minutes, delta_seconds, delta_microseconds) {
delta_minutes, delta_seconds, delta_microseconds, start) {
Sao.PYSON.DateTime._super.init.call(this, year, month, day,
delta_years, delta_months, delta_days);
delta_years, delta_months, delta_days, start);
if (hour === undefined) hour = null;
if (minute === undefined) minute = null;
if (second === undefined) second = null;
@@ -785,13 +798,26 @@
this._hour, this._minute, this._second, this._microsecond,
date_params[3], date_params[4], date_params[5],
this._delta_hours, this._delta_minutes, this._delta_seconds,
this._delta_microseconds];
this._delta_microseconds, date_params[6]];
}
});
Sao.PYSON.DateTime.eval_ = function(value, context) {
var date = Sao.DateTime(value.y, value.M && value.M - 1, value.d,
value.h, value.m, value.s, value.ms && value.ms / 1000, true);
var date = value.start;
if (date && date.isDate) {
date = Sao.DateTime.combine(date, Sao.Time());
}
if (!date || !date.isDateTime) {
date = Sao.DateTime();
date.utc();
}
if (value.y) date.year(value.y);
if (value.M) date.month(value.M - 1);
if (value.d) date.date(value.d);
if (value.h !== null) date.hour(value.h);
if (value.m !== null) date.minute(value.m);
if (value.s !== null) date.second(value.s);
if (value.ms !== null) date.milliseconds(value.ms / 1000);
if (value.dy) date.add(value.dy, 'y');
if (value.dM) date.add(value.dM, 'M');
if (value.dd) date.add(value.dd, 'd');
+81 -2
View File
@@ -48,8 +48,10 @@
var date = Sao.Date(2002, 0, 1);
var datetime = Sao.DateTime(2002, 0, 1, 12, 30, 0, 0);
var pyson_date = new Sao.PYSON.Date(2002, 1, 1).pyson();
pyson_date.start = null;
var pyson_datetime = new Sao.PYSON.DateTime(
2002, 1, 1, 12, 30, 0, 0).pyson();
pyson_datetime.start = null;
var array = ["create_date", '>=', date];
var pyson_array = ["create_date", '>=', pyson_date];
QUnit.strictEqual(encoder.encode(), 'null', "encode()");
@@ -707,7 +709,42 @@
QUnit.strictEqual(
new Sao.PYSON.Date(2010, 1, 12, -1, 12, -7).toString(),
'Date(2010, 1, 12, -1, 12, -7)');
'Date(2010, 1, 12, -1, 12, -7, null)');
});
QUnit.test('PYSON Date start', function() {
var eval_;
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.Date(
undefined, undefined, undefined,
undefined, undefined, undefined,
new Sao.PYSON.Eval('date')));
var date = Sao.Date(2000, 1, 1);
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'date': date}).decode(eval_).valueOf(), date.valueOf());
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.Date(
undefined, undefined, undefined,
undefined, undefined, undefined,
new Sao.PYSON.Eval('datetime')));
var datetime = Sao.DateTime(2000, 1, 1, 12, 0);
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'datetime': datetime}).decode(eval_).valueOf(),
Sao.Date(2000, 1, 1).valueOf());
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.Date(
undefined, undefined, undefined,
undefined, undefined, undefined,
new Sao.PYSON.Eval('foo')));
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'foo': 'bar'}).decode(eval_).valueOf(),
Sao.Date().valueOf());
});
QUnit.test('PYSON DateTime', function() {
@@ -874,7 +911,49 @@
QUnit.strictEqual(new Sao.PYSON.DateTime(2010, 1, 12, 10, 30, 20, 0,
-1, 12, -7, 2, 15, 30, 1).toString(),
'DateTime(2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)');
'DateTime(2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1, null)');
});
QUnit.test('PYSON DateTime start', function() {
var eval_;
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.DateTime(
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
new Sao.PYSON.Eval('datetime')));
var datetime = Sao.DateTime(2000, 1, 1, 12, 0);
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'datetime': datetime}).decode(eval_).valueOf(),
datetime.valueOf());
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.DateTime(
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
new Sao.PYSON.Eval('date')));
var date = Sao.DateTime(2000, 1, 1);
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'date': date}).decode(eval_).valueOf(),
Sao.DateTime(2000, 1, 1, 0, 0).valueOf());
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.DateTime(
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
undefined, undefined, undefined,
undefined, undefined, undefined, undefined,
new Sao.PYSON.Eval('foo')));
QUnit.strictEqual(new Sao.PYSON.Decoder(
{'foo': 'bar'}).decode(eval_).valueOf(),
Sao.DateTime().valueOf());
});
QUnit.test('PYSON TimeDelta', function() {