From 6d303dcfe23f7be9c2c5f3ce376ad1a0ba9be0bf Mon Sep 17 00:00:00 2001 From: Yeganathan S <63534555+skwowet@users.noreply.github.com> Date: Thu, 18 Jun 2026 16:28:40 +0530 Subject: [PATCH 1/3] perf: skip segment leaf expansion in membersToMerge query Signed-off-by: Yeganathan S <63534555+skwowet@users.noreply.github.com> --- backend/src/database/repositories/memberRepository.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index 6346a9e56e..5969e9a493 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -294,11 +294,9 @@ class MemberRepository { const HIGH_CONFIDENCE_LOWER_BOUND = 0.9 const MEDIUM_CONFIDENCE_LOWER_BOUND = 0.7 - const currentSegments = SequelizeRepository.getSegmentIds(options) - - const segmentIds = ( - await new SegmentRepository(options).getSegmentSubprojects(currentSegments) - ).map((s) => s.id) + // Member segments are aggregated at each hierarchy level (group -> project -> subproject). + // Match the selected segment ID directly; do not expand to leaf subprojects. + const segmentIds = SequelizeRepository.getSegmentIds(options) if (segmentIds.length === 0) { return args.countOnly From 237b1eb7328132874c82f25c58dc47a6e0fe973b Mon Sep 17 00:00:00 2001 From: Yeganathan S <63534555+skwowet@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:17:58 +0530 Subject: [PATCH 2/3] perf: skip segment leaf expansion in organizationsToMerge query Signed-off-by: Yeganathan S <63534555+skwowet@users.noreply.github.com> --- .../repositories/organizationRepository.ts | 7 +++---- .../data-quality-member-merge-suggestions.vue | 16 ++-------------- ...ta-quality-organization-merge-suggestions.vue | 16 ++-------------- .../modules/organization/organization-service.js | 6 +----- .../services/organization.api.service.ts | 6 +----- 5 files changed, 9 insertions(+), 42 deletions(-) diff --git a/backend/src/database/repositories/organizationRepository.ts b/backend/src/database/repositories/organizationRepository.ts index c4c948c5c2..fd44c28dcf 100644 --- a/backend/src/database/repositories/organizationRepository.ts +++ b/backend/src/database/repositories/organizationRepository.ts @@ -842,10 +842,9 @@ class OrganizationRepository { const HIGH_CONFIDENCE_LOWER_BOUND = 0.9 const MEDIUM_CONFIDENCE_LOWER_BOUND = 0.7 - const currentSegments = SequelizeRepository.getSegmentIds(options) - const segmentIds = ( - await new SegmentRepository(options).getSegmentSubprojects(currentSegments) - ).map((s) => s.id) + // Organization segments are aggregated at each hierarchy level (group -> project -> subproject). + // Match the selected segment ID(s) directly; do not expand to leaf subprojects. + const segmentIds = SequelizeRepository.getSegmentIds(options) let similarityFilter = '' const similarityConditions = [] diff --git a/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue b/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue index 60e12a1df3..b3d184eb7f 100644 --- a/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue +++ b/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue @@ -84,20 +84,8 @@ const detailsOffset = ref(0); const { selectedProjectGroup } = storeToRefs(useLfSegmentsStore()); const segments = computed(() => (selectedProjectGroup.value?.id === props.projectGroup - ? [ - selectedProjectGroup.value?.id, - ...selectedProjectGroup.value.projects.map((p) => [ - ...p.subprojects.map((sp) => sp.id), - ]).flat(), - ] - : [ - props.projectGroup, - ...selectedProjectGroup.value.projects - .filter((p) => p.id === props.projectGroup) - .map((p) => [ - ...p.subprojects.map((sp) => sp.id), - ]).flat(), - ])); + ? [selectedProjectGroup.value?.id] + : [props.projectGroup])); const loadMergeSuggestions = () => { loading.value = true; diff --git a/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue b/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue index cd70044fff..a40a1e4c89 100644 --- a/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue +++ b/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue @@ -78,20 +78,8 @@ const detailsOffset = ref(0); const { selectedProjectGroup } = storeToRefs(useLfSegmentsStore()); const segments = computed(() => (selectedProjectGroup.value?.id === props.projectGroup - ? [ - selectedProjectGroup.value?.id, - ...selectedProjectGroup.value.projects.map((p) => [ - ...p.subprojects.map((sp) => sp.id), - ]).flat(), - ] - : [ - props.projectGroup, - ...selectedProjectGroup.value.projects - .filter((p) => p.id === props.projectGroup) - .map((p) => [ - ...p.subprojects.map((sp) => sp.id), - ]).flat(), - ])); + ? [selectedProjectGroup.value?.id] + : [props.projectGroup])); const loadMergeSuggestions = () => { loading.value = true; diff --git a/frontend/src/modules/organization/organization-service.js b/frontend/src/modules/organization/organization-service.js index 526bca3a25..bfcbdeecf3 100644 --- a/frontend/src/modules/organization/organization-service.js +++ b/frontend/src/modules/organization/organization-service.js @@ -1,7 +1,6 @@ import authAxios from '@/shared/axios/auth-axios'; import { AuthService } from '@/modules/auth/services/auth.service'; import { storeToRefs } from 'pinia'; import { useLfSegmentsStore } from '@/modules/lf/segments/store'; -import { getSegmentsFromProjectGroup } from '@/utils/segments'; const getSelectedProjectGroup = () => { const lsSegmentsStore = useLfSegmentsStore(); @@ -216,10 +215,7 @@ export class OrganizationService { } static async fetchMergeSuggestions(limit, offset, query) { - const segments = [ - ...getSegmentsFromProjectGroup(getSelectedProjectGroup()), - getSelectedProjectGroup().id, - ]; + const segments = [getSelectedProjectGroup().id]; const data = { limit, diff --git a/frontend/src/modules/organization/services/organization.api.service.ts b/frontend/src/modules/organization/services/organization.api.service.ts index 92964ecdbd..66cac7ce85 100644 --- a/frontend/src/modules/organization/services/organization.api.service.ts +++ b/frontend/src/modules/organization/services/organization.api.service.ts @@ -1,6 +1,5 @@ import authAxios from '@/shared/axios/auth-axios'; import { Organization } from '@/modules/organization/types/Organization'; -import { getSegmentsFromProjectGroup } from '@/utils/segments'; import { useLfSegmentsStore } from '@/modules/lf/segments/store'; import { storeToRefs } from 'pinia'; @@ -33,10 +32,7 @@ export class OrganizationApiService { const lsSegmentsStore = useLfSegmentsStore(); const { selectedProjectGroup } = storeToRefs(lsSegmentsStore); - const segments = [ - ...getSegmentsFromProjectGroup(selectedProjectGroup.value), - selectedProjectGroup.value?.id, - ]; + const segments = [selectedProjectGroup.value?.id]; const data = { limit, From 1c4dfd561ba6d9f7ba47471cb79481f8e6060a86 Mon Sep 17 00:00:00 2001 From: Yeganathan S <63534555+skwowet@users.noreply.github.com> Date: Fri, 19 Jun 2026 17:20:50 +0530 Subject: [PATCH 3/3] fix: resolve pr review comments Signed-off-by: Yeganathan S <63534555+skwowet@users.noreply.github.com> --- .../member/data-quality-member-merge-suggestions.vue | 8 +------- .../data-quality-organization-merge-suggestions.vue | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue b/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue index b3d184eb7f..b63d52486b 100644 --- a/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue +++ b/frontend/src/modules/data-quality/components/member/data-quality-member-merge-suggestions.vue @@ -62,8 +62,6 @@ import LfSpinner from '@/ui-kit/spinner/Spinner.vue'; import LfButton from '@/ui-kit/button/Button.vue'; import LfIcon from '@/ui-kit/icon/Icon.vue'; import AppMemberMergeSuggestionsDialog from '@/modules/member/components/member-merge-suggestions-dialog.vue'; -import { storeToRefs } from 'pinia'; -import { useLfSegmentsStore } from '@/modules/lf/segments/store'; import LfMemberMergeSuggestionDropdown from '@/modules/member/components/suggestions/member-merge-suggestion-dropdown.vue'; import LfScrollBodyControll from '@/ui-kit/scrollcontroll/ScrollBodyControll.vue'; @@ -81,11 +79,7 @@ const mergeSuggestions = ref([]); const isModalOpen = ref(false); const detailsOffset = ref(0); -const { selectedProjectGroup } = storeToRefs(useLfSegmentsStore()); - -const segments = computed(() => (selectedProjectGroup.value?.id === props.projectGroup - ? [selectedProjectGroup.value?.id] - : [props.projectGroup])); +const segments = computed(() => [props.projectGroup]); const loadMergeSuggestions = () => { loading.value = true; diff --git a/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue b/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue index a40a1e4c89..6e42332e16 100644 --- a/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue +++ b/frontend/src/modules/data-quality/components/organization/data-quality-organization-merge-suggestions.vue @@ -58,8 +58,6 @@ import LfDataQualityOrganizationMergeSuggestionsItem from '@/modules/data-quality/components/organization/data-quality-organization-merge-suggestions-item.vue'; import AppOrganizationMergeSuggestionsDialog from '@/modules/organization/components/organization-merge-suggestions-dialog.vue'; -import { storeToRefs } from 'pinia'; -import { useLfSegmentsStore } from '@/modules/lf/segments/store'; import LfScrollBodyControll from '@/ui-kit/scrollcontroll/ScrollBodyControll.vue'; const props = defineProps<{ @@ -75,11 +73,7 @@ const mergeSuggestions = ref([]); const isModalOpen = ref(false); const detailsOffset = ref(0); -const { selectedProjectGroup } = storeToRefs(useLfSegmentsStore()); - -const segments = computed(() => (selectedProjectGroup.value?.id === props.projectGroup - ? [selectedProjectGroup.value?.id] - : [props.projectGroup])); +const segments = computed(() => [props.projectGroup]); const loadMergeSuggestions = () => { loading.value = true;