SCHEMA item_identification_dex;


TYPE any_number_value = NUMBER;
END_TYPE;

TYPE any_string_value = STRING;
END_TYPE;

TYPE assigned_document_select = SELECT
   (Document,
    Document_version,
    File);
END_TYPE;

TYPE classification_item = SELECT
   (Activity,
    Activity_method,
    Address,
    Address_assignment,
    Applied_state_assignment,
    Assigned_property,
    Calendar_date,
    Class,
    Content_item,
    Date_or_date_time_assignment,
    Date_time,
    Digital_file,
    Document,
    Document_assignment,
    Document_version,
    Effectivity,
    Effectivity_assignment,
    External_class_library,
    Identification_assignment,
    Local_time,
    Location,
    Location_assignment,
    Message,
    Organization,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Partial_document_assignment,
    Person,
    Person_in_organization,
    Product,
    Product_as_realized,
    Product_category,
    Product_design_version_to_individual,
    Product_group,
    Product_relationship,
    Product_version,
    Product_view_definition,
    Property_representation,
    Representation,
    Representation_context,
    Representation_item,
    Resource_item,
    State,
    State_assertion,
    State_definition,
    State_role,
    Uncertainty_with_unit,
    Unit,
    Value_with_unit,
    View_definition_context,
    View_definition_relationship);
END_TYPE;

TYPE date_or_date_time_item = SELECT
   (Activity,
    Activity_method,
    Address_assignment,
    Applied_state_assignment,
    Assigned_property,
    Classification_assignment,
    Date_or_date_time_assignment,
    Digital_file,
    Document,
    Document_assignment,
    Document_version,
    Effectivity,
    Effectivity_assignment,
    Identification_assignment,
    Location_assignment,
    Message,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Person,
    Person_in_organization,
    Product_as_realized,
    Product_category_assignment,
    Product_design_version_to_individual,
    Product_group,
    Product_relationship,
    Product_version,
    Product_view_definition,
    Property_representation,
    Representation,
    Resource_item,
    State,
    State_assertion,
    State_definition,
    View_definition_context);
END_TYPE;

TYPE date_or_date_time_select = SELECT
   (Calendar_date,
    Date_time);
END_TYPE;

TYPE date_or_event = SELECT
   (Calendar_date,
    Date_time);
END_TYPE;

TYPE day_in_month_number = INTEGER ;
WHERE
  WR1: {1 <= SELF <= 31};
END_TYPE;

TYPE documented_element_select = SELECT
   (Document_assignment,
    Class,
    Activity,
    Activity_method,
    Assigned_property,
    Document,
    Document_version,
    Effectivity,
    Effectivity_assignment,
    Identification_assignment,
    Location,
    Location_assignment,
    Message,
    Organization,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Person,
    Product,
    Product_as_realized,
    Product_design_version_to_individual,
    Product_group,
    Product_relationship,
    Product_version,
    Product_view_definition,
    Property_representation,
    Representation,
    Representation_item,
    Resource_item,
    State,
    State_assertion,
    State_definition,
    View_definition_relationship);
END_TYPE;

TYPE effectivity_item = SELECT
   (View_definition_usage,
    Classification_assignment,
    Activity,
    Activity_method,
    Address_assignment,
    Assigned_property,
    Date_or_date_time_assignment,
    Document,
    Document_assignment,
    Document_version,
    Effectivity_assignment,
    File,
    Identification_assignment,
    Location_assignment,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Person_in_organization,
    Product,
    Product_as_individual,
    Product_as_individual_version,
    Product_as_individual_view,
    Product_design_version_to_individual,
    Product_group,
    Product_relationship,
    Product_version,
    Product_view_definition);
END_TYPE;

TYPE hour_in_day = INTEGER ;
WHERE
  WR1: {0 <= SELF < 24};
END_TYPE;

TYPE identification_item = SELECT
   (Class,
    Activity,
    Activity_method,
    Address,
    Applied_state_assignment,
    Assigned_property,
    Digital_file,
    Document,
    Document_assignment,
    Document_version,
    Effectivity,
    External_class_library,
    Location,
    Message,
    Organization,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Person,
    Person_in_organization,
    Product_as_individual,
    Product_as_individual_version,
    Product_as_individual_view,
    Product_as_realized,
    Product_group,
    Product_relationship,
    Resource_item,
    State,
    State_assertion,
    State_definition,
    View_definition_relationship);
