Skip to content

Commit 39a8937

Browse files
authored
Merge pull request #102 from code4lib/activerecord-wrapper-table-name-prefix
Prefix column names with model's table name in ActiveRecord wrapper.
2 parents 463db0f + 2439f6d commit 39a8937

12 files changed

+72
-46
lines changed

lib/oai/provider/model/activerecord_wrapper.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ def initialize(model, options={})
3232
end
3333

3434
def earliest
35-
earliest_obj = model.order("#{timestamp_field} asc").first
35+
earliest_obj = model.order("#{model.base_class.table_name}.#{timestamp_field} asc").first
3636
earliest_obj.nil? ? Time.at(0) : earliest_obj.send(timestamp_field)
3737
end
3838

3939
def latest
40-
latest_obj = model.order("#{timestamp_field} desc").first
40+
latest_obj = model.order("#{model.base_class.table_name}.#{timestamp_field} desc").first
4141
latest_obj.nil? ? Time.now : latest_obj.send(timestamp_field)
4242
end
4343
# A model class is expected to provide a method Model.sets that
@@ -137,7 +137,7 @@ def next_set(find_scope, token_string)
137137
def select_partial(find_scope, token)
138138
records = find_scope.where(token_conditions(token))
139139
.limit(@limit)
140-
.order("#{identifier_field} asc")
140+
.order("#{model.base_class.table_name}.#{identifier_field} asc")
141141
raise OAI::ResumptionTokenException.new unless records
142142

143143
total = find_scope.where(token_conditions(token)).count
@@ -158,7 +158,7 @@ def token_conditions(token)
158158

159159
return sql if "0" == last_id
160160
# Now add last id constraint
161-
sql.first << " AND #{identifier_field} > :id"
161+
sql.first << " AND #{model.base_class.table_name}.#{identifier_field} > :id"
162162
sql.last[:id] = last_id
163163

164164
return sql
@@ -169,12 +169,12 @@ def sql_conditions(opts)
169169
sql = []
170170
esc_values = {}
171171
if opts.has_key?(:from)
172-
sql << "#{timestamp_field} >= :from"
172+
sql << "#{model.base_class.table_name}.#{timestamp_field} >= :from"
173173
esc_values[:from] = parse_to_local(opts[:from])
174174
end
175175
if opts.has_key?(:until)
176176
# Handle databases which store fractions of a second by rounding up
177-
sql << "#{timestamp_field} < :until"
177+
sql << "#{model.base_class.table_name}.#{timestamp_field} < :until"
178178
esc_values[:until] = parse_to_local(opts[:until]) { |t| t + 1 }
179179
end
180180

@@ -215,4 +215,3 @@ def parse_to_local(time)
215215

216216
end
217217
end
218-

test/activerecord_provider/database/0001_oaipmh_tables.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ def self.up
1010
t.column :oai_token_id, :integer, :null => false
1111
end
1212

13+
create_table :dc_langs do |t|
14+
t.column :name, :string
15+
t.column :updated_at, :datetime
16+
t.column :created_at, :datetime
17+
end
18+
1319
dc_fields = proc do |t|
1420
t.column :title, :string
1521
t.column :creator, :string
@@ -21,7 +27,7 @@ def self.up
2127
t.column :type, :string
2228
t.column :format, :string
2329
t.column :source, :string
24-
t.column :language, :string
30+
t.column :dc_lang_id, :integer
2531
t.column :relation, :string
2632
t.column :coverage, :string
2733
t.column :rights, :string

test/activerecord_provider/helpers/providers.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ def self.load
5656
File.join(File.dirname(__FILE__), '..', 'fixtures', 'dc.yml')
5757
)
5858
fixtures.keys.sort.each do |key|
59-
DCField.create(fixtures[key])
59+
lang = DCLang.create(name: fixtures[key].delete('language'))
60+
DCField.create(fixtures[key].merge(dc_lang: lang))
6061
end
6162
end
6263

6364
def self.unload
6465
DCField.delete_all
66+
DCLang.delete_all
6567
end
6668
end

test/activerecord_provider/helpers/transactional_test_case.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ def load_fixtures
1919
)
2020
disable_logging do
2121
fixtures.keys.sort.each do |key|
22-
DCField.create(fixtures[key])
22+
lang = DCLang.create(name: fixtures[key].delete('language'))
23+
DCField.create(fixtures[key].merge(dc_lang: lang))
2324
end
2425
end
2526
end

test/activerecord_provider/models/dc_field.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,12 @@ class DCField < ActiveRecord::Base
44
:join_table => "dc_fields_dc_sets",
55
:foreign_key => "dc_field_id",
66
:class_name => "DCSet"
7+
8+
belongs_to :dc_lang, class_name: "DCLang", optional: true
9+
10+
default_scope -> { left_outer_joins(:dc_lang) }
11+
12+
def language
13+
dc_lang&.name
14+
end
715
end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class DCLang < ActiveRecord::Base
2+
has_many :dc_fields
3+
end

