rtm 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. data/DISCLAIMER +10 -33
  2. data/LICENSE +201 -0
  3. data/README +3 -3
  4. data/lib/rtm.rb +148 -74
  5. data/lib/rtm/axes.rb +295 -0
  6. data/lib/rtm/axes/association.rb +76 -0
  7. data/lib/rtm/axes/associations.rb +96 -0
  8. data/lib/rtm/axes/assocs_names_occs.rb +56 -0
  9. data/lib/rtm/axes/characteristic.rb +68 -0
  10. data/lib/rtm/axes/characteristics.rb +93 -0
  11. data/lib/rtm/axes/string.rb +76 -0
  12. data/lib/rtm/axes/strings.rb +87 -0
  13. data/lib/rtm/axes/topic.rb +233 -0
  14. data/lib/rtm/axes/topics.rb +280 -0
  15. data/lib/rtm/{backward_compatibility.rb → deprecated/index_property_set.rb} +3 -0
  16. data/lib/rtm/engine.rb +58 -0
  17. data/lib/rtm/extensions.rb +11 -1
  18. data/lib/rtm/{locator_helpers.rb → helpers/locator.rb} +15 -4
  19. data/lib/rtm/{helpers.rb → helpers/no_output.rb} +3 -0
  20. data/lib/rtm/helpers/uri.rb +13 -0
  21. data/lib/rtm/io.rb +18 -0
  22. data/lib/rtm/io/from_xtm2_libxml.rb +2 -1
  23. data/lib/rtm/io/ontopia_io.rb +25 -0
  24. data/lib/rtm/io/tmapix.rb +234 -0
  25. data/lib/rtm/io/to_hash.rb +116 -0
  26. data/lib/rtm/io/to_jtm.rb +53 -103
  27. data/lib/rtm/io/to_rdf.rb +30 -0
  28. data/lib/rtm/io/to_string.rb +8 -6
  29. data/lib/rtm/io/to_xtm1.rb +6 -4
  30. data/lib/rtm/io/to_xtm2.rb +10 -8
  31. data/lib/rtm/io/to_yaml.rb +29 -98
  32. data/lib/rtm/navigation.rb +37 -0
  33. data/lib/rtm/navigation/association/players.rb +25 -0
  34. data/lib/rtm/navigation/name/atomify.rb +19 -0
  35. data/lib/rtm/navigation/name/characteristics.rb +33 -0
  36. data/lib/rtm/navigation/occurrence/atomify.rb +19 -0
  37. data/lib/rtm/navigation/occurrence/characteristics.rb +33 -0
  38. data/lib/rtm/navigation/topic/characteristics.rb +33 -0
  39. data/lib/rtm/navigation/topic/indicators.rb +31 -0
  40. data/lib/rtm/navigation/topic/items.rb +31 -0
  41. data/lib/rtm/navigation/topic/locators.rb +31 -0
  42. data/lib/rtm/navigation/topic/players.rb +27 -0
  43. data/lib/rtm/navigation/topic/supertypes.rb +162 -0
  44. data/lib/rtm/navigation/topic/traverse.rb +51 -0
  45. data/lib/rtm/navigation/topic/types.rb +107 -0
  46. data/lib/rtm/psi.rb +33 -2
  47. data/lib/rtm/sugar.rb +34 -0
  48. data/lib/rtm/sugar/association/hash_access.rb +46 -0
  49. data/lib/rtm/sugar/occurrence/dynamic_value.rb +75 -0
  50. data/lib/rtm/{pimp_my_api.rb → sugar/occurrence/externalize.rb} +3 -0
  51. data/lib/rtm/sugar/role/counterparts.rb +133 -46
  52. data/lib/rtm/sugar/topic/characteristics.rb +126 -12
  53. data/lib/rtm/sugar/topic/counterparts.rb +130 -7
  54. data/lib/rtm/sugar/topic/hash_access.rb +140 -30
  55. data/lib/rtm/sugar/topic/scoped.rb +65 -0
  56. data/lib/rtm/sugar/topic/topic_ref.rb +35 -0
  57. data/lib/rtm/sugar/topic/typed.rb +159 -0
  58. data/lib/rtm/sugar/typed/types.rb +38 -0
  59. data/lib/rtm/validation.rb +8 -5
  60. data/lib/rtm/version.rb +18 -0
  61. data/spec/helpers/spec_exampleexamplegroup.rb +14 -0
  62. data/spec/rtm/axes/association_spec.rb +88 -0
  63. data/spec/rtm/axes/associations_spec.rb +60 -0
  64. data/spec/rtm/axes/assocs_names_occs_spec.rb +9 -0
  65. data/spec/rtm/axes/characteristic_spec.rb +90 -0
  66. data/spec/rtm/axes/characteristics_spec.rb +85 -0
  67. data/spec/rtm/axes/string_spec.rb +145 -0
  68. data/spec/rtm/axes/strings_spec.rb +168 -0
  69. data/spec/rtm/axes/topic_spec.rb +124 -0
  70. data/spec/rtm/axes/topics_spec.rb +103 -0
  71. data/spec/rtm/base_spec.rb +32 -0
  72. data/spec/rtm/io/tmapix_spec.rb +85 -0
  73. data/spec/rtm/navigation/association/players_spec.rb +58 -0
  74. data/spec/rtm/navigation/association_spec.rb +52 -0
  75. data/spec/rtm/navigation/name/atomify_spec.rb +27 -0
  76. data/spec/rtm/navigation/name/characteristics_spec.rb +34 -0
  77. data/spec/rtm/navigation/name_spec.rb +52 -0
  78. data/spec/rtm/navigation/occurrence/atomify_spec.rb +27 -0
  79. data/spec/rtm/navigation/occurrence/characteristics_spec.rb +34 -0
  80. data/spec/rtm/navigation/occurrence_spec.rb +52 -0
  81. data/spec/rtm/navigation/string_spec.rb +51 -0
  82. data/spec/rtm/navigation/topic/characteristics_spec.rb +55 -0
  83. data/spec/rtm/navigation/topic/indicators_spec.rb +43 -0
  84. data/spec/rtm/navigation/topic/items_spec.rb +44 -0
  85. data/spec/rtm/navigation/topic/locators_spec.rb +44 -0
  86. data/spec/rtm/navigation/topic/players_spec.rb +48 -0
  87. data/spec/rtm/navigation/topic/scope_spec.rb +41 -0
  88. data/spec/rtm/navigation/topic/supertypes_spec.rb +376 -0
  89. data/spec/rtm/navigation/topic/traverse_spec.rb +64 -0
  90. data/spec/rtm/navigation/topic/types_spec.rb +195 -0
  91. data/spec/rtm/navigation/topic_spec.rb +153 -0
  92. data/spec/rtm/sugar/association/hash_access_spec.rb +55 -0
  93. data/spec/rtm/sugar/occurrence/dynamic_value_spec.rb +16 -0
  94. data/spec/rtm/sugar/role/counterparts_spec.rb +191 -0
  95. data/spec/rtm/sugar/topic/characteristics_spec.rb +318 -0
  96. data/spec/rtm/sugar/topic/counterparts_spec.rb +184 -0
  97. data/spec/rtm/sugar/topic/hash_access_spec.rb +234 -0
  98. data/spec/rtm/sugar/topic/scoped_spec.rb +131 -0
  99. data/spec/rtm/sugar/topic/topic_ref_spec.rb +44 -0
  100. data/spec/rtm/sugar/topic/typed_spec.rb +155 -0
  101. data/spec/rtm/sugar/typed/types_spec.rb +24 -0
  102. data/spec/rtm/tmapi/core/association_spec.rb +169 -0
  103. data/spec/rtm/tmapi/core/construct_spec.rb +25 -0
  104. data/spec/rtm/tmapi/core/name_spec.rb +85 -0
  105. data/spec/rtm/tmapi/core/occurrence_spec.rb +96 -0
  106. data/spec/rtm/tmapi/core/reifiable_spec.rb +168 -0
  107. data/spec/rtm/tmapi/core/role_spec.rb +73 -0
  108. data/spec/rtm/tmapi/core/scoped_spec.rb +403 -0
  109. data/spec/rtm/tmapi/core/topic_map_spec.rb +648 -0
  110. data/spec/rtm/tmapi/core/topic_spec.rb +992 -0
  111. data/spec/rtm/tmapi/core/typed_spec.rb +112 -0
  112. data/spec/rtm/tmapi/core/variant_spec.rb +52 -0
  113. data/spec/rtm/tmapi/ext/java_util_set_spec.rb +34 -0
  114. data/spec/rtm/tmapi_spec.rb +44 -0
  115. data/spec/rtm/utils/sparql_spec.rb +26 -0
  116. data/spec/rtm_spec.rb +94 -0
  117. data/spec/spec_helper.rb +23 -0
  118. data/test/base_unit_test.rb +161 -0
  119. data/test/{base_test.rb → base_unit_test_tmapi.rb} +46 -43
  120. metadata +122 -66
  121. data/COPYRIGHT +0 -4
  122. data/lib/Rakefile.rb +0 -42
  123. data/lib/activetopicmaps.rb +0 -278
  124. data/lib/rtm/backend/active_record.rb +0 -58
  125. data/lib/rtm/backend/active_record/001_initial_schema.rb +0 -116
  126. data/lib/rtm/backend/active_record/association_and_role.rb +0 -33
  127. data/lib/rtm/backend/active_record/locators.rb +0 -55
  128. data/lib/rtm/backend/active_record/name_variant_occurrence.rb +0 -45
  129. data/lib/rtm/backend/active_record/quaaxtm2rtm.rb +0 -113
  130. data/lib/rtm/backend/active_record/quaaxtm2rtmviews.rb +0 -134
  131. data/lib/rtm/backend/active_record/set_wrapper.rb +0 -98
  132. data/lib/rtm/backend/active_record/tm_construct.rb +0 -62
  133. data/lib/rtm/backend/active_record/tm_delegator.rb +0 -345
  134. data/lib/rtm/backend/active_record/tm_set_delegator.rb +0 -195
  135. data/lib/rtm/backend/active_record/tmdm.rb +0 -298
  136. data/lib/rtm/backend/active_record/topic.rb +0 -87
  137. data/lib/rtm/backend/active_record/topic_map.rb +0 -314
  138. data/lib/rtm/backend/active_record/traverse_associations.rb +0 -87
  139. data/lib/rtm/base.rb +0 -92
  140. data/lib/rtm/connect.rb +0 -92
  141. data/lib/rtm/core_ext.rb +0 -6
  142. data/lib/rtm/io/from_xtm2.rb +0 -263
  143. data/lib/rtm/merging/merging.rb +0 -307
  144. data/lib/rtm/sugar/topic/identifier_direct.rb +0 -11
  145. data/lib/rtm/sugar/topic/predefined_associations.rb +0 -42
  146. data/lib/run_main_project.rb +0 -16
