nobrainer 0.20.0 → 0.21.0

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_brainer/autoload.rb +0 -5
  3. data/lib/no_brainer/config.rb +14 -9
  4. data/lib/no_brainer/connection.rb +1 -3
  5. data/lib/no_brainer/criteria.rb +1 -1
  6. data/lib/no_brainer/criteria/aggregate.rb +2 -2
  7. data/lib/no_brainer/criteria/cache.rb +8 -3
  8. data/lib/no_brainer/criteria/core.rb +1 -5
  9. data/lib/no_brainer/criteria/delete.rb +1 -1
  10. data/lib/no_brainer/criteria/eager_load.rb +51 -0
  11. data/lib/no_brainer/criteria/order_by.rb +1 -1
  12. data/lib/no_brainer/criteria/scope.rb +3 -10
  13. data/lib/no_brainer/criteria/update.rb +8 -6
  14. data/lib/no_brainer/criteria/where.rb +50 -13
  15. data/lib/no_brainer/document.rb +2 -2
  16. data/lib/no_brainer/document/aliases.rb +0 -8
  17. data/lib/no_brainer/document/association/belongs_to.rb +6 -2
  18. data/lib/no_brainer/document/association/core.rb +5 -4
  19. data/lib/no_brainer/document/association/eager_loader.rb +7 -8
  20. data/lib/no_brainer/document/association/has_many.rb +22 -8
  21. data/lib/no_brainer/document/association/has_many_through.rb +12 -3
  22. data/lib/no_brainer/document/atomic_ops.rb +63 -61
  23. data/lib/no_brainer/document/attributes.rb +11 -3
  24. data/lib/no_brainer/document/core.rb +5 -2
  25. data/lib/no_brainer/document/criteria.rb +14 -5
  26. data/lib/no_brainer/document/dirty.rb +11 -16
  27. data/lib/no_brainer/document/index.rb +0 -6
  28. data/lib/no_brainer/document/index/meta_store.rb +1 -1
  29. data/lib/no_brainer/document/persistance.rb +12 -2
  30. data/lib/no_brainer/document/types.rb +13 -12
  31. data/lib/no_brainer/document/types/binary.rb +0 -4
  32. data/lib/no_brainer/document/types/boolean.rb +0 -1
  33. data/lib/no_brainer/document/types/geo.rb +1 -0
  34. data/lib/no_brainer/document/types/string.rb +3 -0
  35. data/lib/no_brainer/document/types/text.rb +18 -0
  36. data/lib/no_brainer/document/validation.rb +31 -6
  37. data/lib/no_brainer/document/validation/not_null.rb +15 -0
  38. data/lib/no_brainer/document/{uniqueness.rb → validation/uniqueness.rb} +11 -10
  39. data/lib/no_brainer/error.rb +20 -23
  40. data/lib/no_brainer/locale/en.yml +1 -0
  41. data/lib/no_brainer/lock.rb +114 -0
  42. data/lib/no_brainer/query_runner/database_on_demand.rb +0 -1
  43. data/lib/no_brainer/query_runner/missing_index.rb +1 -1
  44. data/lib/no_brainer/query_runner/run_options.rb +0 -3
  45. data/lib/no_brainer/query_runner/table_on_demand.rb +2 -3
  46. data/lib/no_brainer/rql.rb +0 -4
  47. data/lib/nobrainer.rb +1 -1
  48. metadata +8 -4
  49. data/lib/no_brainer/criteria/preload.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 745af373e58173ca12eaee6f9be89f13ab3f56dd
4
- data.tar.gz: 97d1cd1c63e4385ce5088b388bdd6392209dbe2e
3
+ metadata.gz: 2f2246b107585644fff659c53223f7c821bbc628
4
+ data.tar.gz: 9c2b99c8969e58ac8a3e9c447a887ab30d6ee402
5
5
  SHA512:
