Sha256: 677dad99b406cdbdf1feacede31cdd01aa66c67c39e536dde8e1c50c4eda5cb4

Contents?: true

Size: 1.65 KB

Versions: 1

Compression:

Stored size: 1.65 KB

Contents

module Related
  class Relationship < Entity

    validates_presence_of :label, :start_node_id, :end_node_id

    def initialize(*attributes)
      if attributes.first.is_a?(String)
        @id = attributes.first
      end
      @attributes = attributes.last
    end

    def start_node
      @start_node ||= Related::Node.find(start_node_id)
    end

    def end_node
      @end_node ||= Related::Node.find(end_node_id)
    end

    def rank
      Related.redis.zrevrank("#{self.start_node_id}:rel:#{self.label}:out", self.id)
    end

    def self.create(label, node1, node2, attributes = {})
      self.new(attributes.merge(
        :label => label,
        :start_node_id => node1.to_s,
        :end_node_id => node2.to_s
      )).save
    end

  private

    def create
      Related.redis.multi do
        super
        score = Time.now.to_i
        Related.redis.zadd("#{self.start_node_id}:rel:#{self.label}:out", score, self.id)
        Related.redis.zadd("#{self.end_node_id}:rel:#{self.label}:in", score, self.id)

        Related.redis.sadd("#{self.start_node_id}:nodes:#{self.label}:out", self.end_node_id)
        Related.redis.sadd("#{self.end_node_id}:nodes:#{self.label}:in", self.start_node_id)
      end
      self
    end

    def delete
      Related.redis.multi do
        Related.redis.zrem("#{self.start_node_id}:rel:#{self.label}:out", self.id)
        Related.redis.zrem("#{self.end_node_id}:rel:#{self.label}:in", self.id)

        Related.redis.srem("#{self.start_node_id}:nodes:#{self.label}:out", self.end_node_id)
        Related.redis.srem("#{self.end_node_id}:nodes:#{self.label}:in", self.start_node_id)
        super
      end
      self
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
related-0.3.1 lib/related/relationship.rb