package org.myrobotlab.document.transformer; import org.myrobotlab.document.Document; import org.myrobotlab.logging.LoggerFactory; import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; public class DivideValues extends AbstractStage { public final static Logger log = LoggerFactory.getLogger(DivideValues.class.getCanonicalName()); private String dividendField = null; private String divisorField = null; private String quotentField = null; @Override public void startStage(StageConfiguration config) { // TODO Auto-generated method stub if (config != null) { dividendField = config.getProperty("dividendField"); divisorField = config.getProperty("divisorField"); quotentField = config.getProperty("quotentField"); } } @Override public List<Document> processDocument(Document doc) { // divide the double values in 2 fields, store the result in the quotent // field. if (!(doc.hasField(dividendField) && doc.hasField(divisorField))) { return null; } if (doc.getField(dividendField).size() != doc.getField(divisorField).size()) { log.warn("Dividend and Divisor fields of unequal length."); return null; } ArrayList<Double> results = new ArrayList<Double>(); int size = doc.getField(dividendField).size(); for (int i = 0; i < size; i++) { try { // log.info("Compute {} divided by {}", // doc.getField(dividendField).get(i), // doc.getField(divisorField).get(i)); Double divisor = convertToDouble(doc.getField(divisorField).get(i)); Double dividend = convertToDouble(doc.getField(dividendField).get(i)); if (divisor == 0.0) { continue; } Double quotient = dividend / divisor; results.add(quotient); } catch (ClassCastException e) { log.warn("Division Error DocID: ", doc.getId()); e.printStackTrace(); } } if (dividendField.equals(quotentField)) { doc.removeField(quotentField); } for (Double v : results) { doc.addToField(quotentField, v); } return null; } private Double convertToDouble(Object obj) throws ClassCastException { Double doubleVal = null; if (obj instanceof Integer) { doubleVal = new Double(((Integer) obj).intValue()); } else if (obj instanceof Double) { doubleVal = (Double) obj; } else { throw new ClassCastException("Cannot convert " + obj.getClass().getName() + " to Double."); } return doubleVal; } @Override public void stopStage() { // TODO Auto-generated method stub } @Override public void flush() { // TODO Auto-generated method stub } }