module Neomirror::Relationship

Public Class Methods

included(base) click to toggle source
# File lib/neomirror/relationship.rb, line 2
def self.included(base)
  base.extend(ClassMethods)
  base.after_create :create_neo_relationships if base.respond_to?(:after_create)
  base.after_update :update_neo_relationships if base.respond_to?(:after_update)
  base.after_destroy :destroy_neo_relationships if base.respond_to?(:after_destroy)
end

Public Instance Methods

create_neo_relationship(rel_mirror = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 72
def create_neo_relationship(rel_mirror = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  return nil unless (m1 = related_object(rel_mirror[:start_node])) && (m2 = related_object(rel_mirror[:end_node])) &&
    neo_relationship_must_exist?(rel_mirror)
  neo_rel = ::Neography::Relationship.create(rel_mirror[:type], m1.neo_node, m2.neo_node, neo_relationship_properties(rel_mirror))
  ::Neomirror.neo.add_relationship_to_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key), neo_rel)
  neo_rel
end
create_neo_relationships() click to toggle source
# File lib/neomirror/relationship.rb, line 113
def create_neo_relationships
  self.class.rel_mirrors.each { |rel_mirror| create_neo_relationship(rel_mirror) }
  true
end
destroy_neo_relationship(rel_mirror = {}, options = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 103
def destroy_neo_relationship(rel_mirror = {}, options = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  if neo_rel = options.fetch(:neo_rel, find_neo_relationship(rel_mirror))
    ::Neomirror.neo.remove_relationship_from_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key), neo_rel)
    ::Neomirror.neo.delete_relationship(neo_rel)
  else
    true
  end
end
destroy_neo_relationships() click to toggle source
# File lib/neomirror/relationship.rb, line 123
def destroy_neo_relationships
  self.class.rel_mirrors.each { |rel_mirror| destroy_neo_relationship(rel_mirror) }
  true
end
find_neo_relationship(rel_mirror = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 66
def find_neo_relationship(rel_mirror = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  return nil unless rel = ::Neomirror.neo.get_relationship_index(rel_mirror[:index_name], :id, self.__send__(self.class.neo_primary_key))
  ::Neography::Relationship.load(rel, ::Neomirror.neo)
end
neo_rel(partial_mirror = nil)
Alias for: neo_relationship
neo_relationship(partial_mirror = nil) click to toggle source
# File lib/neomirror/relationship.rb, line 49
def neo_relationship(partial_mirror = nil)
  raise "Couldn't find neo_relationship declaration" unless rel_mirror = self.class.rel_mirror(partial_mirror)
  find_neo_relationship(rel_mirror) || create_neo_relationship(rel_mirror)
end
Also aliased as: neo_rel
neo_relationship_must_exist?(rel_mirror = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 61
def neo_relationship_must_exist?(rel_mirror = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  !rel_mirror[:if] || !!rel_mirror[:if].call(self)
end
neo_relationship_properties(rel_mirror = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 55
def neo_relationship_properties(rel_mirror = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  return nil unless rel_mirror[:properties]
  rel_mirror[:properties].reduce({}) { |hash, (property, rule)| hash[property] = rule.call(self); hash }
end
update_neo_relationship(rel_mirror = {}) click to toggle source
# File lib/neomirror/relationship.rb, line 85
def update_neo_relationship(rel_mirror = {})
  raise "Couldn't find neo_relationship declaration" unless rel_mirror[:complete] || (rel_mirror = self.class.rel_mirror(rel_mirror))
  if neo_rel = find_neo_relationship(rel_mirror)
    if related_object(rel_mirror[:start_node]) && related_object(rel_mirror[:end_node]) && neo_relationship_must_exist?(rel_mirror)
      if related_object(rel_mirror[:start_node]).neo_node.id != neo_rel.start_node.id || related_object(rel_mirror[:end_node]).neo_node.id != neo_rel.end_node.id
        destroy_neo_relationship(rel_mirror, neo_rel: neo_rel)
        create_neo_relationship(rel_mirror)
      else
        ::Neomirror.neo.reset_relationship_properties(neo_rel, neo_relationship_properties(rel_mirror))
      end
    else
      destroy_neo_relationship(rel_mirror, neo_rel: neo_rel)
    end
  else
    create_neo_relationship(rel_mirror) if neo_relationship_must_exist?(rel_mirror)
  end
end
update_neo_relationships() click to toggle source
# File lib/neomirror/relationship.rb, line 118
def update_neo_relationships
  self.class.rel_mirrors.each { |rel_mirror| update_neo_relationship(rel_mirror) }
  true
end