Class: Ambition::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/ambition/lib/ambition/query.rb

Constant Summary collapse

@@select =
'SELECT * FROM %s %s'

Instance Method Summary collapse

Constructor Details

#initialize(owner) ⇒ Query

Returns a new instance of Query.



5
6
7
8
9
# File 'lib/ambition/lib/ambition/query.rb', line 5

def initialize(owner)
  @table_name = owner.table_name
  @owner      = owner
  @clauses    = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



20
21
22
23
24
# File 'lib/ambition/lib/ambition/query.rb', line 20

def method_missing(method, *args, &block) 
  with_context do
    @owner.send(method, *args, &block)
  end
end

Instance Method Details

#add(clause) ⇒ Object



11
12
13
14
# File 'lib/ambition/lib/ambition/query.rb', line 11

def add(clause) 
  @clauses << clause
  self
end

#keyed_clausesObject



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/ambition/lib/ambition/query.rb', line 71

def keyed_clauses
  @clauses.inject({}) do |hash, clause|
    hash[clause.key] ||= []
    hash[clause.key] << clause.to_s

    if clause.respond_to?(:includes) && !clause.includes.blank?
      hash[:includes] ||= []
      hash[:includes] << clause.includes
    end

    hash
  end
end

#query_contextObject



16
17
18
# File 'lib/ambition/lib/ambition/query.rb', line 16

def query_context 
  self
end

#to_hashObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ambition/lib/ambition/query.rb', line 34

def to_hash
  keyed = keyed_clauses
  hash  = {}

  unless (where = keyed[:conditions]).blank?
    hash[:conditions] = Array(where)
    hash[:conditions] *= ' AND '
  end

  unless (includes = keyed[:includes]).blank?
    hash[:includes] = includes.flatten
  end

  if order = keyed[:order]
    hash[:order] = order.join(', ')
  end

  if limit = keyed[:limit]
    hash[:limit] = limit.join(', ')
  end

  hash
end

#to_sObject Also known as: to_sql



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ambition/lib/ambition/query.rb', line 58

def to_s
  hash = keyed_clauses

  sql = []
  sql << "JOIN #{hash[:includes].join(', ')}"       unless hash[:includes].blank?
  sql << "WHERE #{hash[:conditions].join(' AND ')}" unless hash[:conditions].blank?
  sql << "ORDER BY #{hash[:order].join(', ')}"      unless hash[:order].blank?
  sql << "LIMIT #{hash[:limit].join(', ')}"         unless hash[:limit].blank?

  @@select % [ @table_name, sql.join(' ') ]
end

#with_contextObject



26
27
28
29
30
31
32
# File 'lib/ambition/lib/ambition/query.rb', line 26

def with_context 
  @owner.query_context = self
  ret = yield
ensure
  @owner.query_context = nil
  ret
end