package dk.daoas.adressevedligehold.afstandandenrute;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import ags.utils.dataStructures.MaxHeap;
import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
import dk.daoas.adressevedligehold.ServiceConfig;
import dk.daoas.adressevedligehold.beans.Address;
import dk.daoas.adressevedligehold.tasks.Task;
public class LookupWorker implements Runnable {
static final int MAX_RESULTS = 99;
final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
OSRMHelper osrmHelper = new OSRMHelper();
CyclicBarrier barrier;
Queue
ikkeDaekkede;
Map> hoTrees;
Database db;
Constants consts;
AtomicInteger antalFundne;
int workerID;
boolean verbose;
Task task;
DistanceFunction dist = new SquareEuclideanDistanceFunction();
public LookupWorker(int workerID,
Task task,
CyclicBarrier barrier,
Queue ikkeDaekkede,
Map> hoTrees,
AtomicInteger antalFundne,
Database db,
boolean verbose,
Constants consts) {
this.workerID = workerID;
this.task = task;
this.barrier = barrier;
this.ikkeDaekkede = ikkeDaekkede;
this.hoTrees = hoTrees;
this.antalFundne = antalFundne;
this.db = db;
this.verbose = verbose;
this.consts = consts;
}
@Override
public void run() {
System.out.println( "Worker/" + workerID + " starting");
ServiceConfig conf = ServiceConfig.getInstance();
try {
while ( ! ikkeDaekkede.isEmpty() ) {
if (task.isAborted()) {
System.out.println( "Worker/" + workerID + " aborting");
return;
}
Address qAddress = ikkeDaekkede.remove();
short ho = qAddress.ho;
KdTree addressTree = hoTrees.get(ho);
MaxHeap res = addressTree.findNearestNeighbors(qAddress.xyz, MAX_RESULTS, dist);
//Collection res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAddress);
int size = res.size();
if (size > MAX_RESULTS ) {
System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
System.exit(0);
}
ArrayList adrList = new ArrayList();
for (int i=0; i" + bedsteAdr + " ::: " + bedsteAfstand );
}
antalFundne.incrementAndGet();
try {
db.gemResultat(qAddress, bedsteAdr, bedsteAfstand);
} catch (SQLException e) {
logger.log(Level.WARNING, "Error saving result", e);
logger.warning("Shutting down");
throw e; // rethrow
}
} else {
if (verbose == true) {
System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand);
}
}
}
} catch (Exception e) {
logger.log( Level.SEVERE, "Worker/" + workerID, e);
task.doAbort();
}
try {
logger.info( "Worker/" + workerID + " afventer barrier");
barrier.await();
} catch (BrokenBarrierException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
System.exit(-1);
} catch(InterruptedException e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
System.out.println( "Worker/" + workerID + " stopping");
}
}