Sha256: fd990340f2ababaf4f207ea04e406ba2dc758657d4a088144441209590fb0e67

Contents?: true

Size: 1.59 KB

Versions: 3

Compression:

Stored size: 1.59 KB

Contents

module Related
  class Relationship < Entity

    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.zrank("#{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

3 entries across 3 versions & 1 rubygems

Version Path
related-0.3.0 lib/related/relationship.rb
related-0.2.1 lib/related/relationship.rb
related-0.2 lib/related/relationship.rb