Skip to content

Commit 54be114

Browse files
author
Jongmin Kim
committed
refactor: convert datetime type to string type in stat query
1 parent 566118a commit 54be114

2 files changed

Lines changed: 29 additions & 20 deletions

File tree

src/spaceone/core/model/mongo_model/__init__.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from datetime import datetime
66
from functools import reduce
77
from mongoengine import EmbeddedDocumentField, EmbeddedDocument, Document, QuerySet, register_connection
8+
from mongoengine.fields import DateField, DateTimeField, ComplexDateTimeField
89
from pymongo import ReadPreference
910
from mongoengine.errors import *
1011
from spaceone.core import config
@@ -107,6 +108,19 @@ def init(cls):
107108

108109
_MONGO_INIT_MODELS.append(cls)
109110

111+
cls.load_default_meta()
112+
113+
@classmethod
114+
def load_default_meta(cls):
115+
cls._meta['datetime_fields'] = []
116+
for name, field in cls._fields.items():
117+
if isinstance(field, DateField):
118+
cls._meta['datetime_fields'].append(name)
119+
elif isinstance(field, DateTimeField):
120+
cls._meta['datetime_fields'].append(name)
121+
elif isinstance(field, ComplexDateTimeField):
122+
cls._meta['datetime_fields'].append(name)
123+
110124
@classmethod
111125
def connect(cls):
112126
db_alias = cls._meta.get('db_alias', 'default')
@@ -752,7 +766,8 @@ def _make_group_rule(cls, options, _before_group_keys):
752766
key, name, operator, sub_fields, sub_conditions, data_type = \
753767
cls._get_group_fields(condition, _before_group_keys)
754768

755-
rule = STAT_GROUP_OPERATORS[operator](condition, key, operator, name, data_type, sub_conditions, sub_fields)
769+
rule = STAT_GROUP_OPERATORS[operator](condition, key, operator, name, data_type, sub_conditions, sub_fields,
770+
cls._meta['datetime_fields'])
756771
_group_rule['$group'].update(rule)
757772

758773
return _group_rule, _group_keys
@@ -1149,7 +1164,7 @@ def _make_select_query(cls, select):
11491164
}
11501165
}
11511166

1152-
supported_operator = ['add', 'subtract', 'multiply', 'divide', 'size', 'sum', 'date_to_string']
1167+
supported_operator = ['add', 'subtract', 'multiply', 'divide', 'size', 'sum']
11531168

11541169
for name, condition in select.items():
11551170
if isinstance(condition, str):

src/spaceone/core/model/mongo_model/stat_operator.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _group_count_resolver(condition, key, operator, name, data_type, sub_conditi
2323
}
2424

2525

26-
def _group_push_resolver(condition, key, operator, name, data_type, sub_conditions, sub_fields, *args):
26+
def _group_push_resolver(condition, key, operator, name, data_type, sub_conditions, sub_fields, datetime_fields, *args):
2727
if not key and len(sub_fields) == 0:
2828
raise ERROR_DB_QUERY(reason=f"'aggregate.group.fields' condition requires fields: {condition}")
2929

@@ -43,7 +43,16 @@ def _group_push_resolver(condition, key, operator, name, data_type, sub_conditio
4343
f_key = sub_field.get('key', sub_field.get('k'))
4444
f_name = sub_field.get('name', sub_field.get('n'))
4545

46-
push_query[f_name] = f'${f_key}'
46+
if f_key in datetime_fields:
47+
push_query[f_name] = {
48+
'$dateToString': {
49+
'format': '%Y-%m-%dT%H:%M:%SZ',
50+
'date': f'${f_key}'
51+
}
52+
}
53+
else:
54+
push_query[f_name] = f'${f_key}'
55+
4756

4857
return {
4958
name: {
@@ -193,7 +202,7 @@ def _project_object_to_array_resolver(condition, key, operator, name, fields, gr
193202
}
194203

195204

196-
def _project_calculate_sub_query(condition, operator, fields, group_keys):
205+
def _project_calculate_sub_query(condition, operator, fields, group_keys, *args):
197206
supported_operator = ['add', 'subtract', 'multiply', 'divide']
198207

199208
if operator is None:
@@ -232,20 +241,6 @@ def _project_calculate_sub_query(condition, operator, fields, group_keys):
232241
}
233242

234243

235-
def _project_date_to_string_resolver(condition, key, operator, name, fields, group_keys, *args):
236-
if key in group_keys:
237-
key = f'_id.{key}'
238-
239-
return {
240-
name: {
241-
'$dateToString': {
242-
'format': '%Y-%m-%dT%H:%M:%SZ',
243-
'date': f'${key}'
244-
}
245-
}
246-
}
247-
248-
249244
def _project_calculate_resolver(condition, key, operator, name, fields, group_keys, *args):
250245
return {
251246
name: _project_calculate_sub_query(condition, operator, fields, group_keys)
@@ -270,7 +265,6 @@ def _project_calculate_resolver(condition, key, operator, name, fields, group_ke
270265
'sum': _project_sum_resolver,
271266
'array_to_object': _project_array_to_object_resolver,
272267
'object_to_array': _project_object_to_array_resolver,
273-
'date_to_string': _project_date_to_string_resolver,
274268
'add': _project_calculate_resolver,
275269
'subtract': _project_calculate_resolver,
276270
'multiply': _project_calculate_resolver,

0 commit comments

Comments
 (0)