diff --git a/src/lib/features/feature-search/feature-search-store.ts b/src/lib/features/feature-search/feature-search-store.ts index ef56e09c9f..e2cb15d0bf 100644 --- a/src/lib/features/feature-search/feature-search-store.ts +++ b/src/lib/features/feature-search/feature-search-store.ts @@ -86,10 +86,7 @@ class FeatureSearchStore implements IFeatureSearchStore { .distinctOn('stage_feature') .orderBy([ 'stage_feature', - { - column: 'entered_stage_at', - order: 'desc', - }, + { column: 'entered_stage_at', order: 'desc' }, ]); } @@ -164,6 +161,12 @@ class FeatureSearchStore implements IFeatureSearchStore { selectColumns = [ ...selectColumns, + this.db.raw( + 'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment) as has_strategies', + ), + this.db.raw( + 'EXISTS (SELECT 1 FROM feature_strategies WHERE feature_strategies.feature_name = features.name AND feature_strategies.environment = feature_environments.environment AND (feature_strategies.disabled IS NULL OR feature_strategies.disabled = false)) as has_enabled_strategies', + ), this.db.raw(`CASE WHEN dependent_features.parent = features.name THEN 'parent' WHEN dependent_features.child = features.name THEN 'child' @@ -321,8 +324,6 @@ class FeatureSearchStore implements IFeatureSearchStore { .joinRaw('CROSS JOIN total_features') .whereBetween('final_rank', [offset + 1, offset + limit]) .orderBy('final_rank'); - - this.applyStrategiesByEnvironment(finalQuery); if (featureLifecycleEnabled) { finalQuery.leftJoin( 'lifecycle', @@ -350,56 +351,6 @@ class FeatureSearchStore implements IFeatureSearchStore { }; } - private applyStrategiesByEnvironment(queryBuilder: Knex.QueryBuilder) { - queryBuilder.select( - this.db.raw( - 'has_strategies.feature_name IS NOT NULL AS has_strategies', - ), - this.db.raw( - 'enabled_strategies.feature_name IS NOT NULL AS has_enabled_strategies', - ), - ); - queryBuilder - .leftJoin( - this.db - .select('feature_name', 'environment') - .from('feature_strategies') - .where(function () { - this.whereNull('disabled').orWhere('disabled', false); - }) - .as('enabled_strategies'), - function () { - this.on( - 'enabled_strategies.feature_name', - '=', - 'ranked_features.feature_name', - ).andOn( - 'enabled_strategies.environment', - '=', - 'ranked_features.environment', - ); - }, - ) - .leftJoin( - this.db - .select('feature_name', 'environment') - .from('feature_strategies') - .groupBy('feature_name', 'environment') - .as('has_strategies'), - function () { - this.on( - 'has_strategies.feature_name', - '=', - 'ranked_features.feature_name', - ).andOn( - 'has_strategies.environment', - '=', - 'ranked_features.environment', - ); - }, - ); - } - private buildRankingSql( favoritesFirst: undefined | boolean, sortBy: string, diff --git a/src/lib/features/feature-search/feature.search.e2e.test.ts b/src/lib/features/feature-search/feature.search.e2e.test.ts index f220182320..2a71e19237 100644 --- a/src/lib/features/feature-search/feature.search.e2e.test.ts +++ b/src/lib/features/feature-search/feature.search.e2e.test.ts @@ -776,23 +776,6 @@ test('should return segments in payload with no duplicates/nulls', async () => { { name: 'my_feature_a', segments: [mySegment.name], - environments: [ - { - name: 'default', - hasStrategies: true, - hasEnabledStrategies: true, - }, - { - name: 'development', - hasStrategies: true, - hasEnabledStrategies: true, - }, - { - name: 'production', - hasStrategies: false, - hasEnabledStrategies: false, - }, - ], }, ], });