END_TYPE;

TYPE length_measure = REAL;
END_TYPE;

TYPE location_assignment_select = SELECT
   (Activity,
    Document,
    Document_version,
    File,
    Organization,
    Person,
    Person_in_organization,
    Product,
    Product_group,
    Product_version,
    Product_view_definition,
    Resource_item,
    View_definition_relationship);
END_TYPE;

TYPE measure_value = SELECT
   (any_number_value,
    any_string_value,
    length_measure,
    plane_angle_measure);
END_TYPE;

TYPE message_definer_select = SELECT
   (Organization,
    Person_in_organization);
END_TYPE;

TYPE minute_in_hour = INTEGER ;
WHERE
  WR1: {0 <= SELF <= 59};
END_TYPE;

TYPE month_in_year_number = INTEGER ;
WHERE
  WR1: {1 <= SELF <= 12};
END_TYPE;

TYPE offset_orientation = ENUMERATION OF
   (ahead,
exact,
behind);
END_TYPE;

TYPE organization_or_person_in_organization_item = SELECT
   (Activity,
    Activity_method,
    Address_assignment,
    Applied_state_assignment,
    Assigned_property,
    Classification_assignment,
    Date_or_date_time_assignment,
    Digital_file,
    Document,
    Document_assignment,
    Document_version,
    Effectivity,
    Effectivity_assignment,
    Identification_assignment,
    Location_assignment,
    Message,
    Organization_or_person_in_organization_assignment,
    Part,
    Part_version,
    Person_in_organization,
    Product_as_individual,
    Product_as_realized,
    Product_category,
    Product_category_assignment,
    Product_group,
    Product_relationship,
    Product_version,
    Product_view_definition,
    Property_representation,
    Representation,
    Resource_item,
    State,
    State_assertion,
    State_definition,
    View_definition_context);
END_TYPE;

TYPE organization_or_person_in_organization_select = SELECT
   (Organization,
    Person_in_organization);
END_TYPE;

TYPE plane_angle_measure = REAL;
END_TYPE;

TYPE property_assignment_select = SELECT
   (Address,
    Applied_state_assignment,
    Document_assignment,
    File,
    Location_assignment,
    Organization_or_person_in_organization_assignment,
    Person,
    Person_in_organization,
    Product_view_definition,
    State,
    State_definition,
    View_definition_relationship);
END_TYPE;

TYPE resource_item_select = SELECT
   (Document,
    Document_version,
    File,
    Location,
    Organization,
    Part,
    Part_version,
    Person,
    Person_in_organization,
    Product_as_individual,
    Product_as_individual_version,
    Product_as_individual_view,
    Product_group);
END_TYPE;

TYPE second_in_minute = REAL ;
WHERE
  WR1: {0 <= SELF <= 60.000000};
END_TYPE;

TYPE state_of_item = SELECT
   (Activity,
    Activity_method,
    Digital_file,
    Document,
    Document_version,
    Location,
    Message,
    Organization,
    Part,
    Part_version,
    Person_in_organization,
    Product,
    Product_as_individual,
    Product_as_individual_view,
    Product_as_realized,
    Product_group,
    Product_version,
    Resource_item,
    View_definition_relationship);
END_TYPE;

TYPE year_number = INTEGER;
END_TYPE;

TYPE message_content_item = SELECT
   (Product,
    Product_version,
    Activity,
    Activity_method,
    External_class_library,
    Resource_item);
END_TYPE;

ENTITY Activity;
  id : STRING;
  name : STRING;
  description : OPTIONAL STRING;
  chosen_method : Activity_method;
END_ENTITY;

ENTITY Activity_actual
  SUBTYPE OF (Activity);
END_ENTITY;

ENTITY Activity_method;
  name : STRING;
  description : OPTIONAL STRING;
  consequence : OPTIONAL STRING;
  purpose : STRING;
END_ENTITY;

