rtm 0.1.6 → 0.2
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.
- data/DISCLAIMER +10 -33
- data/LICENSE +201 -0
- data/README +32 -3
- data/lib/rtm.rb +126 -74
- data/lib/rtm/axes.rb +298 -0
- data/lib/rtm/axes/association.rb +76 -0
- data/lib/rtm/axes/associations.rb +96 -0
- data/lib/rtm/axes/assocs_names_occs.rb +56 -0
- data/lib/rtm/axes/characteristic.rb +68 -0
- data/lib/rtm/axes/characteristics.rb +93 -0
- data/lib/rtm/axes/string.rb +76 -0
- data/lib/rtm/axes/strings.rb +87 -0
- data/lib/rtm/axes/topic.rb +233 -0
- data/lib/rtm/axes/topics.rb +280 -0
- data/lib/rtm/{backward_compatibility.rb → deprecated/index_property_set.rb} +3 -0
- data/lib/rtm/engine.rb +101 -0
- data/lib/rtm/extensions.rb +65 -5
- data/lib/rtm/{locator_helpers.rb → helpers/locator.rb} +15 -4
- data/lib/rtm/{helpers.rb → helpers/no_output.rb} +3 -0
- data/lib/rtm/helpers/uri.rb +13 -0
- data/lib/rtm/io.rb +19 -0
- data/lib/rtm/io/from_xtm2_libxml.rb +2 -1
- data/lib/rtm/io/tmapix_from.rb +155 -0
- data/lib/rtm/io/tmapix_to.rb +223 -0
- data/lib/rtm/io/to_hash.rb +154 -0
- data/lib/rtm/io/to_jtm.rb +53 -103
- data/lib/rtm/io/to_rdf.rb +45 -0
- data/lib/rtm/io/to_string.rb +21 -8
- data/lib/rtm/io/to_xtm1.rb +6 -4
- data/lib/rtm/io/to_xtm2.rb +10 -8
- data/lib/rtm/io/to_yaml.rb +59 -100
- data/lib/rtm/navigation.rb +23 -0
- data/lib/rtm/navigation/association/players.rb +25 -0
- data/lib/rtm/navigation/name/atomify.rb +19 -0
- data/lib/rtm/navigation/name/characteristics.rb +33 -0
- data/lib/rtm/navigation/occurrence/atomify.rb +19 -0
- data/lib/rtm/navigation/occurrence/characteristics.rb +33 -0
- data/lib/rtm/navigation/topic/characteristics.rb +33 -0
- data/lib/rtm/navigation/topic/indicators.rb +31 -0
- data/lib/rtm/navigation/topic/items.rb +31 -0
- data/lib/rtm/navigation/topic/locators.rb +31 -0
- data/lib/rtm/navigation/topic/players.rb +27 -0
- data/lib/rtm/navigation/topic/supertypes.rb +166 -0
- data/lib/rtm/navigation/topic/traverse.rb +51 -0
- data/lib/rtm/navigation/topic/types.rb +109 -0
- data/lib/rtm/psi.rb +39 -2
- data/lib/rtm/sugar.rb +47 -0
- data/lib/rtm/sugar/association/hash_access.rb +46 -0
- data/lib/rtm/sugar/occurrence/dynamic_value.rb +58 -0
- data/lib/rtm/sugar/occurrence/external.rb +53 -0
- data/lib/rtm/sugar/reifiable/reifier.rb +21 -0
- data/lib/rtm/sugar/role/counterparts.rb +139 -46
- data/lib/rtm/sugar/topic/best_name.rb +74 -0
- data/lib/rtm/sugar/topic/characteristics.rb +126 -12
- data/lib/rtm/sugar/topic/counterparts.rb +145 -10
- data/lib/rtm/sugar/topic/hash_access.rb +140 -30
- data/lib/rtm/sugar/topic/scoped.rb +114 -0
- data/lib/rtm/sugar/topic/topic_ref.rb +86 -0
- data/lib/rtm/sugar/topic/typed.rb +207 -0
- data/lib/rtm/sugar/topic_map/query_cache.rb +66 -0
- data/lib/rtm/sugar/topic_map/themes.rb +53 -0
- data/lib/rtm/sugar/typed/types.rb +38 -0
- data/lib/rtm/validation.rb +7 -4
- data/lib/rtm/version.rb +30 -0
- data/spec/helpers/spec_exampleexamplegroup.rb +14 -0
- data/spec/rtm/axes/association_spec.rb +88 -0
- data/spec/rtm/axes/associations_spec.rb +60 -0
- data/spec/rtm/axes/assocs_names_occs_spec.rb +9 -0
- data/spec/rtm/axes/characteristic_spec.rb +90 -0
- data/spec/rtm/axes/characteristics_spec.rb +85 -0
- data/spec/rtm/axes/string_spec.rb +145 -0
- data/spec/rtm/axes/strings_spec.rb +168 -0
- data/spec/rtm/axes/topic_spec.rb +124 -0
- data/spec/rtm/axes/topics_spec.rb +103 -0
- data/spec/rtm/base_spec.rb +32 -0
- data/spec/rtm/io/tmapix_from_spec.rb +76 -0
- data/spec/rtm/io/tmapix_to_spec.rb +159 -0
- data/spec/rtm/io/to_hash_spec.rb +90 -0
- data/spec/rtm/io/to_rdf_spec.rb +37 -0
- data/spec/rtm/io/to_string_spec.rb +122 -0
- data/spec/rtm/io/to_yaml_spec.rb +89 -0
- data/spec/rtm/navigation/association/players_spec.rb +58 -0
- data/spec/rtm/navigation/association_spec.rb +52 -0
- data/spec/rtm/navigation/name/atomify_spec.rb +27 -0
- data/spec/rtm/navigation/name/characteristics_spec.rb +34 -0
- data/spec/rtm/navigation/name_spec.rb +52 -0
- data/spec/rtm/navigation/occurrence/atomify_spec.rb +27 -0
- data/spec/rtm/navigation/occurrence/characteristics_spec.rb +34 -0
- data/spec/rtm/navigation/occurrence_spec.rb +52 -0
- data/spec/rtm/navigation/string_spec.rb +51 -0
- data/spec/rtm/navigation/topic/characteristics_spec.rb +55 -0
- data/spec/rtm/navigation/topic/indicators_spec.rb +43 -0
- data/spec/rtm/navigation/topic/items_spec.rb +44 -0
- data/spec/rtm/navigation/topic/locators_spec.rb +44 -0
- data/spec/rtm/navigation/topic/players_spec.rb +48 -0
- data/spec/rtm/navigation/topic/scope_spec.rb +41 -0
- data/spec/rtm/navigation/topic/supertypes_spec.rb +376 -0
- data/spec/rtm/navigation/topic/traverse_spec.rb +64 -0
- data/spec/rtm/navigation/topic/types_spec.rb +195 -0
- data/spec/rtm/navigation/topic_spec.rb +153 -0
- data/spec/rtm/sugar/association/hash_access_spec.rb +55 -0
- data/spec/rtm/sugar/occurrence/dynamic_value_spec.rb +171 -0
- data/spec/rtm/sugar/occurrence/external_spec.rb +129 -0
- data/spec/rtm/sugar/reifiable/reifier_spec.rb +41 -0
- data/spec/rtm/sugar/role/counterparts_spec.rb +193 -0
- data/spec/rtm/sugar/topic/best_name_spec.rb +25 -0
- data/spec/rtm/sugar/topic/characteristics_spec.rb +333 -0
- data/spec/rtm/sugar/topic/counterparts_spec.rb +224 -0
- data/spec/rtm/sugar/topic/hash_access_spec.rb +234 -0
- data/spec/rtm/sugar/topic/scoped_spec.rb +195 -0
- data/spec/rtm/sugar/topic/topic_ref_spec.rb +44 -0
- data/spec/rtm/sugar/topic/typed_spec.rb +217 -0
- data/spec/rtm/sugar/topic_map/themes_spec.rb +67 -0
- data/spec/rtm/sugar/typed/types_spec.rb +24 -0
- data/spec/rtm/tmapi/core/association_spec.rb +169 -0
- data/spec/rtm/tmapi/core/construct_spec.rb +25 -0
- data/spec/rtm/tmapi/core/datatype_aware_spec.rb +236 -0
- data/spec/rtm/tmapi/core/name_spec.rb +270 -0
- data/spec/rtm/tmapi/core/occurrence_spec.rb +53 -0
- data/spec/rtm/tmapi/core/reifiable_spec.rb +168 -0
- data/spec/rtm/tmapi/core/role_spec.rb +73 -0
- data/spec/rtm/tmapi/core/scoped_spec.rb +441 -0
- data/spec/rtm/tmapi/core/topic_map_spec.rb +716 -0
- data/spec/rtm/tmapi/core/topic_spec.rb +1468 -0
- data/spec/rtm/tmapi/core/typed_spec.rb +112 -0
- data/spec/rtm/tmapi/core/variant_spec.rb +52 -0
- data/spec/rtm/tmapi/ext/java_util_set_spec.rb +34 -0
- data/spec/rtm/tmapi_spec.rb +44 -0
- data/spec/rtm/utils/sparql_spec.rb +26 -0
- data/spec/rtm_spec.rb +93 -0
- data/spec/spec_helper.rb +28 -0
- data/test/javalibs/junit-4.5.jar +0 -0
- data/test/javalibs/tmapi-2.0-tests.jar +0 -0
- data/test/tmapi_tests.rb +25 -0
- metadata +169 -65
- data/COPYRIGHT +0 -4
- data/lib/Rakefile.rb +0 -42
- data/lib/activetopicmaps.rb +0 -278
- data/lib/rtm/backend/active_record.rb +0 -58
- data/lib/rtm/backend/active_record/001_initial_schema.rb +0 -116
- data/lib/rtm/backend/active_record/association_and_role.rb +0 -33
- data/lib/rtm/backend/active_record/locators.rb +0 -55
- data/lib/rtm/backend/active_record/name_variant_occurrence.rb +0 -45
- data/lib/rtm/backend/active_record/quaaxtm2rtm.rb +0 -113
- data/lib/rtm/backend/active_record/quaaxtm2rtmviews.rb +0 -134
- data/lib/rtm/backend/active_record/set_wrapper.rb +0 -98
- data/lib/rtm/backend/active_record/tm_construct.rb +0 -62
- data/lib/rtm/backend/active_record/tm_delegator.rb +0 -345
- data/lib/rtm/backend/active_record/tm_set_delegator.rb +0 -195
- data/lib/rtm/backend/active_record/tmdm.rb +0 -298
- data/lib/rtm/backend/active_record/topic.rb +0 -87
- data/lib/rtm/backend/active_record/topic_map.rb +0 -314
- data/lib/rtm/backend/active_record/traverse_associations.rb +0 -87
- data/lib/rtm/base.rb +0 -92
- data/lib/rtm/connect.rb +0 -92
- data/lib/rtm/core_ext.rb +0 -6
- data/lib/rtm/io/from_xtm2.rb +0 -263
- data/lib/rtm/merging/merging.rb +0 -307
- data/lib/rtm/pimp_my_api.rb +0 -28
- data/lib/rtm/sugar/topic/identifier_direct.rb +0 -11
- data/lib/rtm/sugar/topic/predefined_associations.rb +0 -42
- data/lib/run_main_project.rb +0 -16
- data/test/base_test.rb +0 -162
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module RTM::Sugar::Topic
|
|
5
|
+
module Scoped
|
|
6
|
+
|
|
7
|
+
# Returns the Associations, Names, Occurrences and Variants
|
|
8
|
+
# whose scope contains this Topic. Beware: The scope of a Variant includes
|
|
9
|
+
# the themes of the Name this Variant belongs to.
|
|
10
|
+
#
|
|
11
|
+
# :call-seq:
|
|
12
|
+
# scoped -> Array of Associations, Names, Occurrences and Variants
|
|
13
|
+
#
|
|
14
|
+
def scoped
|
|
15
|
+
_index = scoped_index
|
|
16
|
+
_index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns the Associations whose scope contains this Topic.
|
|
20
|
+
#
|
|
21
|
+
# The result may be empty.
|
|
22
|
+
#
|
|
23
|
+
# :call-seq:
|
|
24
|
+
# scoped_associations -> Array of Associations
|
|
25
|
+
#
|
|
26
|
+
def scoped_associations
|
|
27
|
+
scoped_index.get_associations(self).to_a
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Returns the Names whose scope contains this Topic.
|
|
31
|
+
#
|
|
32
|
+
# The result may be empty.
|
|
33
|
+
#
|
|
34
|
+
# :call-seq:
|
|
35
|
+
# scoped_names -> Array of Names
|
|
36
|
+
#
|
|
37
|
+
def scoped_names
|
|
38
|
+
scoped_index.get_names(self).to_a
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns the Occurrences whose scope contains this Topic.
|
|
42
|
+
#
|
|
43
|
+
# :call-seq:
|
|
44
|
+
# scoped_occurrences -> Array of Occurrences
|
|
45
|
+
#
|
|
46
|
+
def scoped_occurrences
|
|
47
|
+
scoped_index.get_occurrences(self).to_a
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Returns the Variants whose scope (including the scope of the parent Name)
|
|
51
|
+
# contains this Topic.
|
|
52
|
+
#
|
|
53
|
+
# The result may be empty.
|
|
54
|
+
#
|
|
55
|
+
# :call-seq:
|
|
56
|
+
# scoped_variants -> Array of Variants
|
|
57
|
+
#
|
|
58
|
+
def scoped_variants
|
|
59
|
+
scoped_index.get_variants(self).to_a
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# States if this topic occurs as theme in the scope of a scoped Construct.
|
|
63
|
+
#
|
|
64
|
+
# :call-seq:
|
|
65
|
+
# used_as_theme? -> true or false
|
|
66
|
+
#
|
|
67
|
+
def used_as_theme?
|
|
68
|
+
used_as_name_theme? || used_as_occurrence_theme? || used_as_association_theme? || used_as_variant_theme?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# States if this topic occurs as theme in the scope of an Association.
|
|
72
|
+
#
|
|
73
|
+
# :call-seq:
|
|
74
|
+
# used_as_association_theme? -> true or false
|
|
75
|
+
#
|
|
76
|
+
def used_as_association_theme?
|
|
77
|
+
not self.scoped_associations.empty?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# States if this topic occurs as theme in the scope of a Name.
|
|
81
|
+
#
|
|
82
|
+
# :call-seq:
|
|
83
|
+
# used_as_name_theme? -> true or false
|
|
84
|
+
#
|
|
85
|
+
def used_as_name_theme?
|
|
86
|
+
not self.scoped_names.empty?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# States if this topic occurs as theme in the scope of an Occurrence.
|
|
90
|
+
#
|
|
91
|
+
# :call-seq:
|
|
92
|
+
# used_as_occurrence_theme? -> true or false
|
|
93
|
+
#
|
|
94
|
+
def used_as_occurrence_theme?
|
|
95
|
+
not self.scoped_occurrences.empty?
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# States if this topic occurs as theme in the scope of a Variant.
|
|
99
|
+
#
|
|
100
|
+
# :call-seq:
|
|
101
|
+
# used_as_variant_theme? -> true or false
|
|
102
|
+
#
|
|
103
|
+
def used_as_variant_theme?
|
|
104
|
+
not self.scoped_variants.empty?
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
def scoped_index
|
|
109
|
+
@scoped_index ||= topic_map.scoped_index
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module RTM::Sugar
|
|
5
|
+
module Topic
|
|
6
|
+
module TopicRef
|
|
7
|
+
|
|
8
|
+
# Returns an Array including all identifiers of this Topic.
|
|
9
|
+
#
|
|
10
|
+
# This method takes a Hash as argument.
|
|
11
|
+
#
|
|
12
|
+
# The key :ouputstyle defines if the ctm style (value :ctm, this is
|
|
13
|
+
# the default), the YAML
|
|
14
|
+
# style (value :yaml) or no style (value :blank) is supported.
|
|
15
|
+
#
|
|
16
|
+
# In ctm style an item identifier starts with a "^",
|
|
17
|
+
# a subject locator starts with a "=" and
|
|
18
|
+
# a subject identifiers contains no prefix.
|
|
19
|
+
#
|
|
20
|
+
# In yaml style an item identifiers start with a "ii:",
|
|
21
|
+
# a subject locator starts with a "sl:" and
|
|
22
|
+
# a subject identifier start with a "si:".
|
|
23
|
+
#
|
|
24
|
+
# :call-seq:
|
|
25
|
+
# references -> Array of Strings
|
|
26
|
+
# references(params = {}) -> Array of Strings
|
|
27
|
+
#
|
|
28
|
+
def references(params = {})
|
|
29
|
+
default_hash = {:outputstyle => :ctm, :resolve_qnames => :false}
|
|
30
|
+
params = default_hash.merge(params) if params.is_a? Hash
|
|
31
|
+
|
|
32
|
+
case params[:outputstyle]
|
|
33
|
+
when :yaml
|
|
34
|
+
identifiers = subject_identifiers.map{|si| "si:#{si.reference}"} +
|
|
35
|
+
subject_locators.map{ |sl| "sl:#{sl.reference}"} +
|
|
36
|
+
item_identifiers.map{ |ii| "ii:#{ii.reference}"}
|
|
37
|
+
when :blank
|
|
38
|
+
identifiers = subject_identifiers.map{|si| si.reference} +
|
|
39
|
+
subject_locators.map{ |sl| sl.reference} +
|
|
40
|
+
item_identifiers.map{ |ii| ii.reference}
|
|
41
|
+
else #:ctm default
|
|
42
|
+
identifiers = subject_identifiers.map{|si| si.reference} +
|
|
43
|
+
subject_locators.map{ |sl| "=#{sl.reference}"} +
|
|
44
|
+
item_identifiers.map{ |ii| "^#{ii.reference}"}
|
|
45
|
+
end
|
|
46
|
+
return identifiers
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Returns one identifier of this topic. If several exist, the shortest one
|
|
50
|
+
# is returned.
|
|
51
|
+
#
|
|
52
|
+
# This method takes a Hash as argument.
|
|
53
|
+
#
|
|
54
|
+
# The key :ouputstyle defines if the ctm style (value :ctm, this is
|
|
55
|
+
# the default), the YAML
|
|
56
|
+
# style (value :yaml) or no style (value :blank) is supported.
|
|
57
|
+
#
|
|
58
|
+
# In ctm style an item identifier starts with a "^",
|
|
59
|
+
# a subject locator starts with a "=" and
|
|
60
|
+
# a subject identifiers contains no prefix.
|
|
61
|
+
#
|
|
62
|
+
# In yaml style an item identifiers start with a "ii:",
|
|
63
|
+
# a subject locator starts with a "sl:" and
|
|
64
|
+
# a subject identifier start with a "si:".
|
|
65
|
+
#
|
|
66
|
+
#
|
|
67
|
+
# :call-seq:
|
|
68
|
+
# reference -> String
|
|
69
|
+
# reference(params = {}) -> String
|
|
70
|
+
#
|
|
71
|
+
def reference(params = {})
|
|
72
|
+
return references(params).sort_by{|identifier| identifier.size}.reverse.first
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Returns all identifiers of this Topic as Array of Locators.
|
|
76
|
+
#
|
|
77
|
+
# :call-seq:
|
|
78
|
+
# references_as_locators -> Array of Locators
|
|
79
|
+
#
|
|
80
|
+
def references_as_locators
|
|
81
|
+
subject_identifiers.to_a + subject_locators.to_a + item_identifiers.to_a
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module RTM::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
|
+
topic_map.cached self, :is_a?, type do
|
|
156
|
+
self.transitive_types.include?(topic_map.get(type))
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# States if this topic is used as type of a typed Construct.
|
|
161
|
+
#
|
|
162
|
+
# :call-seq:
|
|
163
|
+
# used_as_type? -> true or false
|
|
164
|
+
#
|
|
165
|
+
def used_as_type?
|
|
166
|
+
used_as_name_type? || used_as_occurrence_type? || used_as_association_type? || used_as_role_type?
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# States if this topic is used as type of an Association.
|
|
170
|
+
#
|
|
171
|
+
# :call-seq:
|
|
172
|
+
# used_as_association_type? -> true or false
|
|
173
|
+
#
|
|
174
|
+
def used_as_association_type?
|
|
175
|
+
not self.typed_associations.empty?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# States if this topic is used as type of a Name.
|
|
179
|
+
#
|
|
180
|
+
# :call-seq:
|
|
181
|
+
# used_as_name_type? -> true or false
|
|
182
|
+
#
|
|
183
|
+
def used_as_name_type?
|
|
184
|
+
not self.typed_names.empty?
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# States if this topic is used as type of an Occurrence.
|
|
188
|
+
#
|
|
189
|
+
# :call-seq:
|
|
190
|
+
# used_as_occurrence_type -> true or false
|
|
191
|
+
#
|
|
192
|
+
def used_as_occurrence_type?
|
|
193
|
+
not self.typed_occurrences.empty?
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# States if this topic is used as type of a Role.
|
|
197
|
+
#
|
|
198
|
+
# :call-seq:
|
|
199
|
+
# used_as_role_type? -> true or false
|
|
200
|
+
#
|
|
201
|
+
def used_as_role_type?
|
|
202
|
+
not self.typed_roles.empty?
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module RTM::Sugar
|
|
5
|
+
module TopicMap
|
|
6
|
+
module QueryCache
|
|
7
|
+
|
|
8
|
+
# The query cache is disabled by default. Enables the query cache.
|
|
9
|
+
# Does not erase the cache if it was already enabled.
|
|
10
|
+
#
|
|
11
|
+
# :call-seq:
|
|
12
|
+
# enable_query_cache -> nil
|
|
13
|
+
#
|
|
14
|
+
def enable_query_cache
|
|
15
|
+
@query_cache ||= {}
|
|
16
|
+
return
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# The query cache is disabled by default. Disables the query cache.
|
|
20
|
+
#
|
|
21
|
+
# :call-seq:
|
|
22
|
+
# disable_query_cache -> nil
|
|
23
|
+
#
|
|
24
|
+
def disable_query_cache
|
|
25
|
+
@query_cache = nil # FIXME: This method is unsafe in multithreaded environments: Setting "@query_cache = nil" while @query_cache is being accessed in method "cached" may cause exceptions to be raised.
|
|
26
|
+
return
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Erases the query cache. This needs to be invoked every time there
|
|
30
|
+
# is a write access to the topic map.
|
|
31
|
+
#
|
|
32
|
+
# :call-seq:
|
|
33
|
+
# reset_query_cache -> nil
|
|
34
|
+
#
|
|
35
|
+
def reset_query_cache
|
|
36
|
+
@query_cache = @query_cache? {} : nil
|
|
37
|
+
return
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# If query caching is enabled, looks up the result of
|
|
41
|
+
# module_name.method_name(parameters) in the cache and if present,
|
|
42
|
+
# returns it. If
|
|
43
|
+
# the result has not yet been stored, executes module_name.method_name(parameters),
|
|
44
|
+
# stores the result and returns it.
|
|
45
|
+
#
|
|
46
|
+
# If query caching is disabled, executes module_name.method_name(parameters)
|
|
47
|
+
# and returns the result.
|
|
48
|
+
#
|
|
49
|
+
# :call-seq:
|
|
50
|
+
# cached(module_name, method_name, parameters) {method_body} -> result
|
|
51
|
+
#
|
|
52
|
+
def cached(*args)
|
|
53
|
+
if @query_cache # Maybe we can optimize this simple if statement away by making enable_query_cache extend the particular TopicMap instance's metaclass. But maybe then the cached version is slower.
|
|
54
|
+
result = @query_cache.fetch(args,:not_found) # :not_found if not cached, if result is nil, we want to cache nil as well.
|
|
55
|
+
if result==:not_found
|
|
56
|
+
result = yield
|
|
57
|
+
@query_cache[args] = result
|
|
58
|
+
end
|
|
59
|
+
return result
|
|
60
|
+
else
|
|
61
|
+
yield #execute without caching
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|