Class: GmailSearchSyntax::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/gmail_search_syntax/sql_visitor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(alias_counter:) ⇒ Query

Returns a new instance of Query.



5
6
7
8
9
10
11
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 5

def initialize(alias_counter:)
  @conditions = []
  @joins = {}
  @params = []
  @table_aliases = {}
  @alias_counter = alias_counter
end

Instance Attribute Details

#alias_counterObject (readonly)

Returns the value of attribute alias_counter.



3
4
5
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 3

def alias_counter
  @alias_counter
end

#conditionsObject (readonly)

Returns the value of attribute conditions.



3
4
5
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 3

def conditions
  @conditions
end

#joinsObject (readonly)

Returns the value of attribute joins.



3
4
5
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 3

def joins
  @joins
end

#paramsObject (readonly)

Returns the value of attribute params.



3
4
5
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 3

def params
  @params
end

Instance Method Details

#add_condition(sql_fragment) ⇒ Object



13
14
15
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 13

def add_condition(sql_fragment)
  @conditions << sql_fragment
end

#add_join(table_name, join_sql) ⇒ Object



21
22
23
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 21

def add_join(table_name, join_sql)
  @joins["#{table_name}_#{@joins.size}"] = join_sql
end

#add_param(value) ⇒ Object



17
18
19
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 17

def add_param(value)
  @params << value
end

#get_table_alias(table_name, base_alias = nil) ⇒ Object



25
26
27
28
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 25

def get_table_alias(table_name, base_alias = nil)
  counter_value = @alias_counter.next
  base_alias || "#{table_name.split("_").map { |w| w[0] }.join}#{counter_value}"
end

#to_sqlObject



30
31
32
33
34
35
36
# File 'lib/gmail_search_syntax/sql_visitor.rb', line 30

def to_sql
  where_clause = @conditions.empty? ? "1 = 1" : @conditions.join(" ")
  base_query = "SELECT DISTINCT m0.id FROM messages AS m0"
  join_clause = @joins.values.join(" ")
  full_query = [base_query, join_clause, "WHERE", where_clause].reject(&:empty?).join(" ")
  [full_query, @params]
end