package com.revolsys.record.comparator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import com.revolsys.record.Record;
import com.revolsys.record.Records;
import com.revolsys.util.CompareUtil;
public class RecordFieldComparator implements Comparator<Record> {
private List<String> fieldNames;
private boolean invert;
private boolean nullFirst;
public RecordFieldComparator() {
}
public RecordFieldComparator(final boolean sortAsceding, final String... fieldNames) {
this(Arrays.asList(fieldNames));
this.invert = !sortAsceding;
}
public RecordFieldComparator(final List<String> fieldNames) {
this.fieldNames = fieldNames;
}
public RecordFieldComparator(final String... fieldNames) {
this(Arrays.asList(fieldNames));
}
@Override
public int compare(final Record object1, final Record object2) {
for (final String fieldName : this.fieldNames) {
final int compare = compare(object1, object2, fieldName);
if (compare != 0) {
return compare;
}
}
return 0;
}
public int compare(final Record record1, final Record record2, final String fieldName) {
final Comparable<Object> value1 = Records.getFieldByPath(record1, fieldName);
final Comparable<Object> value2 = Records.getFieldByPath(record2, fieldName);
if (value1 == null) {
if (value2 == null) {
return 0;
} else {
if (this.nullFirst) {
return -1;
} else {
return 1;
}
}
} else if (value2 == null) {
if (this.nullFirst) {
return 1;
} else {
return -1;
}
} else {
final int compare = CompareUtil.compare(value1, value2);
if (this.invert) {
return -compare;
} else {
return compare;
}
}
}
public List<String> getFieldNames() {
return this.fieldNames;
}
public boolean isInvert() {
return this.invert;
}
public boolean isNullFirst() {
return this.nullFirst;
}
public void setFieldNames(final List<String> fieldNames) {
this.fieldNames = fieldNames;
}
public void setInvert(final boolean invert) {
this.invert = invert;
}
public void setNullFirst(final boolean nullFirst) {
this.nullFirst = nullFirst;
}
}