ENTITY Address;
  name : OPTIONAL STRING;
  street_number : OPTIONAL STRING;
  street : OPTIONAL STRING;
  postal_box : OPTIONAL STRING;
  town : OPTIONAL STRING;
  region : OPTIONAL STRING;
  postal_code : OPTIONAL STRING;
  country : OPTIONAL STRING;
  internal_location : OPTIONAL STRING;
  facsimile_number : OPTIONAL STRING;
  telephone_number : OPTIONAL STRING;
  electronic_mail_address : OPTIONAL STRING;
  telex_number : OPTIONAL STRING;
  url : OPTIONAL STRING;
WHERE
  WR1: EXISTS(street_number) OR EXISTS(street) OR EXISTS(postal_box) OR EXISTS(town) OR EXISTS(region) OR EXISTS(postal_code) OR EXISTS(country) OR EXISTS(internal_location) OR EXISTS(facsimile_number) OR EXISTS(telephone_number) OR EXISTS(electronic_mail_address) OR EXISTS(telex_number);
END_ENTITY;

ENTITY Address_assignment;
  address_type : OPTIONAL STRING;
  assigned_address : Address;
  located_person_organizations : SET[1:?] OF organization_or_person_in_organization_select;
END_ENTITY;

ENTITY Applied_state_assignment;
  described_state : State;
  assigned_to : state_of_item;
  role : State_role;
END_ENTITY;

ENTITY Assigned_property;
  id : OPTIONAL STRING;
  name : STRING;
  description : OPTIONAL STRING;
  described_element : property_assignment_select;
END_ENTITY;

ENTITY Calendar_date;
  year_component : year_number;
  month_component : month_in_year_number;
  day_component : day_in_month_number;
END_ENTITY;

ENTITY Class;
  id : STRING;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Classification_assignment;
  assigned_class : Class;
  items : SET[1:?] OF classification_item;
  role : OPTIONAL STRING;
END_ENTITY;

ENTITY Content_item;
  item_identifier : STRING;
  item_type : STRING;
  access_comment : OPTIONAL STRING;
END_ENTITY;

ENTITY Content_item_selected
  SUBTYPE OF (Content_item);
  contents : message_content_item;
END_ENTITY;

ENTITY Date_or_date_time_assignment;
  assigned_date : date_or_date_time_select;
  role : STRING;
  items : SET[1:?] OF date_or_date_time_item;
END_ENTITY;

ENTITY Date_time;
  date_component : Calendar_date;
  time_component : Local_time;
END_ENTITY;

ENTITY Dated_effectivity
  SUBTYPE OF (Effectivity);
  start_bound : date_or_event;
  end_bound : OPTIONAL date_or_event;
END_ENTITY;

ENTITY Digital_file
  SUBTYPE OF (File);
END_ENTITY;

ENTITY Document
  SUBTYPE OF (Product);
END_ENTITY;

ENTITY Document_assignment;
  assigned_document : assigned_document_select;
  is_assigned_to : documented_element_select;
  role : STRING;
END_ENTITY;

ENTITY Document_version
  SUBTYPE OF (Product_version);
  SELF\Product_version.of_product : Document;
END_ENTITY;

ENTITY Effectivity
  SUPERTYPE OF (ONEOF (Dated_effectivity));
  id : STRING;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Effectivity_assignment;
  assigned_effectivity : Effectivity;
  role : STRING;
  items : SET[1:?] OF effectivity_item;
END_ENTITY;

ENTITY External_class
  SUBTYPE OF (Class);
  external_source : External_class_library;
END_ENTITY;

ENTITY External_class_library;
  id : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY File
  ABSTRACT SUPERTYPE OF (ONEOF (Digital_file));
  id : STRING;
  version : OPTIONAL STRING;
  contained_data_type : OPTIONAL STRING;
END_ENTITY;

ENTITY Identification_assignment;
  identifier : STRING;
  role : STRING;
  description : OPTIONAL STRING;
  items : SET[1:?] OF identification_item;
END_ENTITY;

ENTITY Local_time;
  hour_component : hour_in_day;
  minute_component : OPTIONAL minute_in_hour;
  second_component : OPTIONAL second_in_minute;
  zone : Time_offset;
