base_association()
click to toggle source
def base_association
reflections.first
end
base_association_class()
click to toggle source
def base_association_class
base_association.klass
end
column()
click to toggle source
def column
@column ||= property.columns.first
end
extend_reflection(reflection)
click to toggle source
def extend_reflection(reflection)
return [reflection] unless reflection.through_reflection
[reflection.through_reflection, reflection.source_reflection]
end
joins()
click to toggle source
def joins
@joins ||= begin
remainder = reflections.collect(&:name)[1..-1]
return nil if remainder.empty?
return remainder.first if remainder.length == 1
remainder[0..-2].reverse.inject(remainder.last) { |value, key|
{key => value}
}
end
end
offset()
click to toggle source
def offset
"* #{ThinkingSphinx::Configuration.instance.indices.count} + #{source.offset}"
end
queries()
click to toggle source
def queries
queries = []
if column.string?
queries << column.__name.strip.gsub(/\n/, "\\\n")
else
queries << to_sql
queries << range_sql if ranged?
end
queries
end
quote_column(column)
click to toggle source
def quote_column(column)
ActiveRecord::Base.connection.quote_column_name(column)
end
quote_with_table(table, column)
click to toggle source
def quote_with_table(table, column)
"#{quote_column(table)}.#{quote_column(column)}"
end
quoted_foreign_key()
click to toggle source
def quoted_foreign_key
quote_with_table(base_association_class.table_name, base_association.foreign_key)
end
quoted_primary_key()
click to toggle source
def quoted_primary_key
quote_with_table(reflections.last.klass.table_name, column.__name)
end
range_sql()
click to toggle source
def range_sql
base_association_class_unscoped.select(
"MIN(#{quoted_foreign_key}), MAX(#{quoted_foreign_key})"
).to_sql
end
ranged?()
click to toggle source
def ranged?
property.source_type == :ranged_query
end
reflections()
click to toggle source
def reflections
@reflections ||= begin
base = source.model
column.__stack.collect { |key|
reflection = base.reflections[key]
base = reflection.klass
extend_reflection reflection
}.flatten
end
end
source_type()
click to toggle source
def source_type
property.source_type.to_s.dasherize
end
to_sql()
click to toggle source
def to_sql
raise "Could not determine SQL for MVA" if reflections.empty?
relation = base_association_class_unscoped.select("#{quoted_foreign_key} #{offset} AS #{quote_column('id')}, #{quoted_primary_key} AS #{quote_column(property.name)}"
)
relation = relation.joins(joins) if joins.present?
relation = relation.where("#{quoted_foreign_key} BETWEEN $start AND $end") if ranged?
relation = relation.order("#{quoted_foreign_key} ASC") if type.nil?
relation.to_sql
end