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;