You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/09/26 23:20:05 UTC

svn commit: r1526699 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: api/ plugins/memory/ plugins/segment/ plugins/value/ spi/query/

Author: jukka
Date: Thu Sep 26 21:20:05 2013
New Revision: 1526699

URL: http://svn.apache.org/r1526699
Log:
OAK-1049: Blobs shouldn't be Comparable

Drop the Comparable interface from Blob

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java Thu Sep 26 21:20:05 2013
@@ -25,7 +25,7 @@ import javax.annotation.Nonnull;
 /**
  * Immutable representation of a binary value of finite length.
  */
-public interface Blob extends Comparable<Blob> {
+public interface Blob {
 
     /**
      * Returns a new stream for this value object. Multiple calls to this
@@ -47,4 +47,5 @@ public interface Blob extends Comparable
      * @return
      */
     byte[] sha256();
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java Thu Sep 26 21:20:05 2013
@@ -26,7 +26,6 @@ import com.google.common.base.Optional;
 import com.google.common.hash.HashCode;
 import com.google.common.hash.Hasher;
 import com.google.common.hash.Hashing;
-import com.google.common.io.ByteStreams;
 
 import org.apache.jackrabbit.oak.api.Blob;
 import org.slf4j.Logger;
@@ -109,33 +108,4 @@ public abstract class AbstractBlob imple
         }
     }
 
-    @Override
-    public int compareTo(Blob o) {
-        return compare(getNewStream(), o.getNewStream()) ? 0 : 1;
-    }
-
-    private static boolean compare(InputStream in2, InputStream in1) {
-        try {
-            try {
-                byte[] buf1 = new byte[0x1000];
-                byte[] buf2 = new byte[0x1000];
-
-                while (true) {
-                    int read1 = ByteStreams.read(in1, buf1, 0, 0x1000);
-                    int read2 = ByteStreams.read(in2, buf2, 0, 0x1000);
-                    if (read1 != read2 || !Arrays.equals(buf1, buf2)) {
-                        return false;
-                    } else if (read1 != 0x1000) {
-                        return true;
-                    }
-                }
-            } finally {
-                in1.close();
-                in2.close();
-            }
-        } catch (IOException e) {
-            return false;
-        }
-    }
-
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java Thu Sep 26 21:20:05 2013
@@ -20,7 +20,6 @@ import static com.google.common.base.Pre
 
 import javax.annotation.Nonnull;
 
-import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.plugins.memory.AbstractBlob;
 
 public class SegmentBlob extends AbstractBlob {
@@ -50,17 +49,6 @@ public class SegmentBlob extends Abstrac
     }
 
     @Override
