summaryrefslogtreecommitdiff
path: root/app/models/namespaces/traversal/linear_scopes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/namespaces/traversal/linear_scopes.rb')
-rw-r--r--app/models/namespaces/traversal/linear_scopes.rb29
1 files changed, 17 insertions, 12 deletions
diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb
index f5c44171c42..0dfb7320461 100644
--- a/app/models/namespaces/traversal/linear_scopes.rb
+++ b/app/models/namespaces/traversal/linear_scopes.rb
@@ -105,27 +105,32 @@ module Namespaces
:traversal_ids,
'LEAD (namespaces.traversal_ids, 1) OVER (ORDER BY namespaces.traversal_ids ASC) next_traversal_ids'
)
- cte = Gitlab::SQL::CTE.new(:base_cte, base)
+ base_cte = Gitlab::SQL::CTE.new(:descendants_base_cte, base)
namespaces = Arel::Table.new(:namespaces)
- records = unscoped
- .with(cte.to_arel)
- .from([cte.table, namespaces])
# Bound the search space to ourselves (optional) and descendants.
#
# WHERE (base_cte.next_traversal_ids IS NULL OR base_cte.next_traversal_ids > namespaces.traversal_ids)
# AND next_traversal_ids_sibling(base_cte.traversal_ids) > namespaces.traversal_ids
- records = records
- .where(cte.table[:next_traversal_ids].eq(nil).or(cte.table[:next_traversal_ids].gt(namespaces[:traversal_ids])))
- .where(next_sibling_func(cte.table[:traversal_ids]).gt(namespaces[:traversal_ids]))
+ records = unscoped
+ .from([base_cte.table, namespaces])
+ .where(base_cte.table[:next_traversal_ids].eq(nil).or(base_cte.table[:next_traversal_ids].gt(namespaces[:traversal_ids])))
+ .where(next_sibling_func(base_cte.table[:traversal_ids]).gt(namespaces[:traversal_ids]))
# AND base_cte.traversal_ids <= namespaces.traversal_ids
- if include_self
- records.where(cte.table[:traversal_ids].lteq(namespaces[:traversal_ids]))
- else
- records.where(cte.table[:traversal_ids].lt(namespaces[:traversal_ids]))
- end
+ records = if include_self
+ records.where(base_cte.table[:traversal_ids].lteq(namespaces[:traversal_ids]))
+ else
+ records.where(base_cte.table[:traversal_ids].lt(namespaces[:traversal_ids]))
+ end
+
+ records_cte = Gitlab::SQL::CTE.new(:descendants_cte, records)
+
+ unscoped
+ .unscope(where: [:type])
+ .with(base_cte.to_arel, records_cte.to_arel)
+ .from(records_cte.alias_to(namespaces))
end
def next_sibling_func(*args)