Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 3 additions & 20 deletions src/xml2db/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,16 +179,7 @@ def _extract_node(
else key
)
if content_key in content:
if model_table.columns[key].data_type in ["decimal", "float"]:
val = [float(v) for v in content[content_key]]
elif model_table.columns[key].data_type == "integer":
val = [int(v) for v in content[content_key]]
elif model_table.columns[key].data_type == "boolean":
val = [
v == "true" or v == "1" for v in content[content_key]
]
else:
val = content[content_key]
val = content[content_key]

if len(val) == 1:
record[key] = val[0]
Expand Down Expand Up @@ -336,15 +327,7 @@ def _build_node(node_type: str, node_pk: int) -> tuple:
if rel.is_attr
else rel_name
)
if rel.data_type in [
"decimal",
"float",
]: # remove trailing ".0" for decimal and float
content[content_key] = [
value.rstrip("0").rstrip(".") if "." in value else value
for value in str(record[rel_name]).split(",")
]
elif isinstance(record[rel_name], datetime.datetime):
if isinstance(record[rel_name], datetime.datetime):
content[content_key] = [
record[rel_name].isoformat(timespec="milliseconds")
]
Expand All @@ -354,7 +337,7 @@ def _build_node(node_type: str, node_pk: int) -> tuple:
0
]
if "," in str(record[rel_name])
else [str(record[rel_name])]
else [record[rel_name]]
)
elif (
field_type == "rel1"
Expand Down
76 changes: 63 additions & 13 deletions src/xml2db/xml_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,39 @@ def _transform_node(self, node_type: str, content: dict) -> tuple:
child_key, val = list(content.items())[0]
content = {"type": [child_key], "value": val}

# convert some simple types to python types
if node_type in self.model.tables:
table = self.model.tables[node_type]
for key in table.columns:
content_key = (
(
f"{key[:-5]}__attr"
if table.columns[key].has_suffix
else f"{key}__attr"
)
if table.columns[key].is_attr
else key
)
if content_key in content:
if table.columns[key].data_type in ["decimal", "float"]:
content[content_key] = [float(v) for v in content[content_key]]
elif table.columns[key].data_type in [
"integer",
"int",
"nonPositiveInteger",
"nonNegativeInteger",
"positiveInteger",
"negativeInteger",
"short",
"byte",
"long",
]:
content[content_key] = [int(v) for v in content[content_key]]
elif table.columns[key].data_type == "boolean":
content[content_key] = [
v == "true" or v == "1" for v in content[content_key]
]

return node_type, content

def _compute_hash_deduplicate(self, node: tuple, hash_maps: dict) -> tuple:
Expand Down Expand Up @@ -459,20 +492,37 @@ def check_transformed_node(node_type, element):
attributes = {}
text_content = None
if field_type == "col":
if rel.is_attr:
if rel.has_suffix and f"{rel_name[:-5]}__attr" in content:
attributes[rel.name_chain[-1][0][:-5]] = content[
f"{rel_name[:-5]}__attr"
][0]
elif not rel.has_suffix and f"{rel_name}__attr" in content:
attributes[rel.name_chain[-1][0]] = content[
f"{rel_name}__attr"
][0]
elif rel_name in content:
if rel.is_content:
text_content = content[rel_name][0]
content_key = (
(
f"{rel_name[:-5]}__attr"
if rel.has_suffix
else f"{rel_name}__attr"
)
if rel.is_attr
else rel_name
)
if content_key in content:
if rel.data_type in [
"decimal",
"float",
]: # remove trailing ".0" for decimal and float
val = str(content[content_key][0])
val = [val.rstrip("0").rstrip(".") if "." in val else val]
elif isinstance(content[content_key][0], datetime):
val = [
content[content_key][0].isoformat(timespec="milliseconds")
]
else:
val = content[content_key]
if rel.is_attr:
if rel.has_suffix:
attributes[rel.name_chain[-1][0][:-5]] = val[0]
else:
attributes[rel.name_chain[-1][0]] = val[0]
elif rel.is_content:
text_content = val[0]
else:
for field_value in content[rel_name]:
for field_value in val:
child = etree.Element(rel.name_chain[-1][0])
if isinstance(field_value, datetime):
field_value = field_value.isoformat()
Expand Down