mongo_mapper_ign 0.7.4 → 0.7.6

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.
Files changed (102) hide show
  1. data/README.rdoc +1 -1
  2. data/lib/mongo_mapper.rb +5 -8
  3. data/lib/mongo_mapper/document.rb +24 -53
  4. data/lib/mongo_mapper/embedded_document.rb +1 -0
  5. data/lib/mongo_mapper/plugins.rb +1 -0
  6. data/lib/mongo_mapper/plugins/associations.rb +2 -1
  7. data/lib/mongo_mapper/plugins/associations/base.rb +5 -4
  8. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +2 -1
  9. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +2 -1
  10. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  11. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
  12. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +1 -0
  13. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
  14. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +2 -1
  15. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  16. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  17. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  18. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
  19. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +2 -1
  20. data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
  21. data/lib/mongo_mapper/plugins/callbacks.rb +1 -0
  22. data/lib/mongo_mapper/plugins/clone.rb +1 -0
  23. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  24. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  25. data/lib/mongo_mapper/plugins/equality.rb +4 -3
  26. data/lib/mongo_mapper/plugins/identity_map.rb +9 -7
  27. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  28. data/lib/mongo_mapper/plugins/keys.rb +50 -73
  29. data/lib/mongo_mapper/plugins/keys/key.rb +54 -0
  30. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  31. data/lib/mongo_mapper/plugins/modifiers.rb +10 -5
  32. data/lib/mongo_mapper/plugins/pagination.rb +1 -0
  33. data/lib/mongo_mapper/plugins/pagination/proxy.rb +4 -3
  34. data/lib/mongo_mapper/plugins/persistence.rb +1 -0
  35. data/lib/mongo_mapper/plugins/protected.rb +1 -0
  36. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  37. data/lib/mongo_mapper/plugins/serialization.rb +4 -3
  38. data/lib/mongo_mapper/plugins/timestamps.rb +2 -1
  39. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  40. data/lib/mongo_mapper/plugins/validations.rb +3 -2
  41. data/lib/mongo_mapper/query.rb +10 -129
  42. data/lib/mongo_mapper/support.rb +18 -39
  43. data/lib/mongo_mapper/support/descendant_appends.rb +1 -0
  44. data/lib/mongo_mapper/support/find.rb +1 -0
  45. data/lib/mongo_mapper/version.rb +2 -1
  46. metadata +32 -134
  47. data/.gitignore +0 -10
  48. data/Rakefile +0 -37
  49. data/mongo_mapper.gemspec +0 -214
  50. data/mongo_mapper_ign.gemspec +0 -217
  51. data/performance/read_write.rb +0 -52
  52. data/specs.watchr +0 -51
  53. data/test/NOTE_ON_TESTING +0 -1
  54. data/test/active_model_lint_test.rb +0 -13
  55. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
  56. data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
  57. data/test/functional/associations/test_in_array_proxy.rb +0 -325
  58. data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
  59. data/test/functional/associations/test_many_documents_proxy.rb +0 -536
  60. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
  61. data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
  62. data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
  63. data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
  64. data/test/functional/associations/test_one_proxy.rb +0 -196
  65. data/test/functional/test_associations.rb +0 -44
  66. data/test/functional/test_binary.rb +0 -27
  67. data/test/functional/test_callbacks.rb +0 -151
  68. data/test/functional/test_dirty.rb +0 -163
  69. data/test/functional/test_document.rb +0 -1219
  70. data/test/functional/test_embedded_document.rb +0 -210
  71. data/test/functional/test_identity_map.rb +0 -507
  72. data/test/functional/test_indexing.rb +0 -44
  73. data/test/functional/test_logger.rb +0 -20
  74. data/test/functional/test_modifiers.rb +0 -394
  75. data/test/functional/test_pagination.rb +0 -93
  76. data/test/functional/test_protected.rb +0 -163
  77. data/test/functional/test_string_id_compatibility.rb +0 -67
  78. data/test/functional/test_timestamps.rb +0 -64
  79. data/test/functional/test_userstamps.rb +0 -28
  80. data/test/functional/test_validations.rb +0 -342
  81. data/test/models.rb +0 -227
  82. data/test/support/custom_matchers.rb +0 -37
  83. data/test/support/timing.rb +0 -16
  84. data/test/test_helper.rb +0 -64
  85. data/test/unit/associations/test_base.rb +0 -212
  86. data/test/unit/associations/test_proxy.rb +0 -105
  87. data/test/unit/serializers/test_json_serializer.rb +0 -202
  88. data/test/unit/test_descendant_appends.rb +0 -71
  89. data/test/unit/test_document.rb +0 -225
  90. data/test/unit/test_dynamic_finder.rb +0 -123
  91. data/test/unit/test_embedded_document.rb +0 -657
  92. data/test/unit/test_keys.rb +0 -185
  93. data/test/unit/test_mongo_mapper.rb +0 -118
  94. data/test/unit/test_pagination.rb +0 -160
  95. data/test/unit/test_plugins.rb +0 -50
  96. data/test/unit/test_query.rb +0 -374
  97. data/test/unit/test_rails.rb +0 -181
  98. data/test/unit/test_rails_compatibility.rb +0 -52
  99. data/test/unit/test_serialization.rb +0 -51
  100. data/test/unit/test_support.rb +0 -382
  101. data/test/unit/test_time_zones.rb +0 -39
  102. data/test/unit/test_validations.rb +0 -544
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Inspect
@@ -1,6 +1,9 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Keys
5
+ autoload :Key, 'mongo_mapper/plugins/keys/key'
6
+
4
7
  def self.configure(model)
