diff options
author | Sean Griffin <sean@seantheprogrammer.com> | 2014-11-17 05:56:09 -0800 |
---|---|---|
committer | Sean Griffin <sean@seantheprogrammer.com> | 2014-11-17 05:56:09 -0800 |
commit | ed1c3bcb5d06bcc81ecfba8999643059c980c0ab (patch) | |
tree | 8ff56170d9425287a3ca2f7d25eed90aca5be48b /activerecord/lib/active_record/type | |
parent | 94de3979dd1be17a9e324551e6786af4a90a6909 (diff) | |
parent | da99a2a2982d35f670ad9647463e09bfe9032b70 (diff) | |
download | rails-ed1c3bcb5d06bcc81ecfba8999643059c980c0ab.tar.gz rails-ed1c3bcb5d06bcc81ecfba8999643059c980c0ab.tar.bz2 rails-ed1c3bcb5d06bcc81ecfba8999643059c980c0ab.zip |
Merge pull request #17643 from SamSaffron/select_all_perf
PERF: optimise type lookup to avoid invoking procs
Diffstat (limited to 'activerecord/lib/active_record/type')
-rw-r--r-- | activerecord/lib/active_record/type/hash_lookup_type_map.rb | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/type/hash_lookup_type_map.rb b/activerecord/lib/active_record/type/hash_lookup_type_map.rb index bf92680268..2a146d38a9 100644 --- a/activerecord/lib/active_record/type/hash_lookup_type_map.rb +++ b/activerecord/lib/active_record/type/hash_lookup_type_map.rb @@ -1,6 +1,12 @@ module ActiveRecord module Type class HashLookupTypeMap < TypeMap # :nodoc: + + def initialize + @cache = {} + super + end + delegate :key?, to: :@mapping def lookup(type, *args) @@ -8,12 +14,24 @@ module ActiveRecord end def fetch(type, *args, &block) - @mapping.fetch(type, block).call(type, *args) + cache = (@cache[type] ||= {}) + resolved = cache[args] + + unless resolved + resolved = cache[args] = @mapping.fetch(type, block).call(type, *args) + end + + resolved end def alias_type(type, alias_type) register_type(type) { |_, *args| lookup(alias_type, *args) } end + + def register_type(key, value=nil, &block) + @cache = {} + super(key, value, &block) + end end end end |