diff --git a/push_to_db.py b/push_to_db.py index 31a5433e9c195db606008e338da1a6adccde47b3..a7e68e4d81840c668cd9731afae2d5d25db0bf5f 100644 --- a/push_to_db.py +++ b/push_to_db.py @@ -73,6 +73,20 @@ RETURNING part_id;""".format(type=_part_type_enum, columns=columns, value_entrie return None +def check_if_parts_exist(_cursor, _user_id, _part_ids): + sql = """WITH result AS (SELECT combinations.id AS combination_id, +ARRAY(SELECT part_id FROM relations WHERE relations.combination_id = combinations.id ORDER BY relations.part_id) AS parts +FROM combinations WHERE combinations.owner_id = %s) SELECT combination_id FROM result WHERE parts = %s;""" + _cursor.execute(sql, (_user_id, _part_ids)) + data = _cursor.fetchall() + + if not data: + return None + + _existing_combination_id = data[-1][-1] + return _existing_combination_id + + def create_combination(_cursor, nickname, _user_id): _pc_name = "새 PC" if nickname: @@ -140,6 +154,7 @@ def func(): _parts = parse.handle_xml_body(_xml_document) _part_ids = [] + _created_parts = False print("Matching parts") @@ -157,6 +172,7 @@ def func(): _matched_id = match_part_obj_into_db(part, part_type) if not _matched_id: # DB에 없는 부품이라면 + _created_parts = True print(".. creating new part with", part["name"]) with db_conn.cursor() as cursor: _matched_id = create_new_one(part, part_type, cursor) @@ -167,21 +183,34 @@ def func(): continue print(f"[WARNING] failed to match part type={part_type}, part:", part, file=sys.stderr) - - print("Creating combination") - with db_conn.cursor() as cursor: - _combination_id = create_combination(cursor, None, _user_id) - if not _combination_id: - print("Failed to create combination", file=sys.stderr) - exit(1) - print("Wiring parts", _part_ids, "to combination id", _combination_id) - with db_conn.cursor() as cursor: - wire_part_to_combination(cursor, _combination_id, *_part_ids) + _combination_id = None + # 이미 존재하는 경우 + if not _created_parts: + print("Checking combination existance") + with db_conn.cursor() as cursor: + _combination_id = check_if_parts_exist(cursor, _user_id, _part_ids) - print("Committing to DB") - db_conn.commit() + if _combination_id is not None: + print("Combination exist. Using combination id", _combination_id) + + # 새로 추가하는 경우 + if _combination_id is not None: + print("Creating combination") + with db_conn.cursor() as cursor: + _combination_id = create_combination(cursor, None, _user_id) + + if not _combination_id: + print("Failed to create combination", file=sys.stderr) + exit(1) + + print("Wiring parts", _part_ids, "to combination id", _combination_id) + with db_conn.cursor() as cursor: + wire_part_to_combination(cursor, _combination_id, *_part_ids) + + print("Committing to DB") + db_conn.commit() print("Finalizing transaction") with db_conn.cursor() as cursor: