og 0.29.0 → 0.30.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/ProjectInfo +17 -28
- data/README +6 -6
- data/doc/AUTHORS +6 -0
- data/doc/RELEASES +36 -0
- data/lib/glue/hierarchical.rb +3 -4
- data/lib/glue/optimistic_locking.rb +1 -1
- data/lib/glue/orderable.rb +3 -3
- data/lib/glue/taggable.rb +29 -26
- data/lib/glue/timestamped.rb +3 -4
- data/lib/og.rb +21 -9
- data/lib/og/entity.rb +44 -2
- data/lib/og/manager.rb +9 -6
- data/lib/og/markers.rb +9 -1
- data/lib/og/relation.rb +9 -5
- data/lib/og/relation/joins_many.rb +2 -2
- data/lib/og/store/alpha/memory.rb +8 -8
- data/lib/og/store/alpha/sqlserver.rb +3 -3
- data/lib/og/store/kirby.rb +422 -279
- data/lib/og/store/mysql.rb +33 -24
- data/lib/og/store/psql.rb +28 -18
- data/lib/og/store/sql.rb +99 -33
- data/lib/og/store/sqlite.rb +13 -7
- data/lib/og/store/sqlite2.rb +14 -4
- data/test/og/CONFIG.rb +2 -2
- data/test/og/store/tc_sti.rb +41 -0
- data/test/og/tc_aggregations_calculations.rb +8 -2
- data/test/og/tc_cacheable.rb +6 -2
- data/test/og/tc_camel_case_join.rb +51 -0
- data/test/og/tc_ez.rb +30 -1
- data/test/og/tc_join.rb +73 -6
- data/test/og/tc_multi_validations.rb +1 -1
- metadata +53 -53
- data/Rakefile +0 -220
data/ProjectInfo
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
TITLE : &title Og
|
4
4
|
NAME : &pkg og
|
5
|
-
VERSION : '0.
|
5
|
+
VERSION : '0.30.0'
|
6
6
|
STATUS : beta
|
7
7
|
|
8
8
|
AUTHOR : George Moschovitis
|
9
9
|
EMAIL : &email gm@navel.gr
|
10
|
-
HOMEPAGE : "http://www.
|
10
|
+
HOMEPAGE : "http://www.nitroproject.org"
|
11
11
|
|
12
12
|
SUMMARY: State of the art object-relational mapping system.
|
13
13
|
|
@@ -16,27 +16,26 @@ DESCRIPTION: >
|
|
16
16
|
Og serializes standard Ruby objects to Mysql, Postgres, Sqlite,
|
17
17
|
KirbyBase, Filesystem and more.
|
18
18
|
|
19
|
-
DEPENDENCIES:
|
20
|
-
- [ glue, '= 0.29.0' ]
|
21
|
-
|
22
|
-
DISTRIBUTE: [ gem, tgz, zip ]
|
23
|
-
|
24
19
|
RUBYFORGE:
|
25
20
|
PROJECT: 'nitro'
|
26
21
|
USERNAME: 'gmosx'
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
DEPENDENCIES:
|
24
|
+
- [ glue, '= 0.30.0' ]
|
25
|
+
|
26
|
+
PACKAGE: !!package
|
27
|
+
distribute: [ gem, tgz, zip ]
|
28
|
+
|
29
|
+
RDOC: !!rdoc
|
30
|
+
dir: rdoc
|
31
|
+
options: ['--all', '--inline-source']
|
32
|
+
include:
|
33
|
+
- 'lib/og/**/*'
|
34
|
+
- '[A-Z]*'
|
34
35
|
|
35
|
-
|
36
|
-
#TEST:
|
37
|
-
# fixture: ''
|
36
|
+
TEST: !!test
|
38
37
|
|
39
|
-
ANNOUNCE:
|
38
|
+
ANNOUNCE: !!announce
|
40
39
|
to: george.moschovitis@gmail.com
|
41
40
|
from: gm@navel.gr
|
42
41
|
domain: navel.gr
|
@@ -48,15 +47,5 @@ ANNOUNCE:
|
|
48
47
|
file: ANN
|
49
48
|
slogan: Og (ObjectGraph)
|
50
49
|
links:
|
51
|
-
- http://www.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
- http://www.nitroproject.org
|
62
51
|
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Og 0.
|
1
|
+
= Og 0.30.0 README
|
2
2
|
|
3
3
|
Og (ObjectGraph) is a powerful and elegant object-relational mapping
|
4
4
|
library. Og manages the lifecycle of Ruby objects and provides
|
@@ -21,7 +21,7 @@ Filesystem, Oracle and SQL Server are included.
|
|
21
21
|
|
22
22
|
Og is part of the Nitro project, released as a stand-alone library
|
23
23
|
due to popular demand. You can find the ChangeLog in the Nitro
|
24
|
-
distribution (http://www.
|
24
|
+
distribution (http://www.nitroproject.org).
|
25
25
|
|
26
26
|
|
27
27
|
== Features
|
@@ -73,19 +73,19 @@ doc/RELEASES
|
|
73
73
|
|
74
74
|
The latest version of Og can be found at
|
75
75
|
|
76
|
-
* http://www.
|
76
|
+
* http://www.nitroproject.org
|
77
77
|
|
78
78
|
== Documentation
|
79
79
|
|
80
80
|
Documentation for Og can be found at
|
81
81
|
|
82
|
-
* http://www.
|
82
|
+
* http://www.nitroproject.org
|
83
83
|
|
84
84
|
Don't forget to read the file doc/RELEASES for usefull
|
85
85
|
documentation bits. Also, have a look at the test cases in
|
86
86
|
the test directory for examples of usage. Additional examples
|
87
87
|
of Og usage can be found at the example distribution of the
|
88
|
-
Nitro Web Framework (http://www.
|
88
|
+
Nitro Web Framework (http://www.nitroproject.org)
|
89
89
|
|
90
90
|
You can find a nice tutorial at www.rubygarden.com. Be warned
|
91
91
|
that this tutorial describes an earlier version of Og. A *LOT*
|
@@ -170,7 +170,7 @@ http://rubyforge.org/mailman/listinfo/nitro-general
|
|
170
170
|
Copyright (c) 2004-2006, George 'gmosx' Moschovitis (http://www.gmosx.com).
|
171
171
|
Copyright (c) 2004-2006, Navel Ltd (http://www.navel.gr)
|
172
172
|
|
173
|
-
Og (http://www.
|
173
|
+
Og (http://www.nitroproject.org) is copyrighted free
|
174
174
|
software created and maintained by George Moschovitis (mailto:gm@navel.gr)
|
175
175
|
and released under the standard BSD Licence. For details consult
|
176
176
|
the file LICENCE.
|
data/doc/AUTHORS
CHANGED
@@ -30,6 +30,12 @@ IDEAS, ADDITIONAL CODING, SUPPORT:
|
|
30
30
|
* Ghislain Mary <gmary@lunacymaze.org>
|
31
31
|
Bug reports and patches (sqlite3 driver).
|
32
32
|
|
33
|
+
* Kashia Buch <kashia@vfemail.net>
|
34
|
+
Patches.
|
35
|
+
|
36
|
+
* Dylan Bruzenak <dylanb@digitalvalence.com>
|
37
|
+
Patches (kirby).
|
38
|
+
|
33
39
|
* Matt Bowen <matt.bowen@farweststeel.com>
|
34
40
|
Oracle driver, documentation.
|
35
41
|
|
data/doc/RELEASES
CHANGED
@@ -1,3 +1,39 @@
|
|
1
|
+
== Version 0.30.0
|
2
|
+
|
3
|
+
Another pragmatic release. The Nitro development team worked over
|
4
|
+
the submitted tickets and provided many bug fixes. More over, there
|
5
|
+
are many small improvements along the codebase and as always
|
6
|
+
we could not resist adding some cool new features.
|
7
|
+
|
8
|
+
Special thanks fly to Bryan Sotto for making this release
|
9
|
+
possible!
|
10
|
+
|
11
|
+
Most notable chages:
|
12
|
+
|
13
|
+
* Added Og query by example support. Query the database for an
|
14
|
+
entity that matches the example. The example is a hash
|
15
|
+
populated with the property values to search for.
|
16
|
+
|
17
|
+
The provided property values are joined with AND to build
|
18
|
+
the actual query.
|
19
|
+
|
20
|
+
Article.query_by_example :title => 'IBM%', :hits => 2
|
21
|
+
Article.find_with_properties :title => 'IBM%', :hits => 2
|
22
|
+
|
23
|
+
* Added type casting support for Og aggregations and
|
24
|
+
calculations.
|
25
|
+
|
26
|
+
* Added many more RDoc comments to the source code.
|
27
|
+
|
28
|
+
* Many, many bug fixes.
|
29
|
+
|
30
|
+
* Updated to latest Facets.
|
31
|
+
|
32
|
+
Please note that the project home page has been moved to:
|
33
|
+
|
34
|
+
http://www.nitroproject.org
|
35
|
+
|
36
|
+
|
1
37
|
== Version 0.29.0
|
2
38
|
|
3
39
|
A bold step towards maturity. Great care was taken to
|
data/lib/glue/hierarchical.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'glue/paramix'
|
1
|
+
require 'facets/more/paramix'
|
2
|
+
require 'facets/more/ormsupport'
|
4
3
|
|
5
4
|
module Glue
|
6
5
|
|
@@ -119,7 +118,7 @@ end
|
|
119
118
|
# === Example
|
120
119
|
#
|
121
120
|
# class Comment
|
122
|
-
#
|
121
|
+
# is Hierarchical, :method => :nested_sets
|
123
122
|
# end
|
124
123
|
#
|
125
124
|
# [+:method+]
|
data/lib/glue/orderable.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'facets/more/paramix'
|
2
|
+
require 'facets/more/aspects'
|
3
3
|
|
4
4
|
module Glue
|
5
5
|
|
6
6
|
# Attach list/ordering methods to the enchanted class.
|
7
7
|
|
8
8
|
module Orderable
|
9
|
-
include
|
9
|
+
include ::Aspects
|
10
10
|
|
11
11
|
def self.included_with_parameters(base, opt)
|
12
12
|
base.module_eval do
|
data/lib/glue/taggable.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'facet/inflect'
|
2
2
|
|
3
|
-
module Glue
|
4
|
-
|
5
3
|
# The default Tag implementation. A tag attaches semantics to
|
6
4
|
# a given object.
|
7
5
|
#--
|
@@ -83,6 +81,8 @@ class Tag
|
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
84
|
+
module Glue
|
85
|
+
|
86
86
|
# Add tagging methods to the target class.
|
87
87
|
# For more information on the algorithms used surf:
|
88
88
|
# http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html
|
@@ -170,20 +170,22 @@ module Taggable
|
|
170
170
|
# INTERSECTION (AND)
|
171
171
|
|
172
172
|
def find_with_tags(*names)
|
173
|
-
|
173
|
+
relation = relations.reject{|r| r.name != :tags}.first
|
174
|
+
info = ogmanager.store.join_table_info(relation)
|
174
175
|
count = names.size
|
175
176
|
names = names.map { |n| ogmanager.store.quote(n) }.join(',')
|
176
|
-
sql = %{
|
177
|
-
SELECT
|
178
|
-
FROM
|
179
|
-
|
180
|
-
|
181
|
-
#{info[:
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
177
|
+
sql = %{
|
178
|
+
SELECT *
|
179
|
+
FROM #{info[:owner_table]} AS o
|
180
|
+
WHERE o.oid IN (
|
181
|
+
SELECT j.#{info[:owner_key]}
|
182
|
+
FROM #{info[:target_table]} AS t
|
183
|
+
JOIN #{info[:table]} AS j
|
184
|
+
ON t.oid = j.#{info[:target_key]}
|
185
|
+
WHERE (t.name IN (#{names}))
|
186
|
+
GROUP BY j.#{info[:owner_key]}
|
187
|
+
HAVING COUNT(j.#{info[:owner_key]}) = #{count}
|
188
|
+
)
|
187
189
|
}
|
188
190
|
return self.select(sql)
|
189
191
|
end
|
@@ -193,20 +195,21 @@ module Taggable
|
|
193
195
|
# UNION (OR)
|
194
196
|
|
195
197
|
def find_with_any_tag(*names)
|
196
|
-
|
198
|
+
relation = relations.reject{|r| r.name != :tags}.first
|
199
|
+
info = ogmanager.store.join_table_info(relation)
|
197
200
|
count = names.size
|
198
201
|
names = names.map { |n| ogmanager.store.quote(n) }.join(',')
|
199
202
|
sql = %{
|
200
|
-
SELECT
|
201
|
-
FROM
|
202
|
-
|
203
|
-
|
204
|
-
#{info[:
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
203
|
+
SELECT *
|
204
|
+
FROM #{info[:owner_table]} AS o
|
205
|
+
WHERE o.oid IN (
|
206
|
+
SELECT j.#{info[:owner_key]}
|
207
|
+
FROM #{info[:target_table]} AS t
|
208
|
+
JOIN #{info[:table]} AS j
|
209
|
+
ON t.oid = j.#{info[:target_key]}
|
210
|
+
WHERE (t.name IN (#{names}))
|
211
|
+
GROUP BY j.#{info[:owner_key]}
|
212
|
+
)
|
210
213
|
}
|
211
214
|
return self.select(sql)
|
212
215
|
end
|
@@ -220,7 +223,7 @@ module Taggable
|
|
220
223
|
#--
|
221
224
|
# FIXME: Og should handle this automatically.
|
222
225
|
#++
|
223
|
-
base.send :include,
|
226
|
+
base.send :include, ::Aspects
|
224
227
|
base.before 'tags.clear', :on => [:og_delete]
|
225
228
|
end
|
226
229
|
|
data/lib/glue/timestamped.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'facet/time/stamp'
|
2
|
-
|
3
|
-
require 'glue/aspects'
|
2
|
+
require 'facets/more/aspects'
|
4
3
|
|
5
4
|
module Glue
|
6
5
|
|
7
6
|
# Adds timestamping functionality.
|
8
7
|
|
9
8
|
module Timestamped
|
10
|
-
include
|
9
|
+
include ::Aspects
|
11
10
|
|
12
11
|
property :create_time, Time, :control => :none
|
13
12
|
property :update_time, Time, :control => :none
|
@@ -27,7 +26,7 @@ end
|
|
27
26
|
# module.
|
28
27
|
|
29
28
|
module TimestampedOnCreate
|
30
|
-
include
|
29
|
+
include ::Aspects
|
31
30
|
property :create_time, Time, :control => :none
|
32
31
|
before "@create_time = Time.now", :on => :og_insert
|
33
32
|
end
|
data/lib/og.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
# = Og
|
2
2
|
#
|
3
|
-
# Copyright (c) 2004-
|
4
|
-
# Copyright (c) 2004-
|
3
|
+
# Copyright (c) 2004-2006, George Moschovitis (http://www.gmosx.com)
|
4
|
+
# Copyright (c) 2004-2006, Navel Ltd (http://www.navel.gr)
|
5
5
|
#
|
6
|
-
# Og (http://www.
|
6
|
+
# Og (http://www.nitroproject.org) is copyrighted free software
|
7
7
|
# created and maintained by George Moschovitis (mailto:gm@navel.gr)
|
8
8
|
# and released under the standard BSD Licence. For details
|
9
9
|
# consult the file doc/LICENCE.
|
10
10
|
|
11
11
|
require 'facet/synchash'
|
12
12
|
require 'facet/syncarray'
|
13
|
+
require 'facets/more/aspects'
|
13
14
|
|
14
15
|
require 'glue'
|
15
16
|
require 'glue/logger'
|
16
17
|
require 'glue/validation'
|
17
|
-
require 'glue/aspects'
|
18
18
|
require 'glue/configuration'
|
19
19
|
|
20
20
|
# Og (ObjectGraph) manages Ruby objects and their relations and
|
@@ -43,7 +43,7 @@ module Og
|
|
43
43
|
|
44
44
|
# The version.
|
45
45
|
|
46
|
-
Version = '0.
|
46
|
+
Version = '0.30.0'
|
47
47
|
|
48
48
|
# Library path.
|
49
49
|
|
@@ -92,8 +92,7 @@ module Og
|
|
92
92
|
setting :raise_store_exceptions, :default => true, :doc => 'If true raises exceptions on store errors'
|
93
93
|
|
94
94
|
# Enable/dissable thread safe mode.
|
95
|
-
|
96
|
-
#setting :thread_safe, :default => true, :doc => 'Enable/dissable thread safe mode'
|
95
|
+
# setting :thread_safe, :default => true, :doc => 'Enable/dissable thread safe mode'
|
97
96
|
|
98
97
|
# Address of the Og cache (if distributed caching enabled).
|
99
98
|
|
@@ -103,6 +102,11 @@ module Og
|
|
103
102
|
|
104
103
|
setting :cache_port, :default => '9070', :doc => 'Port of the Og cache'
|
105
104
|
|
105
|
+
# A collection of classes that are unmanageable, ie the manager
|
106
|
+
# should ignore them.
|
107
|
+
|
108
|
+
setting :unmanageable_classes, :default => [], :doc => 'Explicitly unmanageable classes'
|
109
|
+
|
106
110
|
# The active manager
|
107
111
|
|
108
112
|
mattr_accessor :manager
|
@@ -154,6 +158,7 @@ module Og
|
|
154
158
|
end
|
155
159
|
alias_method :connect, :setup
|
156
160
|
alias_method :options=, :setup
|
161
|
+
alias_method :setup=, :setup
|
157
162
|
alias_method :start, :setup
|
158
163
|
|
159
164
|
# Helper method.
|
@@ -162,10 +167,17 @@ module Og
|
|
162
167
|
@@manager.store.escape(str)
|
163
168
|
end
|
164
169
|
|
165
|
-
#
|
170
|
+
# Quote the string.
|
171
|
+
|
172
|
+
def quote(str)
|
173
|
+
@@manager.store.quote(str)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Change thread_safe mode.
|
177
|
+
|
166
178
|
def thread_safe=(bool)
|
167
179
|
@@thread_safe = bool
|
168
|
-
@@manager and @@manager.class.managers.each { |m| m.initialize_store }
|
180
|
+
# @@manager and @@manager.class.managers.each { |m| m.initialize_store }
|
169
181
|
@@thread_safe
|
170
182
|
end
|
171
183
|
end
|
data/lib/og/entity.rb
CHANGED
@@ -38,7 +38,7 @@ module EntityMixin
|
|
38
38
|
# don't pass.
|
39
39
|
|
40
40
|
def force_save!(options = nil)
|
41
|
-
self.class.ogmanager.store.force_save(self, options)
|
41
|
+
self.class.ogmanager.store.force_save!(self, options)
|
42
42
|
end
|
43
43
|
|
44
44
|
# Insert the object in the store.
|
@@ -158,6 +158,8 @@ module EntityMixin
|
|
158
158
|
ogmanager.store.update_by_sql(self, set, options)
|
159
159
|
end
|
160
160
|
|
161
|
+
# :section: Query methods.
|
162
|
+
|
161
163
|
# Find a specific instance of this class according
|
162
164
|
# to the given conditions.
|
163
165
|
#
|
@@ -215,11 +217,46 @@ module EntityMixin
|
|
215
217
|
ogmanager.store.select(sql, self)
|
216
218
|
end
|
217
219
|
|
218
|
-
# Select one instance using an
|
220
|
+
# Select one instance using an sql query.
|
219
221
|
|
220
222
|
def select_one(sql)
|
221
223
|
ogmanager.store.select_one(sql, self)
|
222
224
|
end
|
225
|
+
|
226
|
+
# Query the database for an entity that matches the example.
|
227
|
+
# The example is a hash populated with the property values
|
228
|
+
# to search for.
|
229
|
+
#
|
230
|
+
# The provided property values are joined with AND to build
|
231
|
+
# the actual query.
|
232
|
+
#
|
233
|
+
# Article.query_by_example :title => 'IBM%', :hits => 2
|
234
|
+
# Article.find_with_properties :title => 'IBM%', :hits => 2
|
235
|
+
|
236
|
+
def query_by_example(example)
|
237
|
+
condition = []
|
238
|
+
example.each do |k, v|
|
239
|
+
next if v.nil?
|
240
|
+
if v.is_a? String and v =~ /%/
|
241
|
+
condition << "#{k} LIKE #{Og.quote(v)}"
|
242
|
+
else
|
243
|
+
condition << "#{k} = #{Og.quote(v)}"
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
condition = condition.join(' AND ')
|
248
|
+
|
249
|
+
options = {
|
250
|
+
:condition => condition,
|
251
|
+
:class => self,
|
252
|
+
}
|
253
|
+
|
254
|
+
options[:type] = self if self.schema_inheritance_child?
|
255
|
+
|
256
|
+
ogmanager.store.find(options)
|
257
|
+
end
|
258
|
+
alias_method :qbe, :query_by_example
|
259
|
+
alias_method :find_with_properties, :query_by_example
|
223
260
|
|
224
261
|
# :section: Aggregations / Calculations
|
225
262
|
|
@@ -234,6 +271,7 @@ module EntityMixin
|
|
234
271
|
# Perform a count query.
|
235
272
|
|
236
273
|
def count(options = {})
|
274
|
+
options[:field] = '*'
|
237
275
|
calculate('COUNT(*)', options).to_i
|
238
276
|
end
|
239
277
|
|
@@ -241,6 +279,7 @@ module EntityMixin
|
|
241
279
|
# Pass a :group option to return an aggregation.
|
242
280
|
|
243
281
|
def minimum(min, options = {})
|
282
|
+
options[:field] = min
|
244
283
|
calculate("MIN(#{min})", options)
|
245
284
|
end
|
246
285
|
alias_method :min, :minimum
|
@@ -249,6 +288,7 @@ module EntityMixin
|
|
249
288
|
# Pass a :group option to return an aggregation.
|
250
289
|
|
251
290
|
def maximum(max, options = {})
|
291
|
+
options[:field] = max
|
252
292
|
calculate("MAX(#{max})", options)
|
253
293
|
end
|
254
294
|
alias_method :max, :maximum
|
@@ -257,6 +297,7 @@ module EntityMixin
|
|
257
297
|
# Pass a :group option to return an aggregation.
|
258
298
|
|
259
299
|
def average(avg, options = {})
|
300
|
+
options[:field] = avg
|
260
301
|
calculate("AVG(#{avg})", options)
|
261
302
|
end
|
262
303
|
alias_method :avg, :average
|
@@ -265,6 +306,7 @@ module EntityMixin
|
|
265
306
|
# Pass a :group option to return an aggregation.
|
266
307
|
|
267
308
|
def summarize(sum, options = {})
|
309
|
+
options[:field] = sum
|
268
310
|
calculate("SUM(#{sum})", options)
|
269
311
|
end
|
270
312
|
alias_method :sum, :summarize
|