Skip to content

Commit

Permalink
feat: project applications server side paging and sorting and filteri…
Browse files Browse the repository at this point in the history
…ng (#6236)

Uses exactly same pattern as search-store. Nothing too crazy here.
Most code is in tests.
  • Loading branch information
sjaanus committed Feb 14, 2024
1 parent 6a8f903 commit 3d77825
Show file tree
Hide file tree
Showing 12 changed files with 435 additions and 125 deletions.
Expand Up @@ -7,7 +7,6 @@ import {
LineChart,
NotEnoughData,
} from '../LineChart/LineChart';
import { type ScriptableContext } from 'chart.js';

interface IUsersChartProps {
userTrends: ExecutiveSummarySchema['userTrends'];
Expand Down
52 changes: 5 additions & 47 deletions src/lib/features/feature-search/feature-search-store.ts
Expand Up @@ -16,6 +16,7 @@ import {
IFeatureSearchParams,
IQueryParam,
} from '../feature-toggle/types/feature-toggle-strategies-store-type';
import { applyGenericQueryParams, applySearchFilters } from './search-utils';

const sortEnvironments = (overview: IFeatureOverview[]) => {
return overview.map((data: IFeatureOverview) => ({
Expand Down Expand Up @@ -87,28 +88,10 @@ class FeatureSearchStore implements IFeatureSearchStore {
query.from('features');

applyQueryParams(query, queryParams);

const hasSearchParams = searchParams?.length;
if (hasSearchParams) {
const sqlParameters = searchParams.map(
(item) => `%${item}%`,
);
const sqlQueryParameters = sqlParameters
.map(() => '?')
.join(',');

query.where((builder) => {
builder
.orWhereRaw(
`(??) ILIKE ANY (ARRAY[${sqlQueryParameters}])`,
['features.name', ...sqlParameters],
)
.orWhereRaw(
`(??) ILIKE ANY (ARRAY[${sqlQueryParameters}])`,
['features.description', ...sqlParameters],
);
});
}
applySearchFilters(query, searchParams, [
'features.name',
'features.description',
]);

if (type) {
query.whereIn('features.type', type);
Expand Down Expand Up @@ -282,7 +265,6 @@ class FeatureSearchStore implements IFeatureSearchStore {
)
.joinRaw('CROSS JOIN total_features')
.whereBetween('final_rank', [offset + 1, offset + limit]);

const rows = await finalQuery;
stopTimer();
if (rows.length > 0) {
Expand Down Expand Up @@ -417,30 +399,6 @@ const applyQueryParams = (
);
};

const applyGenericQueryParams = (
query: Knex.QueryBuilder,
queryParams: IQueryParam[],
): void => {
queryParams.forEach((param) => {
switch (param.operator) {
case 'IS':
case 'IS_ANY_OF':
query.whereIn(param.field, param.values);
break;
case 'IS_NOT':
case 'IS_NONE_OF':
query.whereNotIn(param.field, param.values);
break;
case 'IS_BEFORE':
query.where(param.field, '<', param.values[0]);
break;
case 'IS_ON_OR_AFTER':
query.where(param.field, '>=', param.values[0]);
break;
}
});
};

const applyMultiQueryParams = (
query: Knex.QueryBuilder,
queryParams: IQueryParam[],
Expand Down
47 changes: 47 additions & 0 deletions src/lib/features/feature-search/search-utils.ts
@@ -0,0 +1,47 @@
import { Knex } from 'knex';
import { IQueryParam } from '../feature-toggle/types/feature-toggle-strategies-store-type';

export const applySearchFilters = (
qb: Knex.QueryBuilder,
searchParams: string[] | undefined,
columns: string[],
): void => {
const hasSearchParams = searchParams?.length;
if (hasSearchParams) {
const sqlParameters = searchParams.map((item) => `%${item}%`);
const sqlQueryParameters = sqlParameters.map(() => '?').join(',');

qb.where((builder) => {
columns.forEach((column) => {
builder.orWhereRaw(
`(${column}) ILIKE ANY (ARRAY[${sqlQueryParameters}])`,
sqlParameters,
);
});
});
}
};

export const applyGenericQueryParams = (
query: Knex.QueryBuilder,
queryParams: IQueryParam[],
): void => {
queryParams.forEach((param) => {
switch (param.operator) {
case 'IS':
case 'IS_ANY_OF':
query.whereIn(param.field, param.values);
break;
case 'IS_NOT':
case 'IS_NONE_OF':
query.whereNotIn(param.field, param.values);
break;
case 'IS_BEFORE':
query.where(param.field, '<', param.values[0]);
break;
case 'IS_ON_OR_AFTER':
query.where(param.field, '>=', param.values[0]);
break;
}
});
};

0 comments on commit 3d77825

Please sign in to comment.