Skip to content

Commit ebd7f78

Browse files
committed
Add PartnershipFilters.types / intersects comparator & filter
1 parent d418c20 commit ebd7f78

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

src/components/partnership/dto/list-partnership.dto.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import { InputType, ObjectType } from '@nestjs/graphql';
1+
import { Field, InputType, ObjectType } from '@nestjs/graphql';
2+
import { Transform } from 'class-transformer';
3+
import { uniq } from 'lodash';
24
import {
35
FilterField,
46
ID,
57
PaginatedList,
68
SecuredList,
79
SortablePaginationInput,
810
} from '~/common';
9-
import { PartnerFilters } from '../../partner/dto';
11+
import { PartnerFilters, PartnerType } from '../../partner/dto';
1012
import { Partnership } from './partnership.dto';
1113

1214
@InputType()
@@ -15,6 +17,15 @@ export abstract class PartnershipFilters {
1517

1618
@FilterField(() => PartnerFilters)
1719
readonly partner?: PartnerFilters & {};
20+
21+
@Field(() => [PartnerType], { nullable: true })
22+
@Transform(({ value }) => {
23+
const types = uniq(value);
24+
return types.length > 0 && types.length < PartnerType.values.size
25+
? types
26+
: undefined;
27+
})
28+
readonly types?: readonly PartnerType[];
1829
}
1930

2031
@InputType()

src/components/partnership/partnership.repository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ export class PartnershipRepository extends DtoRepository<
406406

407407
export const partnershipFilters = filter.define(() => PartnershipFilters, {
408408
projectId: filter.skip,
409+
types: filter.intersectsProp(),
409410
partner: filter.sub(() => partnerFilters)((sub) =>
410411
sub
411412
.with('node as partnership')
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { Comparator } from 'cypher-query-builder/dist/typings/clauses/where-comparators';
2+
import type { Variable } from '../query-augmentation/condition-variables';
3+
4+
export const intersects =
5+
(value: readonly string[] | Variable, paramName?: string): Comparator =>
6+
(params, name) => {
7+
const param = params.addParam(value, paramName ?? name.split('.').at(-1));
8+
return `size(apoc.coll.intersection(${name}, ${String(param)})) > 0`;
9+
};

src/core/database/query/filters.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { identity, isFunction } from 'lodash';
1616
import { AbstractClass, ConditionalKeys } from 'type-fest';
1717
import { DateTimeFilter } from '~/common';
1818
import { variable } from '../query-augmentation/condition-variables';
19+
import { intersects } from './comparators';
1920
import { collect } from './cypher-functions';
2021
import { escapeLuceneSyntax, FullTextIndex } from './full-text';
2122
import { ACTIVE } from './matching';
@@ -132,6 +133,20 @@ export const propPartialVal =
132133
return { [prop ?? key]: { value: regexp(`.*${value}.*`, true) } };
133134
};
134135

136+
export const intersectsProp =
137+
<T, K extends ConditionalKeys<Required<T>, readonly string[]>>(
138+
prop?: string,
139+
): Builder<T, K> =>
140+
({ key, value, query }) => {
141+
prop ??= key;
142+
query.match([
143+
node('node'),
144+
relation('out', '', prop, ACTIVE),
145+
node(prop, 'Property'),
146+
]);
147+
return { [`${prop}.value`]: intersects(value as readonly string[], prop) };
148+
};
149+
135150
export const stringListProp =
136151
<T, K extends ConditionalKeys<Required<T>, readonly string[]>>(
137152
prop?: string,

0 commit comments

Comments
 (0)