Skip to content

Commit 76269d4

Browse files
martinv13cre-os
andauthored
Fix complex base type for type with simple content (#32)
* Fix complex base type * Add test case --------- Co-authored-by: cre-os <opensource@cre.fr>
1 parent 84a4265 commit 76269d4

17 files changed

+49
-15
lines changed

src/xml2db/model.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,15 @@ def get_occurs(particle):
545545
or parent_node.type.has_simple_content()
546546
):
547547
if parent_node.type.base_type is not None:
548+
parent_base_type = parent_node.type.base_type
549+
while parent_base_type.base_type is not None:
550+
parent_base_type = parent_base_type.base_type
548551
(
549552
data_type,
550553
min_length,
551554
max_length,
552555
allow_empty,
553-
) = recurse_parse_simple_type([parent_node.type.base_type])
556+
) = recurse_parse_simple_type([parent_base_type])
554557
else:
555558
data_type, min_length, max_length, allow_empty = "string", 0, None, True
556559

src/xml2db/table/reused_table.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from hashlib import sha1
2+
13
from sqlalchemy import (
24
Table,
35
Column,
@@ -10,8 +12,15 @@
1012
Sequence,
1113
)
1214

13-
from .transformed_table import DataModelTableTransformed
1415
from .column import DataModelColumn
16+
from .transformed_table import DataModelTableTransformed
17+
18+
19+
def shorten_str(x: str, max_len: int = 30) -> str:
20+
if len(x) > max_len:
21+
h = sha1(x.encode("utf8"))
22+
return f"{x[:(max_len - 7)]}_{h.hexdigest()[1:6]}"
23+
return x
1524

1625

1726
class DataModelTableReused(DataModelTableTransformed):
@@ -79,7 +88,7 @@ def get_col(temp=False):
7988
yield from hash_col.get_sqlalchemy_column(temp)
8089
yield UniqueConstraint(
8190
self.data_model.model_config["record_hash_column_name"],
82-
name=f"{prefix if temp else ''}{self.name}_xml2db_record_hash",
91+
name=f"{prefix if temp else ''}{shorten_str(self.name)}_xml2db_record_hash",
8392
)
8493

8594
# build target table

tests/sample_models/orders/base_types.xsd

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,19 @@
3636
<xs:simpleType name="CoordinatesType">
3737
<xs:restriction base="xs:float" />
3838
</xs:simpleType>
39-
<xs:simpleType name="CoordinatesListType">
40-
<xs:list itemType="bt:CoordinatesType"/>
41-
</xs:simpleType>
39+
<xs:simpleType name="CoordinatesListType">
40+
<xs:list itemType="bt:CoordinatesType"/>
41+
</xs:simpleType>
42+
<xs:simpleType name="PostalCodeType-base">
43+
<xs:restriction base="bt:stringtype">
44+
<xs:maxLength value="10"/>
45+
</xs:restriction>
46+
</xs:simpleType>
47+
<xs:complexType name="PostalCodeType">
48+
<xs:simpleContent>
49+
<xs:extension base="bt:PostalCodeType-base">
50+
<xs:attribute name="codingSystem" type="xs:string" use="required"/>
51+
</xs:extension>
52+
</xs:simpleContent>
53+
</xs:complexType>
4254
</xs:schema>

tests/sample_models/orders/orders.xsd

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,10 @@
1111
</xs:choice>
1212
</xs:complexType>
1313

14-
<xs:simpleType name="ZipCodeType-base">
15-
<xs:restriction base="bt:stringtype">
16-
<xs:maxLength value="10"/>
17-
</xs:restriction>
18-
</xs:simpleType>
19-
2014
<xs:complexType name="ZipCodeType">
2115
<xs:simpleContent>
22-
<xs:extension base="ZipCodeType-base">
23-
<xs:attribute name="codingSystem" type="xs:string" use="required"/>
16+
<xs:extension base="bt:PostalCodeType">
17+
<xs:attribute name="state" type="xs:string"/>
2418
</xs:extension>
2519
</xs:simpleContent>
2620
</xs:complexType>

