from(*indices)
click to toggle source
def from(*indices)
@indices += indices
self
end
group_by(attribute)
click to toggle source
def group_by(attribute)
@group_by = attribute
self
end
limit(limit)
click to toggle source
def limit(limit)
@limit = limit
self
end
matching(match)
click to toggle source
def matching(match)
@matching = match
self
end
offset(offset)
click to toggle source
def offset(offset)
@offset = offset
self
end
order_by(order)
click to toggle source
def order_by(order)
@order_by = order
self
end
order_within_group_by(order)
click to toggle source
def order_within_group_by(order)
@order_within_group_by = order
self
end
to_sql()
click to toggle source
def to_sql
sql = "SELECT #{ @values.join(', ') } FROM #{ @indices.join(', ') }"
sql << " WHERE #{ combined_wheres }" if wheres?
sql << " GROUP BY #{escape_column(@group_by)}" if !@group_by.nil?
unless @order_within_group_by.nil?
sql << " WITHIN GROUP ORDER BY #{escape_column(@order_within_group_by)}"
end
sql << " ORDER BY #{escape_column(@order_by)}" if !@order_by.nil?
sql << " #{limit_clause}" unless @limit.nil? && @offset.nil?
sql << " #{options_clause}" unless @options.empty?
sql
end
values(*values)
click to toggle source
def values(*values)
@values += values
self
end
where(filters = {})
click to toggle source
def where(filters = {})
@wheres.merge!(filters)
self
end
where_all(filters = {})
click to toggle source
def where_all(filters = {})
@where_alls.merge!(filters)
self
end
where_not(filters = {})
click to toggle source
def where_not(filters = {})
@where_nots.merge!(filters)
self
end
where_not_all(filters = {})
click to toggle source
def where_not_all(filters = {})
@where_not_alls.merge!(filters)
self
end
with_options(options = {})
click to toggle source
def with_options(options = {})
@options.merge! options
self
end
combined_wheres()
click to toggle source
def combined_wheres
if @matching.nil?
wheres_to_s
elsif @wheres.empty? && @where_nots.empty? && @where_alls.empty? && @where_not_alls.empty?
"MATCH(#{Riddle::Query.quote @matching})"
else
"MATCH(#{Riddle::Query.quote @matching}) AND #{wheres_to_s}"
end
end
escape_column(column)
click to toggle source
def escape_column(column)
if column.to_s =~ /\A[`@]/
column
else
column_name, *extra = column.to_s.split(' ')
extra.unshift("`#{column_name}`").compact.join(' ')
end
end
exclusive_filter_comparison_and_value(attribute, value)
click to toggle source
def exclusive_filter_comparison_and_value(attribute, value)
case value
when Array
"#{escape_column(attribute)} NOT IN (#{value.collect { |val| filter_value(val) }.join(', ')})"
when Range
"#{escape_column(attribute)} < #{filter_value(value.first)} OR #{attribute} > #{filter_value(value.last)}"
else
"#{escape_column(attribute)} <> #{filter_value(value)}"
end
end
filter_comparison_and_value(attribute, value)
click to toggle source
def filter_comparison_and_value(attribute, value)
case value
when Array
"#{escape_column(attribute)} IN (#{value.collect { |val| filter_value(val) }.join(', ')})"
when Range
"#{escape_column(attribute)} BETWEEN #{filter_value(value.first)} AND #{filter_value(value.last)}"
else
"#{escape_column(attribute)} = #{filter_value(value)}"
end
end
filter_value(value)
click to toggle source
def filter_value(value)
case value
when TrueClass
1
when FalseClass
0
when Time
value.to_i
else
value
end
end
limit_clause()
click to toggle source
def limit_clause
if @offset.nil?
"LIMIT #{@limit}"
else
"LIMIT #{@offset}, #{@limit || 20}"
end
end
option_value(value)
click to toggle source
def option_value(value)
case value
when Hash
'(' + value.collect { |key, value| "#{key}=#{value}" }.join(', ') + ')'
else
value
end
end
options_clause()
click to toggle source
def options_clause
'OPTION ' + @options.keys.collect { |key|
"#{key}=#{option_value @options[key]}"
}.join(', ')
end
wheres?()
click to toggle source
def wheres?
!(@wheres.empty? && @where_alls.empty? && @where_nots.empty? && @where_not_alls.empty? && @matching.nil?)
end
wheres_to_s()
click to toggle source
def wheres_to_s
(
@wheres.keys.collect { |key|
filter_comparison_and_value key, @wheres[key]
} +
@where_alls.collect { |key, values|
values.collect { |value|
filter_comparison_and_value key, value
}
} +
@where_nots.keys.collect { |key|
exclusive_filter_comparison_and_value key, @where_nots[key]
} +
@where_not_alls.collect { |key, values|
'(' + values.collect { |value|
exclusive_filter_comparison_and_value key, value
}.join(' OR ') + ')'
}
).flatten.join(' AND ')
end