ActiveRecord Identity Map

Hello everyone,

This email is about Marcin Raczkowski's project for Ruby Summer Of
Code (http://rubysoc.org/projects): Project #12: ActiveRecord Identity
Map

You can find the current implementation in my Rails repo (identity_map
branch): http://github.com/miloops/rails/commits/identity_map

I was assigned as the mentor project and I've also invested time
working on it, since I find its very important for all of us using
Rails to have this implemented.

Several days ago, and after lots of feedback, I sent a pull request to
rails/master as José Valim suggested:
http://github.com/rails/rails/pull/76

Some key features that were lately implemented:

- A middleware that wraps each request into a new map, if it's
disabled then no middleware is loaded.
- IM is enabled by default: to disable it use
config.active_record.identity_map = false
- IM is flushed on tests setup, this was added to
ActiveSupport::TestCase, if you are using Rspec, you should try with:

before(:each) do
  ActiveRecord::IdentityMap.clear
end

- A WeakHash implementation was included in ActiveSupport, if you are
using jRuby Weakling library will be used as WeakHash.

I've been using a script to test resources, which is the most
important feature that IM will bring among objects consistency,
although speed has increased in some cases is not the goal of IM.

Results from the script are very promising:

http://gist.github.com/636470

I would love to get more feedback, if you try it feel free to comment
on the pull request, reply this email, or contact me by email or IM at
miloops at gmail.

Thanks! :smiley:

It concerns me that we're modifying existing tests. Specifically this
commit:

  4db9dca55e3acc2c59f252eb83ecb83db5f4b81b

  http://github.com/miloops/rails/commit/4db9dca55e3acc2c59f252eb83ecb83db5f4b81b

It modifies existing tests in this file:

  activerecord/test/cases/associations/belongs_to_associations_test.rb

Why was this change made? I would hope we could integrate IdentityMap
without modifying existing AR tests.

More questions about 4db9dca55e3acc2c59f252eb83ecb83db5f4b81b:

  http://github.com/miloops/rails/commit/4db9dca55e3acc2c59f252eb83ecb83db5f4b81b

activerecord/test/cases/autosave_association_test.rb is changed. Why
was this test changed? Does the AR api not work anymore? Is it
changing?

- assert !@pirate.ship.marked_for_destruction?
+ assert !@pirate.ship.target.reload.marked_for_destruction?

Do I need to ask the new "target" object if it's marked for destruction?

I am worried. Changing existing tests does not instill confidence. :frowning:

Hello everyone,

This email is about Marcin Raczkowski's project for Ruby Summer Of
Code (http://rubysoc.org/projects): Project #12: ActiveRecord Identity
Map

You can find the current implementation in my Rails repo (identity_map
branch): http://github.com/miloops/rails/commits/identity_map

I was assigned as the mentor project and I've also invested time
working on it, since I find its very important for all of us using
Rails to have this implemented.

Several days ago, and after lots of feedback, I sent a pull request to
rails/master as José Valim suggested:
http://github.com/rails/rails/pull/76

Some key features that were lately implemented:

- A middleware that wraps each request into a new map, if it's
disabled then no middleware is loaded.
- IM is enabled by default: to disable it use
config.active_record.identity_map = false
- IM is flushed on tests setup, this was added to
ActiveSupport::TestCase, if you are using Rspec, you should try with:

before(:each) do
ActiveRecord::IdentityMap.clear
end

- A WeakHash implementation was included in ActiveSupport, if you are
using jRuby Weakling library will be used as WeakHash.

I've been using a script to test resources, which is the most
important feature that IM will bring among objects consistency,
although speed has increased in some cases is not the goal of IM.

Results from the script are very promising:

http://gist.github.com/636470

I would love to get more feedback, if you try it feel free to comment
on the pull request, reply this email, or contact me by email or IM at
miloops at gmail.

It concerns me that we're modifying existing tests. Specifically this
commit:

4db9dca55e3acc2c59f252eb83ecb83db5f4b81b

http://github.com/miloops/rails/commit/4db9dca55e3acc2c59f252eb83ecb83db5f4b81b

It modifies existing tests in this file:

activerecord/test/cases/associations/belongs_to_associations_test.rb

Why was this change made? I would hope we could integrate IdentityMap
without modifying existing AR tests.

Hey,

I reverted that commit and fixed code to work as expected in those
cases. I agree with you that existing tests shouldn't change.

Hi,

I just wanted to say that I am really happy with all the work that has been put into this feature. Currently I'm working on one Rails 3 project for which an identity map is an enormous benefit. I'm using the identity_map branch of your fork, and it's working very well for me.

I was wondering if it is close to being merged into Rails? Is there anything I can do to help?

Thanks to everyone for their hard work on this so far!

Kind regards,

Rolf Timmermans

Hello everyone,

This email is about Marcin Raczkowski's project for Ruby Summer Of
Code (http://rubysoc.org/projects): Project #12: ActiveRecord Identity
Map

You can find the current implementation in my Rails repo (identity_map
branch): http://github.com/miloops/rails/commits/identity_map

I was assigned as the mentor project and I've also invested time
working on it, since I find its very important for all of us using
Rails to have this implemented.

Several days ago, and after lots of feedback, I sent a pull request to
rails/master as José Valim suggested:
http://github.com/rails/rails/pull/76

Some key features that were lately implemented:

- A middleware that wraps each request into a new map, if it's
disabled then no middleware is loaded.
- IM is enabled by default: to disable it use
config.active_record.identity_map = false
- IM is flushed on tests setup, this was added to
ActiveSupport::TestCase, if you are using Rspec, you should try with:

before(:each) do
ActiveRecord::IdentityMap.clear
end

- A WeakHash implementation was included in ActiveSupport, if you are
using jRuby Weakling library will be used as WeakHash.

I've been using a script to test resources, which is the most
important feature that IM will bring among objects consistency,
although speed has increased in some cases is not the goal of IM.

Results from the script are very promising:

http://gist.github.com/636470

I would love to get more feedback, if you try it feel free to comment
on the pull request, reply this email, or contact me by email or IM at
miloops at gmail.

Thanks! :smiley:

Hi,

I just wanted to say that I am really happy with all the work that has been put into this feature. Currently I'm working on one Rails 3 project for which an identity map is an enormous benefit. I'm using the identity_map branch of your fork, and it's working very well for me.

I was wondering if it is close to being merged into Rails? Is there anything I can do to help?

Hey Rolf,

That's great! Just try to stay up to date with my repo, and if you run
into any issue or you have any feedback or question write here or
email me.

Thanks!

Emilio