Skip to content
Snippets Groups Projects
Commit 0870f300 authored by Florian Spreckelsen's avatar Florian Spreckelsen
Browse files

WIP: Start patternProperties treatment

parent 051ce4b6
No related branches found
No related tags found
2 merge requests!73MAINT: change wording of TableImporter argument and allow converters and...,!72Extend json-schema model parser
Pipeline #36700 passed with warnings
...@@ -694,10 +694,19 @@ class JsonSchemaParser(Parser): ...@@ -694,10 +694,19 @@ class JsonSchemaParser(Parser):
# Check if this is a valid Json Schema # Check if this is a valid Json Schema
name = self._stringify(elt["title"], context=elt) name = self._stringify(elt["title"], context=elt)
self._treat_element(elt, name) self._treat_element(elt, name)
elif "properties" in elt: elif "properties" in elt or "patternProperties":
for key, prop in elt["properties"].items(): # No top-level type but there are entities
name = self._get_name_from_property(key, prop) if "properties" in elt:
self._treat_element(prop, name) for key, prop in elt["properties"].items():
name = self._get_name_from_property(key, prop)
self._treat_element(prop, name)
if "patternProperties" in elt:
# See also treatment in ``_treat_record_type``. Since here,
# there is no top-level RT we use the prefix `__Pattern`,
# i.e., the resulting Record Types will be called
# `__PatternElement`.
self._treat_pattern_properties(
elt["patternProperties"], name_prefix="__Pattern")
else: else:
# Neither RecordType itself, nor further properties in schema, # Neither RecordType itself, nor further properties in schema,
# so nothing to do here. Maybe add something in the future. # so nothing to do here. Maybe add something in the future.
...@@ -803,6 +812,17 @@ class JsonSchemaParser(Parser): ...@@ -803,6 +812,17 @@ class JsonSchemaParser(Parser):
rt.add_property(prop_ent, importance=importance, rt.add_property(prop_ent, importance=importance,
datatype=db.LIST(prop_ent)) datatype=db.LIST(prop_ent))
if "patternProperties" in elt:
pattern_property_rts = self_treat_pattern_properties(
elt["patternProperties"], name_prefix=name)
for ppr in pattern_property_rts:
# add reference to pattern property type. These can never be
# obligatory since pattern properties cannot be required in the
# original schema (since their actual names are not known a
# priori).
rt.add_property(ppr)
if "description" in elt: if "description" in elt:
rt.description = elt["description"] rt.description = elt["description"]
return rt return rt
...@@ -847,6 +867,21 @@ class JsonSchemaParser(Parser): ...@@ -847,6 +867,21 @@ class JsonSchemaParser(Parser):
self.model[ref_rt.name] = ref_rt self.model[ref_rt.name] = ref_rt
return db.Property(name=name, datatype=db.LIST(ref_rt)), False return db.Property(name=name, datatype=db.LIST(ref_rt)), False
def _get_pattern_prop(self):
if "__pattern_property_pattern_property" in self.model:
return self.model["__pattern_property_pattern_property"]
pp = db.Property(name="__matched_pattern", datatype=db.TEXT)
self.model["__pattern_property_pattern_property"] = pp
return pp
def _treat_pattern_properties(self, pattern_elements, name_prefix=""):
"""Special Treatment for pattern properties: A RecordType is created for each pattern property."""
num_patterns = len(pattern_elements)
pattern_prop = self._get_pattern_prop()
for ii, (key, element) in enumerate(pattern_elements.items()):
name_suffix = f"_{ii+1}" if num_patterns > 1 else ""
name = name_prefix + "Element" + name_suffix
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description=__doc__, parser = argparse.ArgumentParser(description=__doc__,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment