From 203f2a85bbb7ec7dbae3f98a9ba5c0bea3147e16 Mon Sep 17 00:00:00 2001 From: cre-os Date: Fri, 25 Apr 2025 16:14:36 +0200 Subject: [PATCH 1/2] Fix complex base type --- src/xml2db/model.py | 5 ++++- src/xml2db/table/reused_table.py | 13 +++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/xml2db/model.py b/src/xml2db/model.py index 3038189..34945ec 100644 --- a/src/xml2db/model.py +++ b/src/xml2db/model.py @@ -545,12 +545,15 @@ def get_occurs(particle): or parent_node.type.has_simple_content() ): if parent_node.type.base_type is not None: + parent_base_type = parent_node.type.base_type + if parent_base_type.base_type is not None: + parent_base_type = parent_base_type.base_type ( data_type, min_length, max_length, allow_empty, - ) = recurse_parse_simple_type([parent_node.type.base_type]) + ) = recurse_parse_simple_type([parent_base_type]) else: data_type, min_length, max_length, allow_empty = "string", 0, None, True diff --git a/src/xml2db/table/reused_table.py b/src/xml2db/table/reused_table.py index ce3d62f..3c09851 100644 --- a/src/xml2db/table/reused_table.py +++ b/src/xml2db/table/reused_table.py @@ -1,3 +1,5 @@ +from hashlib import sha1 + from sqlalchemy import ( Table, Column, @@ -10,8 +12,15 @@ Sequence, ) -from .transformed_table import DataModelTableTransformed from .column import DataModelColumn +from .transformed_table import DataModelTableTransformed + + +def shorten_str(x: str, max_len: int = 30) -> str: + if len(x) > max_len: + h = sha1(x.encode("utf8")) + return f"{x[:(max_len - 7)]}_{h.hexdigest()[1:6]}" + return x class DataModelTableReused(DataModelTableTransformed): @@ -79,7 +88,7 @@ def get_col(temp=False): yield from hash_col.get_sqlalchemy_column(temp) yield UniqueConstraint( self.data_model.model_config["record_hash_column_name"], - name=f"{prefix if temp else ''}{self.name}_xml2db_record_hash", + name=f"{prefix if temp else ''}{shorten_str(self.name)}_xml2db_record_hash", ) # build target table From 256dbcd867deba21d08de5280720ef1fdf2f32f0 Mon Sep 17 00:00:00 2001 From: cre-os Date: Mon, 28 Apr 2025 10:29:52 +0200 Subject: [PATCH 2/2] Add test case --- src/xml2db/model.py | 2 +- tests/sample_models/orders/base_types.xsd | 18 +++++++++++++++--- tests/sample_models/orders/orders.xsd | 10 ++-------- .../orders/orders_ddl_mssql_version0.sql | 1 + .../orders/orders_ddl_mssql_version1.sql | 1 + .../orders/orders_ddl_mssql_version2.sql | 2 ++ .../orders/orders_ddl_mysql_version0.sql | 1 + .../orders/orders_ddl_mysql_version1.sql | 1 + .../orders/orders_ddl_mysql_version2.sql | 2 ++ .../orders/orders_ddl_postgresql_version0.sql | 1 + .../orders/orders_ddl_postgresql_version1.sql | 1 + .../orders/orders_ddl_postgresql_version2.sql | 2 ++ .../orders/orders_erd_version0.md | 1 + .../orders/orders_erd_version1.md | 1 + .../orders/orders_erd_version2.md | 2 ++ tests/sample_models/orders/xml/order2.xml | 2 +- 16 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/xml2db/model.py b/src/xml2db/model.py index 34945ec..09dcf39 100644 --- a/src/xml2db/model.py +++ b/src/xml2db/model.py @@ -546,7 +546,7 @@ def get_occurs(particle): ): if parent_node.type.base_type is not None: parent_base_type = parent_node.type.base_type - if parent_base_type.base_type is not None: + while parent_base_type.base_type is not None: parent_base_type = parent_base_type.base_type ( data_type, diff --git a/tests/sample_models/orders/base_types.xsd b/tests/sample_models/orders/base_types.xsd index cadefa7..c10a3cd 100644 --- a/tests/sample_models/orders/base_types.xsd +++ b/tests/sample_models/orders/base_types.xsd @@ -36,7 +36,19 @@ - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/sample_models/orders/orders.xsd b/tests/sample_models/orders/orders.xsd index c54fcd3..4fa2801 100644 --- a/tests/sample_models/orders/orders.xsd +++ b/tests/sample_models/orders/orders.xsd @@ -11,16 +11,10 @@ - - - - - - - - + + diff --git a/tests/sample_models/orders/orders_ddl_mssql_version0.sql b/tests/sample_models/orders/orders_ddl_mssql_version0.sql index 3371f25..51662d8 100644 --- a/tests/sample_models/orders/orders_ddl_mssql_version0.sql +++ b/tests/sample_models/orders/orders_ddl_mssql_version0.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000) NULL, city VARCHAR(1000) NULL, [zip_codingSystem] VARCHAR(1000) NULL, + zip_state VARCHAR(1000) NULL, zip_value VARCHAR(1000) NULL, country VARCHAR(1000) NULL, [phoneNumber] VARCHAR(8000) NULL, diff --git a/tests/sample_models/orders/orders_ddl_mssql_version1.sql b/tests/sample_models/orders/orders_ddl_mssql_version1.sql index 21f3854..a7840aa 100644 --- a/tests/sample_models/orders/orders_ddl_mssql_version1.sql +++ b/tests/sample_models/orders/orders_ddl_mssql_version1.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000) NULL, city VARCHAR(1000) NULL, [zip_codingSystem] VARCHAR(1000) NULL, + zip_state VARCHAR(1000) NULL, zip_value VARCHAR(1000) NULL, country VARCHAR(1000) NULL, [phoneNumber] VARCHAR(8000) NULL, diff --git a/tests/sample_models/orders/orders_ddl_mssql_version2.sql b/tests/sample_models/orders/orders_ddl_mssql_version2.sql index a533b08..d09e427 100644 --- a/tests/sample_models/orders/orders_ddl_mssql_version2.sql +++ b/tests/sample_models/orders/orders_ddl_mssql_version2.sql @@ -17,6 +17,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000) NULL, city VARCHAR(1000) NULL, [zip_codingSystem] VARCHAR(1000) NULL, + zip_state VARCHAR(1000) NULL, zip_value VARCHAR(1000) NULL, country VARCHAR(1000) NULL, [phoneNumber] VARCHAR(8000) NULL, @@ -100,6 +101,7 @@ CREATE TABLE shiporder ( orderperson_address VARCHAR(1000) NULL, orderperson_city VARCHAR(1000) NULL, [orderperson_zip_codingSystem] VARCHAR(1000) NULL, + orderperson_zip_state VARCHAR(1000) NULL, orderperson_zip_value VARCHAR(1000) NULL, orderperson_country VARCHAR(1000) NULL, [orderperson_phoneNumber] VARCHAR(8000) NULL, diff --git a/tests/sample_models/orders/orders_ddl_mysql_version0.sql b/tests/sample_models/orders/orders_ddl_mysql_version0.sql index 70929f2..45347ff 100644 --- a/tests/sample_models/orders/orders_ddl_mysql_version0.sql +++ b/tests/sample_models/orders/orders_ddl_mysql_version0.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(255), city VARCHAR(255), `zip_codingSystem` VARCHAR(255), + zip_state VARCHAR(255), zip_value VARCHAR(255), country VARCHAR(255), `phoneNumber` VARCHAR(4000), diff --git a/tests/sample_models/orders/orders_ddl_mysql_version1.sql b/tests/sample_models/orders/orders_ddl_mysql_version1.sql index 89d8d35..2d6626b 100644 --- a/tests/sample_models/orders/orders_ddl_mysql_version1.sql +++ b/tests/sample_models/orders/orders_ddl_mysql_version1.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(255), city VARCHAR(255), `zip_codingSystem` VARCHAR(255), + zip_state VARCHAR(255), zip_value VARCHAR(255), country VARCHAR(255), `phoneNumber` VARCHAR(4000), diff --git a/tests/sample_models/orders/orders_ddl_mysql_version2.sql b/tests/sample_models/orders/orders_ddl_mysql_version2.sql index f9901cf..c3ab769 100644 --- a/tests/sample_models/orders/orders_ddl_mysql_version2.sql +++ b/tests/sample_models/orders/orders_ddl_mysql_version2.sql @@ -17,6 +17,7 @@ CREATE TABLE orderperson ( address VARCHAR(255), city VARCHAR(255), `zip_codingSystem` VARCHAR(255), + zip_state VARCHAR(255), zip_value VARCHAR(255), country VARCHAR(255), `phoneNumber` VARCHAR(4000), @@ -100,6 +101,7 @@ CREATE TABLE shiporder ( orderperson_address VARCHAR(255), orderperson_city VARCHAR(255), `orderperson_zip_codingSystem` VARCHAR(255), + orderperson_zip_state VARCHAR(255), orderperson_zip_value VARCHAR(255), orderperson_country VARCHAR(255), `orderperson_phoneNumber` VARCHAR(4000), diff --git a/tests/sample_models/orders/orders_ddl_postgresql_version0.sql b/tests/sample_models/orders/orders_ddl_postgresql_version0.sql index 540e8de..204cd70 100644 --- a/tests/sample_models/orders/orders_ddl_postgresql_version0.sql +++ b/tests/sample_models/orders/orders_ddl_postgresql_version0.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000), city VARCHAR(1000), "zip_codingSystem" VARCHAR(1000), + zip_state VARCHAR(1000), zip_value VARCHAR(1000), country VARCHAR(1000), "phoneNumber" VARCHAR(8000), diff --git a/tests/sample_models/orders/orders_ddl_postgresql_version1.sql b/tests/sample_models/orders/orders_ddl_postgresql_version1.sql index 7d1bf33..7955a4b 100644 --- a/tests/sample_models/orders/orders_ddl_postgresql_version1.sql +++ b/tests/sample_models/orders/orders_ddl_postgresql_version1.sql @@ -6,6 +6,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000), city VARCHAR(1000), "zip_codingSystem" VARCHAR(1000), + zip_state VARCHAR(1000), zip_value VARCHAR(1000), country VARCHAR(1000), "phoneNumber" VARCHAR(8000), diff --git a/tests/sample_models/orders/orders_ddl_postgresql_version2.sql b/tests/sample_models/orders/orders_ddl_postgresql_version2.sql index 17f6cd2..ed9c440 100644 --- a/tests/sample_models/orders/orders_ddl_postgresql_version2.sql +++ b/tests/sample_models/orders/orders_ddl_postgresql_version2.sql @@ -17,6 +17,7 @@ CREATE TABLE orderperson ( address VARCHAR(1000), city VARCHAR(1000), "zip_codingSystem" VARCHAR(1000), + zip_state VARCHAR(1000), zip_value VARCHAR(1000), country VARCHAR(1000), "phoneNumber" VARCHAR(8000), @@ -100,6 +101,7 @@ CREATE TABLE shiporder ( orderperson_address VARCHAR(1000), orderperson_city VARCHAR(1000), "orderperson_zip_codingSystem" VARCHAR(1000), + orderperson_zip_state VARCHAR(1000), orderperson_zip_value VARCHAR(1000), orderperson_country VARCHAR(1000), "orderperson_phoneNumber" VARCHAR(8000), diff --git a/tests/sample_models/orders/orders_erd_version0.md b/tests/sample_models/orders/orders_erd_version0.md index 443b28c..83291d8 100644 --- a/tests/sample_models/orders/orders_erd_version0.md +++ b/tests/sample_models/orders/orders_erd_version0.md @@ -36,6 +36,7 @@ erDiagram string address string city string zip_codingSystem + string zip_state string zip_value string country string-N phoneNumber diff --git a/tests/sample_models/orders/orders_erd_version1.md b/tests/sample_models/orders/orders_erd_version1.md index 4b07efa..2261d1c 100644 --- a/tests/sample_models/orders/orders_erd_version1.md +++ b/tests/sample_models/orders/orders_erd_version1.md @@ -36,6 +36,7 @@ erDiagram string address string city string zip_codingSystem + string zip_state string zip_value string country string-N phoneNumber diff --git a/tests/sample_models/orders/orders_erd_version2.md b/tests/sample_models/orders/orders_erd_version2.md index 26e96d9..fa07d52 100644 --- a/tests/sample_models/orders/orders_erd_version2.md +++ b/tests/sample_models/orders/orders_erd_version2.md @@ -10,6 +10,7 @@ erDiagram string orderperson_address string orderperson_city string orderperson_zip_codingSystem + string orderperson_zip_state string orderperson_zip_value string orderperson_country string-N orderperson_phoneNumber @@ -44,6 +45,7 @@ erDiagram string address string city string zip_codingSystem + string zip_state string zip_value string country string-N phoneNumber diff --git a/tests/sample_models/orders/xml/order2.xml b/tests/sample_models/orders/xml/order2.xml index 5926472..214f243 100644 --- a/tests/sample_models/orders/xml/order2.xml +++ b/tests/sample_models/orders/xml/order2.xml @@ -6,7 +6,7 @@ Alice
string
string - 21093 + 21093 string 198210983210983HE1209