Skip to content

Commit 0f957a2

Browse files
committed
Optimize type judgment to improve performance
1 parent c81db86 commit 0f957a2

4 files changed

Lines changed: 92 additions & 67 deletions

File tree

syncanysql/calculaters/mysql_funcs/datetime_funcs.py

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import re
66
import time
7-
import datetime
7+
from datetime import datetime as datetime_datetime, date as datetime_date, time as datetime_time, timedelta as datetime_timedelta
88
import pytz
99
from syncany.utils import get_timezone, parse_datetime
1010
from syncany.calculaters import typing_filter
@@ -38,7 +38,7 @@ def calculate(unit, value):
3838
day -= 1
3939
return None
4040
if unit in TIMEDELTA_UNITS:
41-
td = datetime.timedelta(seconds=TIMEDELTA_UNITS[unit] * value)
41+
td = datetime_timedelta(seconds=TIMEDELTA_UNITS[unit] * value)
4242
return (dt - td) if is_sub else (dt + td)
4343
return None
4444

@@ -62,72 +62,72 @@ def calculate(unit, value):
6262
return dt
6363

6464

65-
@typing_filter(datetime.datetime)
65+
@typing_filter(datetime_datetime)
6666
def mysql_currenttimestamp():
67-
return datetime.datetime.now(tz=get_timezone())
67+
return datetime_datetime.now(tz=get_timezone())
6868

69-
@typing_filter(datetime.date)
69+
@typing_filter(datetime_date)
7070
def mysql_curdate():
71-
return datetime.date.today()
71+
return datetime_date.today()
7272

73-
@typing_filter(datetime.date)
73+
@typing_filter(datetime_date)
7474
def mysql_currentdate():
75-
return datetime.date.today()
75+
return datetime_date.today()
7676

77-
@typing_filter(datetime.time)
77+
@typing_filter(datetime_time)
7878
def mysql_curtime():
79-
dt = datetime.datetime.now(tz=get_timezone())
80-
return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond)
79+
dt = datetime_datetime.now(tz=get_timezone())
80+
return datetime_time(dt.hour, dt.minute, dt.second, dt.microsecond)
8181

82-
@typing_filter(datetime.time)
82+
@typing_filter(datetime_time)
8383
def mysql_currenttime():
84-
dt = datetime.datetime.now(tz=get_timezone())
85-
return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond)
84+
dt = datetime_datetime.now(tz=get_timezone())
85+
return datetime_time(dt.hour, dt.minute, dt.second, dt.microsecond)
8686

87-
@typing_filter(datetime.datetime)
87+
@typing_filter(datetime_datetime)
8888
def mysql_sysdate():
89-
return datetime.datetime.now(tz=get_timezone())
89+
return datetime_datetime.now(tz=get_timezone())
9090

91-
@typing_filter(datetime.date)
91+
@typing_filter(datetime_date)
9292
def mysql_date(dt):
9393
if dt is None:
9494
return None
9595
if isinstance(dt, NumberStringTypes):
9696
dt = parse_datetime(str(dt), None, get_timezone())
97-
if isinstance(dt, datetime.datetime):
98-
return datetime.date(dt.year, dt.month, dt.day)
99-
if isinstance(dt, datetime.date):
97+
if isinstance(dt, datetime_datetime):
98+
return datetime_date(dt.year, dt.month, dt.day)
99+
if isinstance(dt, datetime_date):
100100
return dt
101101
return None
102102