6
- metadata.gz: 68609237b83a8df18d129dc5732eb02e83ed03f362d78c605b092bb96f2e00527a33c6f498f41fe5544ee0b258e3ca3104ffab456d85ed2a33dfe26ac6869c24
7
- data.tar.gz: e74bef453c44b4b3588e23756e8204d228c27a1cfe0868ae5a887f86fce37b8247956ebec9aca2f71f2fb3b06694dc8d3aed498482f60a5c3c16af8fe5629f07
6
+ metadata.gz: 96d2a9de23fc93e7283618a61107043d02fdf4e04623201e654663e4973f248d20122bdfa79f6818580d71169f7d65f56b2dfb4b75dd26f554ed0094996fe6ff
7
+ data.tar.gz: 7c16007cb6fd8c4e1b0d9bb1b2a590f4cddb489f78c9215315870cfacea4cda86b6de1b63429a46d9641bb3c77216d0a5108c48f4b78459e06bdee174bbcfa4d
@@ -17,9 +17,4 @@ module NoBrainer::Autoload
17
17
  constants.each { |constant| autoload constant }
18
18
  constants.each { |constant| include const_get(constant) }
19
19
  end
20
-
21
- def eager_autoload_and_include(*constants)
22
- eager_autoload(*constants)
23
- constants.each { |constant| include const_get(constant) }
24
- end
25
20
  end
@@ -6,27 +6,32 @@ module NoBrainer::Config
6
6
  :environment => { :default => ->{ default_environment } },
7
7
  :rethinkdb_url => { :default => ->{ default_rethinkdb_url } },
8
8
  :logger => { :default => ->{ default_logger } },
9
+ :colorize_logger => { :default => ->{ true }, :valid_values => [true, false] },
9
10
  :warn_on_active_record => { :default => ->{ true }, :valid_values => [true, false] },
10
- :auto_create_databases => { :default => ->{ true }, :valid_values => [true, false] },
11
- :auto_create_tables => { :default => ->{ true }, :valid_values => [true, false] },
12
11
  :max_retries_on_connection_failure => { :default => ->{ default_max_retries_on_connection_failure } },
13
12
  :durability => { :default => ->{ default_durability }, :valid_values => [:hard, :soft] },
13
+ :max_string_length => { :default => -> { 255 } },
14
14
  :user_timezone => { :default => ->{ :local }, :valid_values => [:unchanged, :utc, :local] },
15
15
  :db_timezone => { :default => ->{ :utc }, :valid_values => [:unchanged, :utc, :local] },
16
- :colorize_logger => { :default => ->{ true }, :valid_values => [true, false] },
17
- :distributed_lock_class => { :default => ->{ nil } },
16
+ :geo_options => { :default => ->{ {:geo_system => 'WGS84', :unit => 'm'} } },
17
+ :distributed_lock_class => { :default => ->{ NoBrainer::Lock } },
18
+ :lock_options => { :default => ->{ { :expire => 60, :timeout => 10 } } },
18
19
  :per_thread_connection => { :default => ->{ false }, :valid_values => [true, false] },
19
20
  :machine_id => { :default => ->{ default_machine_id } },
20
- :geo_options => { :default => ->{ {:geo_system => 'WGS84', :unit => 'm'} } },
21
+ :criteria_cache_max_entries => { :default => -> { 10_000 } },
21
22
  }
22
23
 
23
24
  class << self
24
25
  attr_accessor(*SETTINGS.keys)
25
26
 
26
- def max_reconnection_tries=(value)
27
- STDERR.puts "[NoBrainer] config.max_reconnection_tries is deprecated and will be removed"
28
- STDERR.puts "[NoBrainer] use config.max_retries_on_connection_failure instead."
29
- self.max_retries_on_connection_failure = value
27
+ def auto_create_databases=(value)
28
+ STDERR.puts "[NoBrainer] config.auto_create_databases is no longer active."
29
+ STDERR.puts "[NoBrainer] The current behavior is now to always auto create databases"
30
+ end
31
+
32
+ def auto_create_tables=(value)
33
+ STDERR.puts "[NoBrainer] config.auto_create_tables is no longer active."
34
+ STDERR.puts "[NoBrainer] The current behavior is now to always auto create tables"
30
35
  end
31
36
 
32
37
  def apply_defaults
@@ -52,11 +52,9 @@ class NoBrainer::Connection
52
52
  # database (drop)
53
53
  def purge!
54
54
  table_list.each do |table_name|
55
- next if table_name =~ /^nobrainer_/
55
+ next if table_name == 'nobrainer_index_meta' # keeping because indexes are not going away
56
56
  NoBrainer.run { |r| r.table(table_name).delete }
57
57
  end
58
58
  true
59
- rescue RuntimeError => e
60
- raise e unless e.message =~ /No entry with that name/
61
59
  end
62
60
  end
@@ -4,5 +4,5 @@ class NoBrainer::Criteria
4
4
  extend NoBrainer::Autoload
