[offers][fix] Fix offer analysis API percentile calculation

This commit is contained in:
BryannYeap
2022-10-15 08:21:01 +08:00
parent e99e580d5e
commit 8a4a627f80
3 changed files with 18 additions and 42 deletions

View File

@ -5,7 +5,7 @@ import { trpc } from '~/utils/trpc';
function GenerateAnalysis() { function GenerateAnalysis() {
const analysis = trpc.useQuery([ const analysis = trpc.useQuery([
'offers.analysis.generate', 'offers.analysis.generate',
{ profileId: 'cl98yxuei002htx1s8lrmwzmy' }, { profileId: 'cl98ywtbv0000tx1s4p18eol1' },
]); ]);
return <div>{JSON.stringify(analysis.data)}</div>; return <div>{JSON.stringify(analysis.data)}</div>;

View File

@ -5,7 +5,7 @@ import { trpc } from '~/utils/trpc';
function GetAnalysis() { function GetAnalysis() {
const analysis = trpc.useQuery([ const analysis = trpc.useQuery([
'offers.analysis.get', 'offers.analysis.get',
{ profileId: 'cl98yxuei002htx1s8lrmwzmy' }, { profileId: 'cl98ywtbv0000tx1s4p18eol1' },
]); ]);
return <div>{JSON.stringify(analysis.data)}</div>; return <div>{JSON.stringify(analysis.data)}</div>;

View File

@ -13,7 +13,7 @@ import { TRPCError } from '@trpc/server';
import { createRouter } from '../context'; import { createRouter } from '../context';
const binarySearchOfferPercentile = ( const searchOfferPercentile = (
offer: OffersOffer & { offer: OffersOffer & {
OffersFullTime: OffersFullTime:
| (OffersFullTime & { | (OffersFullTime & {
@ -29,40 +29,13 @@ const binarySearchOfferPercentile = (
}, },
similarOffers: Array<any> | string, similarOffers: Array<any> | string,
) => { ) => {
let start = 0;
let end = similarOffers.length - 1;
const salary = for (let i = 0; i < similarOffers.length; i++) {
offer.jobType === JobType.FULLTIME if (similarOffers[i].id === offer.id) {
? offer.OffersFullTime?.totalCompensation.value return i;
: offer.OffersIntern?.monthlySalary.value;
if (!salary) {
throw new TRPCError({
code: 'BAD_REQUEST',
message: 'Cannot analyse without salary',
});
}
while (start <= end) {
const mid = Math.floor((start + end) / 2);
const similarOffer = similarOffers[mid];
const similarSalary =
similarOffer.jobType === JobType.FULLTIME
? similarOffer.OffersFullTime?.totalCompensation.value
: similarOffer.OffersIntern?.monthlySalary.value;
if (similarSalary === salary) {
return mid;
}
if (salary < similarSalary) {
end = mid - 1;
} else {
start = mid + 1;
} }
} }
return -1; return -1;
}; };
@ -335,29 +308,32 @@ export const offersAnalysisRouter = createRouter()
}); });
let similarCompanyOffers = similarOffers.filter( let similarCompanyOffers = similarOffers.filter(
(offer: { companyId: string }) => (offer) => offer.companyId === overallHighestOffer.companyId,
offer.companyId === overallHighestOffer.companyId,
); );
// CALCULATE PERCENTILES // CALCULATE PERCENTILES
const overallIndex = binarySearchOfferPercentile( const overallIndex = searchOfferPercentile(
overallHighestOffer, overallHighestOffer,
similarOffers, similarOffers,
); );
const overallPercentile = overallIndex / similarOffers.length; const overallPercentile =
similarOffers.length === 0 ? 0 : overallIndex / similarOffers.length;
const companyIndex = binarySearchOfferPercentile( const companyIndex = searchOfferPercentile(
overallHighestOffer, overallHighestOffer,
similarCompanyOffers, similarCompanyOffers,
); );
const companyPercentile = companyIndex / similarCompanyOffers.length; const companyPercentile =
similarCompanyOffers.length === 0
? 0
: companyIndex / similarCompanyOffers.length;
// FIND TOP >=90 PERCENTILE OFFERS // FIND TOP >=90 PERCENTILE OFFERS
similarOffers = similarOffers.filter( similarOffers = similarOffers.filter(
(offer: { id: string }) => offer.id !== overallHighestOffer.id, (offer) => offer.id !== overallHighestOffer.id,
); );
similarCompanyOffers = similarCompanyOffers.filter( similarCompanyOffers = similarCompanyOffers.filter(
(offer: { id: string }) => offer.id !== overallHighestOffer.id, (offer) => offer.id !== overallHighestOffer.id,
); );
const noOfSimilarOffers = similarOffers.length; const noOfSimilarOffers = similarOffers.length;