moped_mapping 0.0.1

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NTEwYmI1N2E2MGM0MjJkYTk3YTY0MjQ3YWNiNmNlYTRjMTAxNzA4MA==
5
+ data.tar.gz: !binary |-
6
+ NmI3OWU0N2E5YTM3ZDhhZTY2ZDExNmMzMDI2ZDg5NzA5ZTBjNzg5Mw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NGU5MTRhZGUzZjQwZGQ3NzUxYmE3Yjk1MTgwYzU0MTVhM2RkYmY3YjljYzdm
10
+ NDUwYzdmNWVmZTZlYjNjMGVhZjA2ODY4MDgyMzQyMDAwZGNmNjI5NWVhMzhm
11
+ YzRmZjAxNDc3MDQxMDhmODg3M2E2MTEzYTAxNGM1NGE1OTM4NDA=
12
+ data.tar.gz: !binary |-
13
+ NmE3OTk4MzZiOWMzZGU5YTdlZGI1ZDkwN2M1NDQwMGNiOTZhYWIxN2ZhMTU3
14
+ MmYwZDYzYzBjYzQ1MjU5ZmE5NDczNDViNDQ2YjkyYWJhODE3NTdiMTQxMzU0
15
+ ZDRlMWUwODRhYzY0NWY0NmIzZWE2ZTQ4MzU2ODY3ZjgxZmI5ZjM=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in moped_mapping.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (C) 2013 Groovenauts, inc.
2
+
3
+ This program is free software: you can redistribute it and/or modify
4
+ it under the terms of the GNU General Public License as published by
5
+ the Free Software Foundation; either version 3 of the License, or
6
+ (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License
14
+ along with this program. If not, see <http://www.gnu.org/licenses/>
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # MopedMapping
2
+
3
+ moped extension library to switch collection.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'moped_mapping'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install moped_mapping
18
+
19
+ ## Usage
20
+
21
+ ### Global switch
22
+
23
+ #### configuration
24
+
25
+ ```
26
+ MopedMapping.enable
27
+ ```
28
+
29
+ #### each action
30
+
31
+ ```
32
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
33
+ # actually this document will be inserted into items@3
34
+ session["items"].insert({some: "document"})
35
+ end
36
+ ```
37
+
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create new Pull Request
46
+
47
+ ## License
48
+
49
+ GPLv3
50
+
51
+ Copyright (C) 2013 Groovenauts, inc.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'moped_mapping'
3
+
4
+ module MopedMapping
5
+ module IndexesExt
6
+ def self.included(klass)
7
+ klass.module_eval do
8
+ alias_method :namespace_without_mapping, :namespace
9
+ alias_method :namespace, :namespace_with_mapping
10
+ end
11
+ end
12
+
13
+ def namespace_with_mapping
14
+ return @namespace unless MopedMapping.enabled
15
+ col_name = MopedMapping.mapped_name(database.name, collection_name)
16
+ "#{database.name}.#{col_name}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'moped_mapping'
3
+
4
+ module MopedMapping
5
+ module NodeExt
6
+ def self.included(klass)
7
+ klass.module_eval do
8
+ alias_method :query_without_mapping, :query
9
+ alias_method :query, :query_with_mapping
10
+ end
11
+ end
12
+
13
+ def query_with_mapping(database, collection, selector, options = {}, &block)
14
+ collection = MopedMapping.mapped_name(database, collection)
15
+ return query_without_mapping(database, collection, selector, options, &block)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,104 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'moped_mapping'
3
+
4
+ module MopedMapping
5
+ module SessionContextExt
6
+ def self.included(klass)
7
+ klass.module_eval do
8
+ %w[query insert update remove command].each do |m|
9
+ alias_method :"#{m}_without_mapping", m.to_sym
10
+ alias_method m.to_sym, :"#{m}_with_mapping"
11
+ end
12
+ end
13
+ end
14
+
15
+ def query_with_mapping(database, collection, selector, options = {}, &block)
16
+ collection = MopedMapping.mapped_name(database, collection)
17
+ return query_without_mapping(database, collection, selector, options, &block)
18
+ end
19
+
20
+ def insert_with_mapping(database, collection, documents, options = {}, &block)
21
+ collection = MopedMapping.mapped_name(database, collection)
22
+ return insert_without_mapping(database, collection, documents, options, &block)
23
+ end
24
+
25
+ def update_with_mapping(database, collection, selector, change, options = {}, &block)
26
+ collection = MopedMapping.mapped_name(database, collection)
27
+ return update_without_mapping(database, collection, selector, change, options, &block)
28
+ end
29
+
30
+ def remove_with_mapping(database, collection, selector, options = {}, &block)
31
+ collection = MopedMapping.mapped_name(database, collection)
32
+ return remove_without_mapping(database, collection, selector, options, &block)
33
+ end
34
+
35
+ # MongoDBのコマンド一覧
36
+ # http://docs.mongodb.org/manual/reference/command/
37
+
38
+ # MongoDBのコマンドのうち、コレクションを対象としたコマンド名
39
+ collection_command_names = [
40
+ # #aggregation-commands
41
+ :count, :aggregate, :distinct, # group # mapReduce
42
+ # #geospatial-commands
43
+ :geoNear, :geoSearch, # :geoWalk,
44
+ # #query-and-write-operation-commands
45
+ :findAndModify, # text
46
+ # #replication-commands
47
+ # #sharding-commands
48
+ :shardCollection,
49
+ # #instance-administration-commands
50
+ :drop, :create, # :convertToCapped,
51
+ :dropIndexes, :compact, :collMod, :reIndex,
52
+ :deleteIndexes,
53
+
54
+ # #diagnostic-commands
55
+ :collStats, :validate
56
+ ].freeze
57
+
58
+ COLLECTION_COMMAND_NAMES = (collection_command_names + collection_command_names.map(&:to_s).map(&:freeze)).freeze
59
+
60
+ command_args_array = [
61
+ # [:cloneCollection, :from], # このfromはホスト名を指定するので、対象外
62
+ [:cloneCollectionAsCapped, :toCollection],
63
+ ].map(&:freeze).freeze
64
+
65
+ COMMAND_ARGS_ARRAY = (
66
+ command_args_array +
67
+ command_args_array.map{|args| args.map(&:to_s).map(&:freeze).freeze }
68
+ ).freeze
69
+
70
+ full_name_command_names = [
71
+ :renameCollection, :to
72
+ ].freeze
73
+
74
+ FULL_NAME_COMMAND_NAMES = (full_name_command_names + full_name_command_names.map(&:to_s).map(&:freeze)).freeze
75
+
76
+ def command_with_mapping(database, command, &block)
77
+ done = false
78
+ COLLECTION_COMMAND_NAMES.each do |name|
79
+ next unless command.key?(name)
80
+ command[name] = MopedMapping.mapped_name(database, command[name])
81
+ done = true
82
+ break
83
+ end
84
+ unless done
85
+ COMMAND_ARGS_ARRAY.each do |args|
86
+ next unless command.key?(args.first)
87
+ args.each do |arg|
88
+ command[arg] = MopedMapping.mapped_name(database, command[arg])
89
+ end
90
+ done = true
91
+ break
92
+ end
93
+ end
94
+ unless done
95
+ FULL_NAME_COMMAND_NAMES.each do |name|
96
+ next unless command.key?(name)
97
+ command[name] = MopedMapping.mapped_full_name(database, command[name])
98
+ end
99
+ end
100
+ return command_without_mapping(database, command, &block)
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ module MopedMapping
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,80 @@
1
+ require "moped_mapping/version"
2
+
3
+ require 'moped'
4
+
5
+ module MopedMapping
6
+ extend self
7
+
8
+ attr_reader :enabled
9
+
10
+ def enable(&block) ; set_enabled(true , &block); end
11
+ def disable(&block); set_enabled(false, &block); end
12
+
13
+ def set_enabled(value)
14
+ if block_given?
15
+ bak, @enabled = @enabled, value
16
+ begin
17
+ yield
18
+ ensure
19
+ @enabled = bak
20
+ end
21
+ else
22
+ @enabled = value
23
+ end
24
+ end
25
+ private :set_enabled
26
+
27
+
28
+ def db_collection_map
29
+ t = Thread.current
30
+ result = t[:MopedMapping_db_collection_map]
31
+ unless result
32
+ result = nil
33
+ result = Thread.main[:MopedMapping_db_collection_map] unless t == Thread.main
34
+ result = result.dup if result
35
+ result ||= {}
36
+ t[:MopedMapping_db_collection_map] = result
37
+ end
38
+ result
39
+ end
40
+
41
+ def mapped_name(database, collection)
42
+ return collection unless MopedMapping.enabled
43
+ mapping = db_collection_map[database]
44
+ return collection unless mapping
45
+ return mapping[collection] || collection
46
+ end
47
+
48
+ def mapped_full_name(database, collection)
49
+ return collection unless MopedMapping.enabled
50
+ db, col = collection.split(/\./, 2)
51
+ return collection unless col
52
+ mapping = db_collection_map[db]
53
+ return collection unless mapping
54
+ mapped = mapping[col]
55
+ mapped ? "#{db}.#{mapped}" : collection
56
+ end
57
+
58
+ def collection_map(db_name, mapping)
59
+ if block_given?
60
+ bak, db_collection_map[db_name] = db_collection_map[db_name], mapping
61
+ begin
62
+ yield
63
+ ensure
64
+ db_collection_map[db_name] = bak
65
+ end
66
+ else
67
+ db_collection_map[db_name] = mapping
68
+ end
69
+ end
70
+
71
+ end
72
+
73
+
74
+ require "moped_mapping/session_context_ext"
75
+ require "moped_mapping/indexes_ext"
76
+ require "moped_mapping/node_ext"
77
+
78
+ Moped::Session::Context.send(:include, MopedMapping::SessionContextExt)
79
+ Moped::Indexes.send(:include, MopedMapping::IndexesExt)
80
+ Moped::Node.send(:include, MopedMapping::NodeExt)
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'moped_mapping/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "moped_mapping"
8
+ spec.version = MopedMapping::VERSION
9
+ spec.authors = ["akima"]
10
+ spec.email = ["akm2000@gmail.com"]
11
+ spec.description = %q{make mapping from moped collection object to MongoDB actual collection by using Hash}
12
+ spec.summary = %q{make mapping from moped collection object to MongoDB actual collection by using Hash}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.add_dependency "moped", "~> 1.5.0"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "tengine_support"
25
+ end
@@ -0,0 +1,6 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: moped_mapping_test
5
+ hosts:
6
+ - localhost:27017
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/support/yaml_with_erb'
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+
7
+ describe MopedMapping do
8
+
9
+ let(:config) do
10
+ YAML.load_file(File.expand_path("../../moped.config.yml", __FILE__))["test"].with_indifferent_access
11
+ end
12
+
13
+ describe "2d" do
14
+
15
+ before do
16
+ MopedMapping.disable
17
+ @session = Moped::Session.new(config[:sessions][:default][:hosts])
18
+ @database_name = config[:sessions][:default][:database]
19
+ @session.use(@database_name)
20
+ @session.tap do |s|
21
+ # コレクションの削除
22
+ s.collection_names.each{|col| s[col].drop }
23
+ # テスト用のデータの追加
24
+ s["points@1"].tap do |c|
25
+ c.insert(num: 1, loc: [ 0, 0])
26
+ c.insert(num: 2, loc: [10, 10])
27
+ c.insert(num: 3, loc: [20, 10])
28
+ c.insert(num: 4, loc: [10, 30])
29
+ c.indexes.create({loc: "2d"})
30
+ end
31
+ s["points@2"].tap do |c|
32
+ c.insert(num: 1, loc: [ 0, 0])
33
+ c.insert(num: 2, loc: [10, 10])
34
+ c.insert(num: 3, loc: [15, 5])
35
+ c.insert(num: 4, loc: [10, 20])
36
+ c.indexes.create({loc: "2d"})
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "geoNear" do
42
+ it do
43
+ MopedMapping.collection_map(@database_name,{"points" => "points@1" })
44
+ MopedMapping.enable
45
+ # {
46
+ # "ns"=>"moped_mapping_test.points@1", "near"=>"1100000010010011010011111010100010010011010011111010",
47
+ # "results"=>[
48
+ # {"dis"=>3.605551275463989 , "obj"=>{"_id"=>"51ebfa5a73b7f70994b28e99", "num"=>2, "loc"=>[10, 10] } },
49
+ # {"dis"=>7.280109889280518 , "obj"=>{"_id"=>"51ebfa5a73b7f70994b28e9a", "num"=>3, "loc"=>[20, 10] } },
50
+ # {"dis"=>15.264337522473747, "obj"=>{"_id"=>"51ebfa5a73b7f70994b28e98", "num"=>1, "loc"=>[ 0, 0] } },
51
+ # {"dis"=>22.20360331117452 , "obj"=>{"_id"=>"51ebfa5a73b7f70994b28e9b", "num"=>4, "loc"=>[10, 30] } }
52
+ # ],
53
+ # "stats"=>{"time"=>2, "btreelocs"=>0, "nscanned"=>4, "objectsLoaded"=>4, "avgDistance"=>12.088400499598194, "maxDistance"=>22.203616792998975},
54
+ # "ok"=>1.0
55
+ # }
56
+ target = [14, 8]
57
+ r = @session.command("geoNear" => "points", "near" => target)
58
+ r["ok"].should == 1
59
+ r["results"].map{|d| d["obj"]["num"]}.should == [2,3,1,4]
60
+ MopedMapping.collection_map(@database_name,{"points" => "points@2" }) do
61
+ r = @session.command("geoNear" => "points", "near" => target)
62
+ r["ok"].should == 1
63
+ r["results"].map{|d| d["obj"]["num"]}.should == [3,2,4,1]
64
+ end
65
+ r = @session.command("geoNear" => "points", "near" => target)
66
+ r["ok"].should == 1
67
+ r["results"].map{|d| d["obj"]["num"]}.should == [2,3,1,4]
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "Haystack index" do
73
+
74
+ # see http://docs.mongodb.org/manual/core/geohaystack/
75
+ before do
76
+ MopedMapping.disable
77
+ @session = Moped::Session.new(config[:sessions][:default][:hosts])
78
+ @database_name = config[:sessions][:default][:database]
79
+ @session.use(@database_name)
80
+ @session.tap do |s|
81
+ # コレクションの削除
82
+ s.collection_names.each{|col| s[col].drop }
83
+ # テスト用のデータの追加
84
+ s["places@1"].tap do |c|
85
+ c.insert({ _id: 100, pos: { lng: 126.9, lat: 35.2 } , type: "restaurant"})
86
+ c.insert({ _id: 200, pos: { lng: 127.5, lat: 36.1 } , type: "restaurant"})
87
+ c.insert({ _id: 300, pos: { lng: 128.0, lat: 36.7 } , type: "national park"})
88
+ c.indexes.create({pos: "geoHaystack", type: 1}, { bucketSize: 1 } )
89
+ end
90
+ s["places@2"].tap do |c|
91
+ c.insert({ _id: 100, pos: { lng: 106.9, lat: 25.2 } , type: "restaurant"})
92
+ c.insert({ _id: 200, pos: { lng: 127.5, lat: 36.1 } , type: "restaurant"})
93
+ c.insert({ _id: 300, pos: { lng: 128.0, lat: 36.7 } , type: "national park"})
94
+ c.indexes.create({pos: "geoHaystack", type: 1}, { bucketSize: 1 } )
95
+ end
96
+ end
97
+ end
98
+
99
+ describe :geoSearch do
100
+ it do
101
+ MopedMapping.collection_map(@database_name,{"places" => "places@1" })
102
+ MopedMapping.enable
103
+ target = [127.1, 35.6]
104
+ # {
105
+ # "results"=>[
106
+ # {"_id"=>100, "pos"=>{"lng"=>126.9, "lat"=>35.2}, "type"=>"restaurant"},
107
+ # {"_id"=>200, "pos"=>{"lng"=>127.5, "lat"=>36.1}, "type"=>"restaurant"}
108
+ # ],
109
+ # "stats"=>{"time"=>3, "btreeMatches"=>2, "n"=>2},
110
+ # "ok"=>1.0
111
+ # }
112
+ r = @session.command({geoSearch: "places",
113
+ search: { type: "restaurant" },
114
+ near: target,
115
+ maxDistance: 10 })
116
+ r["ok"].should == 1
117
+ r["results"].map{|d| d["_id"]}.should == [100, 200]
118
+ MopedMapping.collection_map(@database_name,{"places" => "places@2" }) do
119
+ r = @session.command({geoSearch: "places",
120
+ search: { type: "restaurant" },
121
+ near: target,
122
+ maxDistance: 10 })
123
+ r["ok"].should == 1
124
+ r["results"].map{|d| d["_id"]}.should == [200]
125
+ end
126
+ r = @session.command({geoSearch: "places",
127
+ search: { type: "restaurant" },
128
+ near: target,
129
+ maxDistance: 10 })
130
+ r["ok"].should == 1
131
+ r["results"].map{|d| d["_id"]}.should == [100, 200]
132
+ end
133
+ end
134
+ end
135
+
136
+ end
@@ -0,0 +1,112 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/support/yaml_with_erb'
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+
7
+ describe MopedMapping do
8
+
9
+ let(:config) do
10
+ YAML.load_file(File.expand_path("../../moped.config.yml", __FILE__))["test"].with_indifferent_access
11
+ end
12
+
13
+ describe "thread safe" do
14
+ before do
15
+ MopedMapping.disable
16
+ @session = Moped::Session.new(config[:sessions][:default][:hosts])
17
+ @database_name = config[:sessions][:default][:database]
18
+ @session.use(@database_name)
19
+ @session.tap do |s|
20
+ # コレクションの削除
21
+ s.collection_names.each{|col| s[col].drop }
22
+ # テスト用のデータの追加
23
+ s["test_logs@1"].tap do |c|
24
+ c.insert(num: 1)
25
+ c.insert(num: 2)
26
+ c.insert(num: 3)
27
+ c.insert(num: 4)
28
+ end
29
+ s["test_logs@2"].tap do |c|
30
+ c.insert(num: 1)
31
+ end
32
+ end
33
+ end
34
+
35
+ it "query@1 and insert@2 parallel" do
36
+ MopedMapping.enable
37
+ database_name = config[:sessions][:default][:database]
38
+ run_insert = true
39
+ query_thread = Thread.new do
40
+ MopedMapping.collection_map(@database_name,{"test_logs" => "test_logs@1" }) do
41
+ session1 = Moped::Session.new(config[:sessions][:default][:hosts])
42
+ session1.use(database_name)
43
+ 1000.times do
44
+ Thread.pass
45
+ begin
46
+ col = session1["test_logs"]
47
+ r = col.find.count
48
+ r.should == 4
49
+ rescue
50
+ run_insert = false
51
+ raise
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ insert_thread = Thread.new do
58
+ MopedMapping.collection_map(@database_name,{"test_logs" => "test_logs@2" }) do
59
+ session2 = Moped::Session.new(config[:sessions][:default][:hosts])
60
+ session2.use(database_name)
61
+ 1000.times do |idx|
62
+ Thread.pass
63
+ break unless run_insert
64
+ col = session2["test_logs"]
65
+ col.insert(num: idx + 2)
66
+ end
67
+ end
68
+ end
69
+ query_thread.join
70
+ insert_thread.join
71
+ end
72
+
73
+
74
+ it "query@1 and insert@2 parallel with default collection_map defined in main thread" do
75
+ MopedMapping.collection_map(@database_name,{"test_logs" => "test_logs@1" })
76
+ MopedMapping.enable
77
+ database_name = config[:sessions][:default][:database]
78
+ run_insert = true
79
+ query_thread = Thread.new do
80
+ session1 = Moped::Session.new(config[:sessions][:default][:hosts])
81
+ session1.use(database_name)
82
+ 1000.times do
83
+ Thread.pass
84
+ begin
85
+ col = session1["test_logs"]
86
+ r = col.find.count
87
+ r.should == 4
88
+ rescue
89
+ run_insert = false
90
+ raise
91
+ end
92
+ end
93
+ end
94
+
95
+ insert_thread = Thread.new do
96
+ MopedMapping.collection_map(@database_name,{"test_logs" => "test_logs@2" }) do
97
+ session2 = Moped::Session.new(config[:sessions][:default][:hosts])
98
+ session2.use(database_name)
99
+ 1000.times do |idx|
100
+ Thread.pass
101
+ break unless run_insert
102
+ col = session2["test_logs"]
103
+ col.insert(num: idx + 2)
104
+ end
105
+ end
106
+ end
107
+ query_thread.join
108
+ insert_thread.join
109
+ end
110
+ end
111
+
112
+ end
@@ -0,0 +1,581 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ require 'tengine/support/yaml_with_erb'
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+
7
+ describe MopedMapping do
8
+
9
+ let(:config) do
10
+ YAML.load_file(File.expand_path("../moped.config.yml", __FILE__))["test"].with_indifferent_access
11
+ end
12
+
13
+ before do
14
+ MopedMapping.disable
15
+ @session = Moped::Session.new(config[:sessions][:default][:hosts])
16
+ @database_name = config[:sessions][:default][:database]
17
+ @session.use(@database_name)
18
+ @session.tap do |s|
19
+ # コレクションの削除
20
+ s.collection_names.each{|col| s[col].drop }
21
+ # テスト用のデータの追加
22
+ s["items"].tap do |c|
23
+ c.insert(name: "foo", price: 100)
24
+ end
25
+ s["items@1"].tap do |c|
26
+ c.insert(name: "foo", price: 90)
27
+ c.insert(name: "bar", price: 200)
28
+ c.insert(name: "baz", price: 400)
29
+ end
30
+ s["items@2"].tap do |c|
31
+ c.insert(name: "foo", price: 80)
32
+ c.insert(name: "bar", price: 180)
33
+ c.insert(name: "baz", price: 350)
34
+ c.insert(name: "qux", price: 150)
35
+ end
36
+ s["items@3"].tap do |c|
37
+ c.insert(name: "bar", price: 180)
38
+ c.insert(name: "baz", price: 350)
39
+ c.insert(name: "qux", price: 400)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe :enable do
45
+ it "with block" do
46
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" })
47
+ col = @session["items"]
48
+ col.find.sort(price: -1).one["name"].should == "foo"
49
+ col.find.count.should == 1
50
+ MopedMapping.enable do
51
+ col.find.sort(price: -1).one["name"].should == "baz"
52
+ col.find.count.should == 3
53
+ end
54
+ col.find.sort(price: -1).one["name"].should == "foo"
55
+ col.find.count.should == 1
56
+ end
57
+
58
+ it "without block" do
59
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" })
60
+ col = @session["items"]
61
+ col.find.sort(price: -1).one["name"].should == "foo"
62
+ col.find.count.should == 1
63
+ MopedMapping.enable
64
+ col.find.sort(price: -1).one["name"].should == "baz"
65
+ col.find.count.should == 3
66
+ MopedMapping.disable
67
+ col.find.sort(price: -1).one["name"].should == "foo"
68
+ col.find.count.should == 1
69
+ end
70
+ end
71
+
72
+
73
+ describe :collection_map do
74
+ it "actual usage" do
75
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
76
+ MopedMapping.enable
77
+ col = @session["items"]
78
+ col.find.sort(price: -1).one["name"].should == "baz"
79
+ col.find.count.should == 4
80
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
81
+ col.find.sort(price: -1).one["name"].should == "qux"
82
+ col.find.count.should == 3
83
+ end
84
+ end
85
+ end
86
+
87
+ describe :create do
88
+ it "actual usage" do
89
+ MopedMapping.collection_map(@database_name,{"items" => "items@4" })
90
+ MopedMapping.enable
91
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3]
92
+ @session.command("create" => "items")
93
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3 items@4]
94
+ MopedMapping.collection_map(@database_name,{"items" => "items@5" }) do
95
+ @session.command("create" => "items")
96
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3 items@4 items@5]
97
+ end
98
+ end
99
+ end
100
+
101
+ describe :drop do
102
+ it "actual usage" do
103
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
104
+ MopedMapping.enable
105
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3]
106
+ col = @session["items"]
107
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
108
+ col.drop
109
+ @session.collection_names.should =~ %w[items items@1 items@2]
110
+ end
111
+ col.drop
112
+ @session.collection_names.should =~ %w[items items@1]
113
+ end
114
+ end
115
+
116
+
117
+ describe :renameCollection do
118
+ it "actual usage" do
119
+ MopedMapping.collection_map(@database_name,{"items" => "items@2", "products" => "products@2" })
120
+ MopedMapping.enable
121
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3]
122
+ # renameCollection では単なるコレクション名ではなく、 <ネームスペース名>.<コレクション名> を指定する必要があります
123
+ @session.with(database: :admin).command("renameCollection" => "#{@database_name}.items", "to" => "#{@database_name}.products")
124
+ @session.collection_names.should =~ %w[items items@1 products@2 items@3]
125
+ MopedMapping.collection_map(@database_name,{"items" => "items@3", "products" => "products@3" }) do
126
+ @session.with(database: :admin).command("renameCollection" => "#{@database_name}.items", "to" => "#{@database_name}.products")
127
+ @session.collection_names.should =~ %w[items items@1 products@2 products@3]
128
+ end
129
+ @session.collection_names.should =~ %w[items items@1 products@2 products@3]
130
+ end
131
+ end
132
+
133
+ describe :cloneCollectionAsCapped do
134
+ it "actual usage" do
135
+ MopedMapping.collection_map(@database_name,{"items" => "items@2", "products" => "products@2" })
136
+ MopedMapping.enable
137
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3]
138
+ @session.command("cloneCollectionAsCapped" => "items", "toCollection" => "products", "size" => 1024 * 1024)
139
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3 products@2]
140
+ MopedMapping.collection_map(@database_name,{"items" => "items@3", "products" => "products@3" }) do
141
+ @session.command("cloneCollectionAsCapped" => "items", "toCollection" => "products", "size" => 1024 * 1024)
142
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3 products@2 products@3]
143
+ end
144
+ @session.collection_names.should =~ %w[items items@1 items@2 items@3 products@2 products@3]
145
+ end
146
+ end
147
+
148
+
149
+ describe :distinct do
150
+ it "actual usage" do
151
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
152
+ MopedMapping.enable
153
+ col = @session["items"]
154
+ col.find.distinct(:name).should =~ %w[foo bar baz qux]
155
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
156
+ col.find.distinct(:name).should =~ %w[bar baz qux]
157
+ end
158
+ col.find.distinct(:name).should =~ %w[foo bar baz qux]
159
+ end
160
+ end
161
+
162
+ describe :findAndModify do
163
+ it "actual usage" do
164
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
165
+ MopedMapping.enable
166
+ col = @session["items"]
167
+ col.find(name: "bar").modify({"$set" => {price: 190}})
168
+ col.find(name: "bar").one["price"].should == 190
169
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
170
+ col.find(name: "bar").modify({"$set" => {price: 200}})
171
+ col.find(name: "bar").one["price"].should == 200
172
+ end
173
+ col.find(name: "bar").one["price"].should == 190
174
+ end
175
+ end
176
+
177
+
178
+
179
+
180
+ describe :create_index do
181
+ it "actual usage" do
182
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
183
+ MopedMapping.enable
184
+ col = @session["items"]
185
+ col.indexes.create({name: 1}, {name: "items_2_name"})
186
+ %w[items items@2].each do |col_name|
187
+ col.indexes[{"name" => 1}]["name"].should == "items_2_name"
188
+ end
189
+
190
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
191
+ col.indexes.create({"name" => 1}, {name: "items_3_name"})
192
+ %w[items items@2].each do |col_name|
193
+ col.indexes[{"name" => 1}]["name"].should == "items_3_name"
194
+ end
195
+ end
196
+
197
+ %w[items items@2].each do |col_name|
198
+ col.indexes[{"name" => 1}]["name"].should == "items_2_name"
199
+ end
200
+ end
201
+ end
202
+
203
+ describe :drop_index do
204
+ it "actual usage" do
205
+ %w[items items@1 items@2 items@3].each do |col_name|
206
+ col = @session[col_name]
207
+ col.indexes.create({name: 1}, {name: "#{col_name}_name"})
208
+ col.indexes.create({price: 1}, {name: "#{col_name}_price"})
209
+ end
210
+
211
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
212
+ MopedMapping.enable
213
+ col = @session["items"]
214
+ col.indexes.drop({"name" => 1})
215
+ %w[items items@2].each do |col_name|
216
+ col.indexes.to_a.map{|idx| idx["name"]}.should =~ ["_id_", "items@2_price"]
217
+ end
218
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
219
+ col = @session["items"]
220
+ col.indexes.drop({"price" => 1})
221
+ %w[items items@3].each do |col_name|
222
+ col.indexes.to_a.map{|idx| idx["name"]}.should =~ ["_id_", "items@3_name"]
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ describe :insert do
229
+ it do
230
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" })
231
+ MopedMapping.disable do
232
+ @session["items"].find.count.should == 1
233
+ @session["items@2"].find.count.should == 4
234
+ @session["items@3"].find.count.should == 3
235
+ end
236
+ MopedMapping.enable
237
+ col = @session["items"]
238
+ col.find.count.should == 4
239
+ col.insert({name: "quux", price: 500})
240
+ col.find.count.should == 5
241
+ @session["items"].find.count.should == 5
242
+ MopedMapping.disable do
243
+ @session["items"].find.count.should == 1
244
+ @session["items@2"].find.count.should == 5
245
+ @session["items@3"].find.count.should == 3
246
+ end
247
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
248
+ @session["items"].find.count.should == 3
249
+ end
250
+ end
251
+ end
252
+
253
+
254
+ describe :find_one do
255
+ it do
256
+ MopedMapping.disable do
257
+ @session["items" ].find(name: "foo").one["price"].should == 100
258
+ @session["items@1"].find(name: "foo").one["price"].should == 90
259
+ @session["items@2"].find(name: "foo").one["price"].should == 80
260
+ @session["items@3"].find(name: "foo").one.should == nil
261
+ end
262
+ MopedMapping.enable
263
+ col = @session["items"]
264
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
265
+ col.find(name: "foo").one["price"].should == 90
266
+ end
267
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
268
+ col.find(name: "foo").one["price"].should == 80
269
+ end
270
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
271
+ col.find(name: "foo").one.should == nil
272
+ end
273
+ end
274
+ end
275
+
276
+ def assert_item_prices(col, name_to_prices)
277
+ name_to_prices.each do |k,v|
278
+ begin
279
+ @session[col].find(name: k).one["price"].should == v
280
+ rescue
281
+ puts "[#{col}] #{k} => #{v}"
282
+ raise
283
+ end
284
+ end
285
+ end
286
+
287
+ describe :find_with_cursor do
288
+ it do
289
+ MopedMapping.enable
290
+ col = @session["items"]
291
+ cond = { price: {"$gte" => 100, "$lte" => 350} }
292
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
293
+ col.find(cond).sort(price: 1).map{|r| r["name"]}.should == %w[bar]
294
+ end
295
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
296
+ col.find(cond).sort(price: 1).map{|r| r["name"]}.should == %w[qux bar baz]
297
+ end
298
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
299
+ col.find(cond).sort(price: 1).map{|r| r["name"]}.should == %w[bar baz]
300
+ end
301
+ end
302
+ end
303
+
304
+
305
+ describe :update do
306
+ it "match just one" do
307
+ MopedMapping.enable
308
+ col = @session["items"]
309
+ change = {"$inc" => {price: 30}}
310
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
311
+ col.find(name: "foo").update(change)
312
+ end
313
+ MopedMapping.disable do
314
+ @session["items" ].find(name: "foo").one["price"].should == 100
315
+ @session["items@1"].find(name: "foo").one["price"].should == 120
316
+ @session["items@2"].find(name: "foo").one["price"].should == 80
317
+ @session["items@3"].find(name: "foo").one.should == nil
318
+ end
319
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
320
+ col.find(name: "foo").update(change)
321
+ end
322
+ MopedMapping.disable do
323
+ @session["items" ].find(name: "foo").one["price"].should == 100
324
+ @session["items@1"].find(name: "foo").one["price"].should == 120
325
+ @session["items@2"].find(name: "foo").one["price"].should == 110
326
+ @session["items@3"].find(name: "foo").one.should == nil
327
+ end
328
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
329
+ col.find(name: "foo").update(change)
330
+ end
331
+ MopedMapping.disable do
332
+ @session["items" ].find(name: "foo").one["price"].should == 100
333
+ @session["items@1"].find(name: "foo").one["price"].should == 120
334
+ @session["items@2"].find(name: "foo").one["price"].should == 110
335
+ @session["items@3"].find(name: "foo").one.should == nil
336
+ end
337
+ end
338
+
339
+ it "match some documents and does not use update_all but update" do
340
+ MopedMapping.disable do
341
+ {
342
+ "items@1" => {"foo" => 90, "bar" => 200, "baz" => 400},
343
+ "items@2" => {"foo" => 80, "bar" => 180, "baz" => 350, "qux" => 150},
344
+ "items@3" => { "bar" => 180, "baz" => 350, "qux" => 400},
345
+ }.each do |col, hash|
346
+ hash.each do |k,v|
347
+ @session[col].find(name: k).one["price"].should == v
348
+ end
349
+ end
350
+ end
351
+ MopedMapping.enable
352
+ col = @session["items"]
353
+ cond = { price: {"$gte" => 100, "$lte" => 350} }
354
+ change = {"$inc" => {price: 30}}
355
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
356
+ col.find(cond).update(change)
357
+ end
358
+ MopedMapping.disable do
359
+ {
360
+ "items@1" => {"foo" => 90, "bar" => 230, "baz" => 400},
361
+ "items@2" => {"foo" => 80, "bar" => 180, "baz" => 350, "qux" => 150},
362
+ "items@3" => { "bar" => 180, "baz" => 350, "qux" => 400},
363
+ }.each do |col, hash|
364
+ hash.each do |k,v|
365
+ @session[col].find(name: k).one["price"].should == v
366
+ end
367
+ end
368
+ end
369
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
370
+ col.find(cond).update(change)
371
+ end
372
+ MopedMapping.disable do
373
+ {
374
+ "items@1" => {"foo" => 90, "bar" => 230, "baz" => 400},
375
+ "items@2" => {"foo" => 80, "bar" => 210, "baz" => 350, "qux" => 150},
376
+ "items@3" => { "bar" => 180, "baz" => 350, "qux" => 400},
377
+ }.each do |col, hash|
378
+ hash.each do |k,v|
379
+ @session[col].find(name: k).one["price"].should == v
380
+ end
381
+ end
382
+ end
383
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
384
+ col.find(cond).update(change)
385
+ end
386
+ MopedMapping.disable do
387
+ {
388
+ "items@1" => {"foo" => 90, "bar" => 230, "baz" => 400},
389
+ "items@2" => {"foo" => 80, "bar" => 210, "baz" => 350, "qux" => 150},
390
+ "items@3" => { "bar" => 210, "baz" => 350, "qux" => 400},
391
+ }.each do |col, hash|
392
+ hash.each do |k,v|
393
+ @session[col].find(name: k).one["price"].should == v
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ it "match some documents and use update_all" do
400
+ MopedMapping.disable do
401
+ assert_item_prices "items@1", {"foo" => 90, "bar" => 200, "baz" => 400}
402
+ assert_item_prices "items@2", {"foo" => 80, "bar" => 180, "baz" => 350, "qux" => 150}
403
+ assert_item_prices "items@3", { "bar" => 180, "baz" => 350, "qux" => 400}
404
+ end
405
+ MopedMapping.enable
406
+ col = @session["items"]
407
+ cond = { price: {"$gte" => 100, "$lte" => 350} }
408
+ change = {"$inc" => {price: 30}}
409
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
410
+ col.find(cond).update_all(change)
411
+ end
412
+ MopedMapping.disable do
413
+ assert_item_prices "items@1", {"foo" => 90, "bar" => 230, "baz" => 400}
414
+ assert_item_prices "items@2", {"foo" => 80, "bar" => 180, "baz" => 350, "qux" => 150}
415
+ assert_item_prices "items@3", { "bar" => 180, "baz" => 350, "qux" => 400}
416
+ end
417
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
418
+ col.find(cond).update_all(change)
419
+ end
420
+ MopedMapping.disable do
421
+ assert_item_prices "items@1", {"foo" => 90, "bar" => 230, "baz" => 400}
422
+ assert_item_prices "items@2", {"foo" => 80, "bar" => 210, "baz" => 380, "qux" => 180}
423
+ assert_item_prices "items@3", { "bar" => 180, "baz" => 350, "qux" => 400}
424
+ end
425
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
426
+ col.find(cond).update_all(change)
427
+ end
428
+ MopedMapping.disable do
429
+ assert_item_prices "items@1", {"foo" => 90, "bar" => 230, "baz" => 400}
430
+ assert_item_prices "items@2", {"foo" => 80, "bar" => 210, "baz" => 380, "qux" => 180}
431
+ assert_item_prices "items@3", { "bar" => 210, "baz" => 380, "qux" => 400}
432
+ end
433
+ end
434
+
435
+ it "match just one and upsert" do
436
+ MopedMapping.enable
437
+ col = @session["items"]
438
+ change = {name: "foo", price: 60}
439
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
440
+ col.find(name: "foo").upsert(change)
441
+ end
442
+ MopedMapping.disable do
443
+ assert_item_prices "items@1", {"foo" => 60, "bar" => 200, "baz" => 400}
444
+ assert_item_prices "items@2", {"foo" => 80, "bar" => 180, "baz" => 350, "qux" => 150}
445
+ assert_item_prices "items@3", { "bar" => 180, "baz" => 350, "qux" => 400}
446
+ end
447
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
448
+ col.find(name: "foo").upsert(change)
449
+ end
450
+ MopedMapping.disable do
451
+ assert_item_prices "items@1", {"foo" => 60, "bar" => 200, "baz" => 400}
452
+ assert_item_prices "items@2", {"foo" => 60, "bar" => 180, "baz" => 350, "qux" => 150}
453
+ assert_item_prices "items@3", { "bar" => 180, "baz" => 350, "qux" => 400}
454
+ end
455
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
456
+ col.find(name: "foo").upsert(change)
457
+ end
458
+ MopedMapping.disable do
459
+ assert_item_prices "items@1", {"foo" => 60, "bar" => 200, "baz" => 400}
460
+ assert_item_prices "items@2", {"foo" => 60, "bar" => 180, "baz" => 350, "qux" => 150}
461
+ assert_item_prices "items@3", {"foo" => 60, "bar" => 180, "baz" => 350, "qux" => 400}
462
+ end
463
+ end
464
+
465
+ end
466
+
467
+
468
+ describe :remove do
469
+ it "match just one" do
470
+ MopedMapping.enable
471
+ col = @session["items"]
472
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
473
+ col.find(name: "foo").remove
474
+ end
475
+ MopedMapping.disable do
476
+ @session["items" ].find.count.should == 1
477
+ @session["items@1"].find.count.should == 2
478
+ @session["items@2"].find.count.should == 4
479
+ @session["items@3"].find.count.should == 3
480
+ end
481
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
482
+ col.find(name: "foo").remove
483
+ end
484
+ MopedMapping.disable do
485
+ @session["items" ].find.count.should == 1
486
+ @session["items@1"].find.count.should == 2
487
+ @session["items@2"].find.count.should == 3
488
+ @session["items@3"].find.count.should == 3
489
+ end
490
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
491
+ col.find(name: "foo").remove
492
+ end
493
+ MopedMapping.disable do
494
+ @session["items" ].find.count.should == 1
495
+ @session["items@1"].find.count.should == 2
496
+ @session["items@2"].find.count.should == 3
497
+ @session["items@3"].find.count.should == 3
498
+ end
499
+ end
500
+
501
+ it "match some documents and does not use remove_all but remove" do
502
+ MopedMapping.disable do
503
+ @session["items" ].find.count.should == 1
504
+ @session["items@1"].find.count.should == 3
505
+ @session["items@2"].find.count.should == 4
506
+ @session["items@3"].find.count.should == 3
507
+ end
508
+ MopedMapping.enable
509
+ col = @session["items"]
510
+ cond = { price: {"$gte" => 100, "$lte" => 350} }
511
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
512
+ col.find(cond).remove
513
+ end
514
+ MopedMapping.disable do
515
+ @session["items" ].find.count.should == 1
516
+ @session["items@1"].find.count.should == 2
517
+ @session["items@2"].find.count.should == 4
518
+ @session["items@3"].find.count.should == 3
519
+ end
520
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
521
+ col.find(cond).remove
522
+ end
523
+ MopedMapping.disable do
524
+ @session["items" ].find.count.should == 1
525
+ @session["items@1"].find.count.should == 2
526
+ @session["items@2"].find.count.should == 3
527
+ @session["items@3"].find.count.should == 3
528
+ end
529
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
530
+ col.find(cond).remove
531
+ end
532
+ MopedMapping.disable do
533
+ @session["items" ].find.count.should == 1
534
+ @session["items@1"].find.count.should == 2
535
+ @session["items@2"].find.count.should == 3
536
+ @session["items@3"].find.count.should == 2
537
+ end
538
+ end
539
+
540
+ it "match some documents and use remove_all" do
541
+ MopedMapping.disable do
542
+ @session["items" ].find.count.should == 1
543
+ @session["items@1"].find.count.should == 3
544
+ @session["items@2"].find.count.should == 4
545
+ @session["items@3"].find.count.should == 3
546
+ end
547
+ MopedMapping.enable
548
+ col = @session["items"]
549
+ cond = { price: {"$gte" => 100, "$lte" => 350} }
550
+ MopedMapping.collection_map(@database_name,{"items" => "items@1" }) do
551
+ col.find(cond).remove_all
552
+ end
553
+ MopedMapping.disable do
554
+ @session["items" ].find.count.should == 1
555
+ @session["items@1"].find.count.should == 2
556
+ @session["items@2"].find.count.should == 4
557
+ @session["items@3"].find.count.should == 3
558
+ end
559
+ MopedMapping.collection_map(@database_name,{"items" => "items@2" }) do
560
+ col.find(cond).remove_all
561
+ end
562
+ MopedMapping.disable do
563
+ @session["items" ].find.count.should == 1
564
+ @session["items@1"].find.count.should == 2
565
+ @session["items@2"].find.count.should == 1
566
+ @session["items@3"].find.count.should == 3
567
+ end
568
+ MopedMapping.collection_map(@database_name,{"items" => "items@3" }) do
569
+ col.find(cond).remove_all
570
+ end
571
+ MopedMapping.disable do
572
+ @session["items" ].find.count.should == 1
573
+ @session["items@1"].find.count.should == 2
574
+ @session["items@2"].find.count.should == 1
575
+ @session["items@3"].find.count.should == 1
576
+ end
577
+ end
578
+
579
+ end
580
+
581
+ end
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'moped_mapping'
4
+
5
+ Dir[File.expand_path("../support/**/*.rb", __FILE__)].each {|f| require f}
6
+
7
+ RSpec.configure do |config|
8
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moped_mapping
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - akima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: moped
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tengine_support
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: make mapping from moped collection object to MongoDB actual collection
70
+ by using Hash
71
+ email:
72
+ - akm2000@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - lib/moped_mapping.rb
83
+ - lib/moped_mapping/indexes_ext.rb
84
+ - lib/moped_mapping/node_ext.rb
85
+ - lib/moped_mapping/session_context_ext.rb
86
+ - lib/moped_mapping/version.rb
87
+ - moped_mapping.gemspec
88
+ - spec/moped.config.yml
89
+ - spec/moped_mapping/geospatial_spec.rb
90
+ - spec/moped_mapping/thread_safe_spec.rb
91
+ - spec/moped_mapping_spec.rb
92
+ - spec/spec_helper.rb
93
+ homepage: ''
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.0.3
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: make mapping from moped collection object to MongoDB actual collection by
117
+ using Hash
118
+ test_files:
119
+ - spec/moped.config.yml
120
+ - spec/moped_mapping/geospatial_spec.rb
121
+ - spec/moped_mapping/thread_safe_spec.rb
122
+ - spec/moped_mapping_spec.rb
123
+ - spec/spec_helper.rb
124
+ has_rdoc: