You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/10/27 10:00:57 UTC

[02/10] ignite git commit: IGNITE-1770: WIP on using new search algo (builder)

IGNITE-1770: WIP on using new search algo (builder)


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

Branch: refs/heads/ignite-1770
Commit: 6d1df79d3950b098e23e411785c31490de0cf3f9
Parents: 6cb5be4
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Oct 27 11:30:46 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Oct 27 11:30:46 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableReaderExImpl.java |  2 +-
 .../ignite/internal/portable/PortableUtils.java | 11 +++++++
 .../portable/builder/PortableBuilderImpl.java   | 33 ++++++++++++++------
 3 files changed, 35 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6d1df79d/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
index d0424b2..0b36d16 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
@@ -211,7 +211,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         typeId = in.readIntPositioned(start + GridPortableMarshaller.TYPE_ID_POS);
 
         footerStart = PortableUtils.footerStart(in, start);
-        footerEnd = in.readIntPositioned(start + GridPortableMarshaller.TOTAL_LEN_POS);
+        footerEnd = PortableUtils.length(in, start);
 
         // Take in count possible raw offset.
         if ((((footerEnd - footerStart) >> 2) & 0x1) == 0x1)

http://git-wip-us.apache.org/repos/asf/ignite/blob/6d1df79d/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index 26d4b0b..48f814d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -557,6 +557,17 @@ public class PortableUtils {
     }
 
     /**
+     * Get portable object length.
+     *
+     * @param in Input stream.
+     * @param start Start position.
+     * @return Length.
+     */
+    public static int length(PortablePositionReadable in, int start) {
+        return in.readIntPositioned(start + GridPortableMarshaller.TOTAL_LEN_POS);
+    }
+
+    /**
      * Get footer start of the object.
      *
      * @param in Input stream.

http://git-wip-us.apache.org/repos/asf/ignite/blob/6d1df79d/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
index 0b02286..4010415 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
@@ -394,23 +394,36 @@ public class PortableBuilderImpl implements PortableBuilder {
         if (readCache == null) {
             Map<Integer, Object> readCache = new HashMap<>();
 
-            int pos = start + hdrLen;
-            int end = start + PortableUtils.rawOffset(reader, start);
+            int rawPos = start + PortableUtils.rawOffset(reader, start);
+            int footerPos = start + PortableUtils.footerStart(reader, start);
+            int footerEnd = start + PortableUtils.length(reader, start);
 
-            while (pos < end) {
-                int fieldId = reader.readIntPositioned(pos);
+            if ((((footerEnd - footerPos) >> 2) & 0x1) == 0x1)
+                footerEnd -= 4;
 
-                pos += 4;
+            while (footerPos < footerEnd) {
+                int fieldId = reader.readIntPositioned(footerPos);
+                int fieldOffset = reader.readIntPositioned(footerPos + 4);
+                int fieldPos = start + fieldOffset + 8; // TODO: 8 is to be removed.
 
-                int len = reader.readIntPositioned(pos);
+                footerPos += 8;
 
-                pos += 4;
+                // Get field length.
+                int len;
 
-                Object val = reader.getValueQuickly(pos, len);
+                if (footerPos == footerEnd)
+                    // This is the last field, compare to raw offset.
+                    len = rawPos - fieldPos;
+                else {
+                    // Field is somewhere in the middle, get difference with the next offset.
+                    int nextFieldOffset = reader.readIntPositioned(footerPos + 4);
 
-                readCache.put(fieldId, val);
+                    len = nextFieldOffset - fieldOffset - 8; // TODO: 8 is to be removed.
+                }
 
-                pos += len;
+                Object val = reader.getValueQuickly(fieldPos, len);
+
+                readCache.put(fieldId, val);
             }
 
             this.readCache = readCache;