diff options
Diffstat (limited to 'lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb')
-rw-r--r-- | lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb new file mode 100644 index 00000000000..95afd5a8595 --- /dev/null +++ b/lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Gitlab + module Pagination + module Keyset + module InOperatorOptimization + class ArrayScopeColumns + ARRAY_SCOPE_CTE_NAME = 'array_cte' + + def initialize(columns) + validate_columns!(columns) + + array_scope_table = Arel::Table.new(ARRAY_SCOPE_CTE_NAME) + @columns = columns.map do |column| + ColumnData.new(column, "array_scope_#{column}", array_scope_table) + end + end + + def array_scope_cte_name + ARRAY_SCOPE_CTE_NAME + end + + def array_aggregated_columns + columns.map(&:array_aggregated_column) + end + + def array_aggregated_column_names + columns.map(&:array_aggregated_column_name) + end + + def arel_columns + columns.map(&:arel_column) + end + + def array_lookup_expressions_by_position(table_name) + columns.map do |column| + Arel.sql("#{table_name}.#{column.array_aggregated_column_name}[position]") + end + end + + private + + attr_reader :columns + + def validate_columns!(columns) + if columns.blank? + msg = <<~MSG + No array columns were given. + Make sure you explicitly select the columns in the array_scope parameter. + Example: Project.select(:id) + MSG + raise StandardError, msg + end + end + end + end + end + end +end |