103-
@typing_filter(datetime.datetime)
103+
@typing_filter(datetime_datetime)
104104
def mysql_datetime(dt):
105105
if dt is None:
106106
return None
107107
if isinstance(dt, NumberStringTypes):
108108
dt = parse_datetime(str(dt), None, get_timezone())
109-
if isinstance(dt, datetime.datetime):
109+
if isinstance(dt, datetime_datetime):
110110
return dt
111-
if isinstance(dt, datetime.date):
112-
return datetime.datetime(dt.year, dt.month, dt.day, tzinfo=get_timezone())
113-
if isinstance(dt, datetime.time):
114-
now = datetime.datetime.now(tz=get_timezone())
115-
return datetime.datetime(now.year, now.month, now.day, dt.hour, dt.minute,
111+
if isinstance(dt, datetime_date):
112+
return datetime_datetime(dt.year, dt.month, dt.day, tzinfo=get_timezone())
113+
if isinstance(dt, datetime_time):
114+
now = datetime_datetime.now(tz=get_timezone())
115+
return datetime_datetime(now.year, now.month, now.day, dt.hour, dt.minute,
116116
dt.second, dt.microsecond, tzinfo=get_timezone())
117117
return None
118118

119-
@typing_filter(datetime.time)
119+
@typing_filter(datetime_time)
120120
def mysql_time(dt):
121121
if dt is None:
122122
return None
123123
if isinstance(dt, NumberStringTypes):
124124
dt = parse_datetime(str(dt), None, get_timezone())
125-
if isinstance(dt, datetime.time):
125+
if isinstance(dt, datetime_time):
126126
return dt
127-
if isinstance(dt, datetime.datetime):
128-
return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond, tzinfo=get_timezone())
129-
if isinstance(dt, datetime.date):
130-
return datetime.time(tzinfo=get_timezone())
127+
if isinstance(dt, datetime_datetime):
128+
return datetime_time(dt.hour, dt.minute, dt.second, dt.microsecond, tzinfo=get_timezone())
129+
if isinstance(dt, datetime_date):
130+
return datetime_time(tzinfo=get_timezone())
131131
return None
132132

133133
@typing_filter(int)
@@ -136,11 +136,11 @@ def mysql_unix_timestamp(dt=None):
136136
return int(time.time())
137137
return int(time.mktime(dt.utctimetuple()))
138138

139-
@typing_filter(datetime.datetime)
139+
@typing_filter(datetime_datetime)
140140
def mysql_from_unixtime(t):
141141
if t is None:
142142
return None
143-
return datetime.datetime.fromtimestamp(int(t), pytz.UTC).astimezone(tz=get_timezone())
143+
return datetime_datetime.fromtimestamp(int(t), pytz.UTC).astimezone(tz=get_timezone())
144144

145145
@typing_filter(int)
146146
def mysql_month(dt):
@@ -228,66 +228,66 @@ def mysql_sec_to_time(t):
228228
if t is None:
229229
return None
230230
st = parse_datetime("2000-01-01 00:00:00", None, get_timezone())
231-
return (st + datetime.timedelta(seconds=t)).strftime("%H:%M:%S")
231+
return (st + datetime_timedelta(seconds=t)).strftime("%H:%M:%S")
232232

233-
@typing_filter(datetime.datetime)
233+
@typing_filter(datetime_datetime)
234234
def mysql_dateadd(dt, i):
235235
if dt is None:
236236
return None
237237
if isinstance(dt, NumberStringTypes):
238238
dt = parse_datetime(str(dt), None, get_timezone())
239239
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
240-
return dt + datetime.timedelta(days=int(i))
240+
return dt + datetime_timedelta(days=int(i))
241241
return calculate_datetime(dt, i, False)
242242

243-
@typing_filter(datetime.datetime)
243+
@typing_filter(datetime_datetime)
244244
def mysql_adddate(dt, i):
245245
if dt is None:
246246
return None
247247
if isinstance(dt, NumberStringTypes):
248248
dt = parse_datetime(str(dt), None, get_timezone())
249249
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
250-
return dt + datetime.timedelta(days=int(i))
250+
return dt + datetime_timedelta(days=int(i))
251251
return calculate_datetime(dt, i, False)
252252

