lore 0.4.3 → 0.4.5
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/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
|