@@ -1,14 +1,137 @@
1
- module RTM::Sugar
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module Sugar
2
5
  module Topic
3
6
  module Counterparts
7
+
8
+ # Returns all Roles belonging to Associations in which this Topic
9
+ # is a player and for which this Topic is not the player.
10
+ #
11
+ # A filter-hash may be used to filter for the the type
12
+ # of the Role this Topic playes
13
+ # (:rtype), for the Association type (:atype) and/or
14
+ # for the type of the returned Roles (:otype). The
15
+ # identifier may be a Topic, String-Reference or Locator.
16
+ #
17
+ # The result may be empty.
18
+ #
19
+ # :call-seq:
20
+ # counterparts -> Array of Roles
21
+ # counterparts({:rtype => identifier}) -> Array of Roles
22
+ # counterparts({:atype => identifier}) -> Array of Roles
23
+ # counterparts({:otype => identifier}) -> Array of Roles
24
+ # counterparts({:rtype => identifier, :atype => identifier}) -> Array of Roles
25
+ # counterparts({:rtype => identifier, :atype => identifier, :otype => identifier}) -> Array of Roles
26
+ #
4
27
  def counterparts(filter={})
5
- self.roles.
6
- select{|r| filter[:rtype] ? r.type == self.topic_map.get(filter[:rtype]) : true}.
7
- select{|r| filter[:atype] ? r.parent.type == self.topic_map.get(filter[:atype]) : true}.
8
- inject([]){|all,r| all+=r.counterparts(filter)}
28
+ roles.select{|r| filter[:rtype] ? r.type == self.topic_map.get(filter[:rtype]) : true}.
29
+ select{|r| filter[:atype] ? r.parent.type == self.topic_map.get(filter[:atype]) : true}.
30
+ inject([]){|all,r| all+=r.counterparts(filter)}
9
31
  end