test/activerecord_provider/models/exclusive_set_dc_field.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,10 @@ def self.sets
88
end
99
end
1010

11+
belongs_to :dc_lang, class_name: "DCLang", optional: true
12+
13+
def language
14+
dc_lang&.name
15+
end
16+
1117
end

test/activerecord_provider/tc_activerecord_wrapper.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,50 @@ def test_sql_conditions_from_date
55
input = "2005-12-25"
66
expected = input.dup
77
sql_template, sql_opts = sql_conditions(from: input)
8-
assert_equal "updated_at >= :from", sql_template
8+
assert_equal "dc_fields.updated_at >= :from", sql_template
99
assert_equal expected, sql_opts[:from]
1010
sql_template, sql_opts = sql_conditions(from: Date.strptime(input, "%Y-%m-%d"))
11-
assert_equal "updated_at >= :from", sql_template
11+
assert_equal "dc_fields.updated_at >= :from", sql_template
1212
assert_equal expected, sql_opts[:from]
1313
end
1414

1515
def test_sql_conditions_from_time
1616
input = "2005-12-25T00:00:00Z"
1717
expected = "2005-12-25 00:00:00"
1818
sql_template, sql_opts = sql_conditions(from: input)
19-
assert_equal "updated_at >= :from", sql_template
19+
assert_equal "dc_fields.updated_at >= :from", sql_template
2020
assert_equal expected, sql_opts[:from]
2121
sql_template, sql_opts = sql_conditions(from: Time.strptime(input, "%Y-%m-%dT%H:%M:%S%Z"))
22-
assert_equal "updated_at >= :from", sql_template
22+
assert_equal "dc_fields.updated_at >= :from", sql_template
2323
assert_equal expected, sql_opts[:from]
2424
end
2525

2626
def test_sql_conditions_until_date
2727
input = "2005-12-25"
2828
expected = "2005-12-26"
2929
sql_template, sql_opts = sql_conditions(until: input)
30-
assert_equal "updated_at < :until", sql_template
30+
assert_equal "dc_fields.updated_at < :until", sql_template
3131
assert_equal expected, sql_opts[:until]
3232
sql_template, sql_opts = sql_conditions(until: Date.strptime(input, "%Y-%m-%d"))
33-
assert_equal "updated_at < :until", sql_template
33+
assert_equal "dc_fields.updated_at < :until", sql_template
3434
assert_equal expected, sql_opts[:until]
3535
end
3636

3737
def test_sql_conditions_until_time
3838
input = "2005-12-25T00:00:00Z"
3939
expected = "2005-12-25 00:00:01"
4040
sql_template, sql_opts = sql_conditions(until: input)
41-
assert_equal "updated_at < :until", sql_template
41+
assert_equal "dc_fields.updated_at < :until", sql_template
4242
assert_equal expected, sql_opts[:until]
4343
sql_template, sql_opts = sql_conditions(until: Time.strptime(input, "%Y-%m-%dT%H:%M:%S%Z"))
44-
assert_equal "updated_at < :until", sql_template
44+
assert_equal "dc_fields.updated_at < :until", sql_template
4545
assert_equal expected, sql_opts[:until]
4646
end
4747

4848
def test_sql_conditions_both
4949
input = "2005-12-25"
5050
sql_template, sql_opts = sql_conditions(from: input, until: input)
51-
assert_equal "updated_at >= :from AND updated_at < :until", sql_template
51+
assert_equal "dc_fields.updated_at >= :from AND dc_fields.updated_at < :until", sql_template
5252
end
5353

5454
def setup

test/activerecord_provider/tc_ar_provider.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ def test_deleted
8181

8282
def test_from
8383
first_id = DCField.order("id asc").first.id
84-
DCField.where("id < #{first_id + 90}").update_all(updated_at: Time.parse("January 1 2005"))
84+
DCField.where("dc_fields.id < #{first_id + 90}").update_all(updated_at: Time.parse("January 1 2005"))
8585

86-
DCField.where("id < #{first_id + 10}").update_all(updated_at: Time.parse("June 1 2005"))
86+
DCField.where("dc_fields.id < #{first_id + 10}").update_all(updated_at: Time.parse("June 1 2005"))
8787

8888

8989
from_param = Time.parse("January 1 2006").getutc.iso8601
@@ -92,7 +92,7 @@ def test_from
9292
@provider.list_records(
9393
:metadata_prefix => 'oai_dc', :from => from_param)
9494
)
95-
assert_equal DCField.where(["updated_at >= ?", from_param]).size,
95+
assert_equal DCField.where(["dc_fields.updated_at >= ?", from_param]).size,
9696
doc.elements['OAI-PMH/ListRecords'].size
9797