5
8
  model.key :_id, ObjectId
6
9
  end
@@ -17,15 +20,13 @@ module MongoMapper
17
20
  end
18
21
 
19
22
  def key(*args)
20
- key = Key.new(*args)
21
- keys[key.name] = key
22
-
23
- create_accessors_for(key)
24
- create_key_in_descendants(*args)
25
- create_indexes_for(key)
26
- create_validations_for(key)
27
-
28
- key
23
+ Key.new(*args).tap do |key|
24
+ keys[key.name] = key
25
+ create_accessors_for(key)
26
+ create_key_in_descendants(*args)
27
+ create_indexes_for(key)
28
+ create_validations_for(key)
29
+ end
29
30
  end
30
31
 
31
32
  def key?(key)
@@ -36,9 +37,12 @@ module MongoMapper
36
37
  object_id_key?(:_id)
37
38
  end
38
39
 
40
+ def object_id_keys
41
+ keys.keys.select { |key| keys[key].type == ObjectId }.map(&:to_sym)
42
+ end
43
+
39
44
  def object_id_key?(name)
40
- key = keys[name.to_s]
41
- key && key.type == ObjectId
45
+ object_id_keys.include?(name.to_sym)
42
46
  end
43
47
 
44
48
  def to_mongo(instance)
@@ -53,6 +57,7 @@ module MongoMapper
53
57
 
54
58
  # load is overridden in identity map to ensure same objects are loaded
55
59
  def load(attrs)
60
+ return nil if attrs.nil?
56
61
  begin
57
62
  klass = attrs['_type'].present? ? attrs['_type'].constantize : self
58
63
  klass.new(attrs, true)
@@ -62,14 +67,16 @@ module MongoMapper
62
67
  end
63
68
 
64
69
  private
65
- def accessors_module
66
- module_defined = if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
67
- const_defined?('MongoMapperKeys')
68
- else
69
- const_defined?('MongoMapperKeys', false)
70
- end
70
+ def key_accessors_module_defined?
71
+ if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
72
+ const_defined?('MongoMapperKeys')
73
+ else
74
+ const_defined?('MongoMapperKeys', false)
75
+ end
76
+ end
71
77
 
72
- if module_defined
78
+ def accessors_module
79
+ if key_accessors_module_defined?
73
80
  const_get 'MongoMapperKeys'
74
81
  else
75
82
  const_set 'MongoMapperKeys', Module.new
@@ -154,7 +161,7 @@ module MongoMapper
154
161
 
155
162
  if from_database
156
163
  @new = false
157
- self.attributes = attrs
164
+ load_from_database(attrs)
158
165
  else
159
166
  @new = true
160
167
  assign(attrs)
@@ -170,13 +177,11 @@ module MongoMapper
170
177
  def attributes=(attrs)
171
178
  return if attrs.blank?
172
179
 
173
- attrs.each_pair do |name, value|
174
- writer_method = "#{name}="
175
-
176
- if respond_to?(writer_method)
177
- self.send(writer_method, value)
180
+ attrs.each_pair do |key, value|
181
+ if respond_to?(:"#{key}=")
182
+ self.send(:"#{key}=", value)
178
183
  else
179
- self[name.to_s] = value
184
+ self[key] = value
180
185
  end
181
186
  end
182
187
  end
@@ -255,6 +260,17 @@ module MongoMapper
255
260
  end
256
261
 
257
262
  private