10
- def counterplayers(*args)
11
- return self.counterparts(*args).map{|r| r.player}
32
+
33
+ # Returns all Topics that are players of Roles belonging to Associations
34
+ # in which this Topic is another player. The resulting Array does
35
+ # not contain duplicates.
36
+ #
37
+ # A filter-hash may be used to filter for the the type
38
+ # of the Role this Topic playes
39
+ # (:rtype), for the Association type (:atype) and/or
40
+ # for the type of the Roles the returned Topics play (:otype). The
41
+ # identifier may be a Topic, String-Reference or Locator.
42
+ #
43
+ # The result may be empty.
44
+ #
45
+ # :call-seq:
46
+ # counterplayers -> Array of Topics
47
+ # counterplayers(:rtype => identifier) -> Array of Topics
48
+ # counterplayers(:atype => identifier) -> Array of Topics
49
+ # counterplayers(:otype => identifier) -> Array of Topics
50
+ # counterplayers(:rtype => identifier1, :atype => identifier2) -> Array of Topics
51
+ # counterplayers(:rtype => identifier1, :atype => identifier2, :otype => identifier3) -> Array of Topics
52
+ #
53
+ def counterplayers(filter={})
54
+ return counterparts(filter).map{|r| r.player}.uniq
55
+ end
56
+
57
+ # Returns all players (Topics) which share a counterplayer with this Topic (player),
58
+ # If type is given, it may constrain the type of the Role this Topic should play
59
+ # (and therefore the type of the Roles the peers play)
60
+ # or the type of the Association this Topic plays a Role in
61
+ # (and therefore the type of the Associations the peers play an Role in).
62
+ #
63
+ # Type may be a Topic or Topic-Reference.
64
+ #
65
+ # The result may be empty.
66
+ #
67
+ # :call-seq:
68
+ # peers -> Array of Topics
69
+ # peers(type) -> Array of Topics
70
+ #
71
+ def peers(type=:any)
72
+ _peers = []
73
+ if type == :any
74
+ self.roles.each do |r|
75
+ _peers = _peers + r.peers(:arity => :loose, :atype => :loose, :otype => :loose, :rtype => :loose)
76
+ end
77
+ else
78
+ type = topic_map.get(type)
79
+ if type
80
+ if self.roles.map{|r| r.type}.include?(type) #-> rtype
81
+ self.roles(type).each do |r|
82
+ _peers = _peers + r.peers(:arity => :loose, :atype => :loose, :otype => :loose, :rtype => :strict)
83
+ end
84
+ elsif self.roles.map{|r| r.parent.type}.include?(type) #->atype
85
+ self.roles.select{|r| r.parent.type == type}.each do |r|
86
+ _peers = _peers + r.peers(:arity => :loose, :atype => :strict, :otype => :loose, :rtype => :strict)
87
+ end
88
+ elsif self.roles.map{|r| r.counterparts}.flatten.map{|r| r.type}.include?(type) #-> otype
89
+ # nothing can happen so far
90
+ else
91
+ return []
92
+ end
93
+ else
94
+ return []
95
+ end
96
+ end
97
+ return _peers.map{|r| r.player}
98
+ end
99
+
100
+ # Returns all Associations in which this Topic
101
+ # is a player.
102
+ #
103
+ # A filter-hash may be used to filter
104
+ # for the type of the Role this Topic plays (:rtype),
105
+ # for the Association type (:atype),
106
+ # for the type of another role (:otype) as well as
107
+ # for the player of this other role (:oplayer).
108
+ # Each value of this filter-hash may be a Topic, String-Reference or Locator.
109
+ #
110
+ # The result may be empty.
111
+ #
112
+ # :call-seq:
113
+ # associations_played -> Array of Associations
114
+ # associations_played({:rtype => identifier}) -> Array of Associations
115
+ # associations_played({:atype => identifier}) -> Array of Associations
116
+ # associations_played({:otype => identifier}) -> Array of Associations
117
+ # associations_played({:otype => identifier, :oplayer => identifier}) -> Array of Associations
118
+ # associations_played({:rtype => identifier, :atype => identifier}) -> Array of Associations
119
+ # associations_played({:rtype => identifier, :atype => identifier, :otype => identifier}) -> Array of Associations
120
+ # associations_played({:rtype => identifier, :atype => identifier, :otype => identifier, :oplayer => identifier}) -> Array of Associations
121
+ #
122
+ def associations_played(filter = {})
123
+ roles = self.counterparts(filter)
124
+
125
+ if filter[:oplayer]
126
+ oplayer = topic_map.get(filter[:oplayer])
127
+ roles = roles.map do |role|
128
+ (role.player==oplayer)?role:nil
129
+ end.compact
130
+ end
131
+
132
+ roles.map do |role|
133
+ role.parent
134
+ end.uniq
12
135
  end
