Author: jmsnell
Date: Tue Nov 22 23:09:57 2011
New Revision: 1205217

URL: http://svn.apache.org/viewvc?rev=1205217&view=rev
Log:
Utility methods for taking an Iterable of ASObjects, sorting them by either 
updated or published timestamp and filtering out older equivalent duplicates... 
other types of filters can be constructed using similar means...

Modified:
    
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java
    
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java

Modified: 
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java
URL: 
http://svn.apache.org/viewvc/abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java?rev=1205217&r1=1205216&r2=1205217&view=diff
==============================================================================
--- 
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java
 (original)
+++ 
abdera/abdera2/activities/src/main/java/org/apache/abdera2/activities/extra/Extra.java
 Tue Nov 22 23:09:57 2011
@@ -21,7 +21,10 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
 import java.lang.reflect.Method;
+import java.util.AbstractSet;
+import java.util.Collections;
 import java.util.Comparator;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import net.sf.cglib.proxy.Enhancer;
@@ -52,9 +55,11 @@ import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.MapDifference;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.google.common.collect.Maps.EntryTransformer;
 
 import static com.google.common.base.Predicates.*;
@@ -805,6 +810,14 @@ public final class Extra {
   public static final Comparator<ASObject> PUBLISHED_COMPARATOR = 
     new PublishedComparator<ASObject>();
   
+  public static <X extends ASObject>Comparator<X> reversedUpdatedComparator() {
+    return Collections.<X>reverseOrder(Extra.<X>updatedComparator());
+  }
+  
+  public static <X extends ASObject>Comparator<X> 
reversedPublishedComparator() {
+    return Collections.<X>reverseOrder(Extra.<X>publishedComparator());
+  }
+  
   public static <X extends ASObject>Comparator<X> updatedComparator() {
     return new UpdatedComparator<X>();
   }
@@ -1392,4 +1405,92 @@ public final class Extra {
       };
   }
   
+  
+  
+  
+  public static <T extends ASObject>Iterable<T> 
filterUpdatedIdentityEquivalent(Iterable<T> items) {
+    return filterEquivalent(items, 
Extra.<T>identity(),Extra.<T>reversedUpdatedComparator());
+  }
+  
+  public static <T extends ASObject>Iterable<T> 
filterPublishedIdentityEquivalent(Iterable<T> items) {
+    return filterEquivalent(items, 
Extra.<T>identity(),Extra.<T>reversedPublishedComparator());
+  }
+  
+  public static <T extends ASObject>Iterable<T> 
filterUpdatedIdentityWithDuplicatesEquivalent(Iterable<T> items) {
+    return filterEquivalent(items, 
Extra.<T>identityWithDuplicates(),Extra.<T>reversedUpdatedComparator());
+  }
+  
+  public static <T extends ASObject>Iterable<T> 
filterPublishedIdentityWithDuplicatesEquivalent(Iterable<T> items) {
+    return filterEquivalent(items, 
Extra.<T>identityWithDuplicates(),Extra.<T>reversedPublishedComparator());
+  }
+  
+  public static <T extends ASBase>Iterable<T> filterEquivalent(
+    Iterable<T> items, 
+    Equivalence<? super T> equiv, 
+    Comparator<T> comp) {
+    EquivalenceSet<T> a = 
+      new EquivalenceSet<T>(equiv);
+    Iterables.addAll(
+      a,sorted(items,comp));
+    return Iterables.unmodifiableIterable(a);
+  }
+  
+  public static <T extends ASBase>Iterable<T> filterEquivalent(
+    Iterable<T> items, 
+    Equivalence<? super T> equiv) {
+    EquivalenceSet<T> a = 
+      new EquivalenceSet<T>(equiv);
+    Iterables.addAll(
+      a,items);
+    return Iterables.unmodifiableIterable(a);
+  }
+  
+  public static <T extends Comparable<T>>Iterable<T> sorted(Iterable<? extends 
T> items) {
+    return ImmutableSortedSet.<T>naturalOrder().addAll(items).build();
+  }
+  
+  public static <T>Iterable<T> sorted(Iterable<? extends T> items, 
Comparator<T> comp) {
+    return ImmutableSortedSet.<T>orderedBy(comp).addAll(items).build();
+  }
+  
+  public static class EquivalenceSet<T> 
+    extends AbstractSet<T> {
+
+    private final Set<T> set;
+    private final Equivalence<? super T> equiv;
+    
+    public EquivalenceSet(Comparator<? super T> order, Equivalence<? super T> 
equiv) {
+      this.set = Sets.newTreeSet(order);
+      this.equiv = equiv;
+    }
+    
+    public EquivalenceSet(Equivalence<? super T> equiv) {
+      this.set = Sets.newLinkedHashSet();
+      this.equiv = equiv;
+    }
+    
+    @Override
+    public boolean add(T o) {
+      if (set.isEmpty()) return set.add(o);
+      else {
+        Iterable<T> filtered = 
+          Iterables.filter(
+            set, equiv.equivalentTo(o));
+        if (Iterables.isEmpty(filtered))
+          return set.add(o);
+        else return false;
+      }
+    }
+
+    @Override
+    public Iterator<T> iterator() {
+      return set.iterator();
+    }
+
+    @Override
+    public int size() {
+      return set.size();
+    }
+    
+  }
 }

Modified: 
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java
URL: 
http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java?rev=1205217&r1=1205216&r2=1205217&view=diff
==============================================================================
--- 
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java
 (original)
+++ 
abdera/abdera2/common/src/main/java/org/apache/abdera2/common/date/DateTimes.java
 Tue Nov 22 23:09:57 2011
@@ -311,8 +311,9 @@ public final class DateTimes {
     public int innerCompare(DateTime d1, DateTime d2) {
       if (onlySecondIsNull(d1,d2)) return 1;
       if (onlyFirstIsNull(d1,d2)) return -1;
-      if (bothAreNull(d1,d2)) return 0;
-      return d1.compareTo(d2);
+      if (bothAreNull(d1,d2)) return -1;
+      int ret = d1.compareTo(d2);
+      return ret == 0 ? -1 : ret;
     }
   }
 


Reply via email to