/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma.math; import java.util.Objects; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; import org.obiba.magma.Category; import org.obiba.magma.Value; import org.obiba.magma.Variable; import org.obiba.magma.VariableValueSource; /** * An implementation of {@code DescriptiveStatisticsProvider} that will exclude all null Values and all values that are * equal to the name of a {@code missing} category from the statistical summary. */ public class ExcludeMissingDescriptiveStatisticsProvider extends AbstractDescriptiveStatisticsProvider { @Override protected void processValue(VariableValueSource valueSource, Value value, DescriptiveStatistics stats) { if(!isMissing(valueSource.getVariable(), value)) { stats.addValue(((Number) value.getValue()).doubleValue()); } } /** * Returns true when {@code value} is considered {@code missing} for {@code variable}. More formally, this method * returns true when {@code value#isNull()} is true or when {@code value#toString()} is equal to the name of any * missing category ({@code Category#isMissing()} is {@code true}). * * @param variable * @param value * @return */ protected boolean isMissing(Variable variable, Value value) { if(value.isNull()) { return true; } for(Category category : variable.getCategories()) { if(category.isMissing() && Objects.equals(value.toString(), category.getName())) { return true; } } return false; } }