mongodb-mongo 0.6.6 → 0.6.7

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/README.rdoc CHANGED
@@ -288,10 +288,6 @@ See the git log comments.
288
288
 
289
289
  = To Do
290
290
 
291
- * Add group_by. Need to figure out how we are going to send functions. The
292
- current thinking is that Mongo will allow a subset of JavaScript (which we
293
- would have to send as a string), but this is still under discussion.
294
-
295
291
  * Tests for update and repsert.
296
292
 
297
293
  * Add a way to specify a collection of databases on startup (a simple array of
data/Rakefile CHANGED
@@ -23,7 +23,7 @@ desc "Generate documentation"
23
23
  task :rdoc do
24
24
  version = eval(File.read("mongo-ruby-driver.gemspec")).version
25
25
  out = File.join('html', version.to_s)
26
- FileUtils.rm_rf(out)
26
+ FileUtils.rm_rf('html')
27
27
  system "rdoc --main README.rdoc --op #{out} --inline-source --quiet README.rdoc `find lib -name '*.rb'`"
28
28
  end
29
29
 
@@ -139,6 +139,48 @@ module XGen
139
139
  @db.drop_collection(@name)
140
140
  end
141
141
 
142
+ # Perform a query similar to an SQL group by operation.
143
+ #
144
+ # Returns an array of grouped items.
145
+ #
146
+ # :keys :: list of fields to group by
147
+ # :condition :: specification of rows to be considered (as a 'find'
148
+ # query specification)
149
+ # :initial :: initial value of the aggregation counter object
150
+ # :reduce :: aggregation function as a JavaScript string
151
+ def group(keys, condition, initial, reduce)
152
+ group_function = <<EOS
153
+ function () {
154
+ var c = db[ns].find(condition);
155
+ var map = new Map();
156
+ var reduce_function = #{reduce};
157
+ while (c.hasNext()) {
158
+ var obj = c.next();
159
+
160
+ var key = {};
161
+ for (var i in keys) {
162
+ key[keys[i]] = obj[keys[i]];
163
+ }
164
+
165
+ var aggObj = map[key];
166
+ if (aggObj == null) {
167
+ var newObj = Object.extend({}, key);
168
+ aggObj = map[key] = Object.extend(newObj, initial);
169
+ }
170
+ reduce_function(obj, aggObj);
171
+ }
172
+ return {"result": map.values()};
173
+ }
174
+ EOS
175
+ return @db.eval(Code.new(group_function,
176
+ {
177
+ "ns" => @name,
178
+ "keys" => keys,
179
+ "condition" => condition,
180
+ "initial" => initial
181
+ }))["result"]
182
+ end
183
+
142
184
  # Return an array of hashes, one for each index. Each hash contains:
143
185
  #
144
186
  # :name :: Index name
data/lib/mongo/db.rb CHANGED
@@ -372,6 +372,11 @@ module XGen
372
372
  raise "Error with count command: #{doc.inspect}"
373
373
  end
374
374
 
375
+ # Dereference a DBRef, getting the document it points to.
376
+ def dereference(dbref)
377
+ collection(dbref.namespace).find_first("_id" => dbref.object_id)
378
+ end
379
+
375
380
  # Evaluate a JavaScript expression on MongoDB.
376
381
  # +code+ should be a string or Code instance containing a JavaScript
377
382
  # expression. Additional arguments will be passed to that expression
@@ -85,7 +85,13 @@ class BSON
85
85
  @buf.put_int(0)
86
86
 
87
87
  # Write key/value pairs. Always write _id first if it exists.
88
- oid = obj['_id'] || obj[:_id]
88
+ if obj.has_key? '_id'
89
+ oid = obj['_id']
90
+ elsif obj.has_key? :_id
91
+ oid = obj[:_id]
92
+ else
93
+ oid = false
94
+ end
89
95
  serialize_key_value('_id', oid) if oid
90
96
  obj.each {|k, v| serialize_key_value(k, v) unless k == '_id' || k == :_id }
91
97
 
@@ -79,7 +79,7 @@ TEST_FILES = ['tests/mongo-qa/_common.rb',
79
79
 
80
80
  Gem::Specification.new do |s|
81
81
  s.name = 'mongo'
82
- s.version = '0.6.6'
82
+ s.version = '0.6.7'
83
83
  s.platform = Gem::Platform::RUBY
84
84
  s.summary = 'Ruby driver for the 10gen Mongo DB'
85
85
  s.description = 'A Ruby driver for the 10gen Mongo DB. For more information about Mongo, see http://www.mongodb.org.'
data/tests/test_db_api.rb CHANGED
@@ -522,6 +522,42 @@ class DBAPITest < Test::Unit::TestCase
522
522
  end
523
523
  end
524
524
 
525
+ def test_hash_default_value_id
526
+ val = Hash.new(0)
527
+ val["x"] = 5
528
+ @@coll.insert val
529
+ id = @@coll.find_first("x" => 5)["_id"]
530
+ assert id != 0
531
+ end
532
+
533
+ def test_group
534
+ @@db.drop_collection("test")
535
+ test = @@db.collection("test")
536
+
537
+ assert_equal [], test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")
538
+
539
+ test.insert("a" => 2)
540
+ test.insert("b" => 5)
541
+ test.insert("a" => 1)
542
+
543
+ assert_equal 3, test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
544
+ assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
545
+ end
546
+
547
+ def test_deref
548
+ @@coll.clear
549
+
550
+ assert_equal nil, @@db.dereference(DBRef.new("test", ObjectID.new))
551
+ obj = {"x" => true}
552
+ key = @@coll.insert(obj)["_id"]
553
+ assert_equal true, @@db.dereference(DBRef.new("test", key))["x"]
554
+
555
+ assert_equal nil, @@db.dereference(DBRef.new("test", 4))
556
+ obj = {"_id" => 4}
557
+ @@coll.insert(obj)
558
+ assert_equal obj, @@db.dereference(DBRef.new("test", 4))
559
+ end
560
+
525
561
  # TODO this test fails with error message "Undefed Before end of object"
526
562
  # That is a database error. The undefined type may go away.
527
563
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Menard