MatchesFragmentFieldIdentifier🔗

Type: Pattern verification
Check that text is a valid fragment field identifier.

A fragment field identifier points to the part of the returned data which should be filtered, e.g. , $aas#assetInformation.specificAssetIds[] or $sme.someCollection.

See: https://industrialdigitaltwin.io/aas-specifications/IDTA-01002/v3.2/query-language.html#query-grammar

text🔗
Text to be checked
Return🔗
True if the text conforms to the pattern

Code

array_index = "(0|[1-9][0-9]*)"
optional_index = f"\\[{array_index}?\\]"
reference_clause = f"keys({optional_index})?"
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"(\\.externalSubjectId(\\.{reference_clause})?)?)?"
)
submodels_clause = f"submodels({optional_index}(\\.{reference_clause})?)?"
endpoint_clause = f"endpoints({optional_index})?"
sm_descriptor_clause = (
    f"({semantic_id_clause}|{supplemental_semantic_id_clause}"
    f"|idShort|{endpoint_clause})"
)
submodel_descriptors_clause = (
    f"submodelDescriptors({optional_index}(\\.{sm_descriptor_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|assetInformation\\.assetType|assetInformation\\.globalAssetId"
    f"|assetInformation\\.{specific_asset_ids_clause}|{submodels_clause})"
)
fields_sm = f"({semantic_id_clause}|{supplemental_semantic_id_clause}|idShort)"
fields_sme = (
    f"({semantic_id_clause}|{supplemental_semantic_id_clause}"
    f"|idShort|value|valueType|language)"
)
fields_aas_descriptor = (
    f"(idShort|description|displayName|extension|administration"
    f"|assetKind|assetType|globalAssetId|{specific_asset_ids_clause}"
    f"|{endpoint_clause}|{submodel_descriptors_clause})"
)

pattern = (
    f"^(\\$aas#{fields_aas}"
    f"|\\$sm#{fields_sm}"
    f"|\\$sme(\\.{id_short_path})?(#{fields_sme})?"
    f"|\\$cd#idShort"
    f"|\\$aasdesc#{fields_aas_descriptor}"
    f"|\\$smdesc#{sm_descriptor_clause})$"
)

return match(pattern, text) is not None