mongo_mapper-unstable 2009.12.29 → 2009.12.30

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2009.12.29
1
+ 2009.12.30
@@ -8,10 +8,18 @@ module MongoMapper
8
8
  # useful for understanding how MongoMapper handles the parsing of finder
9
9
  # conditions and options.
10
10
  #
11
- # @private
12
11
  class FinderOptions
13
12
  OptionKeys = [:fields, :select, :skip, :offset, :limit, :sort, :order]
14
-
13
+
14
+ def self.normalized_field(field)
15
+ field.to_s == 'id' ? :_id : field
16
+ end
17
+
18
+ def self.normalized_order_direction(direction)
19
+ direction ||= 'ASC'
20
+ direction.upcase == 'ASC' ? 1 : -1
21
+ end
22
+
15
23
  def initialize(model, options)
16
24
  raise ArgumentError, "Options must be a hash" unless options.is_a?(Hash)
17
25
  options = options.symbolize_keys
@@ -58,14 +66,14 @@ module MongoMapper
58
66
  criteria = {}
59
67
 
60
68
  conditions.each_pair do |field, value|
61
- field = normalized_field(field)
69
+ field = self.class.normalized_field(field)
62
70
 
63
71
  if @model.object_id_key?(field) && value.is_a?(String)
64
72
  value = Mongo::ObjectID.from_string(value)
65
73
  end
66
74
 
67
75
  if field.is_a?(FinderOperator)
68
- criteria.merge!(field.to_criteria(value))
76
+ criteria.update(field.to_criteria(value))
69
77
  next
70
78
  end
71
79
 
@@ -86,10 +94,6 @@ module MongoMapper
86
94
  field.to_s =~ /^\$/
87
95
  end
88
96
 
89
- def normalized_field(field)
90
- field.to_s == 'id' ? :_id : field
91
- end
92
-
93
97
  # adds _type single collection inheritance scope for models that need it
94
98
  def add_sci_scope
95
99
  if @model.single_collection_inherited?
@@ -109,14 +113,20 @@ module MongoMapper
109
113
 
110
114
  def convert_order_to_sort(sort)
111
115
  return if sort.blank?
112
- pieces = sort.split(',')
113
- pieces.map { |s| to_mongo_sort_piece(s) }
116
+
117
+ if sort.respond_to?(:all?) && sort.all? { |s| s.respond_to?(:to_order) }
118
+ sort.map { |s| s.to_order }
119
+ elsif sort.respond_to?(:to_order)
120
+ [sort.to_order]
121
+ else
122
+ pieces = sort.split(',')
123
+ pieces.map { |s| to_mongo_sort_piece(s) }
124
+ end
114
125
  end
115
126
 
116
127
  def to_mongo_sort_piece(str)
117
128
  field, direction = str.strip.split(' ')
118
- direction ||= 'ASC'
119
- direction = direction.upcase == 'ASC' ? 1 : -1
129
+ direction = FinderOptions.normalized_order_direction(direction)
120
130
  [field, direction]
121
131
  end
122
132
  end
@@ -127,7 +137,17 @@ module MongoMapper
127
137
  end
128
138
 
129
139
  def to_criteria(value)
130
- {@field => {@operator => value}}
140
+ {FinderOptions.normalized_field(@field) => {@operator => value}}
141
+ end
142
+ end
143
+
144
+ class OrderOperator
145
+ def initialize(field, direction)
146
+ @field, @direction = field, direction
147
+ end
148
+
149
+ def to_order
150
+ [@field.to_s, FinderOptions.normalized_order_direction(@direction)]
131
151
  end
132
152
  end
133
153
  end
@@ -160,6 +160,9 @@ class Symbol
160
160
  MongoMapper::FinderOperator.new(self, "$#{operator}")
161
161
  end
162
162
  end
163
+
164
+ def asc; MongoMapper::OrderOperator.new(self, 'asc') end
165
+ def desc; MongoMapper::OrderOperator.new(self, 'desc') end
163
166
  end
164
167
 
165
168
  class Time
@@ -31,9 +31,7 @@ module MongoMapper
31
31
 
32
32
  def where_conditions(instance)
33
33
  conditions = {}
34
- unless case_sensitive
35
- conditions.merge!({'$where' => "this.#{attribute}.toLowerCase() == '#{instance[attribute].to_s.downcase}'"})
36
- end
34
+ conditions[attribute] = /#{instance[attribute].to_s}/i unless case_sensitive
37
35
  conditions
38
36
  end
39
37
  end
@@ -134,8 +134,8 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
134
134
 
135
135
  @hall = Room.create(:name => 'Hall')
136
136
  @hm1 = Message.create(:body => 'Do not fall in the hall', :position => 1)
137
- @hm2 = Message.create(:body => 'Hall the king!', :position => 2)
138
137
  @hm3 = Message.create(:body => 'Loungin!', :position => 3)
138
+ @hm2 = Message.create(:body => 'Hall the king!', :position => 2)
139
139
  @hall.messages = [@hm1, @hm2, @hm3]
140
140
  @hall.save
141
141
  end
@@ -270,7 +270,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
270
270
  end
271
271
 
272
272
  should "allow overriding the order provided to the association" do
273
- @lounge.messages.all(:order => 'position desc').should == [@lm2, @lm1]
273
+ @lounge.messages.all(:order => 'position').should == [@lm1, @lm2]
274
274
  end
275
275
 
276
276
  should "allow using conditions on association" do
@@ -5,7 +5,7 @@ class Test::Unit::TestCase
5
5
  end_time = Time.now
6
6
 
7
7
  duration = end_time - begin_time
8
- threshold = 0.5
8
+ threshold = 0.75
9
9
 
10
10
  if duration > threshold
11
11
  puts "\nSLOW TEST: #{duration} - #{self.name}"
@@ -61,6 +61,13 @@ class FinderOptionsTest < Test::Unit::TestCase
61
61
  FinderOptions.new(Room, :id => id).criteria.should == {:_id => id}
62
62
  end
63
63
 
64
+ should "convert id with symbol operator to _id with modifier" do
65
+ id = Mongo::ObjectID.new
66
+ FinderOptions.new(Room, :id.ne => id).criteria.should == {
67
+ :_id => {'$ne' => id}
68
+ }
69
+ end
70
+
64
71
  should "make sure that _id's are object ids" do
65
72
  id = Mongo::ObjectID.new
66
73
  FinderOptions.new(Room, :_id => id.to_s).criteria.should == {:_id => id}
@@ -121,6 +128,15 @@ class FinderOptionsTest < Test::Unit::TestCase
121
128
  FinderOptions.new(Room, :order => 'foo DESC').options[:sort].should == sort
122
129
  end
123
130
 
131
+ should "convert order operators to mongo sort" do
132
+ FinderOptions.new(Room, :order => :foo.asc).options[:sort].should == [['foo', 1]]
133
+ FinderOptions.new(Room, :order => :foo.desc).options[:sort].should == [['foo', -1]]
134
+ end
135
+
136
+ should "convert array of order operators to mongo sort" do
137
+ FinderOptions.new(Room, :order => [:foo.asc, :bar.desc]).options[:sort].should == [['foo', 1], ['bar', -1]]
138
+ end
139
+
124
140
  should "convert field without direction to ascending" do
125
141
  sort = [['foo', 1]]
126
142
  FinderOptions.new(Room, :order => 'foo').options[:sort].should == sort
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper-unstable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2009.12.29
4
+ version: 2009.12.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-29 00:00:00 -05:00
12
+ date: 2009-12-30 00:00:00 -05:00
13
13
  default_executable: mmconsole
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency