MatchesFieldIdentifier🔗

Type: Pattern verification
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.

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"(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