Skip to content

Commit fc9e066

Browse files
author
Paolo Tranquilli
committed
Codegen: implement db_table_name in dbschemegen
1 parent 841214f commit fc9e066

File tree

3 files changed

+71
-5
lines changed

3 files changed

+71
-5
lines changed

misc/codegen/generators/dbschemegen.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,12 @@ def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], a
6969
)
7070
# use property-specific tables for 1-to-many and 1-to-at-most-1 properties
7171
for f in cls.properties:
72+
overridden_table_name = f.pragmas.get("ql_db_table_name")
7273
if f.synth:
7374
continue
7475
if f.is_unordered:
7576
yield Table(
76-
name=inflection.tableize(f"{cls.name}_{f.name}"),
77+
name=overridden_table_name or inflection.tableize(f"{cls.name}_{f.name}"),
7778
columns=[
7879
Column("id", type=dbtype(cls.name)),
7980
Column(inflection.singularize(f.name), dbtype(f.type, add_or_none_except)),
@@ -83,7 +84,7 @@ def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], a
8384
elif f.is_repeated:
8485
yield Table(
8586
keyset=KeySet(["id", "index"]),
86-
name=inflection.tableize(f"{cls.name}_{f.name}"),
87+
name=overridden_table_name or inflection.tableize(f"{cls.name}_{f.name}"),
8788
columns=[
8889
Column("id", type=dbtype(cls.name)),
8990
Column("index", type="int"),
@@ -94,7 +95,7 @@ def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], a
9495
elif f.is_optional:
9596
yield Table(
9697
keyset=KeySet(["id"]),
97-
name=inflection.tableize(f"{cls.name}_{f.name}"),
98+
name=overridden_table_name or inflection.tableize(f"{cls.name}_{f.name}"),
9899
columns=[
99100
Column("id", type=dbtype(cls.name)),
100101
Column(f.name, dbtype(f.type, add_or_none_except)),
@@ -104,7 +105,7 @@ def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], a
104105
elif f.is_predicate:
105106
yield Table(
106107
keyset=KeySet(["id"]),
107-
name=inflection.underscore(f"{cls.name}_{f.name}"),
108+
name=overridden_table_name or inflection.underscore(f"{cls.name}_{f.name}"),
108109
columns=[
109110
Column("id", type=dbtype(cls.name)),
110111
],
@@ -118,7 +119,8 @@ def check_name_conflicts(decls: list[Table | Union]):
118119
match decl:
119120
case Table(name=name):
120121
if name in names:
121-
raise Error(f"Duplicate table name: {name}")
122+
raise Error(f"Duplicate table name: {
123+
name}, you can use `@ql.db_table_name` on a property to resolve this")
122124
names.add(name)
123125

124126

misc/codegen/lib/schemadefs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ def __getitem__(self, item):
248248
ql.add(_ClassPragma("hideable", inherited=True))
249249
ql.add(_Pragma("internal"))
250250
ql.add(_Parametrized(_Pragma("name"), factory=lambda name: name))
251+
ql.add(_Parametrized(_PropertyPragma("db_table_name"), factory=lambda name: name))
251252

252253
cpp.add(_Pragma("skip"))
253254

misc/codegen/test/test_dbschemegen.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,5 +603,68 @@ def test_table_conflict(generate):
603603
])
604604

605605

606+
def test_table_name_overrides(generate):
607+
assert generate([
608+
schema.Class("Obj", properties=[
609+
schema.OptionalProperty("x", "a", pragmas={"ql_db_table_name": "foo"}),
610+
schema.RepeatedProperty("y", "b", pragmas={"ql_db_table_name": "bar"}),
611+
schema.RepeatedOptionalProperty("z", "c", pragmas={"ql_db_table_name": "baz"}),
612+
schema.PredicateProperty("p", pragmas={"ql_db_table_name": "hello"}),
613+
schema.RepeatedUnorderedProperty("q", "d", pragmas={"ql_db_table_name": "world"}),
614+
]),
615+
]) == dbscheme.Scheme(
616+
src=schema_file.name,
617+
includes=[],
618+
declarations=[
619+
dbscheme.Table(
620+
name="objs",
621+
columns=[
622+
dbscheme.Column("id", "@obj", binding=True),
623+
],
624+
),
625+
dbscheme.Table(
626+
name="foo",
627+
keyset=dbscheme.KeySet(["id"]),
628+
columns=[
629+
dbscheme.Column("id", "@obj"),
630+
dbscheme.Column("x", "a"),
631+
],
632+
),
633+
dbscheme.Table(
634+
name="bar",
635+
keyset=dbscheme.KeySet(["id", "index"]),
636+
columns=[
637+
dbscheme.Column("id", "@obj"),
638+
dbscheme.Column("index", "int"),
639+
dbscheme.Column("y", "b"),
640+
],
641+
),
642+
dbscheme.Table(
643+
name="baz",
644+
keyset=dbscheme.KeySet(["id", "index"]),
645+
columns=[
646+
dbscheme.Column("id", "@obj"),
647+
dbscheme.Column("index", "int"),
648+
dbscheme.Column("z", "c"),
649+
],
650+
),
651+
dbscheme.Table(
652+
name="hello",
653+
keyset=dbscheme.KeySet(["id"]),
654+
columns=[
655+
dbscheme.Column("id", "@obj"),
656+
],
657+
),
658+
dbscheme.Table(
659+
name="world",
660+
columns=[
661+
dbscheme.Column("id", "@obj"),
662+
dbscheme.Column("q", "d"),
663+
],
664+
),
665+
],
666+
)
667+
668+
606669
if __name__ == '__main__':
607670
sys.exit(pytest.main([__file__] + sys.argv[1:]))

0 commit comments

Comments
 (0)