Class: ActiveGraph::Relationship::RelatedNode

Inherits:
Object
  • Object
show all
Defined in:
lib/active_graph/relationship/related_node.rb

Overview

A container for Relationship’s :inbound and :outbound methods. It provides lazy loading of nodes. It’s important (or maybe not really IMPORTANT, but at least worth mentioning) that calling method_missing will result in a query to load the node if the node is not already loaded.

Defined Under Namespace

Classes: UnsetRelatedNodeError

Instance Method Summary collapse

Constructor Details

#initialize(node = nil) ⇒ RelatedNode

Relationship’s related nodes can be initialized with nothing, an integer, or a fully wrapped node.

Initialization with nothing happens when a new, non-persisted Relationship object is first initialized.

Initialization with an integer happens when a relationship is loaded from the database. It loads using the ID because that is provided by the Cypher response and does not require an extra query.

[View source]

14
15
16
# File 'lib/active_graph/relationship/related_node.rb', line 14

def initialize(node = nil)
  @node = valid_node_param?(node) ? node : (fail ActiveGraph::InvalidParameterError, 'RelatedNode must be initialized with either a node ID or node')
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(*args, **kwargs, &block) ⇒ Object

[View source]

64
65
66
67
68
69
70
# File 'lib/active_graph/relationship/related_node.rb', line 64

def method_missing(*args, **kwargs, &block)
  if RUBY_VERSION < '3' && kwargs.empty?
    loaded.send(*args, &block)
  else
    loaded.send(*args, **kwargs, &block)
  end
end

Instance Method Details

#==(other) ⇒ Object

Loads the node if needed, then conducts comparison.

[View source]

19
20
21
22
# File 'lib/active_graph/relationship/related_node.rb', line 19

def ==(other)
  loaded if @node.is_a?(Integer)
  @node == other
end

#classObject

[View source]

77
78
79
# File 'lib/active_graph/relationship/related_node.rb', line 77

def class
  loaded.send(:class)
end

#cypher_representation(clazz) ⇒ Object

Parameters:

  • clazz (String, Symbol, Array)

    An alternate label to use in the event the node is not present or loaded

[View source]

40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/active_graph/relationship/related_node.rb', line 40

def cypher_representation(clazz)
  case
  when !set?
    "(#{formatted_label_list(clazz)})"
  when set? && !loaded?
    "(Node with neo_id #{@node})"
  else
    node_class = self.class
    id_name = node_class.id_property_name
    labels = ':' + node_class.mapped_label_names.join(':')

    "(#{labels} {#{id_name}: #{@node.id.inspect}})"
  end
end

#loadedObject

Loads a node from the database or returns the node if already laoded

[View source]

30
31
32
33
34
35
36
37
# File 'lib/active_graph/relationship/related_node.rb', line 30

def loaded
  fail UnsetRelatedNodeError, 'Node not set, cannot load' if @node.nil?
  @node = if @node.respond_to?(:neo_id)
            @node
          else
            ActiveGraph::Base.new_query.match(:n).where(n: {neo_id: @node}).pluck(:n).first
          end
end

#loaded?Boolean

Returns indicates whether a node has or has not been fully loaded from the database.

Returns:

  • (Boolean)

    indicates whether a node has or has not been fully loaded from the database

[View source]

56
57
58
# File 'lib/active_graph/relationship/related_node.rb', line 56

def loaded?
  @node.respond_to?(:neo_id)
end

#neo_idObject

Returns the neo_id of a given node without loading.

[View source]

25
26
27
# File 'lib/active_graph/relationship/related_node.rb', line 25

def neo_id
  loaded? ? @node.neo_id : @node
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Returns:

[View source]

72
73
74
75
# File 'lib/active_graph/relationship/related_node.rb', line 72

def respond_to_missing?(method_name, include_private = false)
  loaded if @node.is_a?(Numeric)
  @node.respond_to?(method_name) ? true : super
end

#set?Boolean

Returns:

[View source]

60
61
62
# File 'lib/active_graph/relationship/related_node.rb', line 60

def set?
  !@node.nil?
end