9898
doc = REXML::Document.new(
@@ -103,8 +103,8 @@ def test_from
103103
end
104104

105105
def test_until
106-
first_id = DCField.order("id asc").first.id
107-
DCField.where("id < #{first_id + 10}").update_all(updated_at: Time.parse("June 1 2005"))
106+
first_id = DCField.order(id: :asc).first.id
107+
DCField.where("dc_fields.id < ?", first_id + 10).update_all(updated_at: Time.parse("June 1 2005"))
108108

109109
doc = REXML::Document.new(
110110
@provider.list_records(
@@ -114,10 +114,10 @@ def test_until
114114
end
115115

116116
def test_from_and_until
117-
first_id = DCField.order("id asc").first.id
117+
first_id = DCField.order(id: :asc).first.id
118118
DCField.update_all(updated_at: Time.parse("June 1 2005"))
119-
DCField.where("id < #{first_id + 50}").update_all(updated_at: Time.parse("June 15 2005"))
120-
DCField.where("id < #{first_id + 10}").update_all(updated_at: Time.parse("June 30 2005"))
119+
DCField.where("dc_fields.id < ?", first_id + 50).update_all(updated_at: Time.parse("June 15 2005"))
120+
DCField.where("dc_fields.id < ?", first_id + 10).update_all(updated_at: Time.parse("June 30 2005"))
121121

122122
doc = REXML::Document.new(
123123
@provider.list_records(
@@ -129,8 +129,8 @@ def test_from_and_until
129129
end
130130

131131
def test_bad_until_raises_exception
132-
DCField.order('id asc').limit(10).update_all(updated_at: 1.year.ago)
133-
DCField.order('id desc').limit(10).update_all(updated_at: 1.year.from_now)
132+
DCField.order(id: :asc).limit(10).update_all(updated_at: 1.year.ago)
133+
DCField.order(id: :desc).limit(10).update_all(updated_at: 1.year.from_now)
134134
badTimes = [
135135
'junk',
136136
'February 92nd, 2015']
@@ -142,8 +142,8 @@ def test_bad_until_raises_exception
142142
end
143143

144144
def test_bad_from_raises_exception
145-
DCField.order('id asc').limit(10).update_all(updated_at: 1.year.ago)
146-
DCField.order('id desc').limit(10).update_all(updated_at: 1.year.from_now)
145+
DCField.order(id: :asc).limit(10).update_all(updated_at: 1.year.ago)
146+
DCField.order(id: :desc).limit(10).update_all(updated_at: 1.year.from_now)
147147

148148
badTimes = [
149149
'junk',

test/activerecord_provider/tc_ar_sets_provider.rb

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,22 @@ def define_sets
5151
set_ab = DCSet.create(:name => "Set A:B", :spec => "A:B")
5252

5353
next_id = 0
54-
DCField.limit(10).order("id asc").each do |record|
54+
DCField.limit(10).order(id: :asc).each do |record|
5555
set_a.dc_fields << record
5656
next_id = record.id
5757
end
5858

59-
DCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
59+
DCField.where("dc_fields.id > ?", next_id).limit(10).order(id: :asc).each do |record|
6060
set_b.dc_fields << record
6161
next_id = record.id
6262
end
6363

64-
DCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
64+
DCField.where("dc_fields.id > ?", next_id).limit(10).order(id: :asc).each do |record|
6565
set_ab.dc_fields << record
6666
next_id = record.id
6767
end
6868

69-
DCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
69+
DCField.where("dc_fields.id > ?", next_id).limit(10).order(id: :asc).each do |record|
7070
set_a.dc_fields << record
7171
set_c.dc_fields << record
7272
next_id = record.id
@@ -117,25 +117,25 @@ def setup
117117
def define_sets
118118
next_id = 0
119119

120-
ExclusiveSetDCField.limit(10).order("id asc").each do |record|
120+
ExclusiveSetDCField.limit(10).order(id: :asc).each do |record|
121121
record.set = "A"
122122
record.save!
123123
next_id = record.id
124124
end
125125

126-
ExclusiveSetDCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
126+
ExclusiveSetDCField.where("id > ?", next_id).limit(10).order(id: :asc).each do |record|
127127
record.set = "B"
128128
record.save!
129129
next_id = record.id
130130
end
131131

132-
ExclusiveSetDCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
132+
ExclusiveSetDCField.where("id > ?", next_id).limit(10).order(id: :asc).each do |record|
133133
record.set = "A:B"
134134
record.save!
135135
next_id = record.id
136136
end
137137

138-
ExclusiveSetDCField.where("id > #{next_id}").limit(10).order("id asc").each do |record|
138+
ExclusiveSetDCField.where("id > ?", next_id).limit(10).order(id: :asc).each do |record|
139139
record.set = "A"
140140
record.save!
141141
next_id = record.id
@@ -150,7 +150,8 @@ def load_fixtures
150150
)
151151
disable_logging do
152152
fixtures.keys.sort.each do |key|
153-
ExclusiveSetDCField.create(fixtures[key])
153+
lang = DCLang.create(name: fixtures[key].delete('language'))
154+
ExclusiveSetDCField.create(fixtures[key].merge(dc_lang: lang))
154155
end
155156
end
156157
end

0 commit comments

Comments
 (0)