Skip to content

Commit b0ec386

Browse files
authored
Add function to fetch active organizations in the last year (#1630)
1 parent dca6b01 commit b0ec386

File tree

4 files changed

+96
-3
lines changed

4 files changed

+96
-3
lines changed

backend/src/bin/scripts/enrich-organizations-synchronous.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ if (parameters.help || !parameters.tenant || !parameters.limit) {
5757
const limit = parameters.limit
5858

5959
for (const tenantId of tenantIds) {
60-
await BulkorganizationEnrichmentWorker(tenantId, limit, true)
60+
await BulkorganizationEnrichmentWorker(tenantId, limit, true, true)
6161
log.info(`Done for tenant ${tenantId}`)
6262
}
6363

backend/src/database/repositories/organizationRepository.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,89 @@ class OrganizationRepository {
131131
return orgs
132132
}
133133

134+
static async filterByActiveLastYear(
135+
tenantId: string,
136+
limit: number,
137+
options: IRepositoryOptions,
138+
): Promise<IEnrichableOrganization[]> {
139+
const database = SequelizeRepository.getSequelize(options)
140+
const transaction = SequelizeRepository.getTransaction(options)
141+
const query = `
142+
with org_activities as (select a."organizationId", count(a.id) as "orgActivityCount"
143+
from activities a
144+
where a."tenantId" = :tenantId
145+
and a."deletedAt" is null
146+
and a."isContribution" = true
147+
and a."createdAt" > (CURRENT_DATE - INTERVAL '1 year')
148+
group by a."organizationId"
149+
having count(id) > 0),
150+
identities as (select oi."organizationId", jsonb_agg(oi) as "identities"
151+
from "organizationIdentities" oi
152+
where oi."tenantId" = :tenantId
153+
group by oi."organizationId")
154+
select org.id,
155+
i.identities,
156+
org."displayName",
157+
org."location",
158+
org."website",
159+
org."lastEnrichedAt",
160+
org."twitter",
161+
org."employees",
162+
org."size",
163+
org."founded",
164+
org."industry",
165+
org."naics",
166+
org."profiles",
167+
org."headline",
168+
org."ticker",
169+
org."type",
170+
org."address",
171+
org."geoLocation",
172+
org."employeeCountByCountry",
173+
org."twitter",
174+
org."linkedin",
175+
org."crunchbase",
176+
org."github",
177+
org."description",
178+
org."revenueRange",
179+
org."tags",
180+
org."affiliatedProfiles",
181+
org."allSubsidiaries",
182+
org."alternativeDomains",
183+
org."alternativeNames",
184+
org."averageEmployeeTenure",
185+
org."averageTenureByLevel",
186+
org."averageTenureByRole",
187+
org."directSubsidiaries",
188+
org."employeeChurnRate",
189+
org."employeeCountByMonth",
190+
org."employeeGrowthRate",
191+
org."employeeCountByMonthByLevel",
192+
org."employeeCountByMonthByRole",
193+
org."gicsSector",
194+
org."grossAdditionsByMonth",
195+
org."grossDeparturesByMonth",
196+
org."ultimateParent",
197+
org."immediateParent",
198+
activity."orgActivityCount"
199+
from "organizations" as org
200+
join org_activities activity on activity."organizationId" = org."id"
201+
join identities i on i."organizationId" = org.id
202+
where :tenantId = org."tenantId"
203+
order by org."lastEnrichedAt" asc, org."website", activity."orgActivityCount" desc, org."createdAt" desc
204+
limit :limit
205+
`
206+
const orgs: IEnrichableOrganization[] = await database.query(query, {
207+
type: QueryTypes.SELECT,
208+
transaction,
209+
replacements: {
210+
tenantId,
211+
limit,
212+
},
213+
})
214+
return orgs
215+
}
216+
134217
static async create(data, options: IRepositoryOptions) {
135218
const currentUser = SequelizeRepository.getCurrentUser(options)
136219

backend/src/serverless/microservices/nodejs/bulk-enrichment/bulkOrganizationEnrichmentWorker.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export async function BulkorganizationEnrichmentWorker(
1010
tenantId: string,
1111
maxEnrichLimit: number = 0,
1212
verbose: boolean = false,
13+
includeOrgsActiveLastYear: boolean = false,
1314
) {
1415
const userContext = await getUserContext(tenantId)
1516
const redis = await getRedisClient(REDIS_CONFIG, true)
@@ -39,7 +40,10 @@ export async function BulkorganizationEnrichmentWorker(
3940
tenantId,
4041
limit: remainderEnrichmentLimit,
4142
})
42-
enrichedOrgs = await enrichmentService.enrichOrganizationsAndSignalDone(verbose)
43+
enrichedOrgs = await enrichmentService.enrichOrganizationsAndSignalDone(
44+
includeOrgsActiveLastYear,
45+
verbose,
46+
)
4347
}
4448

4549
if (!skipCredits) {

backend/src/services/premium/enrichment/organizationEnrichmentService.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export default class OrganizationEnrichmentService extends LoggerBase {
7070
}
7171

7272
public async enrichOrganizationsAndSignalDone(
73+
includeOrgsActiveLastYear: boolean = false,
7374
verbose: boolean = false,
7475
): Promise<IOrganization[]> {
7576
const enrichmentPlatformPriority = [
@@ -80,7 +81,12 @@ export default class OrganizationEnrichmentService extends LoggerBase {
8081
const enrichedOrganizations: IOrganization[] = []
8182
const enrichedCacheOrganizations: IOrganizationCache[] = []
8283
let count = 0
83-
for (const instance of await OrganizationRepository.filterByPayingTenant(
84+
85+
const organizationFilterMethod = includeOrgsActiveLastYear
86+
? OrganizationRepository.filterByActiveLastYear
87+
: OrganizationRepository.filterByPayingTenant
88+
89+
for (const instance of await organizationFilterMethod(
8490
this.tenantId,
8591
this.maxOrganizationsLimit,
8692
this.options,

0 commit comments

Comments
 (0)