5
5
  autoload_and_include :Core, :Raw, :AfterFind, :Where, :OrderBy, :Limit,
6
6
  :Pluck, :Count, :Delete, :Enumerable, :First, :Aggregate,
7
- :Preload, :Update, :Cache, :Index, :Extend, :Scope
7
+ :EagerLoad, :Update, :Cache, :Index, :Extend, :Scope
8
8
  end
@@ -2,11 +2,11 @@ module NoBrainer::Criteria::Aggregate
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  def min(*a, &b)
5
- instantiate_doc run { aggregate_rql(:min, *a, &b) }
5
+ order_by(a, &b).first
6
6
  end
7
7
 
8
8
  def max(*a, &b)
9
- instantiate_doc run { aggregate_rql(:max, *a, &b) }
9
+ order_by(a, &b).last
10
10
  end
11
11
 
12
12
  def sum(*a, &b)
@@ -37,15 +37,20 @@ module NoBrainer::Criteria::Cache
37
37
  end
38
38
 
39
39
  def each(options={}, &block)
40
- return super unless with_cache? && !options[:no_cache] && block
40
+ return super unless with_cache? && !options[:no_cache] && block && !@cache_too_small
41
41
  return @cache.each(&block) if @cache
42
42
 
43
43
  cache = []
44
44
  super(options.merge(:no_cache => true)) do |instance|
45
45
  block.call(instance)
46
- cache << instance
46
+ cache << instance unless @cache_too_small
47
+
48
+ if cache.size > NoBrainer::Config.criteria_cache_max_entries
49
+ cache = []
50
+ @cache_too_small = true
51
+ end
47
52
  end
48
- @cache = cache
53
+ @cache = cache unless @cache_too_small
49
54
  self
50
55
  end
51
56
 
@@ -47,7 +47,7 @@ module NoBrainer::Criteria::Core
47
47
  end
48
48
 
49
49
  def merge(criteria, options={})
50
- dup.tap { |new_criteria| new_criteria.merge!(criteria, options) }
50
+ dup.merge!(criteria, options)
51
51
  end
52
52
 
53
53
  def ==(other)
@@ -102,10 +102,6 @@ module NoBrainer::Criteria::Core
102
102
  b
103
103
  end
104
104
 
105
- def merge_hash(a, b)
106
- a ? a.merge(b) : b
107
- end
108
-
109
105
  def append_array(a, b)
110
106
  a ? a+b : b
111
107
  end
@@ -2,7 +2,7 @@ module NoBrainer::Criteria::Delete
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  def delete_all
5
- run { without_ordering.without_plucking.to_rql.delete }
5
+ run { without_distinct.without_ordering.without_plucking.to_rql.delete }
6
6
  end
7
7
 
8
8
  def destroy_all
@@ -0,0 +1,51 @@
1
+ module NoBrainer::Criteria::EagerLoad
2
+ extend ActiveSupport::Concern
3
+
4
+ included { criteria_option :eager_load, :merge_with => :append_array }
5
+
6
+ def eager_load(*values)
7
+ chain({:eager_load => values}, :copy_cache_from => self)
8
+ end
9
+
10
+ def preload(*values)
11
+ STDERR.puts "[NoBrainer] `preload' is deprecated and will be removed, please use `eager_load' instead"
12
+ eager_load(*values)
13
+ end
14
+
15
+ def merge!(criteria, options={})
16
+ super.tap do
17
+ # If we already have some cached documents, and we need to so some eager
18
+ # loading, then we it now. It's easier than doing it lazily.
19
+ if self.cached? && criteria.options[:eager_load].present?
20
+ perform_eager_load(@cache)
21
+ end
22
+ end
23
+ end
24
+
25
+ def each(options={}, &block)
26
+ return super unless should_eager_load? && !options[:no_eager_loading] && block
27
+
28
+ docs = []
29
+ super(options.merge(:no_eager_loading => true)) { |doc| docs << doc }
30
+ # TODO batch the eager loading with NoBrainer::Config.criteria_cache_max_entries
31
+ perform_eager_load(docs)
32
+ docs.each(&block)
33
+ self
34
+ end
35
+
36
+ private
37
+
38
+ def should_eager_load?
39
+ @options[:eager_load].present? && !raw?
40
+ end
41
+
42
+ def get_one(criteria)
43
+ super.tap { |doc| perform_eager_load([doc]) }
44
+ end
45
+
46
+ def perform_eager_load(docs)
47
+ if should_eager_load? && docs.present?
48
+ NoBrainer::Document::Association::EagerLoader.new.eager_load(docs, @options[:eager_load])
49
+ end
50
+ end
51
+ end
@@ -134,6 +134,6 @@ module NoBrainer::Criteria::OrderBy
134
134
  end
