Class: Arel::Middleware::Chain

Inherits:
Object
  • Object
show all
Defined in:
lib/arel/middleware/chain.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(internal_middleware = [], internal_context = {}, executor_class = Arel::Middleware::DatabaseExecutor) ⇒ Chain

Returns a new instance of Chain.



7
8
9
10
11
12
13
14
15
16
# File 'lib/arel/middleware/chain.rb', line 7

def initialize(
  internal_middleware = [],
  internal_context = {},
  executor_class = Arel::Middleware::DatabaseExecutor
)
  @internal_middleware = internal_middleware
  @internal_context = internal_context
  @executor = executor_class.new(internal_middleware)
  @executing_middleware = false
end

Instance Attribute Details

#executing_middleware ⇒ Object (readonly)

Returns the value of attribute executing_middleware.



4
5
6
# File 'lib/arel/middleware/chain.rb', line 4

def executing_middleware
  @executing_middleware
end

#executor ⇒ Object (readonly)

Returns the value of attribute executor.



5
6
7
# File 'lib/arel/middleware/chain.rb', line 5

def executor
  @executor
end

Instance Method Details

#append(new_middleware, &block) ⇒ Object



75
76
77
78
79
# File 'lib/arel/middleware/chain.rb', line 75

def append(new_middleware, &block)
  new_middleware = Array.wrap(new_middleware)
  updated_middleware = internal_middleware + new_middleware
  continue_chain(updated_middleware, internal_context, &block)
end

#apply(middleware, &block) ⇒ Object Also known as: only



39
40
41
42
# File 'lib/arel/middleware/chain.rb', line 39

def apply(middleware, &block)
  new_middleware = Array.wrap(middleware)
  continue_chain(new_middleware, internal_context, &block)
end

#context(new_context = nil, &block) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/arel/middleware/chain.rb', line 81

def context(new_context = nil, &block)
  if new_context.nil? && !block.nil?
    raise 'You cannot do a block statement while calling context without arguments'
  end

  return internal_context if new_context.nil?

  continue_chain(internal_middleware, new_context, &block)
end

#current ⇒ Object



35
36
37
# File 'lib/arel/middleware/chain.rb', line 35

def current
  internal_middleware.dup
end

#except(without_middleware, &block) ⇒ Object



49
50
51
52
53
# File 'lib/arel/middleware/chain.rb', line 49

def except(without_middleware, &block)
  without_middleware = Array.wrap(without_middleware)
  new_middleware = internal_middleware - without_middleware
  continue_chain(new_middleware, internal_context, &block)
end

#execute(sql, binds = [], &execute_sql) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/arel/middleware/chain.rb', line 18

def execute(sql, binds = [], &execute_sql)
  return execute_sql.call(sql, binds).to_casted_result if internal_middleware.length.zero?

  check_middleware_recursion(sql)

  updated_context = context.merge(original_sql: sql)
  enhanced_arel = Arel.enhance(Arel.sql_to_arel(sql, binds: binds))

  result = executor.run(enhanced_arel, updated_context, execute_sql)

  result.to_casted_result
rescue ::PgQuery::ParseError
  execute_sql.call(sql, binds)
ensure
  @executing_middleware = false
end

#insert_after(new_middleware, existing_middleware, &block) ⇒ Object



68
69
70
71
72
73
# File 'lib/arel/middleware/chain.rb', line 68

def insert_after(new_middleware, existing_middleware, &block)
  new_middleware = Array.wrap(new_middleware)
  index = internal_middleware.index(existing_middleware)
  updated_middleware = internal_middleware.insert(index + 1, *new_middleware)
  continue_chain(updated_middleware, internal_context, &block)
end

#insert_before(new_middleware, existing_middleware, &block) ⇒ Object



55
56
57
58
59
60
# File 'lib/arel/middleware/chain.rb', line 55

def insert_before(new_middleware, existing_middleware, &block)
  new_middleware = Array.wrap(new_middleware)
  index = internal_middleware.index(existing_middleware)
  updated_middleware = internal_middleware.insert(index, *new_middleware)
  continue_chain(updated_middleware, internal_context, &block)
end

#none(&block) ⇒ Object



45
46
47
# File 'lib/arel/middleware/chain.rb', line 45

def none(&block)
  continue_chain([], internal_context, &block)
end

#prepend(new_middleware, &block) ⇒ Object



62
63
64
65
66
# File 'lib/arel/middleware/chain.rb', line 62

def prepend(new_middleware, &block)
  new_middleware = Array.wrap(new_middleware)
  updated_middleware = new_middleware + internal_middleware
  continue_chain(updated_middleware, internal_context, &block)
end

#to_sql(type, &block) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/arel/middleware/chain.rb', line 91

def to_sql(type, &block)
  middleware = Arel::Middleware::ToSqlMiddleware.new(type)

  new_chain = Arel::Middleware::Chain.new(
    internal_middleware + [middleware],
    internal_context,
    Arel::Middleware::ToSqlExecutor,
  )

  maybe_execute_block(new_chain, &block)

  middleware.sql
end