package edu.stanford.nlp.sempre;
import com.google.common.base.Function;
import fig.basic.LispTree;
import java.util.List;
/**
* 'Aggregate' takes a set and computes some number on that set.
*
* @author Percy Liang
*/
public class AggregateFormula extends Formula {
public enum Mode { count, sum, avg, min, max };
public final Mode mode;
public final Formula child;
public AggregateFormula(Mode mode, Formula child) {
this.mode = mode;
this.child = child;
}
public LispTree toLispTree() {
LispTree tree = LispTree.proto.newList();
tree.addChild(mode.toString());
tree.addChild(child.toLispTree());
return tree;
}
public static Mode parseMode(String mode) {
if ("count".equals(mode)) return Mode.count;
if ("sum".equals(mode)) return Mode.sum;
if ("avg".equals(mode)) return Mode.avg;
if ("min".equals(mode)) return Mode.min;
if ("max".equals(mode)) return Mode.max;
return null;
}
@Override
public void forEach(Function<Formula, Boolean> func) {
if (!func.apply(this)) child.forEach(func);
}
@Override
public Formula map(Function<Formula, Formula> func) {
Formula result = func.apply(this);
return result == null ? new AggregateFormula(mode, child.map(func)) : result;
}
@Override
public List<Formula> mapToList(Function<Formula, List<Formula>> func, boolean alwaysRecurse) {
List<Formula> res = func.apply(this);
if (res.isEmpty() || alwaysRecurse)
res.addAll(child.mapToList(func, alwaysRecurse));
return res;
}
@SuppressWarnings({"equalshashcode"})
@Override
public boolean equals(Object thatObj) {
if (!(thatObj instanceof AggregateFormula)) return false;
AggregateFormula that = (AggregateFormula) thatObj;
if (!this.mode.equals(that.mode)) return false;
if (!this.child.equals(that.child)) return false;
return true;
}
public int computeHashCode() {
int hash = 0x7ed55d16;
hash = hash * 0xd3a2646c + mode.toString().hashCode();
hash = hash * 0xd3a2646c + child.hashCode();
return hash;
}
}