253-
@typing_filter(datetime.datetime)
253+
@typing_filter(datetime_datetime)
254254
def mysql_datesub(dt, i):
255255
if dt is None:
256256
return None
257257
if isinstance(dt, NumberStringTypes):
258258
dt = parse_datetime(str(dt), None, get_timezone())
259259
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
260-
return dt - datetime.timedelta(days=int(i))
260+
return dt - datetime_timedelta(days=int(i))
261261
return calculate_datetime(dt, i, True)
262262

263-
@typing_filter(datetime.datetime)
263+
@typing_filter(datetime_datetime)
264264
def mysql_subdate(dt, i):
265265
if dt is None:
266266
return None
267267
if isinstance(dt, NumberStringTypes):
268268
dt = parse_datetime(str(dt), None, get_timezone())
269269
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
270-
return dt - datetime.timedelta(days=int(i))
270+
return dt - datetime_timedelta(days=int(i))
271271
return calculate_datetime(dt, i, True)
272272

273-
@typing_filter(datetime.datetime)
273+
@typing_filter(datetime_datetime)
274274
def mysql_addtime(dt, i):
275275
if dt is None:
276276
return None
277277
if isinstance(dt, NumberStringTypes):
278278
dt = parse_datetime(str(dt), None, get_timezone())
279279
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
280-
return dt + datetime.timedelta(days=int(i))
280+
return dt + datetime_timedelta(days=int(i))
281281
return calculate_datetime(dt, i, False)
282282

283-
@typing_filter(datetime.datetime)
283+
@typing_filter(datetime_datetime)
284284
def mysql_subtime(dt, i):
285285
if dt is None:
286286
return None
287287
if isinstance(dt, NumberStringTypes):
288288
dt = parse_datetime(str(dt), None, get_timezone())
289289
if isinstance(i, NumberTypes) or (isinstance(i, str) and i.isdigit()):
290-
return dt - datetime.timedelta(days=int(i))
290+
return dt - datetime_timedelta(days=int(i))
291291
return calculate_datetime(dt, i, True)
292292

293293
@typing_filter(int)
@@ -334,19 +334,19 @@ def mysql_weekday(dt):
334334
dt = parse_datetime(str(dt), None, get_timezone())
335335
return dt.weekday()
336336

337-
@typing_filter(datetime.date)
337+
@typing_filter(datetime_date)
338338
def mysql_utc_date():
339-
dt = datetime.datetime.now(pytz.UTC)
340-
return datetime.date(dt.year, dt.month, dt.day)
339+
dt = datetime_datetime.now(pytz.UTC)
340+
return datetime_date(dt.year, dt.month, dt.day)
341341

342-
@typing_filter(datetime.time)
342+
@typing_filter(datetime_time)
343343
def mysql_utc_time():
344-
dt = datetime.datetime.now(pytz.UTC)
345-
return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond)
344+
dt = datetime_datetime.now(pytz.UTC)
345+
return datetime_time(dt.hour, dt.minute, dt.second, dt.microsecond)
346346

347-
@typing_filter(datetime.datetime)
347+
@typing_filter(datetime_datetime)
348348
def mysql_utc_timestamp():
349-
return datetime.datetime.now(pytz.UTC)
349+
return datetime_datetime.now(pytz.UTC)
350350

351351

352352
funcs = {key[6:]: value for key, value in globals().items() if key.startswith("mysql_")}

syncanysql/calculaters/mysql_funcs/logical_funcs.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
@typing_filter(int)
99
def mysql_eq(a, b):
10-
if a.__class__ == b.__class__:
10+
if a.__class__ is b.__class__:
1111
if a is None:
1212
return None
1313
return 1 if a == b else 0
@@ -35,7 +35,7 @@ def mysql_eq(a, b):
3535

3636
@typing_filter(int)
3737
def mysql_neq(a, b):
38-
if a.__class__ == b.__class__:
38+
if a.__class__ is b.__class__:
3939
if a is None:
4040
return None
4141
return 1 if a != b else 0
@@ -63,7 +63,7 @@ def mysql_neq(a, b):
6363