263
+ def load_from_database(attrs)
264
+ return if attrs.blank?
265
+ attrs.each do |key, value|
266
+ if respond_to?(:"#{key}=") && !self.class.key?(key)
267
+ self.send(:"#{key}=", value)
268
+ else
269
+ self[key] = value
270
+ end
271
+ end
272
+ end
273
+
258
274
  def default_id_value(attrs)
259
275
  unless attrs.nil?
260
276
  provided_keys = attrs.keys.map { |k| k.to_s }
@@ -278,68 +294,29 @@ module MongoMapper
278
294
  end
279
295
  end
280
296
 
281
- def read_key(name)
282
- if key = keys[name]
283
- var_name = "@#{name}"
284
- value = key.get(instance_variable_get(var_name))
297
+ def read_key(key_name)
298
+ if key = keys[key_name]
299
+ value = key.get(instance_variable_get(:"@#{key_name}"))
285
300
  set_parent_document(key, value)
286
- instance_variable_set(var_name, value)
301
+ instance_variable_set(:"@#{key_name}", value)
287
302
  else
288
- raise KeyNotFound, "Could not find key: #{name.inspect}"
303
+ raise KeyNotFound, "Could not find key: #{key_name.inspect}"
289
304
  end
290
305
  end
291
306
 
292
307
  def read_key_before_typecast(name)
293
- instance_variable_get("@#{name}_before_typecast")
308
+ instance_variable_get(:"@#{name}_before_typecast")
294
309
  end
295
310
 
296
311
  def write_key(name, value)
297
- key = keys[name]
298
-
312
+ key = keys[name.to_s]
299
313
  set_parent_document(key, value)
300
- instance_variable_set "@#{name}_before_typecast", value
301
- instance_variable_set "@#{name}", key.set(value)
314
+ instance_variable_set :"@#{name}_before_typecast", value
315
+ instance_variable_set :"@#{name}", key.set(value)
302
316
  end
303
317
  end
304
318
 
305
- class Key
306
- attr_accessor :name, :type, :options, :default_value
307
-
308
- def initialize(*args)
309
- options = args.extract_options!
310
- @name, @type = args.shift.to_s, args.shift
311
- self.options = (options || {}).symbolize_keys
312
- self.default_value = self.options.delete(:default)
313
- end
314
-
315
- def ==(other)
316
- @name == other.name && @type == other.type
317
- end
318
-
319
- def embeddable?
320
- type.respond_to?(:embeddable?) && type.embeddable? ? true : false
321
- end
322
-
323
- def number?
324
- [Integer, Float].include?(type)
325
- end
326
319
 
327
- def get(value)
328
- if value.nil? && !default_value.nil?
329
- if default_value.respond_to?(:call)
330
- return default_value.call
331
- else
332
- return default_value
333
- end
334
- end
335
-
336
- type.from_mongo(value)
337
- end
338
-
339
- def set(value)
340
- type.to_mongo(value)
341
- end
342
- end
343
320
  end
344
321
  end
345
322
  end
@@ -0,0 +1,54 @@
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Keys
5
+ class Key
6
+ attr_accessor :name, :type, :options, :default_value
7
+
8
+ def initialize(*args)
9
+ options = args.extract_options!
10
+ @name, @type = args.shift.to_s, args.shift
11
+ self.options = (options || {}).symbolize_keys
12
+ self.default_value = self.options[:default]
13
+ end
14
+
15
+ def ==(other)
16
+ @name == other.name && @type == other.type
17
+ end
18
+
19
+ def embeddable?
20
+ type.respond_to?(:embeddable?) && type.embeddable? ? true : false
21
+ end
22
+
23
+ def number?
24
+ [Integer, Float].include?(type)
25
+ end
26
+
27
+ def get(value)
28
+ if value.nil? && !default_value.nil?
29
+ if default_value.respond_to?(:call)
30
+ return default_value.call
31
+ else
32
+ return default_value
33
+ end
34
+ end
35
+
36
+ type.from_mongo(value)
37
+ end
38
+
39
+ def set(value)
40
+ type.to_mongo(value).tap do |values|
41
+ if options[:typecast].present?
42
+ values.map! { |v| typecast_class.to_mongo(v) }
43
+ end
44
+ end
45
+ end
46
+
47
+ private
48
+ def typecast_class
49
+ options[:typecast].constantize
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Logger
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Modifiers
@@ -14,7 +15,11 @@ module MongoMapper
14
15
  end
15
16
 
16
17
  def set(*args)
17
- modifier_update('$set', args)
18
+ criteria, updates = criteria_and_keys_from_args(args)
19
+ updates.each do |key, value|
20
+ updates[key] = keys[key].set(value) if key?(key)
21
+ end
22
+ collection.update(criteria, {'$set' => updates}, :multi => true)
18
23
  end
