ignite-757 - fixes

Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/00f532cf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/00f532cf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/00f532cf

Branch: refs/heads/ignite-286
Commit: 00f532cfda0b328d9ec16f2a61422955268d126a
Parents: 2115d68
Author: S.Vladykin <svlady...@gridgain.com>
Authored: Thu Apr 23 01:08:58 2015 +0300
Committer: S.Vladykin <svlady...@gridgain.com>
Committed: Thu Apr 23 01:08:58 2015 +0300

----------------------------------------------------------------------
 .../processors/query/h2/IgniteH2Indexing.java   | 174 +++++++++++++++++--
 .../query/h2/opt/GridH2RowDescriptor.java       |   7 +-
 .../query/h2/opt/GridLuceneIndex.java           |  12 +-
 .../h2/GridIndexingSpiAbstractSelfTest.java     |  20 ++-
 4 files changed, 182 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/00f532cf/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 7c91ca4..7a0a4b2 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -376,6 +376,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
      * @return {@code true} If it is a portable object.
      */
     private boolean isPortable(CacheObject o) {
+        if (ctx == null)
+            return false;
+
         return ctx.cacheObjects().isPortableObject(o);
     }
 
@@ -395,6 +398,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
      * @return Cache object context.
      */
     private CacheObjectContext objectContext(String space) {
+        if (ctx == null)
+            return null;
+
         return ctx.cache().internalCache(space).context().cacheObjectContext();
     }
 
@@ -1949,25 +1955,19 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
             return IgniteH2Indexing.this;
         }
 
