@@ -2,7 +2,7 @@ import { DbStore, RepositoryBase } from '@crowd/database'
2
2
import { Logger } from '@crowd/logging'
3
3
import { RedisCache , RedisClient } from '@crowd/redis'
4
4
import { IMemberAttribute } from '@crowd/types'
5
- import { IDbMemberSyncData , IMemberSegmentMatrix } from './member.data'
5
+ import { IDbMemberSyncData , IMemberSegment , IMemberSegmentMatrix } from './member.data'
6
6
7
7
export class MemberRepository extends RepositoryBase < MemberRepository > {
8
8
private readonly cache : RedisCache
@@ -586,40 +586,58 @@ export class MemberRepository extends RepositoryBase<MemberRepository> {
586
586
return results . map ( ( r ) => r . id )
587
587
}
588
588
589
- public async getMemberSegmentCouples ( ids ) : Promise < IMemberSegmentMatrix > {
590
- let results = await this . db ( ) . any (
591
- `
592
- select distinct a."segmentId", a."memberId"
593
- from activities a
594
- where a."memberId" in ($(ids:csv));
595
- ` ,
596
- {
597
- ids,
598
- } ,
599
- )
600
-
601
- // Manually created members don't have any activities,
602
- // filter out those memberIds that are not in the results
603
- const manuallyCreatedIds = ids . filter ( ( id ) => ! results . some ( ( r ) => r . memberId === id ) )
604
-
605
- // memberSegments aren't maintained well, so use as a fallback for manuallyCreated members
606
- if ( manuallyCreatedIds . length > 0 ) {
607
- const missingResults = await this . db ( ) . any (
589
+ public async getMemberSegmentCouples (
590
+ memberIds : string [ ] ,
591
+ segmentIds ?: string [ ] ,
592
+ ) : Promise < IMemberSegmentMatrix > {
593
+ let memberSegments : IMemberSegment [ ] = [ ]
594
+
595
+ if ( segmentIds && segmentIds . length > 0 ) {
596
+ for ( const memberId of memberIds ) {
597
+ for ( const segmentId of segmentIds ) {
598
+ memberSegments . push ( {
599
+ memberId,
600
+ segmentId,
601
+ } )
602
+ }
603
+ }
604
+ } else {
605
+ memberSegments = await this . db ( ) . any (
608
606
`
609
- select distinct ms ."segmentId", ms ."memberId"
610
- from "memberSegments" ms
611
- where ms ."memberId" in ($(manuallyCreatedIds :csv));
607
+ select distinct a ."segmentId", a ."memberId"
608
+ from activities a
609
+ where a ."memberId" in ($(ids :csv));
612
610
` ,
613
611
{
614
- manuallyCreatedIds ,
612
+ ids : memberIds ,
615
613
} ,
616
614
)
617
- results = [ ...results , ...missingResults ]
615
+
616
+ // Manually created members don't have any activities,
617
+ // filter out those memberIds that are not in the results
618
+ const manuallyCreatedIds = memberIds . filter (
619
+ ( id ) => ! memberSegments . some ( ( r ) => r . memberId === id ) ,
620
+ )
621
+
622
+ // memberSegments aren't maintained well, so use as a fallback for manuallyCreated members
623
+ if ( manuallyCreatedIds . length > 0 ) {
624
+ const missingResults = await this . db ( ) . any (
625
+ `
626
+ select distinct ms."segmentId", ms."memberId"
627
+ from "memberSegments" ms
628
+ where ms."memberId" in ($(manuallyCreatedIds:csv));
629
+ ` ,
630
+ {
631
+ manuallyCreatedIds,
632
+ } ,
633
+ )
634
+ memberSegments = [ ...memberSegments , ...missingResults ]
635
+ }
618
636
}
619
637
620
638
const matrix = { }
621
639
622
- for ( const memberSegment of results ) {
640
+ for ( const memberSegment of memberSegments ) {
623
641
if ( ! matrix [ memberSegment . memberId ] ) {
624
642
matrix [ memberSegment . memberId ] = [
625
643
{
0 commit comments