MatchesFieldIdentifier🔗
Check that
text is a valid field identifier of the query language.
A field identifier starts with a root ($aas, $sm, $sme, $cd,
$aasdesc or $smdesc), optionally followed by an idShortPath in case
of $sme, and ends with an attribute declaration after #,
e.g.
,
$sme.someCollection.someProperty#value.
Code
array_index = "(0|[1-9][0-9]*)"
optional_index = f"\\[{array_index}?\\]"
reference_clause = f"(type|keys{optional_index}\\.(type|value))"
semantic_id_clause = f"semanticId(\\.{reference_clause})?"
supplemental_semantic_id_clause = (
f"supplementalSemanticIds({optional_index})?(\\.{reference_clause})?"
)
specific_asset_ids_clause = (
f"specificAssetIds{optional_index}"
f"\\.(name|value|externalSubjectId(\\.{reference_clause})?)"
)
endpoint_clause = (
f"endpoints{optional_index}\\.(interface|protocolinformation\\.href)"
)
sm_descriptor_clause = (
f"({semantic_id_clause}|{supplemental_semantic_id_clause}"
f"|idShort|id|{endpoint_clause})"
)
id_short = "[A-Za-z]([A-Za-z0-9_-]*[A-Za-z0-9_])?"
id_short_path_segment = f"{id_short}({optional_index})*"
id_short_path = f"{id_short_path_segment}(\\.{id_short_path_segment})*"
fields_aas = (
f"(idShort|id|assetInformation\\.assetKind|assetInformation\\.assetType"
f"|assetInformation\\.globalAssetId"
f"|assetInformation\\.{specific_asset_ids_clause}"
f"|submodels{optional_index}(\\.{reference_clause})?)"
)
fields_sm = f"({semantic_id_clause}|{supplemental_semantic_id_clause}|idShort|id)"
fields_sme = (
f"({semantic_id_clause}|{supplemental_semantic_id_clause}"
f"|idShort|value|valueType|language)"
)
fields_cd = "(idShort|id)"
fields_aas_descriptor = (
f"(idShort|id|assetKind|assetType|globalAssetId"
f"|{specific_asset_ids_clause}|{endpoint_clause}"
f"|submodelDescriptors{optional_index}\\.{sm_descriptor_clause})"
)
pattern = (
f"^(\\$aas#{fields_aas}"
f"|\\$sm#{fields_sm}"
f"|\\$sme(\\.{id_short_path})?#{fields_sme}"
f"|\\$cd#{fields_cd}"
f"|\\$aasdesc#{fields_aas_descriptor}"
f"|\\$smdesc#{sm_descriptor_clause})$"
)
return match(pattern, text) is not None