135
135
 
136
136
  def raise_bad_rule(rule)
137
- raise "Please pass something like ':field1 => :desc, :field2 => :asc', not #{rule}"
137
+ raise "order_by() takes arguments such as `:field1 => :desc, :field2 => :asc', not `#{rule}'"
138
138
  end
139
139
  end
@@ -24,21 +24,14 @@ module NoBrainer::Criteria::Scope
24
24
 
25
25
  private
26
26
 
27
- def should_apply_default_scope?
28
- model.default_scope_proc && @options[:use_default_scope] != false
29
- end
30
-
31
27
  def _apply_default_scope
32
- return unless should_apply_default_scope?
33
- criteria = model.default_scope_proc.call
34
- raise "Mixing model issue. Contact developer." if [criteria.model, self.model].compact.uniq.size == 2
35
- criteria.merge(self)
28
+ return self if @options[:use_default_scope] == false
29
+ (model.default_scopes.map(&:call).compact + [self]).reduce(:merge)
36
30
  end
37
31
 
38
32
  module ClassMethods
39
33
  def _finalize_criteria(base)
40
- criteria = super
41
- criteria.__send__(:_apply_default_scope) || criteria
34
+ super.__send__(:_apply_default_scope)
42
35
  end
43
36
  end
44
37
  end
@@ -2,18 +2,20 @@ module NoBrainer::Criteria::Update
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  def update_all(*a, &b)
5
- prepare_args_for_update!(a)
6
- run { without_ordering.without_plucking.to_rql.update(*a, &b) }
5
+ perform_update(:update, a, b)
7
6
  end
8
7
 
9
8
  def replace_all(*a, &b)
10
- prepare_args_for_update!(a)
11
- run { without_ordering.without_plucking.to_rql.replace(*a, &b) }
9
+ perform_update(:replace, a, b)
12
10
  end
13
11
 
14
12
  private
15
13
 
16
- def prepare_args_for_update!(a)
17
- a[0] = model.persistable_attributes(a[0]) if !a.empty? && a.first.is_a?(Hash)
14
+ def perform_update(type, args, block)
15
+ args[0] = model.persistable_attributes(args[0]) if !args.empty? && args.first.is_a?(Hash)
16
+ # can't use without_distinct when passed a block as the operation may be
17
+ # performed many times, which might not be idempotent.
18
+ clause = block ? self : without_distinct
19
+ run { clause.without_plucking.to_rql.__send__(type, *args, &block) }
18
20
  end
19
21
  end
@@ -8,9 +8,11 @@ module NoBrainer::Criteria::Where
8
8
  Symbol::Decoration.register(*CHAINABLE_OPERATORS, :chainable => true)
9
9
 
10
10
  extend ActiveSupport::Concern
11
+ include ActiveModel::ForbiddenAttributesProtection
11
12
 
12
13
  included do
13
14
  criteria_option :where_ast, :merge_with => NoBrainer::Criteria::Where.method(:merge_where_ast)
15
+ criteria_option :without_distinct, :merge_with => :set_scalar
14
16
  end
15
17
 
16
18
  def where(*args, &block)
@@ -38,6 +40,11 @@ module NoBrainer::Criteria::Where
38
40
  where_index_finder.strategy.try(:rql_op)
39
41
  end
40
42
 
43
+ def without_distinct(value = true)
44
+ # helper for delete_all which can't operate on distinct
45
+ chain(:without_distinct => value)
46
+ end
47
+
41
48
  private
42
49
 
43
50
  class MultiOperator < Struct.new(:op, :clauses)
@@ -157,11 +164,14 @@ module NoBrainer::Criteria::Where
157
164
  case association
158
165
  when NoBrainer::Document::Association::BelongsTo::Metadata
159
166
  target_model = association.target_model
160
- opts = { :attr_name => key, :value => value, :type => target_model }
161
- raise NoBrainer::Error::InvalidType.new(opts) unless value.is_a?(target_model)
167
+ unless value.is_a?(target_model)
168
+ opts = { :model => model, :attr_name => key, :type => target_model, :value => value }
169
+ raise NoBrainer::Error::InvalidType.new(opts)
170
+ end
162
171
  value.pk_value
