001    package com.hammurapi.eventbus;
002    
003    import java.util.Comparator;
004    
005    import com.hammurapi.extract.Predicate;
006    
007    /**
008     * Comparator to sort join predicates.
009     * @author Pavel Vlasov
010     *
011     * @param <E>
012     * @param <C>
013     */
014    public class PredicateCostCardinalityComparator<E,C> implements Comparator<Predicate<E,C>> {
015    
016            @Override
017            public int compare(Predicate<E, C> p1, Predicate<E, C> p2) {
018                    // Predicates ordered by cost first - cheaper come before more expensive
019                    double delta = p1.getCost() - p2.getCost();
020                    if (delta < -Double.MIN_VALUE) {
021                            return -1;
022                    } 
023                    
024                    if (delta > Double.MIN_VALUE) {
025                            return 1;
026                    }                                       
027                    
028                    // Then by cardinality (smaller comes before greater)
029                    // And then by first index.
030                    int c1 = p1.parameterIndices().size();
031                    int c2 = p2.parameterIndices().size();
032                    if (c1!=c2) {
033                            return c1 - c2;
034                    }
035                    
036                    for (int i: p1.parameterIndices()) {
037                            for (int j: p2.parameterIndices()) {
038                                    if (i!=j) {
039                                            return i-j;
040                                    }
041                            }
042                    }
043                    
044                    return p1.hashCode() - p2.hashCode();
045            }
046    
047    }