13
136
  end
14
137
  end
@@ -1,52 +1,162 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
1
4
  module RTM::Sugar
2
5
  module Topic
6
+ # This module implements methods for Hash-like access in Topics.
3
7
  module HashAccess
4
- def [](cref)
5
- raise "Characteristic reference must be a String" unless cref.is_a? String
6
- is_name, type_reference, scope_reference = resolve_characteristic(cref)
7
- if is_name
8
+
9
+ # Returns an Array of Names or Occurrences of
10
+ # this Topic depending on the argument given.
11
+ #
12
+ # If argument is a Topic, an Array of Occurrences of this Topic which
13
+ # have the specified type is returned.
14
+ #
15
+ # Argument may be a String. Then the structure should resemble "-type @scope"
16
+ # or "type @scope".
17
+ #
18
+ # If argument starts with a "-", an Array of Names of this
19
+ # Topic, which have the specified type (trailing the "-"),
20
+ # is returned.
21
+ #
22
+ # If argument equals "-", Names that have the standard name type
23
+ # are returned.
24
+ #
25
+ # If argument starts with a "*", both Names and Occurrences, which have the
26
+ # specified type (trailing the "*") are returned as Array.
27
+ #
28
+ # If argument equals "*", all Names and Occurrences of this Topic are
29
+ # returned. In this case this method equals the characteristics()-method.
30
+ #
31
+ # Else, if argument is a String, an Array of Occurrences
32
+ # of this Topic, which have the specified type,
33
+ # is returned.
34
+ #
35
+ # The argument may include an "@" after the type.
36
+ # The String trailing the @ defines the
37
+ # scope the selected Names and Occurrences should live in. Themes in the
38
+ # scope may be c.
39
+ #
40
+ # Examples:
41
+ # topic[occtype_topic]
42
+ # topic["-"]
43
+ # topic["*"]
44
+ # topic["-nametype"]
45
+ # topic["-nametype @scope]
46
+ # topic["occtype @scope1, scope2"]
47
+ # topic["*type"]
48
+ # topic["*type @scope"]
49
+ #
50
+ # :call-seq:
51
+ # [argument=Topic] -> Array of Occurrences
52
+ # [argument=String] -> Array of Names and/or Occurrences
53
+ #
54
+ def [](identifier = :any)
55
+ # return occurrences by type if topic is given
56
+ return [] unless identifier
57
+ return occurrences(identifier).to_a if (identifier.is_a?(RTM::Topic) || identifier == :any)
58
+ prefix, type_reference, scope_reference = resolve_characteristic(identifier)
59
+ if prefix == :name
8
60
  type_reference = RTM::PSI[:name_type] if type_reference == :any
