Luke Hutchison created FLINK-6070:
-------------------------------------

             Summary: Suggestion: add ComparableTuple types
                 Key: FLINK-6070
                 URL: https://issues.apache.org/jira/browse/FLINK-6070
             Project: Flink
          Issue Type: Improvement
          Components: Core
    Affects Versions: 1.2.0
            Reporter: Luke Hutchison
            Priority: Minor


Since Java doesn't have built-in tuple types, I find myself using Flink tuples 
for a lot of tasks in Flink programs. One downside is that these tuples are not 
inherently comparable, so when you want to sort a collection of tuples, you 
have to provide a custom comparator.

I created a ComparableTuple2 type, as follows. I wanted to get feedback on 
whether something like this would be considered useful for Flink before I 
submitted a PR. Also, I don't know how high I should go with the field arity 
for a ComparableTuple -- presumably not as high as for non-comparable tuples?

{code}
import org.apache.flink.api.java.tuple.Tuple2;

/** A comparable tuple, consisting of comparable fields that act as primary and 
secondary sort keys. */
public class ComparableTuple2<T0 extends Comparable<T0>, T1 extends 
Comparable<T1>> extends Tuple2<T0, T1>
        implements Comparable<Tuple2<T0, T1>> {
    private static final long serialVersionUID = 1L;

    private boolean invertSortOrder0;
    private boolean invertSortOrder1;

    public ComparableTuple2() {
    }

    /**
     * Create a 2-tuple of comparable elements.
     * 
     * @param f0
     *            The first element, which is also the primary sort key, and 
sorts in ascending order.
     * @param f1
     *            The second element, which is also the secondary sort key, and 
sorts in ascending order.
     * @param invertSortOrder0
     *            If true, invert the sort order for the first field (i.e. sort 
in descending order).
     * @param invertSortOrder1
     *            If true, invert the sort order for the second field (i.e. 
sort in descending order).
     */
    public ComparableTuple2(T0 f0, T1 f1) {
        super(f0, f1);
    }

    /**
     * Create a comparable 2-tuple out of comparable elements.
     * 
     * @param f0
     *            The first element, which is also the primary sort key, and 
sorts in ascending order if
     *            invertSortOrder0 == false, else sorts in descending order.
     * @param f1
     *            The second element, which is also the secondary sort key, and 
sorts in decending order if
     *            invertSortOrder1 == false, else sorts in descending order.
     * @param invertSortOrder0
     *            If true, invert the sort order for the first field (i.e. sort 
in descending order).
     * @param invertSortOrder1
     *            If true, invert the sort order for the second field (i.e. 
sort in descending order).
     */
    public ComparableTuple2(final T0 f0, final T1 f1, final boolean 
invertSortOrder0,
            final boolean invertSortOrder1) {
        super(f0, f1);
        this.invertSortOrder0 = invertSortOrder0;
        this.invertSortOrder1 = invertSortOrder1;
    }

    /**
     * Comparison function that compares first the primary sort key, f0, and 
then if equal, compares the secondary sort
     * key, f1.
     */
    @Override
    public int compareTo(final Tuple2<T0, T1> o) {
        int diff = this.f0.compareTo(o.f0);
        if (invertSortOrder0) {
            diff = -diff;
        }
        if (diff != 0) {
            return diff;
        }
        diff = this.f1.compareTo(o.f1);
        if (invertSortOrder1) {
            diff = -diff;
        }
        return diff;
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to