diff --git a/src/lib/features/feature-search/feature-search-store.ts b/src/lib/features/feature-search/feature-search-store.ts index cd49ec67f5..97dc2075a0 100644 --- a/src/lib/features/feature-search/feature-search-store.ts +++ b/src/lib/features/feature-search/feature-search-store.ts @@ -343,89 +343,10 @@ class FeatureSearchStore implements IFeatureSearchStore { .orderBy('final_rank'); if (this.flagResolver.isEnabled('flagsOverviewSearch')) { - finalQuery - .leftJoin( - this.db('change_request_events AS cre') - .join( - 'change_requests AS cr', - 'cre.change_request_id', - 'cr.id', - ) - .select('cre.feature') - .select( - this.db.raw( - 'array_agg(distinct cre.change_request_id) AS change_request_ids', - ), - ) - .select('cr.environment') - .groupBy('cre.feature', 'cr.environment') - .whereNotIn('cr.state', [ - 'Applied', - 'Cancelled', - 'Rejected', - ]) - .as('feature_cr'), - function () { - this.on( - 'feature_cr.feature', - '=', - 'ranked_features.feature_name', - ).andOn( - 'feature_cr.environment', - '=', - 'ranked_features.environment', - ); - }, - ) - .select('feature_cr.change_request_ids'); - - finalQuery - .leftJoin( - this.db - .with('total_milestones', (qb) => { - qb.select('release_plan_definition_id') - .count('* as total_milestones') - .from('milestones') - .groupBy('release_plan_definition_id'); - }) - .select([ - 'rpd.feature_name', - 'rpd.environment', - 'active_milestone.sort_order AS milestone_order', - 'total_milestones.total_milestones', - 'active_milestone.name AS milestone_name', - ]) - .from('release_plan_definitions AS rpd') - .join( - 'total_milestones', - 'total_milestones.release_plan_definition_id', - 'rpd.id', - ) - .join( - 'milestones AS active_milestone', - 'active_milestone.id', - 'rpd.active_milestone_id', - ) - .where('rpd.discriminator', 'plan') - .as('feature_release_plan'), - function () { - this.on( - 'feature_release_plan.feature_name', - '=', - 'ranked_features.feature_name', - ).andOn( - 'feature_release_plan.environment', - '=', - 'ranked_features.environment', - ); - }, - ) - .select([ - 'feature_release_plan.milestone_name', - 'feature_release_plan.milestone_order', - 'feature_release_plan.total_milestones', - ]); + this.buildChangeRequestSql(finalQuery); + this.buildReleasePlanSql(finalQuery); } + this.queryExtraData(finalQuery); const rows = await finalQuery; stopTimer(); @@ -514,6 +435,93 @@ class FeatureSearchStore implements IFeatureSearchStore { ); } + private buildReleasePlanSql(queryBuilder: Knex.QueryBuilder) { + queryBuilder + .leftJoin( + this.db + .with('total_milestones', (qb) => { + qb.select('release_plan_definition_id') + .count('* as total_milestones') + .from('milestones') + .groupBy('release_plan_definition_id'); + }) + .select([ + 'rpd.feature_name', + 'rpd.environment', + 'active_milestone.sort_order AS milestone_order', + 'total_milestones.total_milestones', + 'active_milestone.name AS milestone_name', + ]) + .from('release_plan_definitions AS rpd') + .join( + 'total_milestones', + 'total_milestones.release_plan_definition_id', + 'rpd.id', + ) + .join( + 'milestones AS active_milestone', + 'active_milestone.id', + 'rpd.active_milestone_id', + ) + .where('rpd.discriminator', 'plan') + .as('feature_release_plan'), + function () { + this.on( + 'feature_release_plan.feature_name', + '=', + 'ranked_features.feature_name', + ).andOn( + 'feature_release_plan.environment', + '=', + 'ranked_features.environment', + ); + }, + ) + .select([ + 'feature_release_plan.milestone_name', + 'feature_release_plan.milestone_order', + 'feature_release_plan.total_milestones', + ]); + } + + private buildChangeRequestSql(queryBuilder: Knex.QueryBuilder) { + queryBuilder + .leftJoin( + this.db('change_request_events AS cre') + .join( + 'change_requests AS cr', + 'cre.change_request_id', + 'cr.id', + ) + .select('cre.feature') + .select( + this.db.raw( + 'array_agg(distinct cre.change_request_id) AS change_request_ids', + ), + ) + .select('cr.environment') + .groupBy('cre.feature', 'cr.environment') + .whereNotIn('cr.state', [ + 'Applied', + 'Cancelled', + 'Rejected', + ]) + .as('feature_cr'), + function () { + this.on( + 'feature_cr.feature', + '=', + 'ranked_features.feature_name', + ).andOn( + 'feature_cr.environment', + '=', + 'ranked_features.environment', + ); + }, + ) + .select('feature_cr.change_request_ids'); + } + private buildRankingSql( favoritesFirst: undefined | boolean, sortBy: string,