Skip to content

Commit

Permalink
Join before wheres
Browse files Browse the repository at this point in the history
  • Loading branch information
gridanjbf authored and tagliala committed Nov 8, 2021
1 parent 5725762 commit c809830
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
8 changes: 7 additions & 1 deletion lib/chrono_model/patches/relation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,13 @@ def chrono_join_history(join)
#
return if join.left.respond_to?(:as_of_time)

model = ChronoModel.history_models[join.left.table_name]
model =
if (join.left.respond_to?(:table_name))
ChronoModel.history_models[join.left.table_name]
else
ChronoModel.history_models[join.left]
end

return unless model

join.left = ChronoModel::Patches::JoinNode.new(
Expand Down
14 changes: 10 additions & 4 deletions lib/chrono_model/time_machine/timeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,15 @@ def timeline(record = nil, options = {})
select("DISTINCT UNNEST(ARRAY[#{fields.join(',')}]) AS ts")

if assocs.present?
relation = relation.joins(*assocs.map(&:name))
assocs.each do |ass|
# `join` first, then use `where`s
relation =
if ass.belongs_to?
relation.joins("LEFT JOIN #{ass.table_name} ON #{ass.table_name}.id = #{table_name}.#{ass.foreign_key}")
else
relation.joins("LEFT JOIN #{ass.table_name} ON #{ass.table_name}.#{ass.foreign_key} = #{table_name}.id")
end
end
end

relation = relation.
Expand All @@ -32,7 +40,7 @@ def timeline(record = nil, options = {})
relation = relation.from(%["public".#{quoted_table_name}]) unless self.chrono?
relation = relation.where(id: rid) if rid

sql = "SELECT ts FROM ( #{relation.to_sql} ) foo WHERE ts IS NOT NULL"
sql = "SELECT ts FROM ( #{relation.to_sql} ) AS foo WHERE ts IS NOT NULL"

if options.key?(:before)
sql << " AND ts < '#{Conversions.time_to_utc_string(options[:before])}'"
Expand All @@ -50,8 +58,6 @@ def timeline(record = nil, options = {})

sql << " LIMIT #{options[:limit].to_i}" if options.key?(:limit)

sql.gsub! 'INNER JOIN', 'LEFT OUTER JOIN'

connection.on_schema(Adapter::HISTORY_SCHEMA) do
connection.select_values(sql, "#{self.name} periods").map! do |ts|
Conversions.string_to_utc_time ts
Expand Down

0 comments on commit c809830

Please sign in to comment.