Skip to content

Commit 7b54eb0

Browse files
add: analyze query에 lookup & addFields Parameter 추가
Signed-off-by: jinyoungmoonDEV <moonjinyoung.dev@gmail.com>
1 parent 812f9b3 commit 7b54eb0

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,44 @@ def _make_match_rule(cls, options):
10751075

10761076
return {"$match": match_options}
10771077

1078+
@classmethod
1079+
def _make_lookup_rule(cls, options):
1080+
return {"$lookup": options}
1081+
1082+
@classmethod
1083+
def _make_add_fields_rule(cls, options):
1084+
add_fields_options = {}
1085+
1086+
for field, conditional in options.items():
1087+
add_fields_options.update(
1088+
{field: cls._process_conditional_expression(conditional)}
1089+
)
1090+
1091+
return {"$addFields": add_fields_options}
1092+
1093+
@classmethod
1094+
def _process_conditional_expression(cls, expression):
1095+
if isinstance(expression, dict):
1096+
if_expression = expression["if"]
1097+
1098+
if isinstance(if_expression, dict):
1099+
replaced = {}
1100+
for k, v in if_expression.items():
1101+
new_k = k.replace("__", "$")
1102+
replaced[new_k] = v
1103+
1104+
if_expression = replaced
1105+
1106+
return {
1107+
"$cond": {
1108+
"if": if_expression,
1109+
"then": cls._process_conditional_expression(expression["then"]),
1110+
"else": cls._process_conditional_expression(expression["else"]),
1111+
}
1112+
}
1113+
1114+
return expression
1115+
10781116
@classmethod
10791117
def _make_aggregate_rules(cls, aggregate):
10801118
_aggregate_rules = []
@@ -1116,6 +1154,12 @@ def _make_aggregate_rules(cls, aggregate):
11161154
elif "match" in stage:
11171155
rule = cls._make_match_rule(stage["match"])
11181156
_aggregate_rules.append(rule)
1157+
elif "lookup" in stage:
1158+
rule = cls._make_lookup_rule(stage["lookup"])
1159+
_aggregate_rules.append(rule)
1160+
elif "add_fields" in stage:
1161+
rule = cls._make_add_fields_rule(stage["add_fields"])
1162+
_aggregate_rules.append(rule)
11191163
else:
11201164
raise ERROR_REQUIRED_PARAMETER(
11211165
key="aggregate.unwind or aggregate.group or "
@@ -1514,7 +1558,9 @@ def analyze(
15141558
sort=None,
15151559
start=None,
15161560
end=None,
1561+
lookup=None,
15171562
unwind=None,
1563+
add_fields=None,
15181564
date_field="date",
15191565
date_field_format="%Y-%m-%d",
15201566
reference_filter=None,
@@ -1552,9 +1598,15 @@ def analyze(
15521598

15531599
aggregate = []
15541600

1601+
if lookup:
1602+
aggregate.append({"lookup": lookup})
1603+
15551604
if unwind:
15561605
aggregate.append({"unwind": unwind})
15571606

1607+
if add_fields:
1608+
aggregate.append({"add_fields": add_fields})
1609+
15581610
aggregate.append({"group": {"keys": group_keys, "fields": group_fields}})
15591611

15601612
query = {

0 commit comments

Comments
 (0)