9
- names.select{|n| n.type == topic_map.get(type_reference)}
10
- else
61
+ ret = names(type_reference).to_a
62
+ elsif prefix == :occurrence
11
63
  raise "No occurrence type given" if type_reference == :any
12
- occurrences.select{|o| o.type == topic_map.get(type_reference)}
64
+ ret = occurrences(type_reference).to_a
65
+ elsif prefix == :both
66
+ ret = names(type_reference).to_a + occurrences(type_reference).to_a # type_reference == :any or not :any
67
+ else
68
+
69
+ end
70
+ # we now have a list of names or occurrences, now we have to select for scope
71
+ return ret if scope_reference == :any
72
+ if scope_reference == :ucs
73
+ ret.select{|i| i.scope.size == 0}
74
+ else
75
+ ret = ret.select{|i| scope_reference.all?{|sr| i.scope.include? getParent.get(sr)}}
13
76
  end
77
+ ret
14
78
  end
15
79
 
16
- def []=(cref, value)
17
- is_name, type_reference, scope_reference = resolve_characteristic(cref)
18
- if is_name
19
- type_reference = nil if type_reference == :any
20
- nametype = type_reference || topic_map.get!(RTM::PSI[:name_type])
21
- n = create_name(value, nametype)
22
- n
23
- else
80
+ # Creates a Name or Occurrence of this Topic depending on the
81
+ # argument given and returns this Name/Occurrence.
82
+ #
83
+ # Argument may be a String whose structure should resemble "-type @scope"
84
+ # or "type @scope".
85
+ #
86
+ # If argument starts with a "-", a Name that has the specified type
87
+ # (trailing the "-") is created.
88
+ #
89
+ # If argument equals "-", a Name that hase the standard name type
90
+ # is created.
91
+ #
92
+ # Else, an Occurrence that has the specified type is created.
93
+ #
94
+ # The argument may include an "@" after the type. The String trailing
95
+ # the @ defines the optional scope the Name or Occurrence
96
+ # should live in. Themes in the scope may be comma- and/or space-separated.
97
+ #
98
+ # The value should be a String.
99
+ #
100
+ # Example:
101
+ # topic[occtype]= "occvalue"
102
+ # topic["-"]= "name"
103
+ # topic["-nametype"]= "name"
104
+ # topic["-nametype @scope]= "name"
105
+ # topic["occtype @scope1, scope2"]= "occvalue"
106
+ #
107
+ # :call-seq:
108
+ # [argument]= value
109
+ #
110
+ def []=(identifier, value)
111
+ prefix, type_reference, scope_reference = resolve_characteristic(identifier)
112
+ if prefix == :name
113
+ nametype = (type_reference==:any) ? topic_map.get!(RTM::PSI[:name_type]) : type_reference
114
+ scope_reference = scope_reference==:any ? [] : scope_reference
115
+ raise("Value is not a String") unless value.is_a?(String)
116
+ ret = create_name(nametype, value, scope_reference)
117
+ elsif prefix == :occurrence
24
118
  raise "No occurrence type given" if type_reference == :any
