26 lines
		
	
	
		
			939 B
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			26 lines
		
	
	
		
			939 B
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Database
 | 
						|
    module DateTime
 | 
						|
      # Find the first of the `end_time_attrs` that isn't `NULL`. Subtract from it
 | 
						|
      # the first of the `start_time_attrs` that isn't NULL. `SELECT` the resulting interval
 | 
						|
      # along with an alias specified by the `as` parameter.
 | 
						|
      #
 | 
						|
      # Note: the interval is returned as an INTERVAL type.
 | 
						|
      def subtract_datetimes(query_so_far, start_time_attrs, end_time_attrs, as)
 | 
						|
        diff_fn = subtract_datetimes_diff(query_so_far, start_time_attrs, end_time_attrs)
 | 
						|
 | 
						|
        query_so_far.project(diff_fn.as(as))
 | 
						|
      end
 | 
						|
 | 
						|
      def subtract_datetimes_diff(query_so_far, start_time_attrs, end_time_attrs)
 | 
						|
        Arel::Nodes::Subtraction.new(
 | 
						|
          Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(end_time_attrs)),
 | 
						|
          Arel::Nodes::NamedFunction.new("COALESCE", Array.wrap(start_time_attrs))
 | 
						|
        )
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |