/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.wordpress.salaboy.acc;
import com.wordpress.salaboy.model.Emergency;
import com.wordpress.salaboy.model.Hospital;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
import org.drools.runtime.rule.AccumulateFunction;
/**
*
* @author esteban
*/
public class HospitalDistanceCalculator implements AccumulateFunction, Serializable {
private int[] xs = new int[]{1, 7, 13, 19, 25, 31, 37};
private int[] ys = new int[]{1, 7, 13, 19, 25};
public static class ContextData implements Serializable{
public Hospital selectedHospital;
public double minDistance;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
}
@Override
public Serializable createContext() {
return new ContextData();
}
@Override
public void init(Serializable context) throws Exception {
ContextData contextData = (ContextData)context;
contextData.selectedHospital = null;
contextData.minDistance = 0;
}
@Override
public void accumulate(Serializable context, Object value) {
ContextData contextData = (ContextData)context;
HospitalDistanceCalculationData data = (HospitalDistanceCalculationData)value;
Hospital currentHospital = data.getHospital();
Emergency emergency = data.getEmergency();
float difX = currentHospital.getX() - xs[emergency.getLocation().getLocationX()];
float difY = currentHospital.getY() - ys[emergency.getLocation().getLocationY()];
double difTotal = Math.sqrt(Math.pow(((double)difX),2d) + Math.pow(((double)difY),2d));
if(contextData.selectedHospital == null || difTotal < contextData.minDistance){
contextData.minDistance = difTotal;
contextData.selectedHospital = currentHospital;
}
}
@Override
public void reverse(Serializable context, Object value) throws Exception {
}
@Override
public Object getResult(Serializable context) throws Exception {
return ((ContextData)context).selectedHospital;
}
@Override
public boolean supportsReverse() {
return false;
}
}