Clients order jobs.
Companies (valfirms) accept jobs.
A job can be distributed to a number of companies.
A client states a preferred order of companies for a job to be offered to.
A company may accept or reject a job.
If a company accepts a job, it is not offered to any other companies in the queue.
If a company rejects a job, it is offered to the next company in the queue.
A company may accept then DISTRIBUTE a job on behalf of another company:
i. The client sees a job as accepted by the first company, and never knows about the second.
ii. If the second company rejects a job, we go back to the DISTRIBUTE stage.
Code so far:
table queue (client_id, job_id, valfirm_id, sequence, timestamp, allocation_status).
SELECT * FROM queue WHERE allocation_status = 'PENDING';
foreach $result as $job {
//If a job is not accepted already by ANYONE
//If a job is not rejected by ME
//If I am the topmost valfirm, as ordered by SEQUENCE.
SELECT magicsql...
}
Problem with this approach:
27000+ jobs in DB.
Grabbing all that have PENDING somewhere in them means that we have to iterate through 27000 rows, performing 3 checks (anyone, rejected by me, am i topmost?)
Slow!
Better approaches?
No comments:
Post a Comment