Module: ApacheAge::Entities::Edge

Extended by:
ActiveSupport::Concern
Included in:
ApacheAge::Edge
Defined in:
lib/apache_age/entities/edge.rb

Instance Method Summary collapse

Instance Method Details

#age_typeObject



36
# File 'lib/apache_age/entities/edge.rb', line 36

def age_type = 'edge'

#create_sqlObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/apache_age/entities/edge.rb', line 50

def create_sql
  self.start_node = start_node.save unless start_node.persisted?
  self.end_node = end_node.save unless end_node.persisted?

  start_node_age_label = ActiveRecord::Base.sanitize_sql(start_node.age_label)
  end_node_age_label = ActiveRecord::Base.sanitize_sql(end_node.age_label)
  sanitized_start_id = ActiveRecord::Base.sanitize_sql(["?", start_node.id])
  sanitized_end_id = ActiveRecord::Base.sanitize_sql(["?", end_node.id])
  # cant use sanitize_sql_like because it escapes the % and _ characters
  # label_name = ActiveRecord::Base.sanitize_sql_like(age_label)

  reject_keys = i[id start_id end_id start_node end_node]
  sanitized_properties =
    self.to_h.reject { |k, _v| reject_keys.include?(k) }.reject { |_k, v| v.nil? }
      .map { |k, v| "#{k}: #{ActiveRecord::Base.sanitize_sql(["?", v])}" }
      .join(', ')
  "    SELECT *\n    FROM cypher('\#{age_graph}', $$\n        MATCH (from_node:\#{start_node_age_label}), (to_node:\#{end_node_age_label})\n        WHERE id(from_node) = \#{sanitized_start_id} AND id(to_node) = \#{sanitized_end_id}\n        CREATE (from_node)-[edge:\#{age_label} {\#{sanitized_properties}}]->(to_node)\n        RETURN edge\n    $$) as (edge agtype);\n  SQL\nend\n"

#end_classObject



37
# File 'lib/apache_age/entities/edge.rb', line 37

def end_class = end_node.class

#end_node_classObject



39
# File 'lib/apache_age/entities/edge.rb', line 39

def end_node_class = end_node.class

#initialize(**attributes) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/apache_age/entities/edge.rb', line 28

def initialize(**attributes)
  super
  self.end_id ||= end_node.id if end_node
  self.start_id ||= start_node.id if start_node
  self.end_node ||= Entity.find(end_id) if end_id
  self.start_node ||= Entity.find(start_id) if start_id
end

#start_classObject



38
# File 'lib/apache_age/entities/edge.rb', line 38

def start_class = start_node.class

#start_node_classObject



40
# File 'lib/apache_age/entities/edge.rb', line 40

def start_node_class = start_node.class

#update_sqlObject

So far just properties of string type with ” around them



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/apache_age/entities/edge.rb', line 78

def update_sql
  alias_name = age_alias || age_label.downcase
  set_clause =
    age_properties.map do |k, v|
      if v
        sanitized_value = ActiveRecord::Base.sanitize_sql(["?", v])
        "#{alias_name}.#{k} = #{sanitized_value}"
      else
        "#{alias_name}.#{k} = NULL"
      end
    end.join(', ')

  sanitized_id = ActiveRecord::Base.sanitize_sql(["?", id])

  "    SELECT *\n    FROM cypher('\#{age_graph}', $$\n        MATCH ()-[\#{alias_name}:\#{age_label}]->()\n        WHERE id(\#{alias_name}) = \#{sanitized_id}\n        SET \#{set_clause}\n        RETURN \#{alias_name}\n    $$) as (\#{age_label} agtype);\n  SQL\nend\n"

#validate_nodesObject

Custom validation method to validate start_node and end_node



45
46
47
48
# File 'lib/apache_age/entities/edge.rb', line 45

def validate_nodes
  errors.add(:start_node, 'invalid') if start_node && !start_node.valid?
  errors.add(:end_node, 'invalid') if end_node && !end_node.valid?
end