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.
- data/DISCLAIMER +10 -33
- data/LICENSE +201 -0
- data/README +3 -3
- data/lib/rtm.rb +148 -74
- data/lib/rtm/axes.rb +295 -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 +58 -0
- data/lib/rtm/extensions.rb +11 -1
- 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 +18 -0
- data/lib/rtm/io/from_xtm2_libxml.rb +2 -1
- data/lib/rtm/io/ontopia_io.rb +25 -0
- data/lib/rtm/io/tmapix.rb +234 -0
- data/lib/rtm/io/to_hash.rb +116 -0
- data/lib/rtm/io/to_jtm.rb +53 -103
- data/lib/rtm/io/to_rdf.rb +30 -0
- data/lib/rtm/io/to_string.rb +8 -6
- 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 +29 -98
- data/lib/rtm/navigation.rb +37 -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 +162 -0
- data/lib/rtm/navigation/topic/traverse.rb +51 -0
- data/lib/rtm/navigation/topic/types.rb +107 -0
- data/lib/rtm/psi.rb +33 -2
- data/lib/rtm/sugar.rb +34 -0
- data/lib/rtm/sugar/association/hash_access.rb +46 -0
- data/lib/rtm/sugar/occurrence/dynamic_value.rb +75 -0
- data/lib/rtm/{pimp_my_api.rb → sugar/occurrence/externalize.rb} +3 -0
- data/lib/rtm/sugar/role/counterparts.rb +133 -46
- data/lib/rtm/sugar/topic/characteristics.rb +126 -12
- data/lib/rtm/sugar/topic/counterparts.rb +130 -7
- data/lib/rtm/sugar/topic/hash_access.rb +140 -30
- data/lib/rtm/sugar/topic/scoped.rb +65 -0
- data/lib/rtm/sugar/topic/topic_ref.rb +35 -0
- data/lib/rtm/sugar/topic/typed.rb +159 -0
- data/lib/rtm/sugar/typed/types.rb +38 -0
- data/lib/rtm/validation.rb +8 -5
- data/lib/rtm/version.rb +18 -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_spec.rb +85 -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 +16 -0
- data/spec/rtm/sugar/role/counterparts_spec.rb +191 -0
- data/spec/rtm/sugar/topic/characteristics_spec.rb +318 -0
- data/spec/rtm/sugar/topic/counterparts_spec.rb +184 -0
- data/spec/rtm/sugar/topic/hash_access_spec.rb +234 -0
- data/spec/rtm/sugar/topic/scoped_spec.rb +131 -0
- data/spec/rtm/sugar/topic/topic_ref_spec.rb +44 -0
- data/spec/rtm/sugar/topic/typed_spec.rb +155 -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/name_spec.rb +85 -0
- data/spec/rtm/tmapi/core/occurrence_spec.rb +96 -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 +403 -0
- data/spec/rtm/tmapi/core/topic_map_spec.rb +648 -0
- data/spec/rtm/tmapi/core/topic_spec.rb +992 -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 +94 -0
- data/spec/spec_helper.rb +23 -0
- data/test/base_unit_test.rb +161 -0
- data/test/{base_test.rb → base_unit_test_tmapi.rb} +46 -43
- metadata +122 -66
- 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/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/lib/rtm/psi.rb
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
1
4
|
module RTM
|
|
2
5
|
PSI = {}
|
|
3
6
|
PSI[:type_instance] = "http://psi.topicmaps.org/iso13250/model/type-instance"
|
|
@@ -20,10 +23,18 @@ module RTM
|
|
|
20
23
|
#PSI[:XTMxx] = "http://www.topicmaps.org/xtm/"
|
|
21
24
|
#PSI[:XS] = "http://www.w3.org/2001/XMLSchema"
|
|
22
25
|
#PSI[:DC] = "http://purl.org/dc/elements/1.1/"
|
|
26
|
+
PSI[:Float] = "http://www.w3.org/2001/XMLSchema#float"
|
|
27
|
+
PSI[:Double] = "http://www.w3.org/2001/XMLSchema#double"
|
|
28
|
+
PSI[:Long] = "http://www.w3.org/2001/XMLSchema#long"
|
|
29
|
+
PSI[:Integer] = "http://www.w3.org/2001/XMLSchema#integer"
|
|
30
|
+
PSI[:Int] = "http://www.w3.org/2001/XMLSchema#int"
|
|
31
|
+
PSI[:Decimal] = "http://www.w3.org/2001/XMLSchema#decimal"
|
|
23
32
|
|
|
24
33
|
PSI[:XTM] = "http://psi.topicmaps.org/iso13250/glossary/XTM"
|
|
25
34
|
PSI[:association] = "http://psi.topicmaps.org/iso13250/glossary/association"
|
|
35
|
+
PSI[:role] = "http://psi.topicmaps.org/iso13250/glossary/association-role"
|
|
26
36
|
PSI[:association_role] = "http://psi.topicmaps.org/iso13250/glossary/association-role"
|
|
37
|
+
PSI[:role_type] = "http://psi.topicmaps.org/iso13250/glossary/association-role-type"
|
|
27
38
|
PSI[:association_role_type] = "http://psi.topicmaps.org/iso13250/glossary/association-role-type"
|
|
28
39
|
PSI[:association_type] = "http://psi.topicmaps.org/iso13250/glossary/association-type"
|
|
29
40
|
PSI[:information_resource] = "http://psi.topicmaps.org/iso13250/glossary/information-resource"
|
|
@@ -41,14 +52,33 @@ module RTM
|
|
|
41
52
|
PSI[:subject_locator] = "http://psi.topicmaps.org/iso13250/glossary/subject-locator"
|
|
42
53
|
PSI[:topic] = "http://psi.topicmaps.org/iso13250/glossary/topic"
|
|
43
54
|
PSI[:topic_map] = "http://psi.topicmaps.org/iso13250/glossary/topic-map"
|
|
55
|
+
PSI[:construct] = "http://psi.topicmaps.org/iso13250/glossary/topic-map-construct"
|
|
44
56
|
PSI[:topic_map_construct] = "http://psi.topicmaps.org/iso13250/glossary/topic-map-construct"
|
|
45
57
|
PSI[:Topic_Maps] = "http://psi.topicmaps.org/iso13250/glossary/Topic-Maps"
|
|
46
58
|
PSI[:topic_name] = "http://psi.topicmaps.org/iso13250/glossary/topic-name"
|
|
47
59
|
PSI[:topic_name_type] = "http://psi.topicmaps.org/iso13250/glossary/topic-name-type"
|
|
48
60
|
PSI[:topic_type] = "http://psi.topicmaps.org/iso13250/glossary/topic-type"
|
|
49
61
|
PSI[:unconstrained_scope] = "http://psi.topicmaps.org/iso13250/glossary/unconstrained-scope"
|
|
62
|
+
PSI[:variant] = "http://psi.topicmaps.org/iso13250/glossary/variant-name"
|
|
50
63
|
PSI[:variant_name] = "http://psi.topicmaps.org/iso13250/glossary/variant-name"
|
|
51
64
|
|
|
65
|
+
# languages
|
|
66
|
+
# PSI[:] = "http://psi.oasis-open.org/iso/639/#"
|
|
67
|
+
PSI[:language] = "http://psi.oasis-open.org/iso/639/#language"
|
|
68
|
+
PSI[:language_group] = "http://psi.oasis-open.org/iso/639/#language-group"
|
|
69
|
+
PSI[:code_a2] = "http://psi.oasis-open.org/iso/639/#code-a2"
|
|
70
|
+
PSI[:code_a3b] = "http://psi.oasis-open.org/iso/639/#code-a3b"
|
|
71
|
+
PSI[:code_a3t] = "http://psi.oasis-open.org/iso/639/#code-a3t"
|
|
72
|
+
PSI[:multiple_languages] = "http://psi.oasis-open.org/iso/639/#mul"
|
|
73
|
+
#PSI[:czech] = "http://psi.oasis-open.org/iso/639/#ces"
|
|
74
|
+
#PSI[:dutch] = "http://psi.oasis-open.org/iso/639/#nld"
|
|
75
|
+
#PSI[:english] = "http://psi.oasis-open.org/iso/639/#eng"
|
|
76
|
+
#PSI[:french] = "http://psi.oasis-open.org/iso/639/#fra"
|
|
77
|
+
#PSI[:german] = "http://psi.oasis-open.org/iso/639/#deu"
|
|
78
|
+
#PSI[:italien] = "http://psi.oasis-open.org/iso/639/#ita"
|
|
79
|
+
#PSI[:japanese] = "http://psi.oasis-open.org/iso/639/#jpn"
|
|
80
|
+
|
|
81
|
+
|
|
52
82
|
PSI1 = {}
|
|
53
83
|
PSI1[:XTM] = "http://www.topicmaps.org/xtm/1.0/core.xtm"
|
|
54
84
|
PSI1[:topic] = "http://www.topicmaps.org/xtm/1.0/core.xtm#topic"
|
|
@@ -67,7 +97,8 @@ module RTM
|
|
|
67
97
|
PREFIX[:tm] = "http://psi.topicmaps.org/iso13250/model/" # This is the namespace for the concepts defined by TMDM.
|
|
68
98
|
PREFIX[:glossary] = "http://psi.topicmaps.org/iso13250/glossary/"
|
|
69
99
|
PREFIX[:xsd] = "http://www.w3.org/2001/XMLSchema#" # This is the namespace for the XML Schema Datatypes.
|
|
70
|
-
PREFIX[:tmql] = "http://psi.topicmaps.org/tmql/1.0/" # Under this prefix the concepts of
|
|
71
|
-
PREFIX[:fn] = "http://psi.topicmaps.org/tmql/1.0/functions" # Under this prefix user-callable functions of the predefined
|
|
100
|
+
PREFIX[:tmql] = "http://psi.topicmaps.org/tmql/1.0/" # Under this prefix the concepts of Axes itself are located.
|
|
101
|
+
PREFIX[:fn] = "http://psi.topicmaps.org/tmql/1.0/functions" # Under this prefix user-callable functions of the predefined Axes environment are located.
|
|
72
102
|
PREFIX[:xtm1] = "http://www.topicmaps.org/xtm/1.0/core.xtm#"
|
|
103
|
+
PREFIX[:language] = "http://psi.oasis-open.org/iso/639/#" # This is the namespace for the languae PSIs
|
|
73
104
|
end
|
data/lib/rtm/sugar.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module RTM::Topic
|
|
5
|
+
require 'rtm/sugar/topic/topic_ref'
|
|
6
|
+
include Sugar::Topic::TopicRef
|
|
7
|
+
require 'rtm/sugar/topic/hash_access'
|
|
8
|
+
include RTM::Sugar::Topic::HashAccess
|
|
9
|
+
require 'rtm/sugar/topic/characteristics'
|
|
10
|
+
include Sugar::Topic::Characteristics
|
|
11
|
+
require 'rtm/sugar/topic/counterparts'
|
|
12
|
+
include Sugar::Topic::Counterparts
|
|
13
|
+
require 'rtm/sugar/topic/scoped'
|
|
14
|
+
include Sugar::Topic::Scoped
|
|
15
|
+
require 'rtm/sugar/topic/typed'
|
|
16
|
+
include Sugar::Topic::Typed
|
|
17
|
+
end
|
|
18
|
+
module RTM::Association
|
|
19
|
+
require "rtm/sugar/association/hash_access"
|
|
20
|
+
include Sugar::Association::HashAccess
|
|
21
|
+
end
|
|
22
|
+
module RTM::Role
|
|
23
|
+
require "rtm/sugar/role/counterparts"
|
|
24
|
+
include Sugar::Role::Counterparts
|
|
25
|
+
end
|
|
26
|
+
module RTM::Occurrence
|
|
27
|
+
require "rtm/sugar/occurrence/dynamic_value"
|
|
28
|
+
include Sugar::Occurrence::DynamicValue
|
|
29
|
+
end
|
|
30
|
+
module RTM::Typed
|
|
31
|
+
require "rtm/sugar/typed/types"
|
|
32
|
+
include Sugar::Typed::Types
|
|
33
|
+
end
|
|
34
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module Sugar
|
|
5
|
+
module Association
|
|
6
|
+
# This module implements methods for Hash-like access in Associations.
|
|
7
|
+
module HashAccess
|
|
8
|
+
|
|
9
|
+
# Returns all Roles of this Association.
|
|
10
|
+
#
|
|
11
|
+
# If type is given, returns the Roles of this Association
|
|
12
|
+
# whose Role type match type.
|
|
13
|
+
# Type may be a Topic or Topic-Reference.
|
|
14
|
+
#
|
|
15
|
+
# The result may be empty.
|
|
16
|
+
#
|
|
17
|
+
# :call-seq:
|
|
18
|
+
# [] -> Array of Roles
|
|
19
|
+
# [type] -> Array of Roles
|
|
20
|
+
#
|
|
21
|
+
def [](type=:any)
|
|
22
|
+
return getRoles.to_a if type == :any
|
|
23
|
+
return getRoles.to_a unless type
|
|
24
|
+
type = topic_map.get(type)
|
|
25
|
+
if type
|
|
26
|
+
return getRoles(type).to_a
|
|
27
|
+
else
|
|
28
|
+
return []
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Creates a new Role in this Association where type specifies the
|
|
34
|
+
# Role type and player the associated Role player.
|
|
35
|
+
# Type and player may each be a Topic, String-Reference or Locator.
|
|
36
|
+
#
|
|
37
|
+
# :call-seq:
|
|
38
|
+
# [type]= player
|
|
39
|
+
#
|
|
40
|
+
# TODO Issue #919
|
|
41
|
+
def []=(type,player)
|
|
42
|
+
create_role(type,player)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Copyright: Copyright 2010 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module Sugar::Occurrence
|
|
5
|
+
module DynamicValue
|
|
6
|
+
# Returns the value of this occurrence cast as appropriate Ruby type.
|
|
7
|
+
def dynamic_value
|
|
8
|
+
case self.datatype.to_external_form # first_oc.datatype is actually of type Locator
|
|
9
|
+
when RTM::PSI[:Decimal]
|
|
10
|
+
self.value.to_f
|
|
11
|
+
when RTM::PSI[:Double]
|
|
12
|
+
self.value.to_f
|
|
13
|
+
when RTM::PSI[:Int]
|
|
14
|
+
self.value.to_i
|
|
15
|
+
when RTM::PSI[:Integer]
|
|
16
|
+
self.value.to_i
|
|
17
|
+
when RTM::PSI[:Float]
|
|
18
|
+
self.value.to_f
|
|
19
|
+
when RTM::PSI[:Long]
|
|
20
|
+
self.value.to_i
|
|
21
|
+
# Date, ... missing
|
|
22
|
+
else
|
|
23
|
+
self.value
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class NoDatatypeHandlerAvailableException < Exception
|
|
28
|
+
def initialize(value)
|
|
29
|
+
super "Cannot map #{value} to an occurrence value+datatype. Maybe you need to add a handler for your Ruby object type."
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class Float
|
|
36
|
+
def to_xsd_double
|
|
37
|
+
s = self.to_s
|
|
38
|
+
|
|
39
|
+
case s
|
|
40
|
+
when "Infinity"
|
|
41
|
+
"INF"
|
|
42
|
+
when "-Infinity"
|
|
43
|
+
"-INF"
|
|
44
|
+
else
|
|
45
|
+
s
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
module Sugar::Topic::Characteristics
|
|
51
|
+
#
|
|
52
|
+
# Weird. create_occurrence has an options hash, and we don't have one. We should unify the syntax. What is the right thing to do?
|
|
53
|
+
#
|
|
54
|
+
def dynamic_create_occurrence(type,value,datatype,scope = nil)
|
|
55
|
+
if !datatype # well, let's choose one
|
|
56
|
+
case value
|
|
57
|
+
when Integer
|
|
58
|
+
datatype = RTM::PSI[:Integer]
|
|
59
|
+
use_value = value.to_s
|
|
60
|
+
when Float
|
|
61
|
+
datatype = RTM::PSI[:Double]
|
|
62
|
+
use_value = value.to_xsd_double
|
|
63
|
+
when String
|
|
64
|
+
datatype = RTM::PSI[:String]
|
|
65
|
+
use_value = value
|
|
66
|
+
else
|
|
67
|
+
raise Sugar::Occurrence::DynamicValue::NoDatatypeHandlerAvailableException.new(value)
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
use_value = value
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
create_occurrence(type,use_value,:datatype => datatype, :scope => scope)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -1,51 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
module Counterparts
|
|
4
|
-
# This method fetches all roles from the parent association of this role, except itself (i.e. current role).
|
|
5
|
-
# A filter-hash may be used to filter for the type of the other role (:otype =>topic_reference).
|
|
6
|
-
# Examples:
|
|
7
|
-
# this_role.counterparts # returns all
|
|
8
|
-
# this_role.counterparts(:otype => some_topic) # returns only other roles which have type some_topic
|
|
9
|
-
# this_role.counterparts(:otype => "some_reference") # as above, looking up the reference first
|
|
10
|
-
def counterparts(filter={})
|
|
11
|
-
self.parent.roles.reject{|r| r.id==self.id}.
|
|
12
|
-
select{|r| filter[:otype] ? r.type == self.topic_map.get(filter[:otype]) : true}
|
|
13
|
-
end
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
14
3
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
4
|
+
module Sugar::Role
|
|
5
|
+
module Counterparts
|
|
6
|
+
|
|
7
|
+
# Returns all Roles from the parent Association of this Role,
|
|
8
|
+
# except itself.
|
|
9
|
+
#
|
|
10
|
+
# A filter-hash may be used to filter for the type of the other Roles
|
|
11
|
+
# (:otype). The identfier may be a Topic or Topic-Reference.
|
|
12
|
+
#
|
|
13
|
+
# :call-seq:
|
|
14
|
+
# counterparts -> Array of Roles
|
|
15
|
+
# counterparts({:otype => identifier}) -> Array of Roles
|
|
16
|
+
#
|
|
17
|
+
def counterparts(filter={})
|
|
18
|
+
_roles = parent.roles.reject{|r| r.id==self.id}
|
|
19
|
+
return filter[:otype] ? _roles.select{|r| r.type == topic_map.get(filter[:otype]) } : _roles
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Returns the other role, if the parent association is binary.
|
|
23
|
+
#
|
|
24
|
+
# :call-seq:
|
|
25
|
+
# counterpart -> Role
|
|
26
|
+
#
|
|
27
|
+
def counterpart
|
|
28
|
+
n = parent.roles.size
|
|
29
|
+
raise "Association must be unary or binary to use counterpart method. Please use counterparts for n-ary associations." if n > 2
|
|
30
|
+
return nil if n == 1
|
|
31
|
+
counterparts.first
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns all players of the parent Association of this Role,
|
|
35
|
+
# except the player of itself.
|
|
36
|
+
#
|
|
37
|
+
# A filter-hash may be used to filter for the type of the other Roles
|
|
38
|
+
# (:otype). The identifier may be a Topic or Topic-Reference.
|
|
39
|
+
#
|
|
40
|
+
# :call-seq:
|
|
41
|
+
# counterplayers -> Array of Topics
|
|
42
|
+
# counterplayers({:otype => identifier}) -> Array of Topics
|
|
43
|
+
#
|
|
44
|
+
def counterplayers(filter={})
|
|
45
|
+
counterparts(filter).map{|r| r.player}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns the player of the other role, if the parent association is binary.
|
|
49
|
+
#
|
|
50
|
+
# :call-seq:
|
|
51
|
+
# counterplayer -> Topic
|
|
52
|
+
#
|
|
53
|
+
def counterplayer
|
|
54
|
+
n = parent.roles.size
|
|
55
|
+
raise "Association must be unary or binary to use counterplayer method. Please use counterplayers for n-ary associations (n>2)." if n > 2
|
|
56
|
+
return nil if n == 1
|
|
57
|
+
counterparts.first.player
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns the Roles of other binary Associations for which the following
|
|
61
|
+
# applies:
|
|
62
|
+
#
|
|
63
|
+
# - this Role and all returned Roles must share a counterplayer.
|
|
64
|
+
#
|
|
65
|
+
# - if :rtype is set to :strict, the type of the returned Roles must equal
|
|
66
|
+
# the type of this Role
|
|
67
|
+
#
|
|
68
|
+
# - if :atype is set to :strict, the type of the parent Associaton of this Role must be equal
|
|
69
|
+
# to the type of the parent Associations of the other Roles
|
|
70
|
+
#
|
|
71
|
+
# - if :otype is set to :strict, the type of the Roles the shared counterplayers play (counterparts)
|
|
72
|
+
# must equal
|
|
73
|
+
#
|
|
74
|
+
# - if :arity is set to :strict, the size of the parent Associations must
|
|
75
|
+
# equal the size of the other associations involved
|
|
76
|
+
#
|
|
77
|
+
# Example: Returns all employee-roles of a company, if self is a Role an employee plays in an
|
|
78
|
+
# "firm-employee"-Association.
|
|
79
|
+
#
|
|
80
|
+
# Default: peers(:arity => :strict, :atype => :strict, :otype => :strict, :rtype => :strict)
|
|
81
|
+
#
|
|
82
|
+
# The result may be empty. Esp. if the parent Association includes only this Role, an empty Array is returned.
|
|
83
|
+
#
|
|
84
|
+
# :call-seq:
|
|
85
|
+
# peers -> Array of Roles
|
|
86
|
+
# peers(:arity => :strict) -> Array of Roles
|
|
87
|
+
# peers(:rtype => :strict, :atype => strict, :otype => :loose) -> Array of Roles
|
|
88
|
+
# etc.
|
|
89
|
+
#
|
|
90
|
+
def peers(params = {})
|
|
91
|
+
default_hash = {:arity => :strict, :atype => :strict, :otype => :strict, :rtype => :strict}
|
|
92
|
+
raise("peers: argument has to be a Hash") unless params.is_a? Hash
|
|
93
|
+
params.reject!{|k,v| ![:strict,:loose].include?(v)}
|
|
94
|
+
params = default_hash.merge(params)
|
|
95
|
+
# puts "\narity = " + (params[:arity] == :strict ? "strict" : "loose")
|
|
96
|
+
# puts "atype = " + (params[:atype] == :strict ? "strict" : "loose")
|
|
97
|
+
# puts "otype = " + (params[:otype] == :strict ? "strict" : "loose")
|
|
98
|
+
# puts "rtype = " + (params[:rtype] == :strict ? "strict" : "loose")
|
|
99
|
+
n = self.parent.roles.size
|
|
100
|
+
return [] if n == 1
|
|
101
|
+
atype = self.parent.type # association type
|
|
102
|
+
rtype = self.type #role type
|
|
103
|
+
c_parts = self.counterparts # other roles in the association of this player
|
|
104
|
+
_roles = []
|
|
105
|
+
c_parts.each do |c_part|
|
|
106
|
+
otype = c_part.type # type of the other role in the association
|
|
107
|
+
c_player = c_part.player
|
|
108
|
+
if params[:otype] == :loose
|
|
109
|
+
other_roles = c_player.roles.to_a
|
|
110
|
+
else
|
|
111
|
+
if params[:atype] == :strict
|
|
112
|
+
other_roles = c_player.roles(otype,atype).to_a
|
|
113
|
+
else
|
|
114
|
+
other_roles = c_player.roles(otype).to_a
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
other_roles = other_roles.select{|r| r.parent.roles.size == n} if params[:arity] == :strict #same n-ary
|
|
118
|
+
other_roles = other_roles.map{|r| r.counterparts}.flatten # other roles in these associations
|
|
119
|
+
other_roles = other_roles.select{|r| r.type == rtype} if params[:rtype] == :strict
|
|
120
|
+
other_roles = other_roles.reject{|r| r == self} # reject self
|
|
121
|
+
_roles = _roles + other_roles
|
|
122
|
+
end
|
|
123
|
+
return _roles
|
|
124
|
+
end
|
|
20
125
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
n = self.parent.roles.size
|
|
32
|
-
raise "Association must be unary or binary to use counterplayer method. Please use counterplayers for n-ary associations." if n > 2
|
|
33
|
-
return nil if n == 1
|
|
34
|
-
self.counterparts.first.player
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Fetches all roles of the (binary) parent associations which play the same role in the same with the counterplayer
|
|
38
|
-
# TODO: filter not only otype but also atype and rtype.
|
|
39
|
-
def peers
|
|
40
|
-
cp = self.counterpart
|
|
41
|
-
cp.player.roles.select{|r| r.type == cp.type}.map{|r| r.counterpart}
|
|
42
|
-
end
|
|
43
|
-
# Fetches all players of roles being in the same association with another topic as self
|
|
44
|
-
# Example: current_role is a role of player "me" and type "employee"
|
|
45
|
-
# current_role.peerplayers # returns all employees of my company (including me)
|
|
46
|
-
def peerplayers
|
|
47
|
-
self.peers.map{|r| r.player}
|
|
48
|
-
end
|
|
126
|
+
# Returns all players of the peers of this Role.
|
|
127
|
+
#
|
|
128
|
+
# Example: Returns all employees of a company except the
|
|
129
|
+
# player of itself.
|
|
130
|
+
#
|
|
131
|
+
# :call-seq:
|
|
132
|
+
# peerplayers -> Array of Topics
|
|
133
|
+
#
|
|
134
|
+
def peerplayers
|
|
135
|
+
peers.map{|r| r.player}
|
|
49
136
|
end
|
|
50
137
|
end
|
|
51
138
|
end
|
|
@@ -1,15 +1,129 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
|
2
|
+
# License: Apache License, Version 2.0
|
|
3
|
+
|
|
4
|
+
module Sugar::Topic::Characteristics
|
|
5
|
+
|
|
6
|
+
# Returns all Occurrences of this Topic whose Datatype is not IRI
|
|
7
|
+
#
|
|
8
|
+
# :call-seq:
|
|
9
|
+
# internal_occurrences -> Set of Occurrences
|
|
10
|
+
#
|
|
11
|
+
def internal_occurrences
|
|
12
|
+
occurrences.select{|x| x.getDatatype.toExternalForm != RTM::PSI[:IRI]}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Returns all Occurrences of this Topic whose Datatype is IRI
|
|
16
|
+
#
|
|
17
|
+
# :call-seq:
|
|
18
|
+
# external_occurrences -> Set of Occurrences
|
|
19
|
+
#
|
|
20
|
+
def external_occurrences
|
|
21
|
+
occurrences.select{|y| y.getDatatype.toExternalForm == RTM::PSI[:IRI]}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Returns the Names of this Topic which may be filtered for their type,
|
|
25
|
+
# value and/or scope.
|
|
26
|
+
#
|
|
27
|
+
# If scope is set to :ucs, Names which exist in the unconstrained scope
|
|
28
|
+
# are selected. If scope is set to :any (default), scope does not constrain
|
|
29
|
+
# the Names-Array. Else, only the Names which exist in the given scope
|
|
30
|
+
# are selected.
|
|
31
|
+
#
|
|
32
|
+
# Returns an empty Array if no Names match or if the Name type
|
|
33
|
+
# or scope does not exist.
|
|
34
|
+
#
|
|
35
|
+
# :call-seq:
|
|
36
|
+
# names_by -> Array of Names
|
|
37
|
+
# names_by(:type => identifier) -> Array of Names
|
|
38
|
+
# names_by(:value => string) -> Array of Names
|
|
39
|
+
# names_by(:scope => identifier) -> Array of Names
|
|
40
|
+
# names_by(:type => identifier, :value => string) -> Array of Names
|
|
41
|
+
# names_by(:type => identifier, :value => string, :scope => identifier) -> Array of Names
|
|
42
|
+
# and so on
|
|
43
|
+
#
|
|
44
|
+
def names_by(args = {})
|
|
45
|
+
raise("names_by: arguments must be a Hash") unless args.is_a?(Hash)
|
|
46
|
+
default_hash = {:type => :any, :value => :any, :scope => :any}
|
|
47
|
+
args = default_hash.merge(args)
|
|
48
|
+
#filter for type
|
|
49
|
+
_names = args[:type] == :any ? names : names(args[:type])
|
|
50
|
+
_names = self.filter_by(_names,args)
|
|
51
|
+
# return Array
|
|
52
|
+
return _names.to_a
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns Occurrences of this Topic which may be filtered for their type,
|
|
56
|
+
# value, datatype and/or scope.
|
|
57
|
+
#
|
|
58
|
+
# If scope is set to :ucs, Occurrences which exist in the unconstrained scope
|
|
59
|
+
# are selected. If scope is set to :any (default), scope does not constrain
|
|
60
|
+
# the Occurrence-Array. Else, only the Occurrences which exist in the given scope
|
|
61
|
+
# are selected.
|
|
62
|
+
#
|
|
63
|
+
# Returns an empty Array if no Occurrences match or if the Occurrence type or
|
|
64
|
+
# scope does not exist.
|
|
65
|
+
#
|
|
66
|
+
# :call-seq:
|
|
67
|
+
# occurrence_by -> Array of Occurrences
|
|
68
|
+
# occurrences_by(:type => argument) -> Array of Occurrences
|
|
69
|
+
# occurrences_by(:value => argument) -> Array of Occurrences
|
|
70
|
+
# occurrences_by(:scope => argument) -> Array of Occurrences
|
|
71
|
+
# occurrences_by(:datatype => argument) -> Array of Occurrences
|
|
72
|
+
# occurrences_by(:type => argument1, :value => argument2) -> Array of Occurrences
|
|
73
|
+
# occurrences_by(:type => argument1, :value => argument2, :scope => argument3, :datatype => argument4) -> Array of Occurrences
|
|
74
|
+
# and so on
|
|
75
|
+
#
|
|
76
|
+
def occurrences_by(args = {})
|
|
77
|
+
raise("occurrences_by: arguments must be a Hash") unless args.is_a?(Hash)
|
|
78
|
+
default_hash = {:type => :any, :value => :any, :scope => :any, :datatype => :any}
|
|
79
|
+
args = default_hash.merge(args)
|
|
80
|
+
#filter for type
|
|
81
|
+
_occurrences = args[:type] == :any ? occurrences : occurrences(args[:type])
|
|
82
|
+
_occurrences = self.filter_by(_occurrences,args)
|
|
83
|
+
#filter for datatype
|
|
84
|
+
_occurrences = _occurrences.select{|o| o.datatype == args[:datatype]} unless args[:datatype] == :any
|
|
85
|
+
return _occurrences.to_a
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
protected
|
|
89
|
+
def filter_by(_characteristics,args)
|
|
90
|
+
#filter for value
|
|
91
|
+
unless args[:value] == :any
|
|
92
|
+
_characteristics = args[:value].is_a?(Array) ? _characteristics.select{|o| args[:value].any?{|v| o.value == v}} : _characteristics.select{|o| o.value == args[:value]}
|
|
93
|
+
end
|
|
94
|
+
#filter for scope
|
|
95
|
+
case args[:scope]
|
|
96
|
+
when :any
|
|
97
|
+
when :ucs, []
|
|
98
|
+
_characteristics = _characteristics.select{|o| o.scope.empty?}
|
|
99
|
+
else
|
|
100
|
+
_scope = topic_map.get(args[:scope])
|
|
101
|
+
_characteristics = _scope.is_a?(Array) ? _characteristics.select{|o| _scope.any?{|theme| o.scope.include?(theme)}} : _characteristics.select{|o| o.scope.include?(_scope)}
|
|
13
102
|
end
|
|
103
|
+
_characteristics
|
|
14
104
|
end
|
|
105
|
+
|
|
106
|
+
# Returns the Occurrences and Names of this Topic which have the specified type as
|
|
107
|
+
# Occurrence/Name type. Additionally, scope may constrain the the selection.
|
|
108
|
+
#
|
|
109
|
+
# If scope is set to :ucs, Occurrences/Names which exist in the unconstrained scope
|
|
110
|
+
# are selected. If scope is set to :any (default), scope does not constrain
|
|
111
|
+
# the Occurrence/Names-Array. Else, only the Occurrences/Names which exist in the given scope
|
|
112
|
+
# are selected.
|
|
113
|
+
#
|
|
114
|
+
# Returns an empty Array if no Occurrences or Names match or if the Occurrence/Name type or
|
|
115
|
+
# scope does not exist.
|
|
116
|
+
#
|
|
117
|
+
# :call-seq:
|
|
118
|
+
# characteristics_by -> Array of Occurrences and Names
|
|
119
|
+
#
|
|
120
|
+
# def characteristics_by(args = {})
|
|
121
|
+
# raise("characteristics_by: arguments must be a Hash") unless args.is_a?(Hash)
|
|
122
|
+
# default_hash = {:type => :any, :value => :any, :scope => :any, :datatype => :any}
|
|
123
|
+
# args = default_hash.merge(args)
|
|
124
|
+
# _names = names_by(args) if args[:datatype].include(:any) || args[:datatype] == RTM::PSI[:String] || args[:datatype] == topic_map.create_locator(RTM::PSI[:String])
|
|
125
|
+
# _occurrences = occurrences_by(args)
|
|
126
|
+
#
|
|
127
|
+
# end
|
|
128
|
+
|
|
15
129
|
end
|