25
- o = create_occurrence(value, type_reference)
26
- o
119
+ ret = create_occurrence(type_reference, value)
120
+ else
121
+ return nil
27
122
  end
123
+ # return object without scope if any or ucs
124
+ return ret if [:any, :ucs].include? scope_reference
125
+ # set scope
126
+ ret.add_scope(scope_reference)
127
+ ret
28
128
  end
29
-
129
+
30
130
  private
31
- def resolve_characteristic(ref)
32
- ref =~ /^(-\s*)?(.+)?$/
33
- is_name = $1 ? true : false
131
+
132
+ def resolve_characteristic(identifier)
133
+ # spaces(-|*)?spaces(anything)
134
+ prefix = :occurrence
135
+ identifier =~ /^\s*(-|\*)?\s*(.+)?$/ # - or * and then everything else
136
+ if $1
137
+ prefix = ($1 == "-") ? :name : :both
138
+ end
34
139
  type, scope = resolve_type_and_scope($2)
35
- [is_name, type, scope]
140
+ [prefix, type, scope]
36
141
  end
37
-
142
+
38
143
  def resolve_type_and_scope(ref)
39
144
  return [:any, :any] unless ref
40
- return [ref, :ucs] if ref.is_a? Topic
41
- type, scope = ref.split('@', -1)
42
- if type.blank?
145
+ if ref[0] == ?@
43
146
  type = :any
147
+ scope = ref[1..-1] #cut "@"
44
148
  else
45
- type.strip!
149
+ type, scope = ref.split(' @', -1) # -1 -> trailing null fields are not suppressed
150
+ if (type == nil) || (type.length == 0)
151
+ type = :any
152
+ else
153
+ type.strip! #\s removed
154
+ end
46
155
  end
156
+
47
157
  if scope
48
- scope = scope.strip.split(/\s+/)
49
- scope = :ucs if scope.blank?
158
+ scope = scope.strip.split(/\s*,?\s+/) #divided at \s,\s
159
+ scope = :ucs if (scope == nil) || (scope.length == 0)
50
160
  else
