summaryrefslogtreecommitdiff
path: root/lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb')
-rw-r--r--lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb b/lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb
new file mode 100644
index 00000000000..fa25181d663
--- /dev/null
+++ b/lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module Pagination
+ module Keyset
+ module Conditions
+ class NullCondition < BaseCondition
+ def build
+ [first_attribute_condition, final_condition].join
+ end
+
+ private
+
+ # ex: "(relative_position IS NULL AND id > 500)"
+ def first_attribute_condition
+ condition = <<~SQL
+ (
+ #{table_condition(order_list.first, nil, 'is_null').to_sql}
+ AND
+ #{table_condition(order_list[1], values[1], operators[1]).to_sql}
+ )
+ SQL
+
+ condition
+ end
+
+ # ex: " OR (relative_position IS NOT NULL)"
+ def final_condition
+ if before_or_after == :before
+ <<~SQL
+ OR (#{table_condition(order_list.first, nil, 'is_not_null').to_sql})
+ SQL
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end