tests/sample_models/orders/orders_ddl_mssql_version0.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CREATE TABLE orderperson (
66
address VARCHAR(1000) NULL,
77
city VARCHAR(1000) NULL,
88
[zip_codingSystem] VARCHAR(1000) NULL,
9+
zip_state VARCHAR(1000) NULL,
910
zip_value VARCHAR(1000) NULL,
1011
country VARCHAR(1000) NULL,
1112
[phoneNumber] VARCHAR(8000) NULL,

tests/sample_models/orders/orders_ddl_mssql_version1.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CREATE TABLE orderperson (
66
address VARCHAR(1000) NULL,
77
city VARCHAR(1000) NULL,
88
[zip_codingSystem] VARCHAR(1000) NULL,
9+
zip_state VARCHAR(1000) NULL,
910
zip_value VARCHAR(1000) NULL,
1011
country VARCHAR(1000) NULL,
1112
[phoneNumber] VARCHAR(8000) NULL,

tests/sample_models/orders/orders_ddl_mssql_version2.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ CREATE TABLE orderperson (
1717
address VARCHAR(1000) NULL,
1818
city VARCHAR(1000) NULL,
1919
[zip_codingSystem] VARCHAR(1000) NULL,
20+
zip_state VARCHAR(1000) NULL,
2021
zip_value VARCHAR(1000) NULL,
2122
country VARCHAR(1000) NULL,
2223
[phoneNumber] VARCHAR(8000) NULL,
@@ -100,6 +101,7 @@ CREATE TABLE shiporder (
100101
orderperson_address VARCHAR(1000) NULL,
101102
orderperson_city VARCHAR(1000) NULL,
102103
[orderperson_zip_codingSystem] VARCHAR(1000) NULL,
104+
orderperson_zip_state VARCHAR(1000) NULL,
103105
orderperson_zip_value VARCHAR(1000) NULL,
104106
orderperson_country VARCHAR(1000) NULL,
105107
[orderperson_phoneNumber] VARCHAR(8000) NULL,

tests/sample_models/orders/orders_ddl_mysql_version0.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CREATE TABLE orderperson (
66
address VARCHAR(255),
77
city VARCHAR(255),
88
`zip_codingSystem` VARCHAR(255),
9+
zip_state VARCHAR(255),
910
zip_value VARCHAR(255),
1011
country VARCHAR(255),
1112
`phoneNumber` VARCHAR(4000),

tests/sample_models/orders/orders_ddl_mysql_version1.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CREATE TABLE orderperson (
66
address VARCHAR(255),
77
city VARCHAR(255),
88
`zip_codingSystem` VARCHAR(255),
9+
zip_state VARCHAR(255),
910
zip_value VARCHAR(255),
1011
country VARCHAR(255),
1112
`phoneNumber` VARCHAR(4000),

tests/sample_models/orders/orders_ddl_mysql_version2.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ CREATE TABLE orderperson (
1717
address VARCHAR(255),
1818
city VARCHAR(255),
1919
`zip_codingSystem` VARCHAR(255),
20+
zip_state VARCHAR(255),
2021
zip_value VARCHAR(255),
2122
country VARCHAR(255),
2223
`phoneNumber` VARCHAR(4000),
@@ -100,6 +101,7 @@ CREATE TABLE shiporder (
100101
orderperson_address VARCHAR(255),
101102
orderperson_city VARCHAR(255),
102103
`orderperson_zip_codingSystem` VARCHAR(255),
104+
orderperson_zip_state VARCHAR(255),
103105
orderperson_zip_value VARCHAR(255),
104106
orderperson_country VARCHAR(255),
105107
`orderperson_phoneNumber` VARCHAR(4000),

0 commit comments

Comments
 (0)