private static NullAwareComparator<Object>[] makeNullAware( TypeComparator<Object>[] comparators, boolean[] orders) { checkArgument(comparators.length == orders.length); NullAwareComparator<?>[] result = new NullAwareComparator<?>[comparators.length]; for (int i = 0; i < comparators.length; i++) { result[i] = new NullAwareComparator<Object>(comparators[i], orders[i]); } return (NullAwareComparator<Object>[]) result; } }
@Override public int extractKeys(Object record, Object[] target, int index) { int len = comparators.length; int localIndex = index; for (int i = 0; i < len; i++) { Object element = ((Row) record).getField(keyPositions[i]); // element can be null localIndex += comparators[i].extractKeys(element, target, localIndex); } return localIndex - index; }
@Override public int compareToReference(TypeComparator<Row> referencedComparator) { RowComparator other = (RowComparator) referencedComparator; int i = 0; try { for (; i < keyPositions.length; i++) { int cmp = comparators[i].compareToReference(other.comparators[i]); if (cmp != 0) { return cmp; } } } catch (IndexOutOfBoundsException e) { throw new KeyFieldOutOfBoundsException(keyPositions[i]); } return 0; }
NullAwareComparator<Object> k = comparators[i]; if (k.supportsNormalizedKey()) { if (i == 0) { inverted = k.invertNormalizedKey(); } else if (k.invertNormalizedKey() != inverted) { int len = k.getNormalizeKeyLen(); if (len < 0) { throw new RuntimeException(
@Override public void getFlatComparator(List<TypeComparator> flatComparators) { for (NullAwareComparator<Object> c : comparators) { Collections.addAll(flatComparators, c.getFlatComparators()); } }
@Override public int hash(Row record) { int code = 0; int i = 0; try { for (; i < keyPositions.length; i++) { code *= TupleComparatorBase.HASH_SALT[i & 0x1F]; Object element = record.getField(keyPositions[i]); // element can be null code += comparators[i].hash(element); } } catch (IndexOutOfBoundsException e) { throw new KeyFieldOutOfBoundsException(keyPositions[i]); } return code; }
@Override public TypeComparator<Row> duplicate() { NullAwareComparator<?>[] comparatorsCopy = new NullAwareComparator<?>[comparators.length]; for (int i = 0; i < comparators.length; i++) { comparatorsCopy[i] = (NullAwareComparator<?>) comparators[i].duplicate(); } TypeSerializer<?>[] serializersCopy = new TypeSerializer<?>[serializers.length]; for (int i = 0; i < serializers.length; i++) { serializersCopy[i] = serializers[i].duplicate(); } return new RowComparator( arity, keyPositions, (NullAwareComparator<Object>[]) comparatorsCopy, (TypeSerializer<Object>[]) serializersCopy, normalizedKeyLengths, numLeadingNormalizableKeys, normalizableKeyPrefixLen, invertNormKey); }
NullAwareComparator<Object> k = comparators[i]; if (k.supportsNormalizedKey()) { if (i == 0) { inverted = k.invertNormalizedKey(); } else if (k.invertNormalizedKey() != inverted) { int len = k.getNormalizeKeyLen(); if (len < 0) { throw new RuntimeException(
@Override public void getFlatComparator(List<TypeComparator> flatComparators) { for (NullAwareComparator<Object> c : comparators) { Collections.addAll(flatComparators, c.getFlatComparators()); } }
@Override public int hash(Row record) { int code = 0; int i = 0; try { for (; i < keyPositions.length; i++) { code *= TupleComparatorBase.HASH_SALT[i & 0x1F]; Object element = record.getField(keyPositions[i]); // element can be null code += comparators[i].hash(element); } } catch (IndexOutOfBoundsException e) { throw new KeyFieldOutOfBoundsException(keyPositions[i]); } return code; }
@Override public TypeComparator<Row> duplicate() { NullAwareComparator<?>[] comparatorsCopy = new NullAwareComparator<?>[comparators.length]; for (int i = 0; i < comparators.length; i++) { comparatorsCopy[i] = (NullAwareComparator<?>) comparators[i].duplicate(); } TypeSerializer<?>[] serializersCopy = new TypeSerializer<?>[serializers.length]; for (int i = 0; i < serializers.length; i++) { serializersCopy[i] = serializers[i].duplicate(); } return new RowComparator( arity, keyPositions, (NullAwareComparator<Object>[]) comparatorsCopy, (TypeSerializer<Object>[]) serializersCopy, normalizedKeyLengths, numLeadingNormalizableKeys, normalizableKeyPrefixLen, invertNormKey); }
NullAwareComparator<Object> k = comparators[i]; if (k.supportsNormalizedKey()) { if (i == 0) { inverted = k.invertNormalizedKey(); } else if (k.invertNormalizedKey() != inverted) { int len = k.getNormalizeKeyLen(); if (len < 0) { throw new RuntimeException(
@Override public TypeComparator<T> duplicate() { return new NullAwareComparator<T>(wrappedComparator.duplicate(), order); }
@Override public int extractKeys(Object record, Object[] target, int index) { int len = comparators.length; int localIndex = index; for (int i = 0; i < len; i++) { Object element = ((Row) record).getField(keyPositions[i]); // element can be null localIndex += comparators[i].extractKeys(element, target, localIndex); } return localIndex - index; }
@Override public void getFlatComparator(List<TypeComparator> flatComparators) { for (NullAwareComparator<Object> c : comparators) { Collections.addAll(flatComparators, c.getFlatComparators()); } }
@Override public int hash(Row record) { int code = 0; int i = 0; try { for (; i < keyPositions.length; i++) { code *= TupleComparatorBase.HASH_SALT[i & 0x1F]; Object element = record.getField(keyPositions[i]); // element can be null code += comparators[i].hash(element); } } catch (IndexOutOfBoundsException e) { throw new KeyFieldOutOfBoundsException(keyPositions[i]); } return code; }
@Override public int compareToReference(TypeComparator<Row> referencedComparator) { RowComparator other = (RowComparator) referencedComparator; int i = 0; try { for (; i < keyPositions.length; i++) { int cmp = comparators[i].compareToReference(other.comparators[i]); if (cmp != 0) { return cmp; } } } catch (IndexOutOfBoundsException e) { throw new KeyFieldOutOfBoundsException(keyPositions[i]); } return 0; }
@Override public TypeComparator<Row> duplicate() { NullAwareComparator<?>[] comparatorsCopy = new NullAwareComparator<?>[comparators.length]; for (int i = 0; i < comparators.length; i++) { comparatorsCopy[i] = (NullAwareComparator<?>) comparators[i].duplicate(); } TypeSerializer<?>[] serializersCopy = new TypeSerializer<?>[serializers.length]; for (int i = 0; i < serializers.length; i++) { serializersCopy[i] = serializers[i].duplicate(); } return new RowComparator( arity, keyPositions, (NullAwareComparator<Object>[]) comparatorsCopy, (TypeSerializer<Object>[]) serializersCopy, normalizedKeyLengths, numLeadingNormalizableKeys, normalizableKeyPrefixLen, invertNormKey); }
@Override public TypeComparator[] getFlatComparators() { // determine the flat comparators and wrap them again in null-aware comparators List<TypeComparator<?>> flatComparators = new ArrayList<>(); if (wrappedComparator instanceof CompositeTypeComparator) { ((CompositeTypeComparator) wrappedComparator).getFlatComparator(flatComparators); } else { flatComparators.add(wrappedComparator); } TypeComparator<?>[] result = new TypeComparator[flatComparators.size()]; for (int i = 0; i < result.length; i++) { result[i] = new NullAwareComparator<>(flatComparators.get(i), order); } return result; } }
@Override public int extractKeys(Object record, Object[] target, int index) { int len = comparators.length; int localIndex = index; for (int i = 0; i < len; i++) { Object element = ((Row) record).getField(keyPositions[i]); // element can be null localIndex += comparators[i].extractKeys(element, target, localIndex); } return localIndex - index; }