163
172
  else
164
173
  case op
174
+ when :defined then NoBrainer::Boolean.nobrainer_cast_user_to_model(value)
165
175
  when :intersects
166
176
  raise "Use a geo object with `intersects`" unless value.is_a?(NoBrainer::Geo::Base)
167
177
  value
@@ -225,6 +235,7 @@ module NoBrainer::Criteria::Where
225
235
  end
226
236
 
227
237
  def parse_clause(clause)
238
+ clause = sanitize_for_mass_assignment(clause)
228
239
  case clause
229
240
  when Array then MultiOperator.new(:and, clause.map { |c| parse_clause(c) })
230
241
  when Hash then MultiOperator.new(:and, clause.map { |k,v| parse_clause_stub(k,v) })
@@ -240,9 +251,11 @@ module NoBrainer::Criteria::Where
240
251
 
241
252
  def parse_clause_stub(key, value)
242
253
  case key
243
- when :and then MultiOperator.new(:and, value.map { |v| parse_clause(v) })
244
- when :or then MultiOperator.new(:or, value.map { |v| parse_clause(v) })
245
- when :not then UnaryOperator.new(:not, parse_clause(value))
254
+ when :and then parse_multi_value(:and, value)
255
+ when :or then parse_multi_value(:or, value)
256
+ when :_and then parse_multi_value(:and, value, :safe => true)
257
+ when :_or then parse_multi_value(:or, value, :safe => true)
258
+ when :not then UnaryOperator.new(:not, parse_clause(value))
246
259
  when String, Symbol then parse_clause_stub_eq(key, value)
247
260
  when Symbol::Decoration then
248
261
  case key.decorator
@@ -258,14 +271,38 @@ module NoBrainer::Criteria::Where
258
271
  end
259
272
  end
260
273
 
274
+ def parse_multi_value(op, value, options={})
275
+ raise "The `#{op}' operator takes an array as argument" unless value.is_a?(Array)
276
+ if value.size == 1 && value.first.is_a?(Hash) && !options[:safe]
277
+ raise "The `#{op}' operator was provided an array with a single hash element.\n" +
278
+ "In Ruby, [:a => :b, :c => :d] means [{:a => :b, :c => :d}] which is not the same as [{:a => :b}, {:c => :d}].\n" +
279
+ "To prevent mistakes, the former construct is prohibited as you probably mean the latter.\n" +
280
+ "However, if you know what you are doing, you can use the `_#{op}' operator instead."
281
+ end
282
+ MultiOperator.new(op, value.map { |v| parse_clause(v) })
283
+ end
284
+
261
285
  def parse_clause_stub_eq(key, value)
262
286
  case value
263
287
  when Range then instantiate_binary_op(key, :between, value)
264
- when Regexp then instantiate_binary_op(key, :match, value.inspect[1..-2])
288
+ when Regexp then instantiate_binary_op(key, :match, translate_regexp_to_re2_syntax(value))
265
289
  else instantiate_binary_op(key, :eq, value)
266
290
  end
267
291
  end
268
292
 
293
+ def translate_regexp_to_re2_syntax(value)
294
+ # Ruby always uses what RE2 calls "multiline mode" (the "m" flag),
295
+ # meaning that "foo\nbar" matches /^bar$/.
296
+ #
297
+ # Ruby's /m modifier means that . matches \n and corresponds to RE2's "s" flag.
298
+
299
+ flags = "m"
300
+ flags << "s" if value.options & Regexp::MULTILINE != 0
301
+ flags << "i" if value.options & Regexp::IGNORECASE != 0
302
+
303
+ "(?#{flags})#{value.source}"
304
+ end
305
+
269
306
  def instantiate_binary_op(key, op, value)
270
307
  case key
271
308
  when Symbol::Decoration then BinaryOperator.new(key.symbol, key.decorator, op, value, self.model)
@@ -274,8 +311,8 @@ module NoBrainer::Criteria::Where
274
311
  end
275
312
 
276
313
  class IndexFinder < Struct.new(:criteria, :ast, :strategy)