-    public int compareTo(Blob blob) {
-        if (blob instanceof SegmentBlob) {
-            SegmentBlob that = (SegmentBlob) blob;
-            if (recordId.equals(that.recordId)) {
-                return 0;
-            }
-        }
-        return super.compareTo(blob);
-    }
-
-    @Override
     public boolean equals(Object object) {
         if (object instanceof SegmentBlob) {
             SegmentBlob that = (SegmentBlob) object;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueImpl.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueImpl.java Thu Sep 26 21:20:05 2013
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Calendar;
+
 import javax.jcr.Binary;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -29,6 +30,8 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 
+import com.google.common.base.Objects;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
@@ -263,7 +266,14 @@ public class ValueImpl implements Value 
     public boolean equals(Object other) {
         if (other instanceof ValueImpl) {
             ValueImpl that = (ValueImpl) other;
-            return compare(propertyState, index, that.propertyState, that.index) == 0;
+            Type<?> type = propertyState.getType();
+            if (type.isArray()) {
+                type = type.getBaseType();
+            }
+            return type.tag() == that.propertyState.getType().tag()
+                    && Objects.equal(
+                            propertyState.getValue(type, index),
+                            that.propertyState.getValue(type, that.index));
         } else {
             return false;
         }
@@ -286,36 +296,4 @@ public class ValueImpl implements Value 
         return getOakString();
     }
 
-    private static int compare(PropertyState p1, int i1, PropertyState p2, int i2) {
-        if (p1.getType().tag() != p2.getType().tag()) {
-            return Integer.signum(p1.getType().tag() - p2.getType().tag());
-        }
-        switch (p1.getType().tag()) {
-            case PropertyType.BINARY:
-                return compare(p1.getValue(Type.BINARY, i1), p2.getValue(Type.BINARY, i2));
-            case PropertyType.DOUBLE:
-                return compare(p1.getValue(Type.DOUBLE, i1), p2.getValue(Type.DOUBLE, i2));
-            case PropertyType.LONG:
-                return compare(p1.getValue(Type.LONG, i1), p2.getValue(Type.LONG, i2));
-            case PropertyType.DECIMAL:
-                return compare(p1.getValue(Type.DECIMAL, i1), p2.getValue(Type.DECIMAL, i2));
-            case PropertyType.DATE:
-                return compareAsDate(p1.getValue(Type.STRING, i1), p2.getValue(Type.STRING, i2));
-            default:
-                return compare(p1.getValue(Type.STRING, i1), p2.getValue(Type.STRING, i2));
-        }
-    }
-
-    private static <T extends Comparable<T>> int compare(T p1, T p2) {
-        return p1.compareTo(p2);
-    }
-
-    private static int compareAsDate(String p1, String p2) {
-        Calendar c1 = Conversions.convert(p1).toCalendar();
-        Calendar c2 = Conversions.convert(p1).toCalendar();
-        return c1 != null && c2 != null
-                ? c1.compareTo(c2)
-                : p1.compareTo(p2);
-    }
-
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyStateValue.java Thu Sep 26 21:20:05 2013
@@ -18,6 +18,8 @@
  */
 package org.apache.jackrabbit.oak.spi.query;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Calendar;
 import java.util.Iterator;
 
@@ -25,6 +27,7 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Type;
@@ -99,10 +102,11 @@ public class PropertyStateValue implemen
         case PropertyType.LONG:
             return compare(getValue(Type.LONGS), p2.getValue(Type.LONGS));
         case PropertyType.BINARY:
-            return compare(getValue(Type.BINARIES), p2.getValue(Type.BINARIES));
+            return compareBinaries(
+                    getValue(Type.BINARIES), p2.getValue(Type.BINARIES));
         case PropertyType.DATE:
-            return compareAsDate(getValue(Type.STRINGS),
-                    p2.getValue(Type.STRINGS));
+            return compareAsDate(
+                    getValue(Type.STRINGS), p2.getValue(Type.STRINGS));
         default:
             return compare(getValue(Type.STRINGS), p2.getValue(Type.STRINGS));
         }
@@ -127,6 +131,44 @@ public class PropertyStateValue implemen
         return 0;
     }
 
+    private static int compareBinaries(Iterable<Blob> p1, Iterable<Blob> p2) {
+        Iterator<Blob> i1 = p1.iterator();
+        Iterator<Blob> i2 = p2.iterator();
+        while (i1.hasNext() || i2.hasNext()) {
+            if (!i1.hasNext()) {
+                return 1;
+            }
+            if (!i2.hasNext()) {
+                return -1;
+            }
+            try {
+                InputStream v1 = i1.next().getNewStream();
+                try {
+                    InputStream v2 = i2.next().getNewStream();
+                    try {
+                        while (true) {
+                            int b1 = v1.read();
+                            int b2 = v2.read();
+                            int compare = b1 - b2;
+                            if (compare != 0) {
+                                return compare;
+                            } else if (b1 == -1) {
+                                break;
+                            }
+                        }
+                    } finally {
+                        v2.close();
+                    }
+                } finally {
+                    v1.close();
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("Failed to compare stream values", e);
+            }
+        }
+        return 0;
+    }
+
     private static int compareAsDate(Iterable<String> p1, Iterable<String> p2) {
         Iterator<String> i1 = p1.iterator();
         Iterator<String> i2 = p2.iterator();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java?rev=1526699&r1=1526698&r2=1526699&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java Thu Sep 26 21:20:05 2013
@@ -18,9 +18,10 @@
  */
 package org.apache.jackrabbit.oak.spi.query;
 
+import static com.google.common.collect.Iterables.contains;
+
 import java.math.BigDecimal;
 import java.net.URI;
-import java.util.Iterator;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -184,20 +185,8 @@ public final class PropertyValues {
 
     }
 
-    private static <T extends Comparable<T>> boolean contains(Iterable<T> p1,
-            T p2) {
-        Iterator<T> i1 = p1.iterator();
-        while (i1.hasNext()) {
-            int compare = i1.next().compareTo(p2);
-            if (compare == 0) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     // --
-    
+
     /**
      * Converts the given value to a value of the specified target type. The
      * conversion is performed according to the rules described in