Commit e0cd045a authored by Adam Hegyi's avatar Adam Hegyi

Eliminate redundant UnsupportedScopeOrder classes

This change defines UnsupportedScopeOrder class at only one place.
parent 6bb96f42
...@@ -169,7 +169,7 @@ Consider the following scope: ...@@ -169,7 +169,7 @@ Consider the following scope:
scope = Issue.where(project_id: 10).order(Gitlab::Database.nulls_last_order('relative_position', 'DESC')) scope = Issue.where(project_id: 10).order(Gitlab::Database.nulls_last_order('relative_position', 'DESC'))
# SELECT "issues".* FROM "issues" WHERE "issues"."project_id" = 10 ORDER BY relative_position DESC NULLS LAST # SELECT "issues".* FROM "issues" WHERE "issues"."project_id" = 10 ORDER BY relative_position DESC NULLS LAST
scope.keyset_paginate # raises: Gitlab::Pagination::Keyset::Paginator::UnsupportedScopeOrder: The order on the scope does not support keyset pagination scope.keyset_paginate # raises: Gitlab::Pagination::Keyset::UnsupportedScopeOrder: The order on the scope does not support keyset pagination
``` ```
The `keyset_paginate` method raises an error because the order value on the query is a custom SQL string and not an [`Arel`](https://www.rubydoc.info/gems/arel) AST node. The keyset library cannot automatically infer configuration values from these kinds of queries. The `keyset_paginate` method raises an error because the order value on the query is a custom SQL string and not an [`Arel`](https://www.rubydoc.info/gems/arel) AST node. The keyset library cannot automatically infer configuration values from these kinds of queries.
......
...@@ -6,8 +6,6 @@ module Gitlab ...@@ -6,8 +6,6 @@ module Gitlab
module InOperatorOptimization module InOperatorOptimization
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
class QueryBuilder class QueryBuilder
UnsupportedScopeOrder = Class.new(StandardError)
RECURSIVE_CTE_NAME = 'recursive_keyset_cte' RECURSIVE_CTE_NAME = 'recursive_keyset_cte'
# This class optimizes slow database queries (PostgreSQL specific) where the # This class optimizes slow database queries (PostgreSQL specific) where the
...@@ -44,14 +42,7 @@ module Gitlab ...@@ -44,14 +42,7 @@ module Gitlab
def initialize(scope:, array_scope:, array_mapping_scope:, finder_query: nil, values: {}) def initialize(scope:, array_scope:, array_mapping_scope:, finder_query: nil, values: {})
@scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope) @scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
unless success raise(UnsupportedScopeOrder) unless success
error_message = <<~MSG
The order on the scope does not support keyset pagination. You might need to define a custom Order object.\n
See https://docs.gitlab.com/ee/development/database/keyset_pagination.html#complex-order-configuration\n
Or the Gitlab::Pagination::Keyset::Order class for examples
MSG
raise(UnsupportedScopeOrder, error_message)
end
@order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope) @order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
@array_scope = array_scope @array_scope = array_scope
......
...@@ -4,11 +4,9 @@ module Gitlab ...@@ -4,11 +4,9 @@ module Gitlab
module Pagination module Pagination
module Keyset module Keyset
class Iterator class Iterator
UnsupportedScopeOrder = Class.new(StandardError)
def initialize(scope:, cursor: {}, use_union_optimization: true, in_operator_optimization_options: nil) def initialize(scope:, cursor: {}, use_union_optimization: true, in_operator_optimization_options: nil)
@scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope) @scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
raise(UnsupportedScopeOrder, 'The order on the scope does not support keyset pagination') unless success raise(UnsupportedScopeOrder) unless success
@cursor = cursor @cursor = cursor
@order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope) @order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
......
...@@ -19,8 +19,6 @@ module Gitlab ...@@ -19,8 +19,6 @@ module Gitlab
FORWARD_DIRECTION = 'n' FORWARD_DIRECTION = 'n'
BACKWARD_DIRECTION = 'p' BACKWARD_DIRECTION = 'p'
UnsupportedScopeOrder = Class.new(StandardError)
# scope - ActiveRecord::Relation object with order by clause # scope - ActiveRecord::Relation object with order by clause
# cursor - Encoded cursor attributes as String. Empty value will requests the first page. # cursor - Encoded cursor attributes as String. Empty value will requests the first page.
# per_page - Number of items per page. # per_page - Number of items per page.
...@@ -167,7 +165,7 @@ module Gitlab ...@@ -167,7 +165,7 @@ module Gitlab
def build_scope(scope) def build_scope(scope)
keyset_aware_scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope) keyset_aware_scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
raise(UnsupportedScopeOrder, 'The order on the scope does not support keyset pagination') unless success raise(UnsupportedScopeOrder) unless success
keyset_aware_scope keyset_aware_scope
end end
......
# frozen_string_literal: true
module Gitlab
module Pagination
module Keyset
class UnsupportedScopeOrder < StandardError
DEFAULT_ERROR_MESSAGE = <<~MSG
The order on the scope does not support keyset pagination. You might need to define a custom Order object.\n
See https://docs.gitlab.com/ee/development/database/keyset_pagination.html#complex-order-configuration\n
Or the Gitlab::Pagination::Keyset::Order class for examples
MSG
def message
DEFAULT_ERROR_MESSAGE
end
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment