Sha256: f000046bd85a354225299d191daca1e7a2358c413246ac97fe0d76ae6acba33c

Contents?: true

Size: 1.23 KB

Versions: 5

Compression:

Stored size: 1.23 KB

Contents

require "memoist"

module Scrivito
module Backend

class ContentStateNode < Struct.new(:content_state_id)
  extend Memoist

  def self.find(csid)
    raise InternalError unless csid
    new(csid)
  end

  def id
    content_state_id
  end

  def create_successor(successor_content_state_id, objs)
    successor = self.class.new(successor_content_state_id)

    CmsDataCache.write_content_state_node(successor.id, [id, objs])

    successor
  end

  # used as special return values
  CACHE_MISS = Object.new
  NOT_FOUND = Object.new

  MAX_TRAVERSAL_DEPTH = 20

  def obj_from_changes(id, up_to_csid, up_to_depth = MAX_TRAVERSAL_DEPTH)
    return NOT_FOUND if up_to_csid == content_state_id

    return CACHE_MISS if up_to_depth == 0

    if pred = predecessor
      found = changed_objs.detect { |obj| obj["_id"] == id }

      return found || pred.obj_from_changes(id, up_to_csid, up_to_depth - 1)
    else
      CACHE_MISS
    end
  end

  private

  def predecessor
    self.class.find(data.first) if data
  end

  def changed_objs
    unless data
      raise InternalError, "access to changes without predecessor"
    end

    data.second
  end

  def data
    CmsDataCache.read_content_state_node(content_state_id)
  end
  memoize :data

end

end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
scrivito_sdk-0.65.2 lib/scrivito/backend/content_state_node.rb
scrivito_sdk-0.65.1 lib/scrivito/backend/content_state_node.rb
scrivito_sdk-0.65.0 lib/scrivito/backend/content_state_node.rb
scrivito_sdk-0.65.0.rc2 lib/scrivito/backend/content_state_node.rb
scrivito_sdk-0.65.0.rc1 lib/scrivito/backend/content_state_node.rb