Uploaded image for project: 'Mongoid'
  1. Mongoid
  2. MONGOID-2706

'includes' doesn't use IdentityMap

    • Type: Icon: Task Task
    • Resolution: Done
    • 3.1.0
    • Affects Version/s: None
    • Component/s: None
    • None

      I think, that whenever you use 'includes', there should be only performance difference, but not functional difference. But here's what I get:

      >> CityRoute.includes(:orig).first
      MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6924ms)
      MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=places selector={"deleted_at"=>nil, "_id"=>

      {"$in"=>["4eda5f2e8792904be40001b7"]}, "_type"=>{"$in"=>["City"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.7296ms)
      #<CityRoute _id: 50d85fcbbdaa57462e000002 ... >
      >> CityRoute.includes(:orig).first
      MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6459ms)
      MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=places selector={"deleted_at"=>nil, "_id"=>{"$in"=>["4eda5f2e8792904be40001b7"]}

      , "_type"=>{"$in"=>["City"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.5293ms)
      #<CityRoute _id: 50d85fcbbdaa57462e000002 ... >
      >> CityRoute.first.orig
      MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.8597ms)
      #<City _id: 4eda5f2e8792904be40001b7 ... >

      So 'includes' doesn't use IdentityMap to get all or part of required records. So if I don't use 'includes', I get old records stored in ItentityMap, but if I use 'includes', the records are requested again and possibly they've already been changed (so that's the functional difference). Also, of course, to get the records from IdentityMap would be more efficient in terms of performance. Especially the difference is noticeable when you make something like '.includes(:orig, :dest)', when both the relations reference the same collection and included ids are nearly the same. This way the same set of records is requested twice in a row.

            Assignee:
            Unassigned Unassigned
            Reporter:
            exoth Yuriy Trofimenko
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: