Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/work_items/work_item_hierarchy.rb')
-rw-r--r--lib/gitlab/work_items/work_item_hierarchy.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/gitlab/work_items/work_item_hierarchy.rb b/lib/gitlab/work_items/work_item_hierarchy.rb
new file mode 100644
index 00000000000..e71bf2bce6a
--- /dev/null
+++ b/lib/gitlab/work_items/work_item_hierarchy.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module WorkItems
+ class WorkItemHierarchy < ObjectHierarchy
+ extend ::Gitlab::Utils::Override
+
+ private
+
+ def middle_table
+ ::WorkItems::ParentLink.arel_table
+ end
+
+ def from_tables(cte)
+ [objects_table, cte.table, middle_table]
+ end
+
+ override :parent_id_column
+ def parent_id_column(cte)
+ middle_table[:work_item_parent_id]
+ end
+
+ override :ancestor_conditions
+ def ancestor_conditions(cte)
+ conditions = middle_table[:work_item_parent_id].eq(objects_table[:id]).and(
+ middle_table[:work_item_id].eq(cte.table[:id])
+ )
+
+ with_type_filter(conditions, cte)
+ end
+
+ override :descendant_conditions
+ def descendant_conditions(cte)
+ conditions = middle_table[:work_item_id].eq(objects_table[:id]).and(
+ middle_table[:work_item_parent_id].eq(cte.table[:id])
+ )
+
+ with_type_filter(conditions, cte)
+ end
+
+ def with_type_filter(conditions, cte)
+ return conditions unless options[:same_type]
+
+ conditions.and(objects_table[:work_item_type_id].eq(cte.table[:work_item_type_id]))
+ end
+ end
+ end
+end