-        /**
-         * Wraps object to respective {@link Value}.
-         *
-         * @param obj Object.
-         * @param type Value type.
-         * @return Value.
-         * @throws IgniteCheckedException If failed.
-         */
-        public Value wrap(Object obj, int type) throws IgniteCheckedException {
+        /** {@inheritDoc} */
+        @Override public Value wrap(Object obj, int type) throws 
IgniteCheckedException {
             assert obj != null;
 
-            CacheObjectContext coctx = null;
+            if (obj instanceof CacheObject) { // Handle cache object.
+                CacheObject co = (CacheObject)obj;
 
-            CacheObject co = null;
+                CacheObjectContext coctx = objectContext(schema.spaceName);
 
-            if (obj instanceof CacheObject) { // Unwrap cache object.
-                co = (CacheObject)obj;
+                if (type == Value.JAVA_OBJECT)
+                    return new ValueCacheObject(coctx, co);
 
-                obj = co.value(coctx = objectContext(schema.spaceName), false);
+                obj = co.value(coctx, false);
             }
 
             switch (type) {
@@ -2004,10 +2004,7 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
                 case Value.BYTES:
                     return ValueBytes.get((byte[])obj);
                 case Value.JAVA_OBJECT:
-                    return ValueJavaObject.getNoCopy(obj,
-                        co != null && co.hasValueBytes() ? 
co.valueBytes(coctx) : null,
-                        null);
-
+                    return ValueJavaObject.getNoCopy(obj, null, null);
                 case Value.ARRAY:
                     Object[] arr = (Object[])obj;
 
@@ -2106,4 +2103,145 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
             return new GridH2KeyValueRowOffheap(this, ptr);
         }
     }
+
+    /**
+     * Replacement for {@link ValueJavaObject}.
+     * Note that after serialization/deserialization it will become {@link 
ValueJavaObject}.
+     */
+    private static class ValueCacheObject extends Value {
+        /** */
+        private CacheObject obj;
+
+        /** */
+        private CacheObjectContext coctx;
+
+        /**
+         * @param coctx Cache object context.
+         * @param obj Object.
+         */
+        ValueCacheObject(CacheObjectContext coctx, CacheObject obj) {
+            assert obj != null;
+
+            this.obj = obj;
+            this.coctx = coctx; // Allowed to be null in tests.
+        }
+
+        /** {@inheritDoc} */
+        @Override public String getSQL() {
+            throw new UnsupportedOperationException();
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getType() {
+            return Value.JAVA_OBJECT;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long getPrecision() {
+            return 0;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getDisplaySize() {
+            return 64;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String getString() {
+            return getObject().toString();
+        }
+
+        /** {@inheritDoc} */
+        @Override public byte[] getBytes() {
+            return Utils.cloneByteArray(getBytesNoCopy());
+        }
+
+        /** {@inheritDoc} */
+        @Override public byte[] getBytesNoCopy() {
+            // Can't just return valueBytes for portable because it can't be 
unmarshalled then.
+            if (coctx != null && coctx.processor().isPortableObject(obj))
+                return Utils.serialize(obj, null);
+
+            try {
+                return obj.valueBytes(coctx); // Result must be the same: 
`marshaller.marshall(obj.value(coctx, false))`
+            }
+            catch (IgniteCheckedException e) {
+                throw DbException.convert(e);
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public Object getObject() {
+            return obj.value(coctx, false);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void set(PreparedStatement prep, int parameterIndex) 
throws SQLException {
+            prep.setObject(parameterIndex, getObject(), Types.JAVA_OBJECT);
+        }
+
+        /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
+        @Override protected int compareSecure(Value v, CompareMode mode) {
+            Object o1 = getObject();
+            Object o2 = v.getObject();
+
+            boolean o1Comparable = o1 instanceof Comparable;
+            boolean o2Comparable = o2 instanceof Comparable;
+
+            if (o1Comparable && o2Comparable &&
+                Utils.haveCommonComparableSuperclass(o1.getClass(), 
o2.getClass())) {
+                Comparable<Object> c1 = (Comparable<Object>)o1;
+
+                return c1.compareTo(o2);
+            }
+
+            // Group by types.
+            if (o1.getClass() != o2.getClass()) {
+                if (o1Comparable != o2Comparable)
+                    return o1Comparable ? -1 : 1;
+
+                return 
o1.getClass().getName().compareTo(o2.getClass().getName());
+            }
+
+            // Compare hash codes.
+            int h1 = hashCode();
+            int h2 = v.hashCode();
+
+            if (h1 == h2) {
+                if (o1.equals(o2))
+                    return 0;
+
+                return Utils.compareNotNullSigned(getBytesNoCopy(), 
v.getBytesNoCopy());
+            }
+
+            return h1 > h2 ? 1 : -1;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int hashCode() {
+            return getObject().hashCode();
+        }
+
+        /** {@inheritDoc} */
+        @Override public boolean equals(Object other) {
+            if (!(other instanceof Value))
+                return false;
+
+            Value otherVal = (Value)other;
+
+            return otherVal.getType() == Value.JAVA_OBJECT
+                && getObject().equals(otherVal.getObject());
+        }
+
+        /** {@inheritDoc} */
+        @Override public Value convertPrecision(long precision, boolean force) 
{
+            return this;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getMemory() {
+            return 0;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/00f532cf/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
index a7c690e..cd65ab3 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
@@ -101,9 +101,12 @@ public interface GridH2RowDescriptor extends 
GridOffHeapSmartPointerFactory<Grid
     public GridUnsafeGuard guard();
 
     /**
-     * @param o Object
-     * @param type Object type.
+     * Wraps object to respective {@link Value}.
+     *
+     * @param o Object.
+     * @param type Value type.
      * @return Value.
+     * @throws IgniteCheckedException If failed.
      */
     public Value wrap(Object o, int type) throws IgniteCheckedException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/00f532cf/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
index 827d859..f2f11be 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.query.h2.opt;
 import org.apache.ignite.*;
 import org.apache.ignite.internal.*;
 import org.apache.ignite.internal.processors.cache.*;
+import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.query.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.lang.*;
@@ -33,6 +34,7 @@ import org.apache.lucene.index.*;
 import org.apache.lucene.queryParser.*;
 import org.apache.lucene.search.*;
 import org.apache.lucene.util.*;
+import org.h2.util.*;
 import org.jetbrains.annotations.*;
 
 import java.io.*;
@@ -130,6 +132,9 @@ public class GridLuceneIndex implements Closeable {
      * @return Cache object context.
      */
     private CacheObjectContext objectContext() {
+        if (ctx == null)
+            return null;
+
         return 
ctx.cache().internalCache(spaceName).context().cacheObjectContext();
     }
 
@@ -145,8 +150,8 @@ public class GridLuceneIndex implements Closeable {
     public void store(CacheObject k, CacheObject v, byte[] ver, long expires) 
throws IgniteCheckedException {
         CacheObjectContext coctx = objectContext();
 
-        Object key = coctx.processor().isPortableObject(k) ? k : 
k.value(coctx, false);
-        Object val = coctx.processor().isPortableObject(v) ? v : 
v.value(coctx, false);
+        Object key = k.value(coctx, false);
+        Object val = v.value(coctx, false);
 
         Document doc = new Document();
 
@@ -343,6 +348,9 @@ public class GridLuceneIndex implements Closeable {
          */
         @SuppressWarnings("unchecked")
         private <Z> Z unmarshall(byte[] bytes, ClassLoader ldr) throws 
IgniteCheckedException {
+            if (coctx == null) // For tests.
+                return (Z)Utils.deserialize(bytes, null);
+
             return (Z)coctx.processor().unmarshal(coctx, bytes, ldr);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/00f532cf/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index ba6912a..64de5b2 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.query.h2;
 import org.apache.ignite.*;
 import org.apache.ignite.configuration.*;
 import org.apache.ignite.internal.processors.cache.*;
+import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.query.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
@@ -28,6 +29,7 @@ import org.apache.ignite.plugin.extensions.communication.*;
 import org.apache.ignite.spi.*;
 import org.apache.ignite.testframework.*;
 import org.apache.ignite.testframework.junits.common.*;
+import org.h2.util.*;
 import org.jetbrains.annotations.*;
 
 import java.nio.*;
@@ -134,7 +136,7 @@ public abstract class GridIndexingSpiAbstractSelfTest 
extends GridCommonAbstract
 
         map.put("txt", txt);
 
-        return new CacheObjectImpl(map, null);
+        return new TestCacheObject(map);
     }
 
     /**
@@ -149,7 +151,7 @@ public abstract class GridIndexingSpiAbstractSelfTest 
extends GridCommonAbstract
 
         map.put("sex", sex);
 
-        return new CacheObjectImpl(map, null);
+        return new TestCacheObject(map);
     }
 
     /**
@@ -268,23 +270,23 @@ public abstract class GridIndexingSpiAbstractSelfTest 
extends GridCommonAbstract
             spi.query(typeAA.space(), "from a order by age", 
Collections.emptySet(), typeAA, null);
 
         assertTrue(res.hasNext());
-        assertEquals(aa(3, "Borya", 18), value(res.next()));
+        assertEquals(aa(3, "Borya", 18).value(null, false), value(res.next()));
         assertTrue(res.hasNext());
-        assertEquals(aa(2, "Valera", 19), value(res.next()));
+        assertEquals(aa(2, "Valera", 19).value(null, false), 
value(res.next()));
         assertFalse(res.hasNext());
 
         res = spi.query(typeAB.space(), "from b order by name", 
Collections.emptySet(), typeAB, null);
 
         assertTrue(res.hasNext());
-        assertEquals(ab(1, "Vasya", 20, "Some text about Vasya goes here."), 
value(res.next()));
+        assertEquals(ab(1, "Vasya", 20, "Some text about Vasya goes 
here.").value(null, false), value(res.next()));
         assertTrue(res.hasNext());
-        assertEquals(ab(4, "Vitalya", 20, "Very Good guy"), value(res.next()));
+        assertEquals(ab(4, "Vitalya", 20, "Very Good guy").value(null, false), 
value(res.next()));
         assertFalse(res.hasNext());
 
         res = spi.query(typeBA.space(), "from a", Collections.emptySet(), 
typeBA, null);
 
         assertTrue(res.hasNext());
-        assertEquals(ba(2, "Kolya", 25, true), value(res.next()));
+        assertEquals(ba(2, "Kolya", 25, true).value(null, false), 
value(res.next()));
         assertFalse(res.hasNext());
 
         // Text queries
@@ -292,7 +294,7 @@ public abstract class GridIndexingSpiAbstractSelfTest 
extends GridCommonAbstract
             typeAB, null);
 
         assertTrue(txtRes.hasNext());
-        assertEquals(ab(4, "Vitalya", 20, "Very Good guy"), 
value(txtRes.next()));
+        assertEquals(ab(4, "Vitalya", 20, "Very Good guy").value(null, false), 
value(txtRes.next()));
         assertFalse(txtRes.hasNext());
 
         // Fields query
@@ -559,7 +561,7 @@ public abstract class GridIndexingSpiAbstractSelfTest 
extends GridCommonAbstract
 
         /** {@inheritDoc} */
         @Override public byte[] valueBytes(CacheObjectContext ctx) throws 
IgniteCheckedException {
-            throw new UnsupportedOperationException();
+            return Utils.serialize(val, null);
         }
 
         /** {@inheritDoc} */

Reply via email to