6464
@typing_filter(int)
6565
def mysql_gt(a, b):
66-
if a.__class__ == b.__class__:
66+
if a.__class__ is b.__class__:
6767
if a is None:
6868
return None
6969
try:
@@ -94,7 +94,7 @@ def mysql_gt(a, b):
9494

9595
@typing_filter(int)
9696
def mysql_gte(a, b):
97-
if a.__class__ == b.__class__:
97+
if a.__class__ is b.__class__:
9898
if a is None:
9999
return None
100100
try:
@@ -125,7 +125,7 @@ def mysql_gte(a, b):
125125

126126
@typing_filter(int)
127127
def mysql_lt(a, b):
128-
if a.__class__ == b.__class__:
128+
if a.__class__ is b.__class__:
129129
if a is None:
130130
return None
131131
try:
@@ -156,7 +156,7 @@ def mysql_lt(a, b):
156156

157157
@typing_filter(int)
158158
def mysql_lte(a, b):
159-
if a.__class__ == b.__class__:
159+
if a.__class__ is b.__class__:
160160
if a is None:
161161
return None
162162
try:
@@ -206,15 +206,15 @@ def mysql_not(a):
206206

207207
@typing_filter(int)
208208
def mysql_is(a, b):
209-
if a.__class__ == b.__class__:
209+
if a.__class__ is b.__class__:
210210
return 1 if a is b else 0
211211
if a is None or b is None:
212212
return 1 if a is b else 0
213213
return mysql_eq(a, b)
214214

215215
@typing_filter(int)
216216
def mysql_is_not(a, b):
217-
if a.__class__ == b.__class__:
217+
if a.__class__ is b.__class__:
218218
return 0 if a is b else 1
219219
if a is None or b is None:
220220
return 0 if a is b else 1
@@ -224,6 +224,8 @@ def mysql_is_not(a, b):
224224
def mysql_exists(a):
225225
if a is None:
226226
return 0
227+
if a.__class__ is dict:
228+
return 1
227229
if isinstance(a, dict):
228230
return 1
229231
return 1 if a else 0

syncanysql/calculaters/mysql_funcs/number_funcs.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,45 @@
1111
def mysql_add(x, y):
1212
if x is None or y is None:
1313
return None
14+
if x.__class__ is int or x.__class__ is float:
15+
if y.__class__ is int or y.__class__ is float:
16+
return x + y
1417
return ensure_number(x) + ensure_number(y)
1518

1619
@typing_filter(float)
1720
def mysql_sub(x, y):
1821
if x is None or y is None:
1922
return None
23+
if x.__class__ is int or x.__class__ is float:
24+
if y.__class__ is int or y.__class__ is float:
25+
return x - y
2026
return ensure_number(x) - ensure_number(y)
2127

2228
@typing_filter(float)
2329
def mysql_mul(x, y):
2430
if x is None or y is None:
2531
return None
32+
if x.__class__ is int or x.__class__ is float:
33+
if y.__class__ is int or y.__class__ is float:
34+
return x * y
2635
return ensure_number(x) * ensure_number(y)
2736

2837
@typing_filter(float)
2938
def mysql_div(x, y):
3039
if x is None or y is None:
3140
return None
41+
if x.__class__ is int or x.__class__ is float:
42+
if y.__class__ is int or y.__class__ is float:
43+
return x / y
3244
return ensure_number(x) / ensure_number(y)
3345

3446
@typing_filter(float)
3547
def mysql_mod(x, y):
3648
if x is None or y is None:
3749
return None
50+
if x.__class__ is int or x.__class__ is float:
51+
if y.__class__ is int or y.__class__ is float:
52+
return x % y
3853
return ensure_number(x) % ensure_number(y)
3954

4055
@typing_filter(int)

0 commit comments

Comments
 (0)