You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/02/08 16:51:55 UTC

ignite git commit: sql-store Compare values without unmarshalling.

Repository: ignite
Updated Branches:
  refs/heads/sql-store-cmp 0707e3843 -> db664f038


sql-store Compare values without unmarshalling.


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

Branch: refs/heads/sql-store-cmp
Commit: db664f038d5ff1115794e1918613af83efb58352
Parents: 0707e38
Author: sboikov <sb...@gridgain.com>
Authored: Mon Feb 8 18:51:42 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Feb 8 18:51:42 2016 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/binary/BinaryField.java   | 10 ++-
 .../ignite/internal/binary/BinaryFieldImpl.java | 23 ++++---
 .../internal/binary/BinaryObjectExImpl.java     | 12 +++-
 .../internal/binary/BinaryObjectImpl.java       | 34 +++++-----
 .../binary/BinaryObjectOffheapImpl.java         | 34 ++++++----
 .../processors/query/GridQueryProcessor.java    | 65 +++++++++++++++++---
 .../processors/query/GridQueryProperty.java     | 15 ++++-
 .../h2/GridIndexingSpiAbstractSelfTest.java     |  6 +-
 8 files changed, 150 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
index b85caed..3094b85 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
@@ -47,7 +47,13 @@ public interface BinaryField {
     /**
      * @param addr Marshalled object address.
      * @param len Marshalled data length.
-     * @return Field address.
+     * @return Field offset.
      */
-    public long fieldAddress(long addr, int len);
+    public int fieldOffset(long addr, int len);
+
+    /**
+     * @param obj Object.
+     * @return Field offset.
+     */
+    public int fieldOffset(BinaryObject obj);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
index abbc42f..e8587f3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
@@ -105,7 +105,16 @@ public class BinaryFieldImpl implements BinaryFieldEx {
     }
 
     /** {@inheritDoc} */
-    @Override public long fieldAddress(long addr, int len) {
+    @Override public int fieldOffset(BinaryObject obj) {
+        BinaryObjectExImpl obj0 = (BinaryObjectExImpl)obj;
+
+        int order = fieldOrder(obj0);
+
+        return order != BinarySchema.ORDER_NOT_FOUND ? obj0.fieldOffsetByOrder(order) : -1;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int fieldOffset(long addr, int len) {
         int typeId = GridUnsafe.getInt(addr + GridBinaryMarshaller.TYPE_ID_POS);
 
         if (typeId != this.typeId) {
@@ -133,7 +142,7 @@ public class BinaryFieldImpl implements BinaryFieldEx {
         int order = schema.order(fieldId);
 
         if (order == BinarySchema.ORDER_NOT_FOUND)
-            return -1L;
+            return -1;
 
         int schemaOff = BinaryPrimitives.readInt(addr, GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
@@ -144,16 +153,16 @@ public class BinaryFieldImpl implements BinaryFieldEx {
 
         int fieldOffPos = schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
 
-        int fieldPos;
+        int fieldOff;
 
         if (fieldOffLen == BinaryUtils.OFFSET_1)
-            fieldPos = ((int)BinaryPrimitives.readByte(addr, fieldOffPos) & 0xFF);
+            fieldOff = ((int)BinaryPrimitives.readByte(addr, fieldOffPos) & 0xFF);
         else if (fieldOffLen == BinaryUtils.OFFSET_2)
-            fieldPos = ((int)BinaryPrimitives.readShort(addr, fieldOffPos) & 0xFFFF);
+            fieldOff = ((int)BinaryPrimitives.readShort(addr, fieldOffPos) & 0xFFFF);
         else
-            fieldPos = BinaryPrimitives.readInt(addr, fieldOffPos);
+            fieldOff = BinaryPrimitives.readInt(addr, fieldOffPos);
 
-        return addr + fieldPos;
+        return fieldOff;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
index 4ea5935..c80ed9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
@@ -75,12 +75,18 @@ public abstract class BinaryObjectExImpl implements BinaryObjectEx {
     }
 
     /**
-     * Get field by offset.
+     * @param order Field order.
+     * @return Field offset.
+     */
+    protected abstract int fieldOffsetByOrder(int order);
+
+    /**
+     * Get field by order.
      *
-     * @param fieldOffset Field offset.
+     * @param order Field order.
      * @return Field value.
      */
-    @Nullable protected abstract <F> F fieldByOrder(int fieldOffset);
+    @Nullable protected abstract <F> F fieldByOrder(int order);
 
     /**
      * Writes field value defined by the given field offset to the given byte buffer.

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
index 1afbeb9..8512b8f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
@@ -265,28 +265,34 @@ public final class BinaryObjectImpl extends BinaryObjectExImpl implements Extern
     }
 
     /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    @Nullable @Override protected <F> F fieldByOrder(int order) {
-        Object val;
-
-        // Calculate field position.
-        int schemaOffset = BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+    @Override protected int fieldOffsetByOrder(int order) {
+        int schemaOff = BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
         short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS);
 
         int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN;
-        int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
 
-        int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen;
+        int fieldOffPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
 
-        int fieldPos;
+        int fieldOff;
 
-        if (fieldOffsetLen == BinaryUtils.OFFSET_1)
-            fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF);
-        else if (fieldOffsetLen == BinaryUtils.OFFSET_2)
-            fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF);
+        if (fieldOffLen == BinaryUtils.OFFSET_1)
+            fieldOff = ((int)BinaryPrimitives.readByte(arr, fieldOffPos) & 0xFF);
+        else if (fieldOffLen == BinaryUtils.OFFSET_2)
+            fieldOff = ((int)BinaryPrimitives.readShort(arr, fieldOffPos) & 0xFFFF);
         else
-            fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos);
+            fieldOff = BinaryPrimitives.readInt(arr, fieldOffPos);
+
+        return fieldOff;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Nullable @Override protected <F> F fieldByOrder(int order) {
+        Object val;
+
+        int fieldPos = start + fieldOffsetByOrder(order);
 
         // Read header and try performing fast lookup for well-known types (the most common types go first).
         byte hdr = BinaryPrimitives.readByte(arr, fieldPos);

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
index c93e5d8..f892921 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
@@ -124,6 +124,7 @@ public class BinaryObjectOffheapImpl extends BinaryObjectExImpl implements Exter
         return null;
     }
 
+    /** {@inheritDoc} */
     @Override public boolean putValue(ByteBuffer buf, CacheObjectContext ctx) throws IgniteCheckedException {
         throw new UnsupportedOperationException("TODO implement");
     }
@@ -164,28 +165,35 @@ public class BinaryObjectOffheapImpl extends BinaryObjectExImpl implements Exter
     }
 
     /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    @Nullable @Override protected <F> F fieldByOrder(int order) {
-        Object val;
-
+    @Override protected int fieldOffsetByOrder(int order) {
         // Calculate field position.
-        int schemaOffset = BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+        int schemaOff = BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
         short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS);
 
         int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN;
-        int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
 
-        int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen;
+        int fieldOffPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
 
-        int fieldPos;
+        int fieldOff;
 
-        if (fieldOffsetLen == BinaryUtils.OFFSET_1)
-            fieldPos = start + ((int)BinaryPrimitives.readByte(ptr, fieldOffsetPos) & 0xFF);
-        else if (fieldOffsetLen == BinaryUtils.OFFSET_2)
-            fieldPos = start + ((int)BinaryPrimitives.readShort(ptr, fieldOffsetPos) & 0xFFFF);
+        if (fieldOffLen == BinaryUtils.OFFSET_1)
+            fieldOff = ((int)BinaryPrimitives.readByte(ptr, fieldOffPos) & 0xFF);
+        else if (fieldOffLen == BinaryUtils.OFFSET_2)
+            fieldOff = ((int)BinaryPrimitives.readShort(ptr, fieldOffPos) & 0xFFFF);
         else
-            fieldPos = start + BinaryPrimitives.readInt(ptr, fieldOffsetPos);
+            fieldOff = BinaryPrimitives.readInt(ptr, fieldOffPos);
+
+        return fieldOff;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Nullable @Override protected <F> F fieldByOrder(int order) {
+        Object val;
+
+        int fieldPos = start + fieldOffsetByOrder(order);
 
         // Read header and try performing fast lookup for well-known types (the most common types go first).
         byte hdr = BinaryPrimitives.readByte(ptr, fieldPos);

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index e6461f7..5c40e4c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -1886,13 +1886,18 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         }
 
         /** {@inheritDoc} */
-        @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) {
+        @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) {
+            throw new UnsupportedOperationException();
+        }
+
+        /** {@inheritDoc} */
+        @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
             throw new UnsupportedOperationException();
         }
 
         /** {@inheritDoc} */
         @Override public boolean keyProperty() {
-            return false;
+            return key;
         }
 
         /** {@inheritDoc} */
@@ -2020,7 +2025,53 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         }
 
         /** {@inheritDoc} */
-        @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException {
+        @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
+            if (parent != null)
+                return parent.propertyOffset(key, val);
+
+            if (binaryCtx == null)
+                throw new UnsupportedOperationException("BinaryObjects are not enabled.");
+
+            Object obj;
+
+            int isKeyProp0 = isKeyProp;
+
+            if (isKeyProp0 == 0) {
+                // Key is allowed to be a non-binary object here.
+                // We check key before value consistently with ClassProperty.
+                if (key instanceof BinaryObject && ((BinaryObject)key).hasField(propName))
+                    isKeyProp = isKeyProp0 = 1;
+                else if (val instanceof BinaryObject && ((BinaryObject)val).hasField(propName))
+                    isKeyProp = isKeyProp0 = -1;
+                else {
+                    U.warn(log, "Neither key nor value have property " +
+                        "[propName=" + propName + ", key=" + key + ", val=" + val + "]");
+
+                    return -1;
+                }
+            }
+
+            obj = isKeyProp0 == 1 ? key : val;
+
+            assert obj instanceof BinaryObject : obj;
+
+            BinaryObject obj0 = (BinaryObject)obj;
+
+            BinaryField field = binaryField(obj0);
+
+            if (field != null)
+                return field.fieldOffset(obj0);
+
+            // TODO: try to get address from object.
+
+            return -1;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException {
+            if (parent != null)
+                return parent.propertyOffset(keyAddr, keyLen, valAddr, valLen);
+
             if (binaryCtx == null)
                 throw new UnsupportedOperationException("BinaryObjects are not enabled.");
 
@@ -2036,7 +2087,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
                 else {
                     U.warn(log, "Neither key nor value have property [propName=" + propName + "]");
 
-                    return -1L;
+                    return -1;
                 }
             }
 
@@ -2055,11 +2106,11 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             BinaryField field = binaryField(addr);
 
             if (field != null)
-                return field.fieldAddress(addr, len);
+                return field.fieldOffset(addr, len);
 
-            // TODO: try to get address from object.
+            // TODO: try to get offset from object.
 
-            return -1L;
+            return -1;
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
index 6e600a1..0accb5d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.query;
 
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.processors.cache.CacheObject;
 
 /**
  * Description and access method for query entity field.
@@ -45,11 +46,21 @@ public abstract class GridQueryProperty {
 
     /**
      * @param keyAddr Marshaled key address.
+     * @param keyLen Marshaled key length.
      * @param valAddr Marshalled value address.
-     * @return Value address of -1 if property not found.
+     * @param valLen Marshalled value length.
+     * @return Value address or -1 if property not found.
      * @throws IgniteCheckedException If failed.
      */
-    public abstract long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException;
+    public abstract int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException;
+
+    /**
+     * @param key Key.
+     * @param val Value.
+     * @return Property offset or -1 if property not found.
+     * @throws IgniteCheckedException If failed.
+     */
+    public abstract int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException;
 
     /**
      * @return {@code True} if property belongs to cache key.

http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/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 0040cb6..f014f54 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
@@ -522,7 +522,11 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
                     return Object.class;
                 }
 
-                @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) {
+                @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) {
+                    throw new UnsupportedOperationException();
+                }
+
+                @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
                     throw new UnsupportedOperationException();
                 }