19
24
 
20
25
  def unset(*args)
@@ -25,7 +30,7 @@ module MongoMapper
25
30
  criteria = {:id => ids}
26
31
  end
27
32
 
28
- criteria = to_criteria(criteria)
33
+ criteria = query(criteria).criteria.to_hash
29
34
  modifiers = keys.inject({}) { |hash, key| hash[key] = 1; hash }
30
35
  collection.update(criteria, {'$unset' => modifiers}, :multi => true)
31
36
  end
@@ -57,14 +62,14 @@ module MongoMapper
57
62
 
58
63
  private
59
64
  def modifier_update(modifier, args)
60
- criteria, keys = criteria_and_keys_from_args(args)
61
- collection.update(criteria, {modifier => keys}, :multi => true)
65
+ criteria, updates = criteria_and_keys_from_args(args)
66
+ collection.update(criteria, {modifier => updates}, :multi => true)
62
67
  end
63
68
 
64
69
  def criteria_and_keys_from_args(args)
65
70
  keys = args.pop
66
71
  criteria = args[0].is_a?(Hash) ? args[0] : {:id => args}
67
- [to_criteria(criteria), keys]
72
+ [query(criteria).criteria.to_hash, keys]
68
73
  end
69
74
  end
70
75
 
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Pagination
@@ -1,9 +1,10 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Pagination
4
5
  class Proxy
5
6
  instance_methods.each { |m| undef_method m unless m =~ /(^__|^nil\?$|^send$|respond_to\?|proxy_|^object_id$)/ }
6
-
7
+
7
8
  attr_accessor :subject
8
9
  attr_reader :total_entries, :per_page, :current_page
9
10
  alias limit per_page
@@ -50,11 +51,11 @@ module MongoMapper
50
51
  def method_missing(name, *args, &block)
51
52
  @subject.send(name, *args, &block)
52
53
  end
53
-
54
+
54
55
  def respond_to?(name, *args, &block)
55
56
  super || @subject.respond_to?(name, *args, &block)
56
57
  end
57
-
58
+
58
59
  private
59
60
  def per_page=(value)
60
61
  value = 25 if value.blank?
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Persistence
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Protected
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Rails
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require 'active_support/json'
2
3
 
3
4
  module MongoMapper
@@ -6,7 +7,7 @@ module MongoMapper
6
7
  def self.configure(model)
7
8
  model.class_eval { cattr_accessor :include_root_in_json, :instance_writer => true }
8
9
  end
9
-
10
+
10
11
  module InstanceMethods
11
12
  def to_xml(options = {}, &block)
12
13
  options[:dasherize] = false unless options.has_key?(:dasherize)
@@ -49,7 +50,7 @@ module MongoMapper
49
50
  }
50
51
  end
51
52
  # End rip
52
-
53
+
53
54
  options.delete(:only) if options[:only].nil? or options[:only].empty?
54
55
 
55
56
  hash.each do |key, value|
@@ -63,7 +64,7 @@ module MongoMapper
63
64
  hash[key] = value.as_json(options)
64
65
  end
65
66
  end
66
-
67
+
67
68
  # Replicate Rails 3 naming - and also bin anytihng after : for use in our dynamic classes from unit tests
68
69
  hash = { ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).gsub(/:.*/,'') => hash } if include_root_in_json
69
70
  hash
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Timestamps
@@ -8,7 +9,7 @@ module MongoMapper
8
9
  class_eval { before_save :update_timestamps }
9
10
  end
10
11
  end
11
-
12
+
12
13
  module InstanceMethods
13
14
  def update_timestamps
14
15
  now = Time.now.utc
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Userstamps
@@ -1,16 +1,17 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Validations
4
5
  def self.configure(model)
5
6
  model.class_eval { include Validatable }
6
7
  end
7
-
8
+
8
9
  module DocumentMacros
9
10
  def validates_uniqueness_of(*args)
10
11
  add_validations(args, MongoMapper::Plugins::Validations::ValidatesUniquenessOf)
11
12
  end
12
13
  end
13
-
14
+
14
15
  class ValidatesUniquenessOf < Validatable::ValidationBase
15
16
  option :scope, :case_sensitive
16
17
  default :case_sensitive => true
@@ -1,143 +1,24 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
- # IMPORTANT
3
- # This class is private to MongoMapper and should not be considered part of MongoMapper's public API.
4
- #
5
3
  class Query
6
- OptionKeys = [:fields, :select, :skip, :offset, :limit, :sort, :order]
7
-
8
- attr_reader :model
9
-
10
- def initialize(model, options)
4
+ def initialize(model, options={})
11
5
  raise ArgumentError, "Options must be a hash" unless options.is_a?(Hash)
