lore 0.4.3 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- data/custom_models.rb +93 -0
- data/lib/lore/README.txt +3 -3
- data/lib/lore/cache/abstract_entity_cache.rb +1 -1
- data/lib/lore/cache/mmap_entity_cache.rb +9 -9
- data/lib/lore/clause.rb +29 -25
- data/lib/lore/gui/erb_template.rb +3 -3
- data/lib/lore/gui/form_element.rb +2 -2
- data/lib/lore/gui/templates/button.rhtml +0 -0
- data/lib/lore/gui/templates/checkbox.rhtml +0 -0
- data/lib/lore/gui/templates/file.rhtml +0 -0
- data/lib/lore/gui/templates/form_element.rhtml +0 -0
- data/lib/lore/gui/templates/form_table.rhtml +0 -0
- data/lib/lore/gui/templates/radio.rhtml +0 -0
- data/lib/lore/gui/templates/select.rhtml +0 -0
- data/lib/lore/gui/templates/text.rhtml +0 -0
- data/lib/lore/gui/templates/text_readonly.rhtml +0 -0
- data/lib/lore/gui/templates/textarea.rhtml +0 -0
- data/lib/lore/result.rb +19 -0
- data/lib/lore/table_accessor.rb +56 -221
- data/lib/lore/table_instance.rb +4 -2
- data/lib/lore/table_selector.rb +12 -11
- data/lib/lore.rb +1 -1
- data/lore.gemspec +5 -3
- data/test/model.rb +1 -1
- data/test/tc_aspect.rb +1 -1
- data/test/tc_cache.rb +5 -2
- data/test/tc_clause.rb +1 -1
- data/test/tc_deep_inheritance.rb +1 -1
- data/test/tc_factory.rb +1 -1
- data/test/tc_filter.rb +1 -1
- data/test/tc_form.rb +1 -1
- data/test/tc_model.rb +57 -3
- data/test/tc_prepare.rb +1 -2
- data/test/tc_refined_query.rb +1 -1
- data/test/tc_table_accessor.rb +2 -0
- data/test/tc_thread.rb +100 -0
- data/test/test_lore.rb +12 -11
- metadata +6 -6
- data/lore-0.4.3.gem +0 -0
- data/test/lore_test.log +0 -617
data/lib/lore/table_instance.rb
CHANGED
@@ -88,7 +88,8 @@ module Table_Instance
|
|
88
88
|
def marshal_dump
|
89
89
|
{
|
90
90
|
:klass => self.class.to_s,
|
91
|
-
:values => get_attribute_values
|
91
|
+
:values => get_attribute_values,
|
92
|
+
:joined => @joined_models
|
92
93
|
}
|
93
94
|
end
|
94
95
|
|
@@ -112,7 +113,8 @@ module Table_Instance
|
|
112
113
|
# Creates an instance of self from marshalled value set.
|
113
114
|
def marshal_load(dump)
|
114
115
|
klass = eval(dump[:klass])
|
115
|
-
|
116
|
+
dump[:joined].map { |m| m = eval(m) }
|
117
|
+
return initialize(dump[:values], dump[:fields], dump[:joined], :cached)
|
116
118
|
end
|
117
119
|
|
118
120
|
# Whether this instance has been loaded from
|
data/lib/lore/table_selector.rb
CHANGED
@@ -163,7 +163,7 @@ protected
|
|
163
163
|
|
164
164
|
clause_string = ''
|
165
165
|
if block_given? then
|
166
|
-
yield_obj = Lore::Clause_Parser.new(accessor
|
166
|
+
yield_obj = Lore::Clause_Parser.new(accessor)
|
167
167
|
clause = yield *yield_obj
|
168
168
|
end
|
169
169
|
# Extend AS part by attributes that have been added in clause
|
@@ -190,7 +190,7 @@ protected
|
|
190
190
|
# but generating a Plan instead the query.
|
191
191
|
# Pass block& to Plan_Clause, too, only in case a plan is needed.
|
192
192
|
|
193
|
-
return query_string
|
193
|
+
return { :query => query_string, :joined_models => clause.parts[:joined] }
|
194
194
|
|
195
195
|
end
|
196
196
|
|
@@ -210,7 +210,7 @@ protected
|
|
210
210
|
accessor,
|
211
211
|
&block)
|
212
212
|
|
213
|
-
return perform_select(accessor, query_string)
|
213
|
+
return perform_select(accessor, query_string[:query])
|
214
214
|
|
215
215
|
end # def
|
216
216
|
|
@@ -230,9 +230,9 @@ protected
|
|
230
230
|
result = nil if result == ''
|
231
231
|
@@logger.debug { "cache contents for #{accessor.table_name} found: #{result.to_s != ''}" }
|
232
232
|
else
|
233
|
-
db_result = perform_select(accessor, query_string)
|
234
|
-
db_result
|
235
|
-
result.push(accessor.new(row))
|
233
|
+
db_result = perform_select(accessor, query_string[:query]).get_rows()
|
234
|
+
db_result[:values].each { |row|
|
235
|
+
result.push(accessor.new(row, db_result[:fields], query_string[:joined_models]))
|
236
236
|
}
|
237
237
|
if Lore.cache_enabled? && accessor.entity_cache then
|
238
238
|
accessor.entity_cache.create(accessor, query_string, result)
|
@@ -241,6 +241,7 @@ protected
|
|
241
241
|
return result
|
242
242
|
end # def
|
243
243
|
|
244
|
+
# DELETE ME
|
244
245
|
def self.select_on_keys(accessor,
|
245
246
|
value_keys)
|
246
247
|
|
@@ -255,7 +256,7 @@ protected
|
|
255
256
|
args_string = ''
|
256
257
|
args.map { |a| a = Lore::TYPE_NAMES[a] }
|
257
258
|
if args.to_s != '' && args.length > 0 then args_string = "(#{args.join(',')})" end
|
258
|
-
query_string = "PREPARE #{accessor.table_name.gsub('.','_')}__#{plan_name.to_s}#{args_string} AS " << select_query(nil, accessor, &block)
|
259
|
+
query_string = "PREPARE #{accessor.table_name.gsub('.','_')}__#{plan_name.to_s}#{args_string} AS " << select_query(nil, accessor, &block)[:query]
|
259
260
|
begin
|
260
261
|
result = Lore::Connection.perform(query_string)
|
261
262
|
rescue ::Exception => excep
|
@@ -273,9 +274,9 @@ protected
|
|
273
274
|
result = nil if result == ''
|
274
275
|
@@logger.debug { "cache contents for prepared #{accessor.table_name}: #{result.to_s.inspect}" }
|
275
276
|
else
|
276
|
-
db_result = perform_select(accessor, query_string)
|
277
|
-
db_result
|
278
|
-
result.push(accessor.new(row))
|
277
|
+
db_result = perform_select(accessor, query_string).get_rows()
|
278
|
+
db_result[:values].each { |row|
|
279
|
+
result.push(accessor.new(row, db_result[:fields]))
|
279
280
|
}
|
280
281
|
if Lore.cache_enabled? && accessor.entity_cache then
|
281
282
|
accessor.create_entity_cache(query_string, result)
|
@@ -305,7 +306,7 @@ private
|
|
305
306
|
raise pge
|
306
307
|
ensure
|
307
308
|
Context.leave unless accessor.get_context.nil?
|
308
|
-
|
309
|
+
# GC.start
|
309
310
|
end
|
310
311
|
end
|
311
312
|
|
data/lib/lore.rb
CHANGED
data/lore.gemspec
CHANGED
@@ -12,9 +12,11 @@ spec = Gem::Specification.new { |s|
|
|
12
12
|
(multiple) inheritance, a comfortable query syntax,
|
13
13
|
highly customizable automated form generation,
|
14
14
|
and result caching using memory mapping (MMap).
|
15
|
+
It aims at performance, usability and - unlike most ORMs -
|
16
|
+
high coverage of native SQL functions and features.
|
15
17
|
Lore is currently using PostgreSQL as database backend.
|
16
18
|
EOF
|
17
|
-
s.version = '0.4.
|
19
|
+
s.version = '0.4.5'
|
18
20
|
s.author = 'Tobias Fuchs'
|
19
21
|
s.email = 'fuchs@atomnode.net'
|
20
22
|
s.date = Time.now
|
@@ -34,8 +36,8 @@ spec = Gem::Specification.new { |s|
|
|
34
36
|
|
35
37
|
s.has_rdoc = true
|
36
38
|
s.rdoc_options << '--title' << 'Lore ORM' <<
|
37
|
-
|
38
|
-
|
39
|
+
'--main' << 'Lore::Model' <<
|
40
|
+
'--line-numbers'
|
39
41
|
|
40
42
|
s.homepage = 'http://lore.rubyforge.org'
|
41
43
|
|
data/test/model.rb
CHANGED
data/test/tc_aspect.rb
CHANGED
data/test/tc_cache.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'test/unit'
|
3
3
|
|
4
|
-
require('
|
5
|
-
require('lore/test/ts_lore')
|
4
|
+
require('./test/model')
|
6
5
|
|
7
6
|
module Lore
|
8
7
|
module Unit
|
@@ -40,6 +39,9 @@ module Unit
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def test_basic
|
42
|
+
Lore.enable_cache
|
43
|
+
Car.use_entity_cache Lore::Cache::Mmap_Entity_Cache
|
44
|
+
|
43
45
|
passed = true
|
44
46
|
org_name = Car.all.entity.name
|
45
47
|
20.times {
|
@@ -62,6 +64,7 @@ module Unit
|
|
62
64
|
cached_inst.commit
|
63
65
|
passed = passed && (!Lore.cache_enabled? || !cached_inst.is_cached_entity?)
|
64
66
|
}
|
67
|
+
Lore.disable_cache
|
65
68
|
assert(passed, 'Cached value and original value differ')
|
66
69
|
end
|
67
70
|
|
data/test/tc_clause.rb
CHANGED
data/test/tc_deep_inheritance.rb
CHANGED
data/test/tc_factory.rb
CHANGED
data/test/tc_filter.rb
CHANGED
data/test/tc_form.rb
CHANGED
data/test/tc_model.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
require 'test/unit'
|
3
|
-
require '
|
3
|
+
require './test/model'
|
4
4
|
require 'lore/symbol'
|
5
5
|
|
6
6
|
module Lore
|
@@ -43,8 +43,8 @@ module Unit
|
|
43
43
|
|
44
44
|
def test_create
|
45
45
|
v = Vehicle.create(:name => 'Async', :maxspeed => 100,
|
46
|
-
|
47
|
-
|
46
|
+
:num_seats => 2,
|
47
|
+
:manuf_id => 0)
|
48
48
|
|
49
49
|
car_type = Car_Type.create(:name => 'Basic_Type')
|
50
50
|
assert_equal(car_type.name, 'Basic_Type')
|
@@ -55,6 +55,60 @@ module Unit
|
|
55
55
|
ct.delete
|
56
56
|
end
|
57
57
|
|
58
|
+
def test_joined_attributes_order
|
59
|
+
|
60
|
+
num_loops = 25
|
61
|
+
|
62
|
+
Vehicle_Owner.delete_all
|
63
|
+
owners = []
|
64
|
+
vehicles = []
|
65
|
+
for i in 0...num_loops do
|
66
|
+
o = Owner.create(:name => "owner_#{i}")
|
67
|
+
v = Vehicle.create(:name => 'Async', :maxspeed => 10*i,
|
68
|
+
:num_seats => i,
|
69
|
+
:manuf_id => i)
|
70
|
+
j = Vehicle_Owner.create(:vehicle_id => v.id, :owner_id => o.id)
|
71
|
+
owners << o
|
72
|
+
vehicles << v
|
73
|
+
end
|
74
|
+
vo = Vehicle_Owner.find(num_loops).sort_by(:vehicle_id, :asc).entities
|
75
|
+
for i in 0...vo.length do
|
76
|
+
assert_equal(owners[i].id, vo[i].owner_id)
|
77
|
+
assert_equal(vehicles[i].id, vo[i].vehicle_id)
|
78
|
+
end
|
79
|
+
|
80
|
+
join = Vehicle_Owner.select { |vo|
|
81
|
+
vo.join(Vehicle).on(Vehicle_Owner.vehicle_id == Vehicle.id) { |v|
|
82
|
+
v.join(Owner).on(Owner.owner_id == Vehicle_Owner.owner_id) { |o|
|
83
|
+
o.where(true)
|
84
|
+
o.limit(num_loops)
|
85
|
+
o.order_by(:vehicle_id, :asc)
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
assert_equal(num_loops, join.length)
|
90
|
+
|
91
|
+
for i in 0...join.length do
|
92
|
+
fulljoin = join[i]
|
93
|
+
assert_equal(owners[i].id, fulljoin.owner_id)
|
94
|
+
assert_equal(vehicles[i].id, fulljoin.vehicle_id)
|
95
|
+
end
|
96
|
+
|
97
|
+
join_ids = Vehicle_Owner.select_values(:vehicle_id) { |vo|
|
98
|
+
vo.join(Vehicle).on(Vehicle_Owner.vehicle_id == Vehicle.id) { |v|
|
99
|
+
v.join(Owner).on(Owner.owner_id == Vehicle_Owner.owner_id) { |o|
|
100
|
+
o.where(true)
|
101
|
+
o.limit(num_loops)
|
102
|
+
o.order_by(:vehicle_id, :asc)
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
for i in 0...join_ids.length do
|
107
|
+
assert_equal(vehicles[i].id, join_ids[i])
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
58
112
|
def test_create_with_inheritance
|
59
113
|
car_type = Car_Type.create(:name => 'Temp')
|
60
114
|
inst_attribs = {
|
data/test/tc_prepare.rb
CHANGED
data/test/tc_refined_query.rb
CHANGED
data/test/tc_table_accessor.rb
CHANGED
data/test/tc_thread.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require './test/model'
|
4
|
+
require 'lore/symbol'
|
5
|
+
|
6
|
+
module Lore
|
7
|
+
module Unit
|
8
|
+
|
9
|
+
|
10
|
+
class TC_Model < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def setup
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_simple
|
19
|
+
t1 = Thread.new {
|
20
|
+
30.times {
|
21
|
+
Car.find(10)
|
22
|
+
}
|
23
|
+
}
|
24
|
+
t2 = Thread.new {
|
25
|
+
30.times {
|
26
|
+
Car.find(10)
|
27
|
+
}
|
28
|
+
}
|
29
|
+
t3 = Thread.new {
|
30
|
+
30.times {
|
31
|
+
Car.find(10)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
t1.join
|
35
|
+
t2.join
|
36
|
+
t3.join
|
37
|
+
end
|
38
|
+
def test_create
|
39
|
+
c1 = Car.create(
|
40
|
+
:manuf_id => 0,
|
41
|
+
:name => '318i',
|
42
|
+
:num_seats => 5,
|
43
|
+
:maxspeed => 180,
|
44
|
+
:num_doors => 5,
|
45
|
+
:owner_id => 1,
|
46
|
+
:car_type_id => 23
|
47
|
+
)
|
48
|
+
c1.delete
|
49
|
+
return
|
50
|
+
t1 = Thread.new {
|
51
|
+
30.times {
|
52
|
+
c1 = Car.create(
|
53
|
+
:manuf_id => 0,
|
54
|
+
:name => '318i',
|
55
|
+
:num_seats => 5,
|
56
|
+
:maxspeed => 180,
|
57
|
+
:num_doors => 5,
|
58
|
+
:owner_id => 1,
|
59
|
+
:car_type_id => 23
|
60
|
+
)
|
61
|
+
c1.delete
|
62
|
+
}
|
63
|
+
}
|
64
|
+
t2 = Thread.new {
|
65
|
+
30.times {
|
66
|
+
c1 = Car.create(
|
67
|
+
:manuf_id => 0,
|
68
|
+
:name => '318i',
|
69
|
+
:num_seats => 5,
|
70
|
+
:maxspeed => 180,
|
71
|
+
:num_doors => 5,
|
72
|
+
:owner_id => 1,
|
73
|
+
:car_type_id => 23
|
74
|
+
)
|
75
|
+
c1.delete
|
76
|
+
}
|
77
|
+
}
|
78
|
+
t3 = Thread.new {
|
79
|
+
30.times {
|
80
|
+
c1 = Car.create(
|
81
|
+
:manuf_id => 0,
|
82
|
+
:name => '318i',
|
83
|
+
:num_seats => 5,
|
84
|
+
:maxspeed => 180,
|
85
|
+
:num_doors => 5,
|
86
|
+
:owner_id => 1,
|
87
|
+
:car_type_id => 23
|
88
|
+
)
|
89
|
+
c1.delete
|
90
|
+
}
|
91
|
+
}
|
92
|
+
t1.join
|
93
|
+
t2.join
|
94
|
+
t3.join
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
data/test/test_lore.rb
CHANGED
@@ -1,23 +1,24 @@
|
|
1
1
|
|
2
|
+
require 'rubygems'
|
2
3
|
require 'test/unit/testsuite'
|
3
4
|
|
4
5
|
require('lore')
|
5
6
|
Lore.logfile = './lore_test.log'
|
6
7
|
require('rubygems')
|
7
|
-
require('
|
8
|
+
require('./test/model')
|
8
9
|
require('lore/connection')
|
9
10
|
require('lore/cache/mmap_entity_cache')
|
10
11
|
|
11
|
-
require('
|
12
|
-
require('
|
13
|
-
require('
|
14
|
-
require('
|
15
|
-
require('
|
16
|
-
require('
|
17
|
-
require('
|
18
|
-
require('
|
19
|
-
require('
|
20
|
-
require('
|
12
|
+
require('./test/tc_table_accessor')
|
13
|
+
require('./test/tc_clause')
|
14
|
+
require('./test/tc_model')
|
15
|
+
require('./test/tc_form')
|
16
|
+
require('./test/tc_cache')
|
17
|
+
require('./test/tc_factory')
|
18
|
+
require('./test/tc_refined_query')
|
19
|
+
require('./test/tc_filter')
|
20
|
+
require('./test/tc_deep_inheritance')
|
21
|
+
require('./test/tc_prepare')
|
21
22
|
|
22
23
|
module Lore
|
23
24
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Fuchs
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-11-
|
12
|
+
date: 2008-11-12 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: "0.1"
|
23
23
|
version:
|
24
|
-
description: Lore is an object-relational mapping (ORM) implementation providing many features like prepared statements, (multiple) inheritance, a comfortable query syntax, highly customizable automated form generation, and result caching using memory mapping (MMap). Lore is currently using PostgreSQL as database backend.
|
24
|
+
description: Lore is an object-relational mapping (ORM) implementation providing many features like prepared statements, (multiple) inheritance, a comfortable query syntax, highly customizable automated form generation, and result caching using memory mapping (MMap). It aims at performance, usability and - unlike most ORMs - high coverage of native SQL functions and features. Lore is currently using PostgreSQL as database backend.
|
25
25
|
email: fuchs@atomnode.net
|
26
26
|
executables: []
|
27
27
|
|
@@ -31,6 +31,7 @@ extra_rdoc_files: []
|
|
31
31
|
|
32
32
|
files:
|
33
33
|
- History.txt
|
34
|
+
- custom_models.rb
|
34
35
|
- lib
|
35
36
|
- Manifest.txt
|
36
37
|
- bin
|
@@ -38,7 +39,6 @@ files:
|
|
38
39
|
- Rakefile
|
39
40
|
- lore.gemspec
|
40
41
|
- LICENSE
|
41
|
-
- lore-0.4.3.gem
|
42
42
|
- lib/lore
|
43
43
|
- lib/lore.rb
|
44
44
|
- lib/lore/table_updater.rb
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- test/tc_refined_query.rb
|
119
119
|
- test/tc_deep_inheritance.rb
|
120
120
|
- test/prepare.rb
|
121
|
+
- test/tc_thread.rb
|
121
122
|
- test/tc_model.rb
|
122
123
|
- test/README
|
123
124
|
- test/model.rb
|
@@ -127,7 +128,6 @@ files:
|
|
127
128
|
- test/tc_aspect.rb
|
128
129
|
- test/tc_filter.rb
|
129
130
|
- test/env.rb
|
130
|
-
- test/lore_test.log
|
131
131
|
- test/benchmark
|
132
132
|
- test/tc_factory.rb
|
133
133
|
- test/tc_prepare.rb
|
@@ -139,7 +139,7 @@ rdoc_options:
|
|
139
139
|
- --title
|
140
140
|
- Lore ORM
|
141
141
|
- --main
|
142
|
-
-
|
142
|
+
- Lore::Model
|
143
143
|
- --line-numbers
|
144
144
|
require_paths:
|
145
145
|
- lib
|
data/lore-0.4.3.gem
DELETED
File without changes
|