mongocore 0.4.4 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +2 -2
- data/lib/mongocore.rb +1 -1
- data/lib/mongocore/document.rb +8 -8
- data/lib/mongocore/query.rb +37 -24
- data/lib/mongocore/schema.rb +3 -3
- data/mongocore.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b7497f2ffc863157d942ced1f326b41a595ab1f
|
4
|
+
data.tar.gz: f65ce1925bc082ffa01b603f8975752c40960b8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8728af7535106eb8865794093c8cca1b44d20276864267760622b03a183a818b80d63fdd92fa37b53d344b2ff21fd4e1d62aeeebe87a7d6bcfaa043622bd80c
|
7
|
+
data.tar.gz: 49ba47e50f24a96ef3d3e4441145661e93c5651787fd02d9b4a4a4714a070ad2e5945815d36d9ee802a06a7a9868c6a613a5f45b0d2c025fa9e954a3075df5d8
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,15 @@
|
|
1
|
+
**Version 0.4.5** - *2018-01-23*
|
2
|
+
|
3
|
+
- Fixed memory bug with Mongocore.sort option
|
4
|
+
- Removed unused option
|
5
|
+
- Optimized cursor query
|
6
|
+
|
7
|
+
|
1
8
|
**Version 0.4.4** - *2018-01-19*
|
2
9
|
|
3
10
|
- Fixed dirty tracking clearing after save
|
4
11
|
|
12
|
+
|
5
13
|
**Version 0.4.3** - *2018-01-19*
|
6
14
|
|
7
15
|
- Reset model properly when doing a reload
|
data/README.md
CHANGED
@@ -134,13 +134,13 @@ Model.find(:duration => 50).each{|m| puts m}
|
|
134
134
|
m = Model.find(:house => {:$ne => nil, :$eq => 'Nice'}).last
|
135
135
|
|
136
136
|
# Sorting, use -1 for descending, 1 for ascending
|
137
|
-
m = Model.find({:duration => {:$gt => 40}},
|
137
|
+
m = Model.find({:duration => {:$gt => 40}}, :sort => {:duration => -1}).all
|
138
138
|
m = p.models.find(:duration => 10).sort(:duration => -1).first
|
139
139
|
|
140
140
|
# Limit, pass as third option to find or chain, up to you
|
141
141
|
p = Parent.find.sort(:duration => 1).limit(5).all
|
142
142
|
p = Parent.limit(1).last
|
143
|
-
m = p.models.find({},
|
143
|
+
m = p.models.find({}, :sort => {:goal => 1}, :limit => 1).first
|
144
144
|
m = Model.sort(:goal => 1, :duration => -1).limit(10).all
|
145
145
|
|
146
146
|
# First
|
data/lib/mongocore.rb
CHANGED
data/lib/mongocore/document.rb
CHANGED
@@ -161,13 +161,13 @@ module Mongocore
|
|
161
161
|
alias_method :new_record?, :unsaved?
|
162
162
|
|
163
163
|
# Short cut for setting up a Mongocore::Query object
|
164
|
-
def mq(m, q = {}, o = {}
|
165
|
-
Mongocore::Query.new(m, q,
|
164
|
+
def mq(m, q = {}, o = {})
|
165
|
+
Mongocore::Query.new(m, q, {:source => self}.merge(o))
|
166
166
|
end
|
167
167
|
|
168
168
|
# Short cut for query needing only id
|
169
|
-
def one(
|
170
|
-
mq(self.class, {:_id => @_id},
|
169
|
+
def one(o = {})
|
170
|
+
mq(self.class, {:_id => @_id}, o)
|
171
171
|
end
|
172
172
|
|
173
173
|
|
@@ -297,22 +297,22 @@ module Mongocore
|
|
297
297
|
|
298
298
|
# Sort
|
299
299
|
def sort(o = {})
|
300
|
-
find({},
|
300
|
+
find({}, :sort => o)
|
301
301
|
end
|
302
302
|
|
303
303
|
# Limit
|
304
304
|
def limit(n = 1)
|
305
|
-
find({},
|
305
|
+
find({}, :limit => n)
|
306
306
|
end
|
307
307
|
|
308
308
|
# Skip
|
309
309
|
def skip(n = 0)
|
310
|
-
find({},
|
310
|
+
find({}, :skip => n)
|
311
311
|
end
|
312
312
|
|
313
313
|
# Projection
|
314
314
|
def projection(o = {})
|
315
|
-
find({},
|
315
|
+
find({}, :projection => o)
|
316
316
|
end
|
317
317
|
alias_method :fields, :projection
|
318
318
|
|
data/lib/mongocore/query.rb
CHANGED
@@ -10,12 +10,12 @@ module Mongocore
|
|
10
10
|
# it's only the parameters that change.
|
11
11
|
#
|
12
12
|
|
13
|
-
attr_accessor :model, :collection, :colname, :query, :options, :
|
13
|
+
attr_accessor :model, :collection, :colname, :query, :options, :cache
|
14
14
|
|
15
15
|
# Mongocore query initializer
|
16
|
-
def initialize(m, q = {}, o = {}
|
16
|
+
def initialize(m, q = {}, o = {})
|
17
17
|
|
18
|
-
# Storing model class. The instance can be found in
|
18
|
+
# Storing model class. The instance can be found in options[:source]
|
19
19
|
@model = m
|
20
20
|
|
21
21
|
# The model name is singular, the collection name is plural
|
@@ -24,17 +24,24 @@ module Mongocore
|
|
24
24
|
# Storing the Mongo::Collection object
|
25
25
|
@collection = Mongocore.db[@colname]
|
26
26
|
|
27
|
+
# Default options
|
28
|
+
o[:source] ||= nil
|
29
|
+
o[:chain] ||= []
|
30
|
+
o[:skip] ||= 0
|
31
|
+
o[:limit] ||= 0
|
32
|
+
o[:sort] ||= Mongocore.sort.dup
|
33
|
+
o[:projection] ||= {}
|
34
|
+
|
27
35
|
# Storing query and options
|
28
|
-
|
29
|
-
@query, @options, @store = @model.schema.ids(hashify(q)), o, s
|
36
|
+
@query, @options = @model.schema.ids(hashify(q)), o
|
30
37
|
|
31
38
|
# Set up cache
|
32
39
|
@cache = Mongocore::Cache.new(self)
|
33
40
|
end
|
34
41
|
|
35
42
|
# Find. Returns a Mongocore::Query
|
36
|
-
def find(q = {}, o = {}
|
37
|
-
self.class.new(@model, @query.merge(hashify(q)), @options.merge(o)
|
43
|
+
def find(q = {}, o = {})
|
44
|
+
self.class.new(@model, @query.merge(hashify(q)), @options.merge(o))
|
38
45
|
end
|
39
46
|
alias_method :where, :find
|
40
47
|
|
@@ -45,12 +52,16 @@ module Mongocore
|
|
45
52
|
|
46
53
|
# Cursor
|
47
54
|
def cursor
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
o = @options.dup
|
56
|
+
|
57
|
+
# Remove blank options
|
58
|
+
o.delete(:skip) if o[:skip] < 1
|
59
|
+
o.delete(:limit) if o[:limit] < 1
|
60
|
+
o.delete(:sort) if o[:sort].empty?
|
61
|
+
o.delete(:projection) if o[:projection].empty?
|
62
|
+
|
63
|
+
# Return view
|
64
|
+
@collection.find(@query, o)
|
54
65
|
end
|
55
66
|
|
56
67
|
# Insert
|
@@ -80,7 +91,7 @@ module Mongocore
|
|
80
91
|
end
|
81
92
|
|
82
93
|
# Check if there's a corresponding counter for this count
|
83
|
-
def counter(s = @
|
94
|
+
def counter(s = @options[:source], c = @options[:chain])
|
84
95
|
s.send(%{#{@colname}#{c.present? ? "_#{c.join('_')}" : ''}_count}) rescue nil
|
85
96
|
end
|
86
97
|
|
@@ -107,16 +118,18 @@ module Mongocore
|
|
107
118
|
total = fetch(:count)
|
108
119
|
|
109
120
|
# Set page, defaults to 1
|
110
|
-
o[:page] = o[:page].to_i
|
121
|
+
o[:page] = o[:page].to_i
|
122
|
+
o[:page] = 1 if o[:page] < 1
|
111
123
|
|
112
124
|
# Set results per page, defaults to 20 in Mongocore.per_page setting
|
113
|
-
o[:per_page] = o[:per_page].to_i
|
125
|
+
o[:per_page] = o[:per_page].to_i
|
126
|
+
o[:per_page] = Mongocore.per_page if o[:per_page] < 1
|
114
127
|
|
115
128
|
# Skip results
|
116
|
-
@
|
129
|
+
@options[:skip] = o[:per_page] * (o[:page] - 1)
|
117
130
|
|
118
131
|
# Apply limit
|
119
|
-
@
|
132
|
+
@options[:limit] = o[:per_page]
|
120
133
|
|
121
134
|
# Fetch the result as array
|
122
135
|
all.tap{|r| r.total = total}
|
@@ -157,22 +170,22 @@ module Mongocore
|
|
157
170
|
|
158
171
|
# Sort
|
159
172
|
def sort(o = {})
|
160
|
-
find(@query, @options
|
173
|
+
find(@query, @options.tap{(@options[:sort] ||= {}).merge!(o)})
|
161
174
|
end
|
162
175
|
|
163
176
|
# Limit
|
164
177
|
def limit(n = 1)
|
165
|
-
find(@query, @options
|
178
|
+
find(@query, @options.tap{@options[:limit] = n})
|
166
179
|
end
|
167
180
|
|
168
181
|
# Skip
|
169
182
|
def skip(n = 0)
|
170
|
-
find(@query, @options
|
183
|
+
find(@query, @options.tap{@options[:skip] = n})
|
171
184
|
end
|
172
185
|
|
173
186
|
# Projection
|
174
187
|
def projection(o = {})
|
175
|
-
find(@query, @options
|
188
|
+
find(@query, @options.tap{@options[:projection].merge!(o)})
|
176
189
|
end
|
177
190
|
alias_method :fields, :projection
|
178
191
|
|
@@ -183,12 +196,12 @@ module Mongocore
|
|
183
196
|
|
184
197
|
# Cache key
|
185
198
|
def key
|
186
|
-
@key ||= "#{@model}#{@query.sort}#{@options.
|
199
|
+
@key ||= "#{@model}#{@query.sort}#{@options.values}"
|
187
200
|
end
|
188
201
|
|
189
202
|
# Call and return the scope if it exists
|
190
203
|
def method_missing(name, *arguments, &block)
|
191
|
-
return @model.send(name, @query, @options
|
204
|
+
return @model.send(name, @query, @options.tap{|r| r[:chain] << name}) if @model.schema.scopes.has_key?(name)
|
192
205
|
super
|
193
206
|
end
|
194
207
|
|
data/lib/mongocore/schema.rb
CHANGED
@@ -126,7 +126,7 @@ module Mongocore
|
|
126
126
|
def many(key)
|
127
127
|
t = %Q{
|
128
128
|
def #{key}
|
129
|
-
mq(#{key.to_s.singularize.capitalize}, {:#{@klass.to_s.downcase}_id => @_id},
|
129
|
+
mq(#{key.to_s.singularize.capitalize}, {:#{@klass.to_s.downcase}_id => @_id}, :source => self)
|
130
130
|
end
|
131
131
|
}
|
132
132
|
@klass.class_eval t
|
@@ -148,8 +148,8 @@ module Mongocore
|
|
148
148
|
# Define the scope method so we can call it
|
149
149
|
j = pm.any? ? %{#{pm.join(', ')},} : ''
|
150
150
|
t = %Q{
|
151
|
-
def #{key}(#{j} q = {}, o = {}
|
152
|
-
mq(self, q.merge(#{d}),
|
151
|
+
def #{key}(#{j} q = {}, o = {})
|
152
|
+
mq(self, q.merge(#{d}), {:scope => [:#{key}]}.merge(o))
|
153
153
|
end
|
154
154
|
}
|
155
155
|
@klass.instance_eval t
|
data/mongocore.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'mongocore'
|
3
|
-
s.version = '0.4.
|
4
|
-
s.date = '2018-01-
|
3
|
+
s.version = '0.4.5'
|
4
|
+
s.date = '2018-01-23'
|
5
5
|
s.summary = "MongoDB ORM implementation on top of the Ruby MongoDB driver"
|
6
6
|
s.description = "Does validations, associations, scopes, filters, pagination, counter cache, request cache, and nested queries. Using a YAML schema file, which supports default values, data types, and security levels for each key."
|
7
7
|
s.authors = ['Fugroup Limited']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongocore
|
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
|
- Fugroup Limited
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongo
|