package com.revolsys.gis.parallel;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import com.revolsys.parallel.channel.Channel;
import com.revolsys.parallel.process.MultipleFilterProcess;
import com.revolsys.record.Record;
import com.revolsys.util.count.LabelCountMap;
public class StatisticsMultipleFilterProcess extends MultipleFilterProcess<Record> {
private final Map<Predicate<Record>, LabelCountMap> statisticsMap = new HashMap<>();
private String statisticsName;
private boolean useStatistics;
@Override
protected void destroy() {
super.destroy();
for (final LabelCountMap stats : this.statisticsMap.values()) {
stats.disconnect();
}
}
/**
* @return the statisticsName
*/
public String getStatisticsName() {
return this.statisticsName;
}
/**
* @return the useStatistics
*/
public boolean isUseStatistics() {
return this.useStatistics;
}
@Override
protected boolean processPredicate(final Record object, final Predicate<Record> filter,
final Channel<Record> filterOut) {
if (super.processPredicate(object, filter, filterOut)) {
if (this.useStatistics) {
LabelCountMap stats = this.statisticsMap.get(filter);
String name;
if (stats == null) {
if (this.statisticsName != null) {
name = this.statisticsName + " " + filter.toString();
} else {
name = filter.toString();
}
stats = new LabelCountMap(name);
stats.connect();
this.statisticsMap.put(filter, stats);
}
stats.addCount(object);
}
return true;
} else {
return false;
}
}
/**
* @param statisticsName the statisticsName to set
*/
public void setStatisticsName(final String statisticsName) {
this.statisticsName = statisticsName;
}
/**
* @param useStatistics the useStatistics to set
*/
public void setUseStatistics(final boolean useStatistics) {
this.useStatistics = useStatistics;
}
}