mongo_mapper-unstable 2009.12.29 → 2009.12.30

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/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