mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-29 05:02:52 +08:00
[offers][fix] Fix offer analysis API percentile calculation
This commit is contained in:
@ -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>;
|
||||||
|
@ -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>;
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user