END_ENTITY;

ENTITY Location;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Location_assignment;
  description : OPTIONAL STRING;
  role : OPTIONAL STRING;
  entity_for_location : location_assignment_select;
  location_for_assignment : Location;
END_ENTITY;

ENTITY Measure_item
  ABSTRACT SUPERTYPE OF (ONEOF (Numerical_item_with_unit))
  SUBTYPE OF (Representation_item);
WHERE
  WR1: SIZEOF(USEDIN(SELF, 'ITEM_IDENTIFICATION_DEX.REPRESENTATION.ITEMS')) > 0;
END_ENTITY;

ENTITY Message;
  id : STRING;
  message_type : STRING;
  contains : SET OF Content_item;
  defined_by : OPTIONAL SET OF message_definer_select;
  purpose : OPTIONAL STRING;
END_ENTITY;

ENTITY Numerical_item_with_unit
  SUBTYPE OF (Measure_item, Value_with_unit);
END_ENTITY;

ENTITY Numerical_representation_context
  SUBTYPE OF (Representation_context);
  units : OPTIONAL SET[1:?] OF Unit;
  accuracies : OPTIONAL SET[1:?] OF Uncertainty_with_unit;
END_ENTITY;

ENTITY Organization;
  id : OPTIONAL STRING;
  name : STRING;
END_ENTITY;

ENTITY Organization_or_person_in_organization_assignment;
  assigned_entity : organization_or_person_in_organization_select;
  role : STRING;
  items : SET[1:?] OF organization_or_person_in_organization_item;
END_ENTITY;

ENTITY Part
  SUBTYPE OF (Product);
WHERE
  WR1: SIZEOF(['part', 'raw material', 'tool'] * types_of_product(SELF)) = 1;
END_ENTITY;

ENTITY Part_version
  SUBTYPE OF (Product_version);
  SELF\Product_version.of_product : Part;
END_ENTITY;

ENTITY Partial_document_assignment
  SUBTYPE OF (Document_assignment);
  document_portion : STRING;
END_ENTITY;

ENTITY Person;
  last_name : STRING;
  first_name : OPTIONAL STRING;
  middle_names : OPTIONAL LIST[1:?] OF STRING;
  prefix_titles : OPTIONAL LIST[1:?] OF STRING;
  suffix_titles : OPTIONAL LIST[1:?] OF STRING;
END_ENTITY;

ENTITY Person_in_organization;
  concerned_person : Person;
  containing_organization : Organization;
  role : STRING;
END_ENTITY;

ENTITY Product
  ABSTRACT SUPERTYPE OF (ONEOF (Document,
                                Part,
                                Product_as_individual));
  id : STRING;
  name : OPTIONAL STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Product_as_individual
  SUBTYPE OF (Product);
END_ENTITY;

ENTITY Product_as_individual_version
  ABSTRACT SUPERTYPE OF (ONEOF (Product_as_realized))
  SUBTYPE OF (Product_version);
  SELF\Product_version.of_product : Product_as_individual;
END_ENTITY;

ENTITY Product_as_individual_view
  SUBTYPE OF (Product_view_definition);
  SELF\Product_view_definition.defined_version : Product_as_individual_version;
END_ENTITY;

ENTITY Product_as_realized
  SUBTYPE OF (Product_as_individual_version);
END_ENTITY;

ENTITY Product_category;
  id : OPTIONAL STRING;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Product_category_assignment;
  category : Product_category;
  products : SET[1:?] OF Product;
END_ENTITY;

ENTITY Product_design_version_to_individual;
  product_design_version : Product_version;
  individual_product : Product_as_individual_version;
END_ENTITY;

ENTITY Product_group;
  id : STRING;
  description : OPTIONAL STRING;
  purpose : STRING;
  membership_rule : OPTIONAL STRING;
  product_group_context : OPTIONAL STRING;
END_ENTITY;

ENTITY Product_relationship;
  relation_type : STRING;
  description : OPTIONAL STRING;
  relating_product : Product;
  related_product : Product;
END_ENTITY;

