/*
* #%L
* gitools-core
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.matrix.sort;
import com.google.common.base.Function;
import com.google.common.base.Strings;
import org.gitools.api.matrix.SortDirection;
import org.gitools.api.matrix.view.IMatrixViewDimension;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SortByLabelComparator implements Comparator<String> {
private IMatrixViewDimension sortDimension;
private SortDirection direction;
protected Function<String, String> transformFunction;
private int firstPosition;
private boolean asNumeric;
private Set<String> sortIdentifiers;
/**
* @param sortDimension
* @param direction Sort direction
* @param transformFunction Patterns transform function
* @param firstPosition Indicate if only sorting selected items, otherwise -1
* @param asNumeric If the annotation values are numeric
*/
public SortByLabelComparator(IMatrixViewDimension sortDimension, SortDirection direction, Function<String, String> transformFunction, int firstPosition, boolean asNumeric) {
this.sortDimension = sortDimension;
this.direction = direction;
this.transformFunction = transformFunction;
this.firstPosition = firstPosition;
this.asNumeric = asNumeric;
sortIdentifiers = new HashSet<>();
if (firstPosition > -1) {
for (String id : sortDimension.getSelected()) {
sortIdentifiers.add(id);
}
}
}
@Override
public int compare(String idx1, String idx2) {
// 1. If only sorting selected and idx1 & idx2 not amognst them
if (firstPosition > -1) {
boolean before1 = sortDimension.indexOf(idx1) < firstPosition;
boolean before2 = sortDimension.indexOf(idx2) < firstPosition;
if (!sortIdentifiers.contains(idx1) && !sortIdentifiers.contains(idx2)) {
if (before1 != before2) {
return before1 ? -1 : 1;
} else {
return 0;
}
} else if (!sortIdentifiers.contains(idx1)) {
return before1 ? -1 : 1;
} else if (!sortIdentifiers.contains(idx2)) {
return before2 ? 1 : -1;
}
}
// 2 Compare selected or ALL
String v1 = transformFunction.apply(idx1);
String v2 = transformFunction.apply(idx2);
if (Strings.isNullOrEmpty(v1) && Strings.isNullOrEmpty(v2)) {
return 0;
}
if (Strings.isNullOrEmpty(v1)) {
return 1;
}
if (Strings.isNullOrEmpty(v2)) {
return -1;
}
if (asNumeric) {
Double d1;
Double d2;
try {
d1 = Double.valueOf(v1);
} catch (NumberFormatException e) {
return 1;
}
try {
d2 = Double.valueOf(v2);
} catch (NumberFormatException e) {
return -1;
}
return direction.compare(Double.valueOf(d1), Double.valueOf(d2));
}
return direction.compare(v1, v2);
}
}