277
- class Strategy < Struct.new(:rql_op, :index, :ast, :rql_proc); end
278
- class IndexStrategy < Struct.new(:criteria_ast, :optimized_clauses, :index, :rql_op, :rql_args, :rql_options)
314
+ class Strategy < Struct.new(:index_finder, :rql_op, :index, :ast, :rql_proc); end
315
+ class IndexStrategy < Struct.new(:index_finder, :criteria_ast, :optimized_clauses, :index, :rql_op, :rql_args, :rql_options)
279
316
  def ast
280
317
  MultiOperator.new(criteria_ast.op, criteria_ast.clauses - optimized_clauses)
281
318
  end
@@ -287,7 +324,7 @@ module NoBrainer::Criteria::Where
287
324
  r = r.map { |i| i['doc'] } if rql_op == :get_nearest
288
325
  # TODO distinct: waiting for issue #3345
289
326
  # TODO coerce_to: waiting for issue #3346
290
- r = r.coerce_to('array').distinct if index.multi
327
+ r = r.coerce_to('array').distinct if index.multi && !index_finder.criteria.options[:without_distinct]
291
328
  r
292
329
  end
293
330
  end
@@ -327,7 +364,7 @@ module NoBrainer::Criteria::Where
327
364
  when :between then [:between, [clause.value.min, clause.value.max],
328
365
  :left_bound => :closed, :right_bound => :closed]
329
366
  end
330
- IndexStrategy.new(ast, [clause], index, *args)
367
+ IndexStrategy.new(self, ast, [clause], index, *args)
331
368
  end.compact.sort_by { |strat| usable_indexes.values.index(strat.index) }.first
332
369
  end
333
370
 
@@ -339,7 +376,7 @@ module NoBrainer::Criteria::Where
339
376
  indexed_clauses = index.what.map { |field| clauses[field] }
340
377
  next unless indexed_clauses.all? { |c| c.try(:compatible_with_index?, index) }
341
378
 
342
- return IndexStrategy.new(ast, indexed_clauses, index, :get_all, [indexed_clauses.map(&:value)])
379
+ return IndexStrategy.new(self, ast, indexed_clauses, index, :get_all, [indexed_clauses.map(&:value)])
343
380
  end
344
381
  return nil
345
382
  end
@@ -363,7 +400,7 @@ module NoBrainer::Criteria::Where
363
400
  options[:left_bound] = {:gt => :open, :ge => :closed}[left_bound.op] if left_bound
364
401
  options[:right_bound] = {:lt => :open, :le => :closed}[right_bound.op] if right_bound
365
402
 
366
- return IndexStrategy.new(ast, [left_bound, right_bound].compact, index, :between,
403
+ return IndexStrategy.new(self, ast, [left_bound, right_bound].compact, index, :between,
367
404
  [left_bound.try(:value), right_bound.try(:value)], options)
368
405
  end
369
406
  return nil
@@ -386,7 +423,7 @@ module NoBrainer::Criteria::Where
386
423
  end.reduce(:union).distinct
387
424
  end
388
425
 
389
- Strategy.new(:union, strategies.map(&:index), nil, rql_proc)
426
+ Strategy.new(self, :union, strategies.map(&:index), nil, rql_proc)
390
427
  end
391
428
 
392
429
  def find_strategy
@@ -4,8 +4,8 @@ module NoBrainer::Document
4
4
  extend ActiveSupport::Concern
5
5
  extend NoBrainer::Autoload
6
6
 
7
- autoload_and_include :Core, :StoreIn, :InjectionLayer, :Attributes, :Readonly, :Validation,
8
- :Persistance, :Types, :Uniqueness, :Callbacks, :Dirty, :PrimaryKey,
7
+ autoload_and_include :Core, :StoreIn, :InjectionLayer, :Attributes, :Readonly,
8
+ :Persistance, :Validation, :Types, :Callbacks, :Dirty, :PrimaryKey,
9
9
  :Association, :Serialization, :Criteria, :Polymorphic, :Index, :Aliases,
10
10
  :MissingAttributes, :LazyFetch, :AtomicOps
11
11
 
@@ -19,14 +19,6 @@ module NoBrainer::Document::Aliases
19
19
  super
20
20
  end
21
21
 
22
- def field(attr, options={})
23
- if options[:as]
24
- STDERR.puts "[NoBrainer] `:as' is deprecated and will be removed. Please use `:store_as' instead (from the #{self} model)"
25
- options[:store_as] = options.delete(:as)
26
- end
27
- super
28
- end
29
-
30
22
  def _remove_field(attr, options={})
31
23
  super
32
24