51
161
  scope = :any
52
162
  end
@@ -54,4 +164,4 @@ module RTM::Sugar
54
164
  end
55
165
  end
56
166
  end
57
- end
167
+ end
@@ -0,0 +1,65 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module Sugar
5
+ module Topic
6
+ module Scoped
7
+
8
+ # Returns the Associations, Names, Occurrences and Variants
9
+ # whose scope contains this Topic. Beware: The scope of a Variant includes
10
+ # the themes of the Name this Variant belongs to.
11
+ #
12
+ # :call-seq:
13
+ # scoped -> Array of Associations, Names, Occurrences and Variants
14
+ #
15
+ def scoped
16
+ _index = topic_map.scoped_index
17
+ _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
18
+ end
19
+
20
+ # Returns the Associations whose scope contains this Topic.
21
+ #
22
+ # The result may be empty.
23
+ #
24
+ # :call-seq:
25
+ # scoped_associations -> Array of Associations
26
+ #
27
+ def scoped_associations
28
+ topic_map.scoped_index.get_associations(self).to_a
29
+ end
30
+
31
+ # Returns the Names whose scope contains this Topic.
32
+ #
33
+ # The result may be empty.
34
+ #
35
+ # :call-seq:
36
+ # scoped_names -> Array of Names
37
+ #
38
+ def scoped_names
39
+ topic_map.scoped_index.get_names(self).to_a
40
+ end
41
+
42
+ # Returns the Occurrences whose scope contains this Topic.
43
+ #
44
+ # :call-seq:
45
+ # scoped_occurrences -> Array of Occurrences
46
+ #
47
+ def scoped_occurrences
48
+ topic_map.scoped_index.get_occurrences(self).to_a
49
+ end
50
+
51
+ # Returns the Variants whose scope (including the scope of the parent Name)
52
+ # contains this Topic.
53
+ #
54
+ # The result may be empty.
55
+ #
56
+ # :call-seq:
57
+ # scoped_variants -> Array of Variants
58
+ #
59
+ def scoped_variants
60
+ topic_map.scoped_index.get_variants(self).to_a
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module Sugar
5
+ module Topic
6
+ module TopicRef
7
+
8
+ # Returns an Array including all identifiers of this Topic.
9
+ # Item identifiers start with a "^", subject locators start
10
+ # with a "=", subject identifiers contain no prefix.
11
+ #
12
+ # :call-seq:
13
+ # topic_references -> Array of Strings
14
+ #
15
+ def topic_references
16
+ #def identifiers
17
+ subject_identifiers.map{|si| si.reference} +
18
+ subject_locators.map{|sl| "=#{sl.reference}"} +
19
+ item_identifiers.map{|ii| "^#{ii.reference}"}
20
+ end
21
+
22
+
23
+ # Returns all identifiers of this Topic as Array of Locators.
24
+ #
25
+ # :call-seq:
26
+ # topic_references_as_locators -> Array of Locators
27
+ #
28
+ def topic_references_as_locators
29
+ # TODO Spec
30
+ subject_identifiers.to_a + subject_locators.to_a + item_identifiers.to_a
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,159 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module Sugar
5
+ module Topic
6
+ module Typed
7
+
8
+ # Returns the associations, names, occurrences and roles whose
9
+ # type equals this topic.
10
+ #
11
+ # The result may be empty.
12
+ #
13
+ # :call-seq:
14
+ # typed -> Array of Associations, Names, Occurrences and Roles
15
+ #
16
+ def typed
17
+ _index = topic_map.type_instance_index
18
+ _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_roles(self).to_a
19
+ end
20
+
21
+ # Returns the associations, names, occurrences and roles whose
22
+ # type equals this topic or subtypes
23
+ # of this topic.
24
+ #
25
+ # The result may be empty.
26
+ #
27
+ # :call-seq:
28
+ # transitive_typed -> Array of Associations, Names, Occurrences and Roles
29
+ #
30
+ def transitive_typed
31
+ trans_typed = typed #may be empty
32
+ transitive_subtypes.each do |subtype|
33
+ trans_typed.concat(subtype.typed)
34
+ end
35
+ trans_typed = trans_typed.uniq #no duplicates outside of tmql mode
36
+ end
37
+
38
+ # Returns the associations whose type equals this topic.
39
+ #
40
+ # The result may be empty.
41
+ #
42
+ # :call-seq:
43
+ # typed_associations -> Array of Associations
44
+ #
45
+ def typed_associations
46
+ topic_map.type_instance_index.get_associations(self).to_a
47
+ end
48
+
49
+ # Returns the associations whose type equals this topic or subtypes
50
+ # of this topic.
51
+ #
52
+ # The result may be empty.
53
+ #
54
+ # :call-seq:
55
+ # transitive_typed_associations -> Array of Associations
56
+ #
57
+ def transitive_typed_associations
58
+ trans_types_assocs = typed_associations #may be empty
59
+ transitive_subtypes.each do |subtype|
60
+ trans_types_assocs.concat(subtype.typed_associations)
61
+ end
62
+ trans_types_assocs = trans_types_assocs.uniq #no duplicates outside of tmql mode
63
+ end
64
+
65
+ # Returns the names whose type equals this topic.
66
+ #
67
+ # The result may be empty.
68
+ #
69
+ # :call-seq:
70
+ # typed_names -> Array of Names
71
+ #
72
+ def typed_names
73
+ topic_map.type_instance_index.get_names(self).to_a
74
+ end
75
+
76
+ # Returns the names whose type equals this topic or subtypes
77
+ # of this topic.
78
+ #
79
+ # The result may be empty.
80
+ #
81
+ # :call-seq:
82
+ # transitive_typed_names -> Array of Associations
83
+ #
84
+ def transitive_typed_names
85
+ trans_types_names = typed_names #may be empty
86
+ transitive_subtypes.each do |subtype|
87
+ trans_types_names.concat(subtype.typed_names)
88
+ end
89
+ trans_types_names = trans_types_names.uniq #no duplicates outside of tmql mode
90
+ end
91
+
92
+ # Returns the occurrences whose type equals this topic.
93
+ #
94
+ # The result may be empty.
95
+ #
96
+ # :call-seq:
97
+ # typed_occurrences -> Array of Occurrences
98
+ #
99
+ def typed_occurrences
100
+ topic_map.type_instance_index.get_occurrences(self).to_a
101
+ end
102
+
103
+ # Returns the occurrences whose type equals this topic or subtypes
104
+ # of this topic.
105
+ #
106
+ # The result may be empty.
107
+ #
108
+ # :call-seq:
109
+ # transitive_typed_occurrences -> Array of Associations
110
+ #
111
+ def transitive_typed_occurrences
112
+ trans_types_occs = typed_occurrences #may be empty
113
+ transitive_subtypes.each do |subtype|
114
+ trans_types_occs.concat(subtype.typed_occurrences)
115
+ end
116
+ trans_types_occs = trans_types_occs.uniq #no duplicates outside of tmql mode
117
+ end
118
+
119
+ # Returns the roles whose type equals this topic.
120
+ #
121
+ # The result may be empty.
122
+ #
123
+ # :call-seq:
124
+ # typed_roles -> Array of Roles
125
+ #
126
+ def typed_roles
127
+ topic_map.type_instance_index.get_roles(self).to_a
128
+ end
129
+
130
+ # Returns the roles whose type equals this topic or subtypes
131
+ # of this topic.
132
+ #
133
+ # The result may be empty.
134
+ #
135
+ # :call-seq:
136
+ # transitive_typed_roles -> Array of Associations
137
+ #
138
+ def transitive_typed_roles
139
+ trans_types_roles = typed_roles #may be empty
140
+ transitive_subtypes.each do |subtype|
141
+ trans_types_roles.concat(subtype.typed_roles)
142
+ end
143
+ trans_types_roles = trans_types_roles.uniq #no duplicates outside of tmql mode
144
+ end
145
+
146
+ # Determines whether this topic is instance (directly or indirectly)
147
+ # of the argument type.
148
+ #
149
+ # Type may be a topic reference.
150
+ #
151
+ # :call-seq:
152
+ # topic_is_a?(type)
153
+ #
154
+ def topic_is_a?(type)
155
+ self.transitive_types.include?(topic_map.get(type))
156
+ end
157
+ end
158
+ end
159
+ end