1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-25 00:07:47 +01:00

feat: optimize search store by removing inline EXISTS (#7385)

Instead of running exists on every row, we are joining the exists, which
runs the query only once.
This decreased load time on my huge dataset from 2000ms to 200ms.

Also added tests that values still come through as expected.
This commit is contained in:
Jaanus Sellin 2024-06-13 13:11:47 +03:00 committed by GitHub
parent 3cc0dfe35a
commit b9f43f5ba0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 67 additions and 3 deletions

View File

@ -86,7 +86,10 @@ class FeatureSearchStore implements IFeatureSearchStore {
.distinctOn('stage_feature') .distinctOn('stage_feature')
.orderBy([ .orderBy([
'stage_feature', 'stage_feature',
{ column: 'entered_stage_at', order: 'desc' }, {
column: 'entered_stage_at',
order: 'desc',
},
]); ]);
} }
@ -162,10 +165,10 @@ class FeatureSearchStore implements IFeatureSearchStore {
selectColumns = [ selectColumns = [
...selectColumns, ...selectColumns,
this.db.raw( 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', 'has_strategies.feature_name IS NOT NULL AS has_strategies',
), ),
this.db.raw( 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', 'enabled_strategies.feature_name IS NOT NULL AS has_enabled_strategies',
), ),
this.db.raw(`CASE this.db.raw(`CASE
WHEN dependent_features.parent = features.name THEN 'parent' WHEN dependent_features.parent = features.name THEN 'parent'
@ -245,6 +248,8 @@ class FeatureSearchStore implements IFeatureSearchStore {
'features.created_by_user_id', 'features.created_by_user_id',
); );
this.applyStrategiesByEnvironment(query);
query.leftJoin('last_seen_at_metrics', function () { query.leftJoin('last_seen_at_metrics', function () {
this.on( this.on(
'last_seen_at_metrics.environment', 'last_seen_at_metrics.environment',
@ -351,6 +356,48 @@ class FeatureSearchStore implements IFeatureSearchStore {
}; };
} }
private applyStrategiesByEnvironment(queryBuilder: Knex.QueryBuilder) {
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',
'=',
'features.name',
).andOn(
'enabled_strategies.environment',
'=',
'feature_environments.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',
'=',
'features.name',
).andOn(
'has_strategies.environment',
'=',
'feature_environments.environment',
);
},
);
}
private buildRankingSql( private buildRankingSql(
favoritesFirst: undefined | boolean, favoritesFirst: undefined | boolean,
sortBy: string, sortBy: string,

View File

@ -776,6 +776,23 @@ test('should return segments in payload with no duplicates/nulls', async () => {
{ {
name: 'my_feature_a', name: 'my_feature_a',
segments: [mySegment.name], segments: [mySegment.name],
environments: [
{
name: 'default',
hasStrategies: true,
hasEnabledStrategies: true,
},
{
name: 'development',
hasStrategies: true,
hasEnabledStrategies: true,
},
{
name: 'production',
hasStrategies: false,
hasEnabledStrategies: false,
},
],
}, },
], ],
}); });