@JsonCreator
  public ArithmeticPostAggregator(
      @JsonProperty("name") String name,
      @JsonProperty("fn") String fnName,
      @JsonProperty("fields") List<PostAggregator> fields) {
    this.name = name;
    this.fnName = fnName;
    this.fields = fields;
    if (fields.size() <= 1) {
      throw new IAE("Illegal number of fields[%s], must be > 1", fields.size());
    }

    this.op = Ops.lookup(fnName);
    if (op == null) {
      throw new IAE("Unknown operation[%s], known operations[%s]", fnName, Ops.getFns());
    }
  }
 @Override
 public Object compute(Map<String, Object> values) {
   Iterator<PostAggregator> fieldsIter = fields.iterator();
   double retVal = 0.0;
   if (fieldsIter.hasNext()) {
     retVal = ((Number) fieldsIter.next().compute(values)).doubleValue();
     while (fieldsIter.hasNext()) {
       retVal = op.compute(retVal, ((Number) fieldsIter.next().compute(values)).doubleValue());
     }
   }
   return retVal;
 }
 /** Process results in the UI Thread. */
 protected void onPostExecute(Result result) {
   mOps.onPostExecute(result, mParam);
 }
 static {
   for (Ops op : Ops.values()) {
     lookupMap.put(op.getFn(), op);
   }
 }
  /** Run in a background thread to avoid blocking the UI thread. */
  @SuppressWarnings("unchecked")
  protected Result doInBackground(Params... params) {
    mParam = params[0];

    return mOps.doInBackground(mParam);
  }