Class: Cyrel::Pattern::Node

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Attributes, ActiveModel::Model, Cyrel::Parameterizable
Defined in:
lib/cyrel/pattern/node.rb

Instance Method Summary collapse

Constructor Details

#initialize(alias_name, labels: nil, or_labels: nil, properties: {}, **kw) ⇒ Node

Returns a new instance of Node.



20
21
22
23
24
25
26
27
# File 'lib/cyrel/pattern/node.rb', line 20

def initialize(alias_name, labels: nil, or_labels: nil, properties: {}, **kw)
  super(
    { alias_name: alias_name,
      labels: Array(labels).compact.flatten,
      or_labels: Array(or_labels).compact.flatten,
      properties: properties }.merge(kw)
  )
end

Instance Method Details

#as(new_alias) ⇒ Object


Public: return a copy of this Node with a different alias.

Cyrel.node('Person').as(:p)      # (:p:Person)

We dup so the original immutable instance (often reused by the DSL) isn’t mutated.




37
38
39
# File 'lib/cyrel/pattern/node.rb', line 37

def as(new_alias)
  dup_with(alias_name: new_alias.to_sym)
end

#freezeObject



69
70
71
72
73
74
# File 'lib/cyrel/pattern/node.rb', line 69

def freeze
  super
  labels.freeze
  or_labels.freeze
  properties.freeze
end

#render(query) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/cyrel/pattern/node.rb', line 41

def render(query)
  base = +"(#{alias_name}"

  # OR labels take precedence (Memgraph 3.2+: n:Label1|Label2)
  if or_labels.any?
    base << ':' << or_labels.join('|')
  elsif labels.any?
    base << ':' << labels.join(':')
  end

  unless properties.empty?
    params = properties.with_indifferent_access
    formatted = params.map do |k, v|
      # Let register_parameter handle loop variable detection
      param_key = query.register_parameter(v)
      if param_key.is_a?(Symbol) && param_key == v
        # Loop variable returned as-is, don't parameterize
        "#{k}: #{v}"
      else
        # Normal parameter key returned
        "#{k}: $#{param_key}"
      end
    end.join(', ')
    base << " {#{formatted}}"
  end
  base << ')'
end