Class: Glossarist::Rdf::GlossNaryMember

Inherits:
Lutaml::Model::Serializable
  • Object
show all
Defined in:
lib/glossarist/rdf/gloss_nary_member.rb

Overview

Shared base for typed n-ary hyperedge member RDF views (GlossPartitiveMember, GlossGenericMember, future leaves).

Carries the shared attributes and the deterministic_id algorithm. Concrete leaves declare their own rdf do block AND their own type-specific attributes — is_delimiting on GlossPartitiveMember (binary role, ISO 704 §5.5.4.2.2); characteristic on GlossGenericMember (delimiting text, ISO 704 §5.5.4.2.1).

Subject identity is content-derived so the same member in the same hyperedge produces the same URI across runs (and across processes). Two members with identical ref + dimensions share a subject — that is intentional: it exposes model-level inconsistency if the same concept is given different dimensions inside the same dataset.

Direct Known Subclasses

GlossGenericMember, GlossPartitiveMember

Class Method Summary collapse

Class Method Details

.deterministic_id(member) ⇒ Object

Human-readable SOURCE:ID when both are present; SHA-256 / 16 hex chars fallback otherwise. Same content → same slug across instances, runs, and processes.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/glossarist/rdf/gloss_nary_member.rb', line 32

def self.deterministic_id(member)
  readable = [member.ref_source, member.ref_id].compact.reject(&:empty?)
  return readable.join(":") unless readable.empty?

  parts = [member.ref_source, member.ref_id, member.ref_text,
           member.presence, member.count]
  # Type-specific discriminator: include the delimiting flag for
  # partitive members (binary role) or the characteristic text
  # for generic members (so members of different criteria don't
  # collide on the same hash input).
  case member
  when GlossPartitiveMember
    parts << member.is_delimiting
  when GlossGenericMember
    parts << member.characteristic
  end
  DeterministicSlug.from_parts(*parts)
end