ENTITY Product_version
  ABSTRACT SUPERTYPE OF (ONEOF (Document_version,
                                Part_version,
                                Product_as_individual_version));
  id : STRING;
  description : OPTIONAL STRING;
  of_product : Product;
END_ENTITY;

ENTITY Product_view_definition
  SUPERTYPE OF (ONEOF (Product_as_individual_view));
  id : STRING;
  name : OPTIONAL STRING;
  additional_characterization : OPTIONAL STRING;
  initial_context : View_definition_context;
  additional_contexts : SET OF View_definition_context;
  defined_version : Product_version;
WHERE
  WR1: NOT (initial_context IN additional_contexts);
END_ENTITY;

ENTITY Property_representation;
  description : OPTIONAL STRING;
  property : Assigned_property;
  rep : Representation;
  role : OPTIONAL STRING;
END_ENTITY;

ENTITY Property_value_representation
  SUBTYPE OF (Representation);
  SELF\Representation.context_of_items : Numerical_representation_context;
END_ENTITY;

ENTITY Representation;
  id : OPTIONAL STRING;
  name : STRING;
  description : OPTIONAL STRING;
  context_of_items : Representation_context;
  items : SET[1:?] OF Representation_item;
END_ENTITY;

ENTITY Representation_context;
  id : STRING;
  kind : STRING;
INVERSE
  representations_in_context : SET[1:?] OF Representation FOR context_of_items;
END_ENTITY;

ENTITY Representation_item;
  name : STRING;
END_ENTITY;

ENTITY Resource_item;
  name : STRING;
  description : OPTIONAL STRING;
  resource_items : OPTIONAL SET OF resource_item_select;
END_ENTITY;

ENTITY State
  SUPERTYPE OF (ONEOF (State_observed));
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY State_assertion;
  name : STRING;
  description : OPTIONAL STRING;
  asserted_state : State;
  conformance_state : State_definition;
END_ENTITY;

ENTITY State_definition;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY State_observed
  SUBTYPE OF (State);
END_ENTITY;

ENTITY State_role;
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Time_offset;
  hour_offset : INTEGER;
  minute_offset : OPTIONAL INTEGER;
  sense : offset_orientation;
DERIVE
  actual_minute_offset : INTEGER := NVL(minute_offset, 0);
WHERE
  WR1: {0 <= hour_offset < 24};
  WR2: {0 <= actual_minute_offset <= 59};
  WR3: NOT (((hour_offset <> 0) OR (actual_minute_offset <> 0)) AND (sense = exact));
END_ENTITY;

ENTITY Uncertainty_with_unit
  SUBTYPE OF (Value_with_unit);
  name : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY Unit;
  name : STRING;
  si_unit : BOOLEAN;
END_ENTITY;

ENTITY Value_with_unit;
  unit : Unit;
  value_component : measure_value;
END_ENTITY;

ENTITY View_definition_context;
  application_domain : STRING;
  life_cycle_stage : STRING;
  description : OPTIONAL STRING;
END_ENTITY;

ENTITY View_definition_relationship
  ABSTRACT SUPERTYPE OF (ONEOF (View_definition_usage));
  id : OPTIONAL STRING;
  relation_type : OPTIONAL STRING;
  description : OPTIONAL STRING;
  relating_view : Product_view_definition;
  related_view : Product_view_definition;
END_ENTITY;

ENTITY View_definition_usage
  SUBTYPE OF (View_definition_relationship);
END_ENTITY;


FUNCTION types_of_product
 (obj : Product) : SET OF STRING;

  LOCAL
    category_assignments : BAG OF Product_category_assignment;
    categories : SET OF STRING := [];
    i : INTEGER;
  END_LOCAL;

  category_assignments := USEDIN(obj, 'ITEM_IDENTIFICATION_DEX.PRODUCT_CATEGORY_ASSIGNMENT.PRODUCTS');
  REPEAT i := LOINDEX(category_assignments) TO HIINDEX(category_assignments);
    categories := categories + category_assignments[i].category.name;
  END_REPEAT;
  RETURN (categories);
      

END_FUNCTION;


END_SCHEMA;  -- item_identification_dex