/** * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. * * Copyright 2012-2016 the original author or authors. */ package org.assertj.db.util; import org.assertj.db.type.Row; import org.assertj.db.type.Value; import java.util.Comparator; import java.util.List; /** * Comparator for the {@code Row}. * * @author RĂ©gis Pouiller * */ public enum RowComparator implements Comparator<Row>{ /** * The singleton */ INSTANCE; /** * Compare one array of values to another. * @param values1 The first array of values. * @param values2 The second array of values. * @return The result. * @see Comparator#compare(Object, Object) */ private static int compare(Value[] values1, Value[] values2) { if (values1.length == values2.length) { for (int index = 0; index < values1.length; index++) { Value value1 = values1[index]; Value value2 = values2[index]; Object object1 = value1.getValue(); Object object2 = value2.getValue(); if (object1 == null && object2 != null) { return 1; } if (object1 != null && object2 == null) { return -1; } if (object1 instanceof Comparable && object2 instanceof Comparable) { @SuppressWarnings("unchecked") Comparable<Object> comparable1 = Comparable.class.cast(object1); int compare = comparable1.compareTo(object2); if (compare != 0) { return compare; } } } } return 0; } /** {@inheritDoc} */ @Override public int compare(Row row1, Row row2) { Value[] pksValues1 = row1.getPksValues(); Value[] pksValues2 = row2.getPksValues(); int compare = compare(pksValues1, pksValues2); if (compare != 0) { return compare; } List<Value> valuesList1 = row1.getValuesList(); List<Value> valuesList2 = row2.getValuesList(); Value[] values1 = valuesList1.toArray(new Value[valuesList1.size()]); Value[] values2 = valuesList2.toArray(new Value[valuesList2.size()]); return compare(values1, values2); } }