Skip to content

Commit 320a3d9

Browse files
committed
Optimize primary_keys parsing
1 parent 874dad2 commit 320a3d9

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

syncanysql/compiler.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ class Compiler(object):
103103
"char": "str", "varchar": "str", "nchar": "str", "text": "str", "mediumtext": "str", "tinytext": "str",
104104
"bigint": "int", "mediumint": "int", "smallint": "int", "tinyint": "int", "decimal": "decimal", "double": "float",
105105
"boolean": "bool", "binary": "bytes", "varbinary": "bytes", "blob": "bytes", "timestamp": "datetime"}
106-
PRIMARY_TABLE = {"db": None, "name": None, "table_name": None, "table_alias": None, "seted_primary_keys": False,
107-
"loader_primary_keys": [], "outputer_primary_keys": [], "alias_primary_keys": [],
106+
PRIMARY_TABLE = {"db": None, "name": None, "table_name": None, "table_alias": None, "primary_keys": [],
107+
"seted_primary_keys_type": 0, "loader_primary_keys": [], "outputer_primary_keys": [], "alias_primary_keys": [],
108108
"columns": {}, "subquery": None, "select_columns": {}}
109109

110110
def __init__(self, config, env_variables, name):
@@ -211,7 +211,8 @@ def compile_delete(self, expression, arguments):
211211
if where_calculate_expression is not None:
212212
raise SyncanySqlCompileException('unknown where expression, related sql "%s"' % self.to_sql(expression))
213213
self.parse_condition_typing_filter(expression, config, arguments)
214-
config["output"] = "".join(["&.", table_info["db"], ".", table_info["name"], "::id use DI"])
214+
config["output"] = "".join(["&.", table_info["db"], ".", table_info["name"], "::",
215+
"".join(table_info["primary_keys"]) if table_info.get("primary_keys") else "-", " use DI"])
215216
return config
216217

217218
def compile_query(self, expression, arguments):
@@ -464,6 +465,7 @@ def compile_select(self, expression, config, arguments):
464465
primary_table["name"] = table_info["name"]
465466
primary_table["table_alias"] = table_info["table_alias"]
466467
primary_table["table_name"] = table_info["table_name"]
468+
primary_table["primary_keys"] = table_info["primary_keys"]
467469
elif isinstance(from_expression, sqlglot_expressions.Subquery):
468470
if "alias" not in from_expression.args:
469471
raise SyncanySqlCompileException('error subquery, must have an alias name, related sql "%s"'
@@ -733,12 +735,17 @@ def compile_select_column(self, expression, config, arguments, primary_table, co
733735
if not column_info["column_name"].isidentifier() or not column_alias.isidentifier():
734736
return None
735737
if "pk" in column_info["typing_options"]:
736-
if not primary_table["seted_primary_keys"]:
737-
primary_table["loader_primary_keys"], primary_table["outputer_primary_keys"], primary_table["seted_primary_keys"] = [], [], True
738+
if primary_table["seted_primary_keys_type"] < 2:
739+
primary_table["loader_primary_keys"], primary_table["outputer_primary_keys"], primary_table["seted_primary_keys_type"] = [], [], 2
738740
primary_table["loader_primary_keys"].append(column_info["column_name"])
739741
primary_table["outputer_primary_keys"].append(column_alias)
740-
elif not primary_table["seted_primary_keys"] and not primary_table["loader_primary_keys"]:
741-
if not column_info["table_name"] or column_info["table_name"] == primary_table["table_name"]:
742+
elif primary_table["seted_primary_keys_type"] < 2 and not column_info["table_name"] or column_info["table_name"] == primary_table["table_name"]:
743+
if column_info["column_name"] in primary_table["primary_keys"]:
744+
if primary_table["seted_primary_keys_type"] < 1:
745+
primary_table["loader_primary_keys"], primary_table["outputer_primary_keys"], primary_table["seted_primary_keys_type"] = [], [], 1
746+
primary_table["loader_primary_keys"].append(column_info["column_name"])
747+
primary_table["outputer_primary_keys"].append(column_alias)
748+
elif not primary_table["loader_primary_keys"]:
742749
primary_table["loader_primary_keys"] = [column_info["column_name"]]
743750
if not primary_table["outputer_primary_keys"]:
744751
primary_table["outputer_primary_keys"] = [column_alias]
@@ -765,7 +772,7 @@ def compile_select_calculate_column(self, expression, config, arguments, primary
765772
else:
766773
config["schema"][column_alias] = self.compile_calculate(expression, config, arguments, primary_table, [])
767774
primary_table["select_columns"][column_alias] = expression
768-
if parse_primary_key and not primary_table["seted_primary_keys"] and not primary_table["outputer_primary_keys"] and column_alias.isidentifier():
775+
if parse_primary_key and not primary_table["seted_primary_keys_type"] and not primary_table["outputer_primary_keys"] and column_alias.isidentifier():
769776
loader_primary_keys = [calculate_field["column_name"] for calculate_field in calculate_fields
770777
if calculate_field["column_name"].isidentifier() and
771778
(not calculate_field["table_name"] or calculate_field["table_name"] == primary_table["table_name"])]
@@ -2694,6 +2701,7 @@ def parse(expression):
26942701
"table_alias": table_alias,
26952702
"origin_name": origin_name,
26962703
"typing_options": typing_options,
2704+
"primary_keys": [],
26972705
}
26982706

26992707
def parse_column(self, expression, config, arguments, primary_table):
@@ -3244,6 +3252,8 @@ def optimize_rewrite_update(self, expression, config, arguments):
32443252
continue
32453253
set_expressions.append({"column": column, "expression": set_expression.args["expression"]})
32463254

3255+
if not primary_keys:
3256+
primary_keys = primary_table.get("primary_keys")
32473257
if not primary_keys:
32483258
raise SyncanySqlCompileException('unknown primary key, related sql "%s"' % self.to_sql(expression))
32493259
sql = ["INSERT INTO"]

0 commit comments

Comments
 (0)