mongo_scope 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -9,6 +9,7 @@ begin
9
9
  gem.email = "mharris717@gmail.com"
10
10
  gem.homepage = "http://github.com/mharris717/mongo_scope"
11
11
  gem.authors = ["Mike Harris"]
12
+ gem.add_dependency 'mongo'
12
13
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
13
14
  end
14
15
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
data/lib/mongo_scope.rb CHANGED
@@ -1,6 +1,21 @@
1
1
  require 'rubygems'
2
2
  require File.join(File.dirname(__FILE__),'mongo_scope','util')
3
3
 
4
+ class SumBdy
5
+ def sum_by_raw(ops)
6
+ reduce_function = "function (obj, prev) { prev.count += (obj.#{ops[:sum_field]} ? obj.#{ops[:sum_field]} : 0); }"
7
+ code = Mongo::Code.new(reduce_function)
8
+ group([ops[:key]].flatten, ops[:filter]||{}, {"count" => 0},code)
9
+ end
10
+ def sum_by(ops)
11
+ sum_by_raw(ops).inject({}) { |h,a| k = ops[:key]; h.merge(a[k] => a['count'])}
12
+ end
13
+ end
14
+
15
+ class Mongo::Collection
16
+ #include SumBy
17
+ end
18
+
4
19
  module MongoScope
5
20
  module ScopeMethods
6
21
  def raw_scope(ops)
@@ -21,29 +36,69 @@ module MongoScope
21
36
  def count
22
37
  find.count
23
38
  end
39
+ def to_scoped
40
+ MongoScope::ScopedCollection.new(nil,self)
41
+ end
42
+ end
43
+
44
+ class ScopedCursor
45
+ attr_accessor :cursor
46
+ include FromHash
47
+ def each(&b)
48
+ cursor.each do |x|
49
+ yield(MongoRow.new(x))
50
+ end
51
+ end
52
+ def method_missing(sym,*args,&b)
53
+ cursor.send(sym,*args,&b)
54
+ end
55
+ end
56
+
57
+ class MongoRow
58
+ attr_accessor :h
59
+ def initialize(h)
60
+ @h = h
61
+ end
62
+ def method_missing(sym,*args,&b)
63
+ h.send(sym,*args,&b)
64
+ end
24
65
  end
25
66
 
26
67
  class ScopedCollection
27
68
  include ScopeMethods
28
69
  include CollMethods
70
+ #include SumBy
29
71
  attr_accessor :scope_obj, :coll
72
+ include Enumerable
30
73
  def initialize(scope_ops,coll)
31
- self.scope_obj = Scope.new(scope_ops)
74
+ self.scope_obj = (scope_ops ? Scope.new(scope_ops) : nil)
32
75
  self.coll = coll
33
76
  end
34
77
  def scoped_ops(ops)
78
+ return ops unless scope_obj
35
79
  ops = {'_id' => ops} unless ops.kind_of?(Hash)
36
80
  ops.merge(scope_obj.find_ops)
37
81
  end
38
82
  def find(selector={},options={})
39
- coll.find(scoped_ops(selector),options)
83
+ ScopedCursor.new(:cursor => coll.find(scoped_ops(selector),options))
40
84
  end
41
85
  def find_one(selector={},options={})
42
- coll.find_one(scoped_ops(selector),options)
86
+ res = coll.find_one(scoped_ops(selector),options)
87
+ res ? MongoRow.new(res) : res
88
+ end
89
+ def remove(ops={})
90
+ coll.remove(scoped_ops(ops))
43
91
  end
44
92
  def method_missing(sym,*args,&b)
45
93
  coll.send(sym,*args,&b)
46
94
  end
95
+ def each(&b)
96
+ coll.each(&b) #should this be scoped?
97
+ end
98
+ def group(k,filter,*args)
99
+ filter = scoped_ops(filter || {})
100
+ coll.group(k,filter,*args)
101
+ end
47
102
  end
48
103
 
49
104
  class Scope
@@ -17,7 +17,7 @@ describe "MongoScope" do
17
17
  before(:all) do
18
18
  @connection = Mongo::Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost', ENV['MONGO_RUBY_DRIVER_PORT'] || Mongo::Connection::DEFAULT_PORT)
19
19
  @db = @connection.db('ruby-mongo-test')
20
- @coll = @db.collection("test")
20
+ @coll = @db.collection("test").to_scoped
21
21
  end
22
22
  before(:each) do
23
23
  @coll.remove
@@ -64,5 +64,19 @@ describe "MongoScope" do
64
64
  it 'should save' do
65
65
  @coll.scope_eq(:first_name => 'Mike').save(:abc => 42)
66
66
  end
67
+ it 'scoped remove' do
68
+ @coll.scope_eq(:first_name => 'Mike').remove
69
+ @coll.count.should == 2
70
+ end
71
+ it 'scoped group' do
72
+ @coll.remove
73
+ # @coll.save('a' => 'a', 'b' => 1)
74
+ # @coll.save("a" => 'a', 'b' => 3)
75
+ # @coll.save('a' => 'b', 'b' => 2)
76
+ #
77
+ # @coll.sum_by(:key => 'a', :sum_field => 'b').should == {'a' => 4, 'b' => 2}
78
+ end
67
79
 
68
80
  end
81
+
82
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_scope
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Harris
@@ -9,10 +9,19 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-11 00:00:00 -05:00
12
+ date: 2010-04-15 00:00:00 -04:00
13
13
  default_executable:
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mongo
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
16
25
  description:
17
26
  email: mharris717@gmail.com
18
27
  executables: []