Support PYSON comparison of timedelta

Closes #10727
This commit is contained in:
Cédric Krier
2023-06-15 17:06:13 +02:00
parent 3c4be97ed0
commit 041a3fb9b2
10 changed files with 62 additions and 11 deletions
+1
View File
@@ -1,3 +1,4 @@
* Support PYSON comparison of timedelta
* Support encoding timedelta into PYSON TimeDelta
Version 6.8.0 - 2023-05-01
+6 -2
View File
@@ -314,12 +314,14 @@ class Greater(PYSON):
if isinstance(i, PYSON):
assert i.types().issubset({
int, float, type(None),
datetime.datetime, datetime.date}), \
datetime.datetime, datetime.date,
datetime.timedelta}), \
'statement must be an integer, float, date or datetime'
else:
assert isinstance(i, (
int, float, type(None),
datetime.datetime, datetime.date)), \
datetime.datetime, datetime.date,
datetime.timedelta)), \
'statement must be an integer, float, date or datetime'
if isinstance(equal, PYSON):
if equal.types() != {bool}:
@@ -358,6 +360,8 @@ class Greater(PYSON):
elif isinstance(stmt, datetime.date):
time = datetime.time(0, 0)
stmt = datetime.datetime.combine(stmt, time).timestamp()
elif isinstance(stmt, datetime.timedelta):
stmt = stmt.total_seconds()
dct[i] = float(stmt)
return dct
+1
View File
@@ -1,3 +1,4 @@
* Support PYSON comparison of timedelta
* Support encoding timedelta into PYSON TimeDelta
* Eagerly read string value of multiselection fields
* Use locale timezone for CSV in locale format
+7 -5
View File
@@ -415,15 +415,16 @@
var statement = statements[i];
if (statement instanceof Sao.PYSON.PYSON) {
if ( (!(statement instanceof Sao.PYSON.DateTime ||
statement instanceof Sao.PYSON.Date)) &&
statement instanceof Sao.PYSON.Date ||
statement instanceof Sao.PYSON.TimeDelta)) &&
(jQuery(statement.types()).not(['number']).length) ) {
throw 'statement must be an integer, float, ' +
'date or datetime';
'date, datetime or timedelta';
}
} else {
if (!~['number', 'object'].indexOf(typeof statement)) {
throw 'statement must be an integer, float, ' +
'date or datetime';
'date, datetime or timedelta';
}
}
}
@@ -461,8 +462,9 @@
for (var i=0; i < 2; i++) {
if (moment.isMoment(values[i])) {
values[i] = values[i].valueOf();
}
else {
} else if (moment.isDuration(values[i])) {
values[i] = values[i].valueOf();
} else {
values[i] = Number(values[i]);
}
}
+18
View File
@@ -520,6 +520,24 @@
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
new Sao.PYSON.TimeDelta(5, 2),
new Sao.PYSON.TimeDelta(4, 2)));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
'decode(Greater(PYSON.TimeDelta(5, 2), PYSON.TimeDelta(4, 2)))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
new Sao.PYSON.TimeDelta(4, 2),
new Sao.PYSON.TimeDelta(5, 2)));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false,
'decode(Greater(PYSON.TimeDelta(4, 2), PYSON.TimeDelta(5, 2)))');
eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(
new Sao.PYSON.TimeDelta(5, 2),
Sao.TimeDelta(4, 2)));
QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true,
'decode(Greater(PYSON.TimeDelta(5, 2), Sao.TimeDelta(4, 2)))');
eval_ = new Sao.PYSON.Encoder().encode(
new Sao.PYSON.Greater(new Sao.PYSON.Eval('i', 0), 0));
QUnit.strictEqual(new Sao.PYSON.Decoder({i: 1}).decode(eval_), true,
+1
View File
@@ -1,3 +1,4 @@
* Support PYSON comparison of timedelta
* Support encoding timedelta into PYSON TimeDelta
* Transfer configuration, profiles and plugins from previous version
* Eagerly read string value of multiselection fields
+6 -2
View File
@@ -314,12 +314,14 @@ class Greater(PYSON):
if isinstance(i, PYSON):
assert i.types().issubset({
int, float, type(None),
datetime.datetime, datetime.date}), \
datetime.datetime, datetime.date,
datetime.timedelta}), \
'statement must be an integer, float, date or datetime'
else:
assert isinstance(i, (
int, float, type(None),
datetime.datetime, datetime.date)), \
datetime.datetime, datetime.date,
datetime.timedelta)), \
'statement must be an integer, float, date or datetime'
if isinstance(equal, PYSON):
if equal.types() != {bool}:
@@ -358,6 +360,8 @@ class Greater(PYSON):
elif isinstance(stmt, datetime.date):
time = datetime.time(0, 0)
stmt = datetime.datetime.combine(stmt, time).timestamp()
elif isinstance(stmt, datetime.timedelta):
stmt = stmt.total_seconds()
dct[i] = float(stmt)
return dct
+1
View File
@@ -1,3 +1,4 @@
* Support PYSON comparison of timedelta
* Support encoding timedelta into PYSON TimeDelta
* Allow date formating in sequences substitutions
* Make ModelSQL based on table query read only by default
+6 -2
View File
@@ -314,12 +314,14 @@ class Greater(PYSON):
if isinstance(i, PYSON):
assert i.types().issubset({
int, float, type(None),
datetime.datetime, datetime.date}), \
datetime.datetime, datetime.date,
datetime.timedelta}), \
'statement must be an integer, float, date or datetime'
else:
assert isinstance(i, (
int, float, type(None),
datetime.datetime, datetime.date)), \
datetime.datetime, datetime.date,
datetime.timedelta)), \
'statement must be an integer, float, date or datetime'
if isinstance(equal, PYSON):
if equal.types() != {bool}:
@@ -358,6 +360,8 @@ class Greater(PYSON):
elif isinstance(stmt, datetime.date):
time = datetime.time(0, 0)
stmt = datetime.datetime.combine(stmt, time).timestamp()
elif isinstance(stmt, datetime.timedelta):
stmt = stmt.total_seconds()
dct[i] = float(stmt)
return dct
+15
View File
@@ -303,6 +303,21 @@ class PYSONTestCase(unittest.TestCase):
pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))
self.assertTrue(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Greater(
pyson.TimeDelta(5, 2),
pyson.TimeDelta(4, 2)))
self.assertTrue(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Greater(
pyson.TimeDelta(4, 2),
pyson.TimeDelta(5, 2)))
self.assertFalse(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(pyson.Greater(
pyson.TimeDelta(5, 2),
datetime.timedelta(4, 2)))
self.assertTrue(pyson.PYSONDecoder().decode(eval))
eval = pyson.PYSONEncoder().encode(
pyson.Greater(pyson.Eval('i', 0), 0))
self.assertTrue(pyson.PYSONDecoder({'i': 1}).decode(eval))