delta_force 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/.travis.yml +2 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/README.rdoc +11 -1
- data/lib/delta_force/change_proxy.rb +14 -1
- data/lib/delta_force/version.rb +1 -1
- data/pkg/delta_force-0.0.2.gem +0 -0
- data/test/test_active_record_integration.rb +12 -6
- metadata +9 -8
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm ree@deltaforce
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
delta_force (0.0.
|
4
|
+
delta_force (0.0.2)
|
5
5
|
activerecord (~> 2.3.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -14,6 +14,7 @@ GEM
|
|
14
14
|
factory_girl (1.3.3)
|
15
15
|
linecache (0.43)
|
16
16
|
pg (0.10.1)
|
17
|
+
rake (0.9.2)
|
17
18
|
ruby-debug (0.10.4)
|
18
19
|
columnize (>= 0.1)
|
19
20
|
ruby-debug-base (~> 0.10.4.0)
|
@@ -29,5 +30,6 @@ DEPENDENCIES
|
|
29
30
|
delta_force!
|
30
31
|
factory_girl
|
31
32
|
pg
|
33
|
+
rake
|
32
34
|
ruby-debug
|
33
35
|
shoulda
|
data/README.rdoc
CHANGED
@@ -4,6 +4,8 @@ DeltaForce allows you to use some Postgres 8.4+ window functions in named scopes
|
|
4
4
|
|
5
5
|
It is very much still a work in progress; please contribute if possible and let me know what I can do better!
|
6
6
|
|
7
|
+
{<img src="https://travis-ci.org/joelind/delta_force.png" />}[http://travis-ci.org/joelind/delta_force]
|
8
|
+
|
7
9
|
== Installing
|
8
10
|
|
9
11
|
<b>DeltaForce only works with Rails 2.3</b>. I will be adding Rails 3 compatibility shortly.
|
@@ -69,11 +71,19 @@ You can retrieve a set of modified Foo objects that have opening and closing val
|
|
69
71
|
|
70
72
|
Note that opening_* and closing_* values are not currently typecast. I'd like to support that in the future.
|
71
73
|
|
74
|
+
|
75
|
+
You can also retrieve a hash of the values for a given field *as of* the period as follows:
|
76
|
+
|
77
|
+
Foo.x_by_bar_id_as_of_period("2011-03-10")
|
78
|
+
=> {1=>2.0, 2=>4.0}
|
79
|
+
|
80
|
+
This hash contains the latest x on or before the specified period keyed by the bar_id.
|
81
|
+
|
72
82
|
== Under the hood
|
73
83
|
|
74
84
|
DeltaForce uses {Postgres 8.4+ window functions}[http://www.postgresql.org/docs/current/static/tutorial-window.html] to partition data by an arbitrary key.
|
75
85
|
|
76
|
-
This has been tested
|
86
|
+
This has been tested against Postgres 8.4 and should also work with Postgres 9. Oracle provides the same set of functions, but I have not been able to test it against an Oracle instance yet.
|
77
87
|
|
78
88
|
== Copyright
|
79
89
|
|
@@ -11,7 +11,8 @@ module DeltaForce
|
|
11
11
|
def values(*value_fields)
|
12
12
|
options = value_fields.extract_options!.symbolize_keys
|
13
13
|
|
14
|
-
|
14
|
+
partition_key = options[:by].to_s
|
15
|
+
partition_column = "#{table_name}.#{partition_key}"
|
15
16
|
id_column = "#{table_name}.id"
|
16
17
|
|
17
18
|
period_field_name = options[:over].to_s
|
@@ -41,6 +42,18 @@ module DeltaForce
|
|
41
42
|
first_value(#{period_column}) over #{window} as closing_#{period_field_name},
|
42
43
|
#{value_expressions.join ','}
|
43
44
|
"
|
45
|
+
|
46
|
+
value_fields.each do |value_field|
|
47
|
+
klass.class.send :define_method, "#{value_field}_by_#{options[:by].to_s}_as_of_#{options[:over].to_s}" do |period|
|
48
|
+
Hash[
|
49
|
+
scoped(
|
50
|
+
:select => "distinct #{partition_column},
|
51
|
+
first_value(#{table_name}.#{value_field.to_s}) over #{window} as #{value_field.to_s}",
|
52
|
+
:conditions => [ "#{period_column} <= ?", period]
|
53
|
+
).index_by(&partition_key.to_sym).map{|k,v| [k, v[value_field]]}
|
54
|
+
]
|
55
|
+
end
|
56
|
+
end
|
44
57
|
end
|
45
58
|
|
46
59
|
alias :value :values
|
data/lib/delta_force/version.rb
CHANGED
Binary file
|
@@ -15,18 +15,24 @@ class TestActiveRecordIntegration < Test::Unit::TestCase
|
|
15
15
|
context 'with foos for a given bar' do
|
16
16
|
setup do
|
17
17
|
@bar = Factory(:bar)
|
18
|
-
|
19
18
|
@foos = 3.times.collect do |i|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
end.flatten
|
19
|
+
Factory :foo, :bar => @bar, :period => (i+1).days.from_now.to_date,
|
20
|
+
:x => (i+1), :y => (i+1) * 10, :z => (i+1) * 100
|
21
|
+
end
|
25
22
|
|
26
23
|
#decoy foo
|
27
24
|
Factory :foo
|
28
25
|
end
|
29
26
|
|
27
|
+
context 'bar.foos.x_by_bar_id_as_of_period' do
|
28
|
+
should 'have the correct x' do
|
29
|
+
@foos.each do |foo|
|
30
|
+
result = @bar.foos.x_by_bar_id_as_of_period(foo.period)
|
31
|
+
assert_equal foo.x, result[@bar.id]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
30
36
|
context 'bar.foos.changes_in_x_and_y_and_z_by_bar_id_over_period' do
|
31
37
|
subject { @bar.foos.changes_in_x_and_y_and_z_by_bar_id_over_period }
|
32
38
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delta_force
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joe Lind
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-10-31 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: activerecord
|
@@ -102,6 +101,8 @@ extra_rdoc_files:
|
|
102
101
|
- README.rdoc
|
103
102
|
files:
|
104
103
|
- .gitignore
|
104
|
+
- .rvmrc
|
105
|
+
- .travis.yml
|
105
106
|
- Gemfile
|
106
107
|
- Gemfile.lock
|
107
108
|
- LICENSE
|
@@ -112,6 +113,7 @@ files:
|
|
112
113
|
- lib/delta_force/change_proxy.rb
|
113
114
|
- lib/delta_force/class_methods.rb
|
114
115
|
- lib/delta_force/version.rb
|
116
|
+
- pkg/delta_force-0.0.2.gem
|
115
117
|
- test/factories/bar.rb
|
116
118
|
- test/factories/foo.rb
|
117
119
|
- test/fixtures/bar.rb
|
@@ -119,7 +121,6 @@ files:
|
|
119
121
|
- test/fixtures/schema.rb
|
120
122
|
- test/helper.rb
|
121
123
|
- test/test_active_record_integration.rb
|
122
|
-
has_rdoc: true
|
123
124
|
homepage: http://github.com/joelind/delta_force
|
124
125
|
licenses: []
|
125
126
|
|
@@ -152,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
153
|
requirements: []
|
153
154
|
|
154
155
|
rubyforge_project: delta_force
|
155
|
-
rubygems_version: 1.
|
156
|
+
rubygems_version: 1.8.10
|
156
157
|
signing_key:
|
157
158
|
specification_version: 3
|
158
159
|
summary: ActiveRecord named scopes with Postgres window functions.
|