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/11/03 12:46:08 UTC
ignite git commit: IGNITE-1838: Optimizing fast-path for common types.
Repository: ignite
Updated Branches:
refs/heads/ignite-1838 [created] 4a19b5c92
IGNITE-1838: Optimizing fast-path for common types.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4a19b5c9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4a19b5c9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4a19b5c9
Branch: refs/heads/ignite-1838
Commit: 4a19b5c92846971f7ca42c4f39aeec2b32eb1af8
Parents: 845c4f2
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Tue Nov 3 14:46:38 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Nov 3 14:46:38 2015 +0300
----------------------------------------------------------------------
.../internal/portable/PortableObjectImpl.java | 91 ++++++++++++++++++--
.../portable/PortableObjectOffheapImpl.java | 86 ++++++++++++++++++
.../internal/portable/PortablePrimitives.java | 44 ++++++++++
3 files changed, 214 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/4a19b5c9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
index c7e01d7..26076ed 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
@@ -39,16 +39,28 @@ import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import java.math.BigDecimal;
+import java.math.BigInteger;
import java.nio.ByteBuffer;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.UUID;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.BOOLEAN;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.BYTE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.CHAR;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DATE;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DECIMAL;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DOUBLE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLOAT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.INT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.LONG;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.NULL;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID;
/**
* Portable object implementation.
@@ -178,13 +190,6 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
}
/**
- * @return {@code True} if detach is allowed.
- */
- public boolean detachAllowed() {
- return true;
- }
-
- /**
* @param detachAllowed Detach allowed flag.
*/
public void detachAllowed(boolean detachAllowed) {
@@ -320,6 +325,78 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
break;
+ case UUID: {
+ long most = PortablePrimitives.readLong(arr, fieldPos + 1);
+ long least = PortablePrimitives.readLong(arr, fieldPos + 1 + 8);
+
+ val = new UUID(most, least);
+
+ break;
+ }
+
+ case DATE: {
+ long time = PortablePrimitives.readLong(arr, fieldPos + 1);
+
+ val = new Date(time);
+
+ break;
+ }
+
+ case TIMESTAMP: {
+ long time = PortablePrimitives.readLong(arr, fieldPos + 1);
+ int nanos = PortablePrimitives.readInt(arr, fieldPos + 1 + 8);
+
+ Timestamp ts = new Timestamp(time);
+
+ ts.setNanos(ts.getNanos() + nanos);
+
+ val = ts;
+
+ break;
+ }
+
+ case DECIMAL: {
+ int scale = PortablePrimitives.readInt(arr, fieldPos + 1);
+
+ int dataLen = PortablePrimitives.readInt(arr, fieldPos + 5);
+ byte[] data = PortablePrimitives.readByteArray(arr, fieldPos + 9, dataLen);
+
+ BigInteger intVal = new BigInteger(data);
+
+ if (scale < 0) {
+ scale &= 0x7FFFFFFF;
+
+ intVal = intVal.negate();
+ }
+
+ val = new BigDecimal(intVal, scale);
+
+ break;
+ }
+
+ case STRING: {
+ boolean utf = PortablePrimitives.readBoolean(arr, fieldPos + 1);
+
+ if (utf) {
+ int dataLen = PortablePrimitives.readInt(arr, fieldPos + 2);
+
+ val = new String(arr, fieldPos + 6, dataLen, UTF_8);
+ }
+ else {
+ int dataLen = PortablePrimitives.readInt(arr, fieldPos + 2);
+ char[] data = PortablePrimitives.readCharArray(arr, fieldPos + 6, dataLen);
+
+ val = String.valueOf(data);
+ }
+
+ break;
+ }
+
+ case NULL:
+ val = null;
+
+ break;
+
default: {
PortableReaderExImpl reader = new PortableReaderExImpl(ctx, arr, start, null);
http://git-wip-us.apache.org/repos/asf/ignite/blob/4a19b5c9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
index 7ba5553..c098834 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
@@ -21,7 +21,13 @@ import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import java.math.BigDecimal;
+import java.math.BigInteger;
import java.nio.ByteBuffer;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.UUID;
+
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.portable.streams.PortableOffheapInputStream;
import org.apache.ignite.internal.processors.cache.CacheObject;
@@ -37,14 +43,21 @@ import org.apache.ignite.portable.PortableObject;
import org.jetbrains.annotations.Nullable;
import sun.misc.Unsafe;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.BOOLEAN;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.BYTE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.CHAR;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DATE;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DECIMAL;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DOUBLE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLOAT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.INT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.LONG;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.NULL;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID;
/**
* Portable object implementation over offheap memory
@@ -252,6 +265,79 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
break;
+ case UUID: {
+ long most = PortablePrimitives.readLong(ptr, fieldPos + 1);
+ long least = PortablePrimitives.readLong(ptr, fieldPos + 1 + 8);
+
+ val = new UUID(most, least);
+
+ break;
+ }
+
+ case DATE: {
+ long time = PortablePrimitives.readLong(ptr, fieldPos + 1);
+
+ val = new Date(time);
+
+ break;
+ }
+
+ case TIMESTAMP: {
+ long time = PortablePrimitives.readLong(ptr, fieldPos + 1);
+ int nanos = PortablePrimitives.readInt(ptr, fieldPos + 1 + 8);
+
+ Timestamp ts = new Timestamp(time);
+
+ ts.setNanos(ts.getNanos() + nanos);
+
+ val = ts;
+
+ break;
+ }
+
+ case DECIMAL: {
+ int scale = PortablePrimitives.readInt(ptr, fieldPos + 1);
+
+ int dataLen = PortablePrimitives.readInt(ptr, fieldPos + 5);
+ byte[] data = PortablePrimitives.readByteArray(ptr, fieldPos + 9, dataLen);
+
+ BigInteger intVal = new BigInteger(data);
+
+ if (scale < 0) {
+ scale &= 0x7FFFFFFF;
+
+ intVal = intVal.negate();
+ }
+
+ val = new BigDecimal(intVal, scale);
+
+ break;
+ }
+
+ case STRING: {
+ boolean utf = PortablePrimitives.readBoolean(ptr, fieldPos + 1);
+
+ if (utf) {
+ int dataLen = PortablePrimitives.readInt(ptr, fieldPos + 2);
+ byte[] data = PortablePrimitives.readByteArray(ptr, fieldPos + 6, dataLen);
+
+ val = new String(data, UTF_8);
+ }
+ else {
+ int dataLen = PortablePrimitives.readInt(ptr, fieldPos + 2);
+ char[] data = PortablePrimitives.readCharArray(ptr, fieldPos + 6, dataLen);
+
+ val = String.valueOf(data);
+ }
+
+ break;
+ }
+
+ case NULL:
+ val = null;
+
+ break;
+
default: {
PortableReaderExImpl reader = new PortableReaderExImpl(ctx,
new PortableOffheapInputStream(ptr, size, false),
http://git-wip-us.apache.org/repos/asf/ignite/blob/4a19b5c9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
index d5a78bc..02f552a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
@@ -68,6 +68,32 @@ public abstract class PortablePrimitives {
/**
* @param arr Array.
* @param off Offset.
+ * @return Value.
+ */
+ public static byte[] readByteArray(byte[] arr, int off, int len) {
+ byte[] arr0 = new byte[len];
+
+ UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, BYTE_ARR_OFF, len);
+
+ return arr0;
+ }
+
+ /**
+ * @param ptr Pointer.
+ * @param off Offset.
+ * @return Value.
+ */
+ public static byte[] readByteArray(long ptr, int off, int len) {
+ byte[] arr0 = new byte[len];
+
+ UNSAFE.copyMemory(null, ptr + off, arr0, BYTE_ARR_OFF, len);
+
+ return arr0;
+ }
+
+ /**
+ * @param arr Array.
+ * @param off Offset.
* @param val Value.
*/
public static void writeBoolean(byte[] arr, int off, boolean val) {
@@ -191,6 +217,24 @@ public abstract class PortablePrimitives {
}
/**
+ * @param ptr Pointer.
+ * @param off Offset.
+ * @return Value.
+ */
+ public static char[] readCharArray(long ptr, int off, int len) {
+ char[] arr0 = new char[len];
+
+ UNSAFE.copyMemory(null, ptr + off, arr0, CHAR_ARR_OFF, len << 1);
+
+ if (BIG_ENDIAN) {
+ for (int i = 0; i < len; i++)
+ arr0[i] = Character.reverseBytes(arr0[i]);
+ }
+
+ return arr0;
+ }
+
+ /**
* @param arr Array.
* @param off Offset.
* @param val Value.