12
- @model, @options, @conditions, @original_options = model, {}, {}, options
13
- separate_options_and_conditions
6
+ @model, @options, @conditions = model, {}, {}
7
+ query.update(options)
14
8
  add_sci_condition
15
9
  end
16
10
 
17
- def criteria
18
- to_criteria(@conditions)
19
- end
20
-
21
- def options
22
- fields = @options[:fields] || @options[:select]
23
- skip = @options[:skip] || @options[:offset] || 0
24
- limit = @options[:limit] || 0
25
- sort = @options[:sort] || normalized_sort(@options[:order])
26
-
27
- {:fields => to_fields(fields), :skip => skip.to_i, :limit => limit.to_i, :sort => sort}
28
- end
29
-
30
- def to_a
31
- [criteria, options]
32
- end
33
-
34
11
  private
35
- def separate_options_and_conditions
36
- @original_options.each_pair do |key, value|
37
- key = key.respond_to?(:to_sym) ? key.to_sym : key
38
-
39
- if OptionKeys.include?(key)
40
- @options[key] = value
41
- elsif key == :conditions
42
- @conditions.update(value)
43
- else
44
- @conditions[key] = value
45
- end
46
- end
12
+ def method_missing(method, *args, &block)
13
+ query.send(method, *args, &block)
47
14
  end
48
15
 
49
- # adds _type single collection inheritance scope for models that need it
50
- def add_sci_condition
51
- @conditions[:_type] = model.to_s if model.single_collection_inherited?
16
+ def query
17
+ @query ||= Plucky::Query.new(@model.collection).object_ids(@model.object_id_keys)
52
18
  end
53
19
 
54
- def modifier?(field)
55
- field.to_s =~ /^\$/
56
- end
57
-
58
- def symbol_operator?(object)
59
- object.respond_to?(:field, :operator)
60
- end
61
-
62
- def to_criteria(conditions, parent_key=nil)
63
- criteria = {}
64
-
65
- conditions.each_pair do |key, value|
66
- key = normalized_key(key)
67
-
68
- if model.object_id_key?(key)
69
- case value
70
- when String
71
- value = ObjectId.to_mongo(value)
72
- when Array
73
- value.map! { |id| ObjectId.to_mongo(id) }
74
- end
75
- end
76
-
77
- if symbol_operator?(key)
78
- key, value = normalized_key(key.field), {"$#{key.operator}" => value}
79
- end
80
-
81
- criteria[key] = normalized_value(criteria, key, value)
82
- end
83
-
84
- criteria
85
- end
86
-
87
- def to_fields(keys)
88
- return keys if keys.is_a?(Hash)
89
- return nil if keys.blank?
90
-
91
- if keys.respond_to?(:flatten, :compact)
92
- keys.flatten.compact
93
- else
94
- keys.split(',').map { |key| key.strip }
95
- end
96
- end
97
-
98
- def to_order(key, direction=nil)
99
- [normalized_key(key).to_s, normalized_direction(direction)]
100
- end
101
-
102
- def normalized_key(key)
103
- key.to_s == 'id' ? :_id : key
104
- end
105
-
106
- # TODO: this is getting heavy enough to move to a class
107
- def normalized_value(criteria, key, value)
108
- case value
109
- when Array, Set
110
- modifier?(key) ? value.to_a : {'$in' => value.to_a}
111
- when Hash
112
- if criteria[key].kind_of?(Hash)
113
- criteria[key].dup.merge(to_criteria(value, key))
114
- else
115
- to_criteria(value, key)
116
- end
117
- when Time
118
- value.utc
119
- else
120
- value
121
- end
122
- end
123
-
124
- def normalized_direction(direction)
125
- direction ||= 'asc'
126
- direction.downcase == 'asc' ? Mongo::ASCENDING : Mongo::DESCENDING
127
- end
128
-
129
- def normalized_sort(sort)
130
- return if sort.blank?
131
-
132
- if sort.respond_to?(:all?) && sort.all? { |s| symbol_operator?(s) }
133
- sort.map { |s| to_order(s.field, s.operator) }
134
- elsif symbol_operator?(sort)
135
- [to_order(sort.field, sort.operator)]
136
- else
137
- sort.split(',').map do |str|
138
- to_order(*str.strip.split(' '))
139
- end
140
- end
20
+ def add_sci_condition
21
+ query[:_type] = @model.to_s if @model.single_collection_inherited?
141
22
  end
142
23
  end
143
24
  end