Class: Card::Query::SqlStatement

Inherits:
Object
  • Object
show all
Includes:
Joins, Order, Where
Defined in:
lib/card/query/sql_statement.rb,
lib/card/query/sql_statement/joins.rb,
lib/card/query/sql_statement/order.rb,
lib/card/query/sql_statement/where.rb

Overview

convert @query sort rep into order by statement order information is stored in @mods, @mods, and @mods

Defined Under Namespace

Modules: Joins, Order, Where

Constant Summary collapse

ORDER_MAP =
{
  "id" => "id",
  "update" => "updated_at",
  "create" => "created_at",
  "name" => "key",
  "content" => "db_content",
  "alpha" => "key",       # DEPRECATED
  "relevance" => "updated_at" # DEPRECATED
}.freeze

Instance Method Summary collapse

Methods included from Order

#order, #order_as, #order_dir, #order_directive, #order_directives, #order_field

Methods included from Where

#basic_conditions, #condition_joint, #conditions_from, #exist_condition, #explicit_conditions, #format_conditions, #implicit_conditions, #in_condition, #maybe_not, #permission_conditions, #spaced_subquery_sql, #standard_condition, #trash_condition, #where

Methods included from Joins

#join_clause, #join_clause_parts, #join_table, #joins, #joins_on_query, #on_card_conditions, #on_clause, #subjoins

Constructor Details

#initialize(query = nil) ⇒ SqlStatement

Returns a new instance of SqlStatement.



18
19
20
21
# File 'lib/card/query/sql_statement.rb', line 18

def initialize query=nil
  @query = query
  @mods = query&.mods
end

Instance Method Details

#buildObject



23
24
25
26
27
28
29
30
31
32
# File 'lib/card/query/sql_statement.rb', line 23

def build
  @fields = fields
  @tables = tables
  @joins  = joins
  @where  = where
  @group  = group
  @order  = order
  @limit_and_offset = limit_and_offset
  self
end

#cast_type(type) ⇒ Object



114
115
116
117
# File 'lib/card/query/sql_statement.rb', line 114

def cast_type type
  cxn ||= ActiveRecord::Base.connection
  (val = cxn.cast_types[type.to_sym]) ? val[:name] : safe_sql(type)
end

#commentObject



52
53
54
55
56
# File 'lib/card/query/sql_statement.rb', line 52

def comment
  return nil unless Card.config.sql_comments && @query.comment

  "/* #{@query.comment} */\n"
end

#fieldsObject



62
63
64
65
66
67
68
# File 'lib/card/query/sql_statement.rb', line 62

def fields
  table = @query.table_alias
  field = @mods[:return] unless @mods[:return] =~ /^_\w+/
  field = field.blank? ? :card : field.to_sym
  field = full_field(table, field)
  [field, @mods[:sort_join_field]].compact * ", "
end

#fromObject



44
45
46
# File 'lib/card/query/sql_statement.rb', line 44

def from
  "FROM #{@tables}"
end

#full_field(table, field) ⇒ Object



70
71
72
73
74
75
76
77
78
79
# File 'lib/card/query/sql_statement.rb', line 70

def full_field table, field
  case field
  when :card, :raw then "#{table}.*"
  when :content    then "#{table}.db_content"
  when :name, :key then "#{table}.name, #{table}.left_id, #{table}.right_id"
  when :count      then "coalesce(count( distinct #{table}.id),0) as count"
  else
    standard_full_field table, field
  end
end

#full_syntaxObject



106
107
108
# File 'lib/card/query/sql_statement.rb', line 106

def full_syntax
  @query.full? ? yield : return
end

#groupObject



89
90
91
92
# File 'lib/card/query/sql_statement.rb', line 89

def group
  group = @mods[:group]
  "GROUP BY #{safe_sql group}" if group.present?
end

#leading_spaceObject



48
49
50
# File 'lib/card/query/sql_statement.rb', line 48

def leading_space
  " " * (@query.depth * 2)
end

#limit_and_offsetObject



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/card/query/sql_statement.rb', line 94

def limit_and_offset
  full_syntax do
    limit = @mods[:limit]
    offset = @mods[:offset]
    if limit.to_i.positive?
      string =  "LIMIT  #{limit.to_i} "
      string += "OFFSET #{offset.to_i} " if offset.present?
      string
    end
  end
end

#safe_sql(txt) ⇒ Object



110
111
112
# File 'lib/card/query/sql_statement.rb', line 110

def safe_sql txt
  Query.safe_sql txt
end

#selectObject



40
41
42
# File 'lib/card/query/sql_statement.rb', line 40

def select
  "#{leading_space}SELECT #{'DISTINCT' if @joins.present?} #{@fields}"
end

#standard_full_field(table, field) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/card/query/sql_statement.rb', line 81

def standard_full_field table, field
  if Query.attributes[field.to_sym] == :basic
    "#{table}.#{field}"
  else
    safe_sql field
  end
end

#tablesObject



58
59
60
# File 'lib/card/query/sql_statement.rb', line 58

def tables
  "#{@query.table} #{@query.table_alias}"
end

#to_sObject



34
35
36
37
38
# File 'lib/card/query/sql_statement.rb', line 34

def to_s
  [
    comment, select, from, @joins, @where, @group, @order, @limit_and_offset
  ].compact.join " "
end