rtm 0.1.0 → 0.1.1
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/lib/activetopicmaps.rb +229 -0
- data/lib/rtm/backend/active_record/association_and_role.rb +54 -0
- data/lib/rtm/backend/active_record/locators.rb +53 -0
- data/lib/rtm/backend/active_record/name_variant_occurrence.rb +44 -0
- data/lib/rtm/backend/active_record/quaaxtm2rtm.rb +113 -0
- data/lib/rtm/backend/active_record/quaaxtm2rtmviews.rb +134 -0
- data/lib/rtm/backend/active_record/set_wrapper.rb +98 -0
- data/lib/rtm/backend/active_record/tm_construct.rb +62 -0
- data/lib/rtm/backend/active_record/tm_delegator.rb +420 -0
- data/lib/rtm/backend/active_record/tm_set_delegator.rb +195 -0
- data/lib/rtm/backend/active_record/tmdm.rb +0 -1
- data/lib/rtm/backend/active_record/topic.rb +153 -0
- data/lib/rtm/backend/active_record/topic_map.rb +285 -0
- data/lib/rtm/backend/active_record.rb +9 -1350
- data/lib/rtm/io/to_jtm.rb +5 -1
- metadata +74 -68
@@ -0,0 +1,229 @@
|
|
1
|
+
require 'rtm'
|
2
|
+
# Yep, this is the easter egg I told of on the website.
|
3
|
+
# See the source code at the very end of this file for an explanation.
|
4
|
+
# Pleace note, this is not beta code, not even alpha - it's just an experiment.
|
5
|
+
|
6
|
+
module ActiveTopicMaps
|
7
|
+
class Base
|
8
|
+
def self.inherited(klass)
|
9
|
+
klass.send(:include, ActiveTopicMaps::Topic)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Topic
|
14
|
+
def self.included(klass)
|
15
|
+
klass.extend(ClassMethods)
|
16
|
+
end
|
17
|
+
def initialize(topic)
|
18
|
+
@topic = topic
|
19
|
+
end
|
20
|
+
def topic;@topic;end
|
21
|
+
|
22
|
+
module ClassMethods
|
23
|
+
def acts_as_topic
|
24
|
+
self.class_eval <<-EOS
|
25
|
+
def method_missing(name, *args)
|
26
|
+
@topic.send(name, *args)
|
27
|
+
end
|
28
|
+
|
29
|
+
alias atm_old_respond_to? respond_to?
|
30
|
+
def respond_to?(*args)
|
31
|
+
atm_old_respond_to?(*args) || @topic.respond_to?(*args)
|
32
|
+
end
|
33
|
+
|
34
|
+
alias old_methods methods
|
35
|
+
def methods
|
36
|
+
@methods ||= (old_methods + @topic.methods).uniq
|
37
|
+
end
|
38
|
+
EOS
|
39
|
+
end
|
40
|
+
|
41
|
+
# def acts_smart
|
42
|
+
# self.class_eval <<-EOS
|
43
|
+
# alias atm_old_method_missing method_missing
|
44
|
+
# def method_missing(name, *args)
|
45
|
+
# if @topic.respond_to?(name)
|
46
|
+
# @topic.send(name, *args)
|
47
|
+
# else
|
48
|
+
# begin
|
49
|
+
# if name =~ /=$/
|
50
|
+
# smart_setter(name, *args)
|
51
|
+
# else
|
52
|
+
# smart_getter(name, *args)
|
53
|
+
# end
|
54
|
+
# rescue
|
55
|
+
# atm_old_method_missing(name, *args)
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# def smart_getter(name, *args)
|
61
|
+
# val = instance_variable_set(("smart_prop_" + name.to_s).to_sym, smart_prop_name)
|
62
|
+
# prefix = ""
|
63
|
+
# smart_prop_name ||= (iname = @topic["#{prefix}#{name}"].first) ? iname.value : nil
|
64
|
+
# instance_variable_set(name, smart_prop_name)
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def smart_setter(name, *args)
|
68
|
+
#
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# alias atm_old_respond_to? respond_to?
|
72
|
+
# def respond_to?(*args)
|
73
|
+
# atm_old_respond_to?(*args) || @topic.respond_to?(*args)
|
74
|
+
# end
|
75
|
+
# EOS
|
76
|
+
# end
|
77
|
+
|
78
|
+
def name(name, type="")
|
79
|
+
prop_getter(name, type, "-")
|
80
|
+
prop_setter(name, type, "-")
|
81
|
+
end
|
82
|
+
|
83
|
+
def occurrence(name, type=nil)
|
84
|
+
type ||= name
|
85
|
+
prop_getter(name, type)
|
86
|
+
prop_setter(name, type)
|
87
|
+
end
|
88
|
+
|
89
|
+
def prop_getter(name, type, prefix="")
|
90
|
+
self.class_eval <<-EOS
|
91
|
+
def #{name}
|
92
|
+
@#{name} ||= (iname = @topic["#{prefix}#{type}"].first) ? iname.value : nil
|
93
|
+
end
|
94
|
+
EOS
|
95
|
+
end
|
96
|
+
|
97
|
+
def prop_setter(name, type, prefix="")
|
98
|
+
self.class_eval <<-EOS
|
99
|
+
def #{name}=(name)
|
100
|
+
old = @topic["#{prefix}#{type}"].first
|
101
|
+
@#{name} = if old
|
102
|
+
old.value = name
|
103
|
+
else
|
104
|
+
@topic["#{prefix}#{type}"] = name
|
105
|
+
end
|
106
|
+
end
|
107
|
+
EOS
|
108
|
+
end
|
109
|
+
|
110
|
+
def binassoc(name, rt1, at, rt2, klass)
|
111
|
+
eval(<<-EOS)
|
112
|
+
class RTM::AR::Topic
|
113
|
+
index_property_set :#{name}, :type => :Topic, :rule => {
|
114
|
+
:transitive => true,
|
115
|
+
:role_type => "#{rt1}",
|
116
|
+
:association_type => "#{at}",
|
117
|
+
:association_arity => 2,
|
118
|
+
:other_role_type => "#{rt2}",
|
119
|
+
:add => "#{name.to_s.singularize}",
|
120
|
+
}
|
121
|
+
end
|
122
|
+
EOS
|
123
|
+
self.class_eval <<-EOS
|
124
|
+
def #{name}
|
125
|
+
@topic.#{name}.map{|o| #{klass}.new(o)}
|
126
|
+
end
|
127
|
+
def add_#{name.to_s.singularize}(o)
|
128
|
+
@topic.add_#{name.to_s.singularize}(o.topic)
|
129
|
+
end
|
130
|
+
def remove_#{name.to_s.singularize}(o)
|
131
|
+
@topic.remove_#{name.to_s.singularize}(o.topic)
|
132
|
+
end
|
133
|
+
EOS
|
134
|
+
end
|
135
|
+
|
136
|
+
def topic_map(base_uri_or_tm)
|
137
|
+
@tm = base_uri_or_tm.is_a?(RTM::TopicMap) ? base_uri_or_tm : RTM.create(base_uri_or_tm)
|
138
|
+
end
|
139
|
+
|
140
|
+
def create(ref)
|
141
|
+
self.new(@tm.get!(ref))
|
142
|
+
end
|
143
|
+
alias get! create
|
144
|
+
|
145
|
+
def find(ref)
|
146
|
+
t = @tm.get(ref)
|
147
|
+
self.new(t) if t
|
148
|
+
end
|
149
|
+
alias get find
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
#require 'activetopicmaps'
|
156
|
+
#RTM.connect
|
157
|
+
#
|
158
|
+
#class Person < ActiveTopicMaps::Base
|
159
|
+
# topic_map "urn:/base"
|
160
|
+
#
|
161
|
+
# name :name
|
162
|
+
# occurrence :age
|
163
|
+
# occurrence :shoesize, "http://rtm.rubyforge.org/psi/shoesize" # this tells ActiveTM to use this as occurrence type
|
164
|
+
#
|
165
|
+
# def to_s
|
166
|
+
# a = " (#{age})" if age
|
167
|
+
# "#{name}#{a}"
|
168
|
+
# end
|
169
|
+
#end
|
170
|
+
#
|
171
|
+
#class Country
|
172
|
+
# include ActiveTopicMaps::Topic
|
173
|
+
#
|
174
|
+
# topic_map "urn:/base"
|
175
|
+
#
|
176
|
+
# acts_as_topic
|
177
|
+
#
|
178
|
+
# name :name
|
179
|
+
# occurrence :population
|
180
|
+
# occurrence :size
|
181
|
+
#
|
182
|
+
# binassoc :inhabitants, "country", "country-inhabitant", "inhabitant", :Person
|
183
|
+
#
|
184
|
+
# def to_s
|
185
|
+
# "There is a country called #{name} with #{population} inhabitants and a size of #{size} km^2.\n" +
|
186
|
+
# "These are some of the inhabitants: #{inhabitants.map{|i| i.to_s}.join(", ")}."
|
187
|
+
# end
|
188
|
+
#end
|
189
|
+
#
|
190
|
+
## create a new object with a (new?) topic
|
191
|
+
#p = Person.create("max")
|
192
|
+
#
|
193
|
+
## set name, age, shoesize
|
194
|
+
#p.name = "Max Mustermann"
|
195
|
+
#p.age = 30
|
196
|
+
#p.shoesize = 44 # european ;)
|
197
|
+
#
|
198
|
+
## print out the name
|
199
|
+
#puts p.name
|
200
|
+
#
|
201
|
+
## create a new object, using a topic (might be queried before, ... you know)
|
202
|
+
#h = Person.new(RTM[0].get!("hans"))
|
203
|
+
#
|
204
|
+
## set name
|
205
|
+
#h.name = "Hans Maier"
|
206
|
+
## set another name (overwrites the old one! this is different from topic["-name"] !!!)
|
207
|
+
#h.name = "Hans Meyer"
|
208
|
+
#
|
209
|
+
## don't know what that does, maybe you?
|
210
|
+
#puts h.name
|
211
|
+
#
|
212
|
+
## Norway is the item identifier, here
|
213
|
+
#no=Country.create("Norway")
|
214
|
+
#
|
215
|
+
#no.name="Norway"
|
216
|
+
#no.population = "4.743.000"
|
217
|
+
#no.size = "385.199"
|
218
|
+
#
|
219
|
+
## use real person objects here
|
220
|
+
#no.add_inhabitant h
|
221
|
+
#no.add_inhabitant p
|
222
|
+
#
|
223
|
+
## use this nice to_s method we provided above
|
224
|
+
#puts no.to_s
|
225
|
+
#
|
226
|
+
## find hans
|
227
|
+
#puts "Trying to find Hans: #{Person.find("hans")}"
|
228
|
+
## won't find otto
|
229
|
+
#puts "Trying to find Otto: #{Person.find("otto")}"
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module RTM::AR
|
2
|
+
class Association < Reifiable
|
3
|
+
include RTM::Association
|
4
|
+
wrapper_cache
|
5
|
+
|
6
|
+
parent :topic_map
|
7
|
+
property :type, :aka => [:ty,:t], :rw => true, :type => :Topic, :wrap => true
|
8
|
+
property_set :scope, :type => :Topic, :wrap => true
|
9
|
+
property_set :roles, :aka => [:r, :association_roles], :type => :AssociationRole, :wrap => true,
|
10
|
+
:create => :role, :create_aka => [:cr, :create_association_role],
|
11
|
+
:create_args => [ {:name => :player, :type => :Topic}, {:name => :type, :type => :Topic}]
|
12
|
+
|
13
|
+
property_set :role_players, :aka => [:players, :rp, :pl], :type => :Topic, :wrap => true
|
14
|
+
property_set :role_types, :aka => [:types, :rt], :type => :Topic, :wrap => true
|
15
|
+
|
16
|
+
equality [:scope, :type, :roles]
|
17
|
+
end
|
18
|
+
|
19
|
+
class AssociationRole < Reifiable
|
20
|
+
include RTM::AssociationRole
|
21
|
+
wrapper_cache
|
22
|
+
|
23
|
+
parent :association
|
24
|
+
property :player, :aka => [:pl,:topic], :rw => true, :type => :Topic, :wrap => true
|
25
|
+
property :type, :aka => [:ty,:t], :rw => true, :type => :Topic, :wrap => true
|
26
|
+
|
27
|
+
def counterparts
|
28
|
+
self.parent.roles.reject{|r| r.id==self.id}
|
29
|
+
end
|
30
|
+
def counterplayers
|
31
|
+
self.counterparts.map{|r| r.player}
|
32
|
+
end
|
33
|
+
def counterpart
|
34
|
+
n = self.parent.roles.size
|
35
|
+
raise "Association must be unary or binary to use counterpart method. Please use counterparts for n-ary associations." if n > 2
|
36
|
+
return nil if n == 1
|
37
|
+
self.parent.roles.reject{|r| r.id==self.id}.first
|
38
|
+
end
|
39
|
+
def counterplayer
|
40
|
+
n = self.parent.roles.size
|
41
|
+
raise "Association must be unary or binary to use counterplayer method. Please use counterplayers for n-ary associations." if n > 2
|
42
|
+
return nil if n == 1
|
43
|
+
self.parent.roles.reject{|r| r.id==self.id}.first.player
|
44
|
+
end
|
45
|
+
def peers
|
46
|
+
self.counterpart.player.roles.select{|r| r.type == cp.type}.counterpart
|
47
|
+
end
|
48
|
+
def peerplayers
|
49
|
+
self.peers.map{|r| r.player}
|
50
|
+
end
|
51
|
+
|
52
|
+
equality [:type, :player, :parent]
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module RTM::AR
|
2
|
+
class Locator < TMDelegator
|
3
|
+
include RTM::Locator
|
4
|
+
|
5
|
+
delegate :+
|
6
|
+
delegate :-
|
7
|
+
#delegate :==
|
8
|
+
delegate :id
|
9
|
+
|
10
|
+
delegate :get
|
11
|
+
delegate :hash
|
12
|
+
delegate :resolve_relative
|
13
|
+
delegate :to_s, :to => :reference
|
14
|
+
delegate :to_uri
|
15
|
+
delegate :uri
|
16
|
+
delegate :reference, :rw => true, :save => true
|
17
|
+
alias :value :reference
|
18
|
+
alias :value= :reference=
|
19
|
+
|
20
|
+
equality [:reference]
|
21
|
+
|
22
|
+
def self.wrap(obj)
|
23
|
+
return nil unless obj
|
24
|
+
raise "Double wrapping" if obj.respond_to?(:__getobj__)
|
25
|
+
case obj.class.name
|
26
|
+
when "RTM::AR::TMDM::ItemIdentifier"
|
27
|
+
ItemIdentifier.wrap(obj)
|
28
|
+
when "RTM::AR::TMDM::SubjectIdentifier"
|
29
|
+
SubjectIdentifier.wrap(obj)
|
30
|
+
when "RTM::AR::TMDM::SubjectLocator"
|
31
|
+
SubjectLocator.wrap(obj)
|
32
|
+
else
|
33
|
+
raise "Can't wrap object. Class for wrapping #{obj.class} unknown (object: #{obj})"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class ItemIdentifier < Locator
|
39
|
+
include RTM::ItemIdentifier
|
40
|
+
wrapper_cache
|
41
|
+
property :topic_map_construct, :type => :TopicMapConstruct, :wrap => true
|
42
|
+
end
|
43
|
+
class SubjectIdentifier < Locator
|
44
|
+
include RTM::SubjectIdentifier
|
45
|
+
wrapper_cache
|
46
|
+
property :topic, :type => :Topic, :wrap => true
|
47
|
+
end
|
48
|
+
class SubjectLocator < Locator
|
49
|
+
include RTM::SubjectLocator
|
50
|
+
wrapper_cache
|
51
|
+
property :topic, :type => :Topic, :wrap => true
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module RTM::AR
|
2
|
+
class TopicName < Reifiable
|
3
|
+
include RTM::TopicName
|
4
|
+
wrapper_cache
|
5
|
+
|
6
|
+
parent :topic
|
7
|
+
property :type, :aka => [:ty,:t], :rw => true, :type => :Topic, :wrap => true
|
8
|
+
property_set :scope, :type => :Topic, :wrap => true
|
9
|
+
|
10
|
+
property_set :variants, :aka => :v, :type => :Variant, :wrap => true,
|
11
|
+
:create => :variant, :create_aka => :cv,
|
12
|
+
:create_args => [ {:name => :value, :type => [:String, :Locator]}, {:name => :scope, :type => :Collection}]
|
13
|
+
|
14
|
+
property :value, :rw => true, :type => :String
|
15
|
+
|
16
|
+
equality [:value, :type, :scope, :parent]
|
17
|
+
end
|
18
|
+
|
19
|
+
class Variant < Reifiable
|
20
|
+
include RTM::Variant
|
21
|
+
wrapper_cache
|
22
|
+
|
23
|
+
parent :topic_name, :aka => :name
|
24
|
+
property :value, :rw => true, :type => :String
|
25
|
+
property :datatype, :rw => true, :type => :Locator #, :wrap => true
|
26
|
+
property_set :scope, :type => :Topic, :wrap => true
|
27
|
+
|
28
|
+
equality [:value, :datatype, :scope, :parent]
|
29
|
+
end
|
30
|
+
|
31
|
+
class Occurrence < Reifiable
|
32
|
+
include RTM::Occurrence
|
33
|
+
wrapper_cache
|
34
|
+
|
35
|
+
parent :topic
|
36
|
+
property :value, :rw => true, :type => :String
|
37
|
+
property :datatype, :rw => true, :type => :String
|
38
|
+
|
39
|
+
property_set :scope, :type => :Topic, :wrap => true
|
40
|
+
property :type, :aka => [:ty,:t], :rw => true, :type => :Topic, :wrap => true
|
41
|
+
|
42
|
+
equality [:value, :datatype, :scope, :type, :parent]
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
|
4
|
+
module RTM
|
5
|
+
module AR
|
6
|
+
module TMDM
|
7
|
+
class Topic < ActiveRecord::Base;end
|
8
|
+
class ItemIdentifier < ActiveRecord::Base
|
9
|
+
belongs_to :topic_map_construct
|
10
|
+
end
|
11
|
+
class SubjectIdentifier < ActiveRecord::Base
|
12
|
+
belongs_to :topic
|
13
|
+
end
|
14
|
+
|
15
|
+
class SubjectLocator < ActiveRecord::Base
|
16
|
+
belongs_to :topic
|
17
|
+
end
|
18
|
+
|
19
|
+
class QuaaxTM2RTM < ActiveRecord::Migration
|
20
|
+
def self.up
|
21
|
+
rename_table("qtm_topicmap", "topic_maps" )
|
22
|
+
rename_column("topic_maps", "baselocator", "base_locator")
|
23
|
+
|
24
|
+
rename_table("qtm_topic", "topics")
|
25
|
+
rename_column("topics", "topicmap_id", "topic_map_id")
|
26
|
+
|
27
|
+
add_column :topics, :reified_id, :integer
|
28
|
+
add_column :topics, :reified_type, :string
|
29
|
+
|
30
|
+
rename_table "qtm_association", "associations"
|
31
|
+
rename_column "associations", "type_id", "ttype_id"
|
32
|
+
rename_column "associations", "topicmap_id", "topic_map_id"
|
33
|
+
|
34
|
+
rename_table "qtm_assocrole", "association_roles"
|
35
|
+
rename_column "association_roles", "type_id", "ttype_id"
|
36
|
+
rename_column "association_roles", "reference", "topic_id"
|
37
|
+
|
38
|
+
rename_table "qtm_topicname", "topic_names"
|
39
|
+
rename_column "topic_names", "type_id", "ttype_id"
|
40
|
+
|
41
|
+
rename_table "qtm_occurrence", "occurrences"
|
42
|
+
rename_column "occurrences", "type_id", "ttype_id"
|
43
|
+
|
44
|
+
rename_table "qtm_variant", "variants"
|
45
|
+
rename_column "variants", "topicname_id", "topic_name_id"
|
46
|
+
|
47
|
+
rename_table "qtm_topicmapconstructref", "item_identifiers"
|
48
|
+
rename_column "item_identifiers", "locator", "reference"
|
49
|
+
add_column :item_identifiers, :topic_map_id, :integer
|
50
|
+
ItemIdentifier.reset_column_information
|
51
|
+
ItemIdentifier.find(:all).each do |si|
|
52
|
+
si.update_attribute :topic_map_id, si.topic_map_construct.topic_map_id
|
53
|
+
end
|
54
|
+
|
55
|
+
create_table :item_identifiers do |t|
|
56
|
+
t.column :topic_map_id, :integer, :null => false
|
57
|
+
t.column :reference, :string, :null => false
|
58
|
+
t.column :topic_map_construct_id, :integer
|
59
|
+
t.column :topic_map_construct_type, :string
|
60
|
+
end
|
61
|
+
SubjectIdentifier.reset_column_information
|
62
|
+
SubjectIdentifier.find(:all).each do |si|
|
63
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
64
|
+
end
|
65
|
+
|
66
|
+
rename_table "qtm_subjectidentifier", "subject_identifiers"
|
67
|
+
rename_column :subject_identifiers, "locator", "reference"
|
68
|
+
add_column :subject_identifiers, :topic_map_id, :integer
|
69
|
+
|
70
|
+
SubjectIdentifier.reset_column_information
|
71
|
+
SubjectIdentifier.find(:all).each do |si|
|
72
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
73
|
+
end
|
74
|
+
|
75
|
+
rename_table "qtm_subjectlocator", "subject_locators"
|
76
|
+
rename_column :subject_locators, "locator", "reference"
|
77
|
+
add_column :subject_locators, :topic_map_id, :integer
|
78
|
+
|
79
|
+
Topic.reset_column_information
|
80
|
+
SubjectLocator.reset_column_information
|
81
|
+
SubjectLocator.find(:all).each do |si|
|
82
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
83
|
+
end
|
84
|
+
|
85
|
+
create_table :scoped_objects_topics do |t|
|
86
|
+
t.column :scoped_object_id, :integer
|
87
|
+
t.column :scoped_object_type, :string
|
88
|
+
t.column :topic_id, :integer
|
89
|
+
end
|
90
|
+
|
91
|
+
# TODO: instance of
|
92
|
+
# scope
|
93
|
+
# reifier
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.down
|
97
|
+
raise "not supported"
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#if __FILE__ == $0
|
106
|
+
# puts "Generating SQLite3 Databse tmdm.sqlite3."
|
107
|
+
# ActiveRecord::Base.establish_connection(
|
108
|
+
# :adapter => "sqlite3",
|
109
|
+
# :database => "tmdm.sqlite3"
|
110
|
+
# )
|
111
|
+
# RTM::AR::TMDM::QuaaxTM2RTM.migrate(:up)
|
112
|
+
#end
|
113
|
+
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
|
4
|
+
module RTM
|
5
|
+
module AR
|
6
|
+
module TMDM
|
7
|
+
class Topic < ActiveRecord::Base;end
|
8
|
+
class ItemIdentifier < ActiveRecord::Base
|
9
|
+
belongs_to :topic_map_construct
|
10
|
+
end
|
11
|
+
class SubjectIdentifier < ActiveRecord::Base
|
12
|
+
belongs_to :topic
|
13
|
+
end
|
14
|
+
|
15
|
+
class SubjectLocator < ActiveRecord::Base
|
16
|
+
belongs_to :topic
|
17
|
+
end
|
18
|
+
|
19
|
+
class QuaaxTM2RTMViews < ActiveRecord::Migration
|
20
|
+
def self.up
|
21
|
+
create_view "topic_maps", "select id, baselocator from qtm_topicmap" do |t|
|
22
|
+
t.column :id
|
23
|
+
t.column :base_locator
|
24
|
+
end
|
25
|
+
|
26
|
+
create_view "topics", "select id, topicmap_id, null, null from qtm_topic" do |t|
|
27
|
+
t.column :id
|
28
|
+
t.column :topic_map_id
|
29
|
+
t.column :reified_id
|
30
|
+
t.column :reified_type
|
31
|
+
end
|
32
|
+
|
33
|
+
create_view "associations", "select id, topicmap_id, type_id from qtm_association" do |t|
|
34
|
+
t.column :id
|
35
|
+
t.column :topic_map_id
|
36
|
+
t.column :ttype_id
|
37
|
+
end
|
38
|
+
|
39
|
+
create_view "association_roles", "select id, association_id, type_id, reference from qtm_assocrole" do |t|
|
40
|
+
t.column :id
|
41
|
+
t.column :association_id
|
42
|
+
t.column :ttype_id
|
43
|
+
t.column :topic_id
|
44
|
+
end
|
45
|
+
|
46
|
+
create_view "topic_names", "select id, topic_id, type_id, value from qtm_topicname" do |t|
|
47
|
+
t.column :id
|
48
|
+
t.column :topic_id
|
49
|
+
t.column :ttype_id
|
50
|
+
t.column :value
|
51
|
+
end
|
52
|
+
|
53
|
+
create_view "occurrence", "select id, topic_id, type_id, value, datatype from qtm_occurrence" do |t|
|
54
|
+
t.column :id
|
55
|
+
t.column :topic_id
|
56
|
+
t.column :ttype_id
|
57
|
+
t.column :value
|
58
|
+
t.column :datatype
|
59
|
+
end
|
60
|
+
|
61
|
+
create_view "variants", "select id, topicname_id, value, datatype from qtm_variant" do |t|
|
62
|
+
t.column :id
|
63
|
+
t.column :topic_name_id
|
64
|
+
t.column :value
|
65
|
+
t.column :datatype
|
66
|
+
end
|
67
|
+
|
68
|
+
rename_table "qtm_topicmapconstructref", "item_identifiers"
|
69
|
+
rename_column "item_identifiers", "locator", "reference"
|
70
|
+
add_column :item_identifiers, :topic_map_id, :integer
|
71
|
+
ItemIdentifier.reset_column_information
|
72
|
+
ItemIdentifier.find(:all).each do |si|
|
73
|
+
si.update_attribute :topic_map_id, si.topic_map_construct.topic_map_id
|
74
|
+
end
|
75
|
+
|
76
|
+
create_table :item_identifiers do |t|
|
77
|
+
t.column :topic_map_id, :integer, :null => false
|
78
|
+
t.column :reference, :string, :null => false
|
79
|
+
t.column :topic_map_construct_id, :integer
|
80
|
+
t.column :topic_map_construct_type, :string
|
81
|
+
end
|
82
|
+
SubjectIdentifier.reset_column_information
|
83
|
+
SubjectIdentifier.find(:all).each do |si|
|
84
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
85
|
+
end
|
86
|
+
|
87
|
+
rename_table "qtm_subjectidentifier", "subject_identifiers"
|
88
|
+
rename_column :subject_identifiers, "locator", "reference"
|
89
|
+
add_column :subject_identifiers, :topic_map_id, :integer
|
90
|
+
|
91
|
+
SubjectIdentifier.reset_column_information
|
92
|
+
SubjectIdentifier.find(:all).each do |si|
|
93
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
94
|
+
end
|
95
|
+
|
96
|
+
rename_table "qtm_subjectlocator", "subject_locators"
|
97
|
+
rename_column :subject_locators, "locator", "reference"
|
98
|
+
add_column :subject_locators, :topic_map_id, :integer
|
99
|
+
|
100
|
+
Topic.reset_column_information
|
101
|
+
SubjectLocator.reset_column_information
|
102
|
+
SubjectLocator.find(:all).each do |si|
|
103
|
+
si.update_attribute :topic_map_id, si.topic.topic_map_id
|
104
|
+
end
|
105
|
+
|
106
|
+
create_table :scoped_objects_topics do |t|
|
107
|
+
t.column :scoped_object_id, :integer
|
108
|
+
t.column :scoped_object_type, :string
|
109
|
+
t.column :topic_id, :integer
|
110
|
+
end
|
111
|
+
|
112
|
+
# TODO: instance of
|
113
|
+
# scope
|
114
|
+
# reifier
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.down
|
118
|
+
raise "not supported"
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
#if __FILE__ == $0
|
127
|
+
# puts "Generating SQLite3 Databse tmdm.sqlite3."
|
128
|
+
# ActiveRecord::Base.establish_connection(
|
129
|
+
# :adapter => "sqlite3",
|
130
|
+
# :database => "tmdm.sqlite3"
|
131
|
+
# )
|
132
|
+
# RTM::AR::TMDM::QuaaxTM2RTM.migrate(:up)
|
133
|
+
#end
|
134
|
+
|