Class: Gitlab::Pagination::Keyset::InOperatorOptimization::OrderByColumns

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb

Instance Method Summary collapse

Constructor Details

#initialize(columns, arel_table) ⇒ OrderByColumns

This class exposes collection methods for the order by columns

Example: by modeling the ‘issues.created_at ASC, issues.id ASC` ORDER BY SQL clause, this class will receive two ColumnOrderDefinition objects



14
15
16
17
18
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 14

def initialize(columns, arel_table)
  @columns = columns.map do |column|
    OrderByColumnData.new(column, "order_by_columns_#{column.attribute_name}", arel_table)
  end
end

Instance Method Details

#arel_columnsObject



20
21
22
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 20

def arel_columns
  columns.map(&:column_for_projection)
end

#array_aggregated_column_namesObject



28
29
30
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 28

def array_aggregated_column_names
  columns.map(&:array_aggregated_column_name)
end

#array_aggregated_columnsObject



24
25
26
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 24

def array_aggregated_columns
  columns.map(&:array_aggregated_column)
end

#array_lookup_expressions_by_position(table_name) ⇒ Object



51
52
53
54
55
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 51

def array_lookup_expressions_by_position(table_name)
  columns.map do |column|
    Arel.sql("#{table_name}.#{column.array_aggregated_column_name}[position]")
  end
end

#cursor_values(table_name) ⇒ Object



45
46
47
48
49
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 45

def cursor_values(table_name)
  columns.each_with_object({}) do |column, hash|
    hash[column.original_column_name] = Arel.sql("#{table_name}.#{column.array_aggregated_column_name}[position]")
  end
end

#each(&block) ⇒ Object



65
66
67
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 65

def each(&block)
  columns.each(&block)
end

#original_column_namesObject



32
33
34
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 32

def original_column_names
  columns.map(&:original_column_name)
end

#original_column_names_as_arel_stringObject



36
37
38
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 36

def original_column_names_as_arel_string
  columns.map { |c| Arel.sql(c.original_column_name) }
end

#original_column_names_as_tmp_tambleObject



40
41
42
43
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 40

def original_column_names_as_tmp_tamble
  temp_table = Arel::Table.new('record')
  original_column_names.map { |c| temp_table[c] }
end

#replace_value_in_array_by_position_expressionsObject



57
58
59
60
61
62
63
# File 'lib/gitlab/pagination/keyset/in_operator_optimization/order_by_columns.rb', line 57

def replace_value_in_array_by_position_expressions
  columns.map do |column|
    name = "#{QueryBuilder::RECURSIVE_CTE_NAME}.#{column.array_aggregated_column_name}"
    new_value = "next_cursor_values.#{column.original_column_name}"
    "#{name}[:position_query.position-1]||#{new_value}||#{name}[position_query.position+1:]"
  end
end