class SemanticallyTaggable::TagParentage

Public Class Methods

refresh_closure!() click to toggle source

Refreshes the closure table across schemes

# File lib/semantically_taggable/tag_parentage.rb, line 7
def self.refresh_closure!
  ActiveRecord::Base.connection.execute %{DELETE FROM tag_parentages WHERE distance <> 1}

  rows_affected = 1
  total_inserts = 0
  while rows_affected > 0 do
    rows_affected = ActiveRecord::Base.connection.update %{
      INSERT IGNORE INTO tag_parentages
      SELECT DISTINCT
          p1.parent_tag_id,
          p2.child_tag_id,
          p1.distance + p2.distance
      FROM
        tag_parentages AS p1
      INNER JOIN tag_parentages AS p2 ON p1.child_tag_id = p2.parent_tag_id
    }
    total_inserts += rows_affected
  end
  total_inserts += ActiveRecord::Base.connection.update(%{
                    INSERT INTO `tag_parentages`
                    SELECT parent_tag_id, parent_tag_id, 0 FROM `tag_parentages`
                    GROUP BY parent_tag_id })
  total_inserts += ActiveRecord::Base.connection.update(
      %{
         INSERT INTO tag_parentages (parent_tag_id, child_tag_id, distance)
         SELECT tags.id, tags.id, 0
         FROM tags
         LEFT JOIN tag_parentages ON tags.id = tag_parentages.parent_tag_id
         WHERE tag_parentages.parent_tag_id IS NULL
         AND tags.scheme_id IN (SELECT id FROM schemes WHERE polyhierarchical = 1)
      })
  total_inserts
end