Class: Neo4j::Cypher::ClauseList

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/neo4j-cypher/clause_list.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(variables = []) ⇒ ClauseList

Returns a new instance of ClauseList.



8
9
10
11
12
13
# File 'lib/neo4j-cypher/clause_list.rb', line 8

def initialize(variables = [])
  @variables = variables
  @lists_of_clause_list = [[]]
  @curr_clause_list = @lists_of_clause_list.first
  @insert_order = 0
end

Instance Attribute Details

#clause_listObject

Returns the value of attribute clause_list.



5
6
7
# File 'lib/neo4j-cypher/clause_list.rb', line 5

def clause_list
  @clause_list
end

#variablesObject

Returns the value of attribute variables.



5
6
7
# File 'lib/neo4j-cypher/clause_list.rb', line 5

def variables
  @variables
end

Instance Method Details

#create_variable(var) ⇒ Object

def debug

@curr_clause_list.each_with_index { |c, i| puts "  #{i} #{c.clause_type.inspect}, #{c.to_cypher} - #{c.class} id: #{c.object_id} order #{c.insert_order}" }

end



80
81
82
83
84
# File 'lib/neo4j-cypher/clause_list.rb', line 80

def create_variable(var)
  raise "Already included #{var}" if @variables.include?(var)
  @variables << var
  "v#{@variables.size}".to_sym
end

#delete(clause_or_context) ⇒ Object



71
72
73
74
# File 'lib/neo4j-cypher/clause_list.rb', line 71

def delete(clause_or_context)
  c = clause_or_context.respond_to?(:clause) ? clause_or_context.clause : clause_or_context
  @curr_clause_list.delete(c)
end

#depthObject



48
49
50
# File 'lib/neo4j-cypher/clause_list.rb', line 48

def depth
  @lists_of_clause_list.count
end

#eachObject



27
28
29
# File 'lib/neo4j-cypher/clause_list.rb', line 27

def each
  @curr_clause_list.each { |c| yield c }
end

#empty?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/neo4j-cypher/clause_list.rb', line 15

def empty?
  !first
end

#find(clause_type) ⇒ Object



23
24
25
# File 'lib/neo4j-cypher/clause_list.rb', line 23

def find(clause_type)
  @curr_clause_list.find { |c| c.clause_type == clause_type }
end

#group_by_clauseObject



86
87
88
89
90
91
92
93
94
# File 'lib/neo4j-cypher/clause_list.rb', line 86

def group_by_clause
  prev_clause = nil
  inject([]) do |memo, clause|
    memo << [] if clause.clause_type != prev_clause
    prev_clause = clause.clause_type
    memo.last << clause
    memo
  end
end

#include?(clause_type) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/neo4j-cypher/clause_list.rb', line 19

def include?(clause_type)
  !!find(clause_type)
end

#insert(clause) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/neo4j-cypher/clause_list.rb', line 52

def insert(clause)
  ctype = clause.clause_type

  if Clause::ORDER.include?(ctype)
    # which list should we add the cluase to, the root or the sub list ?
    # ALl the start and return clauses should move to the clause_list
    c = (depth > 1 && (ctype == :start || ctype == :return)) ? @lists_of_clause_list.first : @curr_clause_list
    c << clause
    @insert_order += 1
    clause.insert_order = @insert_order
    c.sort!
  end
  self
end

#join_group(list) ⇒ Object



96
97
98
# File 'lib/neo4j-cypher/clause_list.rb', line 96

def join_group(list)
  list.map { |c| c.to_cypher }.join(list.first.separator)
end

#lastObject



67
68
69
# File 'lib/neo4j-cypher/clause_list.rb', line 67

def last
  @curr_clause_list.last
end

#popObject



37
38
39
40
41
42
# File 'lib/neo4j-cypher/clause_list.rb', line 37

def pop
  @lists_of_clause_list.pop
  @curr_clause_list = @lists_of_clause_list.last
  @curr_clause_list.sort!
  self
end

#prefix(list) ⇒ Object



105
106
107
# File 'lib/neo4j-cypher/clause_list.rb', line 105

def prefix(list)
  (depth > 1) && !prefix_for_depth_2.include?(list.first.clause_type) ? '' : "#{list.first.prefix} "
end

#prefix_for_depth_2Object



109
110
111
112
113
114
115
116
# File 'lib/neo4j-cypher/clause_list.rb', line 109

def prefix_for_depth_2
  if include?(:match) && include?(:where)
    [:set, :delete, :create, :remove, :where]
  else
    [:set, :delete, :create, :remove]
  end

end

#pushObject



31
32
33
34
35
# File 'lib/neo4j-cypher/clause_list.rb', line 31

def push
  @lists_of_clause_list << []
  @curr_clause_list = @lists_of_clause_list.last
  self
end

#return_clauseObject



44
45
46
# File 'lib/neo4j-cypher/clause_list.rb', line 44

def return_clause
  @curr_clause_list.find{|r| r.respond_to?(:return_items)}
end

#to_cypherObject



100
101
102
103
# File 'lib/neo4j-cypher/clause_list.rb', line 100

def to_cypher
  # Sub lists, like in with clause should not have a clause prefix like WHERE or MATCH
  group_by_clause.map { |list| "#{prefix(list)}#{join_group(list)}" }.join(' ')
end