ignite-757 - direct marshalling for H2 types

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

Branch: refs/heads/ignite-286
Commit: 351001bdc6941f03560e2f269b1a47ab84c8f7a2
Parents: 59ec2f9
Author: S.Vladykin <svlady...@gridgain.com>
Authored: Mon Apr 27 03:22:35 2015 +0300
Committer: S.Vladykin <svlady...@gridgain.com>
Committed: Mon Apr 27 03:22:35 2015 +0300

----------------------------------------------------------------------
 .../ignite/codegen/MessageCodeGenerator.java    |  25 ++-
 .../ignite/internal/GridDirectCollection.java   |   3 +
 .../managers/communication/GridIoManager.java   |  23 ++-
 .../communication/GridIoMessageFactory.java     |   8 +
 .../cache/query/GridCacheSqlQuery.java          | 135 ++++++++++++--
 .../cache/query/GridCacheTwoStepQuery.java      |   8 +-
 .../processors/query/GridQueryIndexing.java     |   8 +
 .../processors/query/GridQueryProcessor.java    |   9 +
 .../messages/GridQueryNextPageResponse.java     |  68 ++++---
 .../h2/twostep/messages/GridQueryRequest.java   |  21 +--
 .../processors/query/h2/IgniteH2Indexing.java   | 152 +---------------
 .../query/h2/opt/GridH2ValueCacheObject.java    | 160 +++++++++++++++++
 .../query/h2/twostep/GridMapQueryExecutor.java  |  21 ++-
 .../query/h2/twostep/GridMergeIndex.java        |   2 +-
 .../h2/twostep/GridMergeIndexUnsorted.java      |   4 +-
 .../h2/twostep/GridReduceQueryExecutor.java     |  11 +-
 .../query/h2/twostep/GridResultPage.java        |  69 ++++++-
 .../query/h2/twostep/msg/GridH2Array.java       | 106 +++++++++++
 .../query/h2/twostep/msg/GridH2Boolean.java     |  94 ++++++++++
 .../query/h2/twostep/msg/GridH2Byte.java        |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Bytes.java       |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Date.java        |  97 ++++++++++
 .../query/h2/twostep/msg/GridH2Decimal.java     |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Double.java      |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Float.java       |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Geometry.java    | 116 ++++++++++++
 .../query/h2/twostep/msg/GridH2Integer.java     |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2JavaObject.java  |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Long.java        |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2Null.java        |  66 +++++++
 .../query/h2/twostep/msg/GridH2Short.java       |  95 ++++++++++
 .../query/h2/twostep/msg/GridH2String.java      |  97 ++++++++++
 .../query/h2/twostep/msg/GridH2Time.java        |  98 ++++++++++
 .../query/h2/twostep/msg/GridH2Timestamp.java   | 115 ++++++++++++
 .../query/h2/twostep/msg/GridH2Uuid.java        | 115 ++++++++++++
 .../h2/twostep/msg/GridH2ValueMessage.java      |  28 +++
 .../twostep/msg/GridH2ValueMessageFactory.java  | 179 +++++++++++++++++++
 37 files changed, 2472 insertions(+), 221 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
----------------------------------------------------------------------
diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
 
b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
index f75bcf4..eef4dd6 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.codegen;
 
 import org.apache.ignite.internal.*;
-import org.apache.ignite.internal.processors.datastreamer.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.lang.*;
 import org.apache.ignite.plugin.extensions.communication.*;
@@ -46,6 +45,9 @@ public class MessageCodeGenerator {
     private static final String DFLT_SRC_DIR = U.getIgniteHome() + 
"/modules/core/src/main/java";
 
     /** */
+    private static final String INDEXING_SRC_DIR = U.getIgniteHome() + 
"/modules/indexing/src/main/java";
+
+    /** */
     private static final Class<?> BASE_CLS = Message.class;
 
     /** */
@@ -140,7 +142,7 @@ public class MessageCodeGenerator {
 
         MessageCodeGenerator gen = new MessageCodeGenerator(srcDir);
 
-        gen.generateAndWrite(DataStreamerEntry.class);
+//        gen.generateAndWrite(DataStreamerEntry.class);
 
 //        gen.generateAndWrite(GridDistributedLockRequest.class);
 //        gen.generateAndWrite(GridDistributedLockResponse.class);
@@ -172,6 +174,25 @@ public class MessageCodeGenerator {
 //        gen.generateAndWrite(GridQueryNextPageResponse.class);
 //        gen.generateAndWrite(GridQueryRequest.class);
 //        gen.generateAndWrite(GridCacheSqlQuery.class);
+
+//        gen.generateAndWrite(GridH2Null.class);
+//        gen.generateAndWrite(GridH2Boolean.class);
+//        gen.generateAndWrite(GridH2Byte.class);
+//        gen.generateAndWrite(GridH2Short.class);
+//        gen.generateAndWrite(GridH2Integer.class);
+//        gen.generateAndWrite(GridH2Long.class);
+//        gen.generateAndWrite(GridH2Decimal.class);
+//        gen.generateAndWrite(GridH2Double.class);
+//        gen.generateAndWrite(GridH2Float.class);
+//        gen.generateAndWrite(GridH2Time.class);
+//        gen.generateAndWrite(GridH2Date.class);
+//        gen.generateAndWrite(GridH2Timestamp.class);
+//        gen.generateAndWrite(GridH2Bytes.class);
+//        gen.generateAndWrite(GridH2String.class);
+//        gen.generateAndWrite(GridH2Array.class);
+//        gen.generateAndWrite(GridH2JavaObject.class);
+//        gen.generateAndWrite(GridH2Uuid.class);
+//        gen.generateAndWrite(GridH2Geometry.class);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java
index 61144d6..58c1c29 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/GridDirectCollection.java
@@ -17,10 +17,13 @@
 
 package org.apache.ignite.internal;
 
+import org.apache.ignite.plugin.extensions.communication.*;
+
 import java.lang.annotation.*;
 
 /**
  * Annotates iterable fields.
+ * Note that for any {@link Message} implementations it is enough to set item 
type to {@code Message.class}.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.FIELD)

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index c2df045..dba043a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -55,6 +55,9 @@ import static 
org.jsr166.ConcurrentLinkedHashMap.QueuePolicy.*;
  * Grid communication manager.
  */
 public class GridIoManager extends 
GridManagerAdapter<CommunicationSpi<Serializable>> {
+    /** Empty array of message factories. */
+    public static final MessageFactory[] EMPTY = {};
+
     /** Max closed topics to store. */
     public static final int MAX_CLOSED_TOPICS = 10240;
 
@@ -224,7 +227,25 @@ public class GridIoManager extends 
GridManagerAdapter<CommunicationSpi<Serializa
             };
         }
 
-        msgFactory = new 
GridIoMessageFactory(ctx.plugins().extensions(MessageFactory.class));
+        MessageFactory[] msgs = ctx.plugins().extensions(MessageFactory.class);
+
+        if (msgs == null)
+            msgs = EMPTY;
+
+        MessageFactory qryMsgs = null;
+
+        try {
+            qryMsgs = U.newInstance( // TODO fix this dirty hack
+                
"org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory");
+        }
+        catch (IgniteCheckedException e) {
+            // No-op.
+        }
+
+        if (qryMsgs != null)
+            msgs = F.concat(msgs, qryMsgs);
+
+        msgFactory = new GridIoMessageFactory(msgs);
 
         if (log.isDebugEnabled())
             log.debug(startInfo());

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
index b82147b..5b7d84d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
@@ -595,6 +595,14 @@ public class GridIoMessageFactory implements 
MessageFactory {
 
                 break;
 
+            case 112:
+                msg = new GridCacheSqlQuery();
+
+                break;
+
+            // [-3..112] - this
+            // [120..123] - DR
+            // [-4..-21] - SQL
             default:
                 if (ext != null) {
                     for (MessageFactory factory : ext) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
index 2ee690a..0c1c822 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
@@ -17,16 +17,20 @@
 
 package org.apache.ignite.internal.processors.cache.query;
 
+import org.apache.ignite.*;
+import org.apache.ignite.internal.*;
 import org.apache.ignite.internal.util.tostring.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.marshaller.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 
-import java.io.*;
+import java.nio.*;
 
 /**
  * Query.
  */
-public class GridCacheSqlQuery implements Externalizable {
+public class GridCacheSqlQuery implements Message {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -34,18 +38,22 @@ public class GridCacheSqlQuery implements Externalizable {
     public static final Object[] EMPTY_PARAMS = {};
 
     /** */
-    String alias;
+    private String alias;
 
     /** */
     @GridToStringInclude
-    String qry;
+    private String qry;
 
     /** */
     @GridToStringInclude
-    Object[] params;
+    @GridDirectTransient
+    private Object[] params;
+
+    /** */
+    private byte[] paramsBytes;
 
     /**
-     * For {@link Externalizable}.
+     * For {@link Message}.
      */
     public GridCacheSqlQuery() {
         // No-op.
@@ -86,25 +94,116 @@ public class GridCacheSqlQuery implements Externalizable {
         return params;
     }
 
-    /** {@inheritDoc} */
-    @Override public void writeExternal(ObjectOutput out) throws IOException {
-        U.writeString(out, alias);
-        U.writeString(out, qry);
-        U.writeArray(out, params);
+    /**
+     * @param m Marshaller.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void marshallParams(Marshaller m) throws IgniteCheckedException {
+        if (paramsBytes != null)
+            return;
+
+        assert params != null;
+
+        paramsBytes = m.marshal(params);
     }
 
-    /** {@inheritDoc} */
-    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
-        alias = U.readString(in);
-        qry = U.readString(in);
-        params = U.readArray(in);
+    /**
+     * @param m Marshaller.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void unmarshallParams(Marshaller m) throws IgniteCheckedException {
+        if (params != null)
+            return;
+
+        assert paramsBytes != null;
 
-        if (F.isEmpty(params))
-            params = EMPTY_PARAMS;
+        params = m.unmarshal(paramsBytes, null);
     }
 
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridCacheSqlQuery.class, this);
     }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeString("alias", alias))
+                    return false;
+
+                writer.incrementState();
+
+            case 1:
+                if (!writer.writeByteArray("paramsBytes", paramsBytes))
+                    return false;
+
+                writer.incrementState();
+
+            case 2:
+                if (!writer.writeString("qry", qry))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                alias = reader.readString("alias");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+            case 1:
+                paramsBytes = reader.readByteArray("paramsBytes");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+            case 2:
+                qry = reader.readString("qry");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return 112;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 3;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
index 11b2057..ce12a85 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
@@ -23,16 +23,12 @@ import org.apache.ignite.internal.util.tostring.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
 
-import java.io.*;
 import java.util.*;
 
 /**
  * Two step map-reduce style query.
  */
-public class GridCacheTwoStepQuery implements Serializable {
-    /** */
-    private static final long serialVersionUID = 0L;
-
+public class GridCacheTwoStepQuery {
     /** */
     public static final int DFLT_PAGE_SIZE = 1000;
 
@@ -95,7 +91,7 @@ public class GridCacheTwoStepQuery implements Serializable {
      * @return Map queries.
      */
     public Collection<GridCacheSqlQuery> mapQueries() {
-        return new ArrayList<>(mapQrys.values()); // Copy to make it 
Serializable.
+        return mapQrys.values();
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
index fb8d35c..b1c3970 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
@@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.cache.query.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.lang.*;
 import org.apache.ignite.lang.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 import org.apache.ignite.spi.indexing.*;
 import org.jetbrains.annotations.*;
 
@@ -224,4 +225,11 @@ public interface GridQueryIndexing {
      * @return Backup filter.
      */
     public IndexingQueryFilter backupFilter();
+
+    /**
+     * Gets message factory.
+     *
+     * @return Message factory.
+     */
+    public MessageFactory messageFactory();
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/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 5111b99..7a3cb68 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
@@ -24,6 +24,7 @@ import org.apache.ignite.cache.query.annotations.*;
 import org.apache.ignite.configuration.*;
 import org.apache.ignite.events.*;
 import org.apache.ignite.internal.*;
+import org.apache.ignite.internal.managers.communication.*;
 import org.apache.ignite.internal.processors.*;
 import org.apache.ignite.internal.processors.cache.*;
 import org.apache.ignite.internal.processors.cache.query.*;
@@ -35,6 +36,7 @@ import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.internal.util.worker.*;
 import org.apache.ignite.lang.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 import org.apache.ignite.spi.indexing.*;
 import org.jetbrains.annotations.*;
 import org.jsr166.*;
@@ -650,6 +652,13 @@ public class GridQueryProcessor extends 
GridProcessorAdapter {
     }
 
     /**
+     * @return Message factory for {@link GridIoManager}.
+     */
+    public MessageFactory messageFactory() {
+        return idx == null ? null : idx.messageFactory();
+    }
+
+    /**
      * Closeable iterator.
      */
     private static interface ClIter<X> extends AutoCloseable, Iterator<X> {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
index b7b6f4c..4fdc027 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
@@ -23,6 +23,7 @@ import org.apache.ignite.plugin.extensions.communication.*;
 
 import java.io.*;
 import java.nio.*;
+import java.util.*;
 
 /**
  * Next page response.
@@ -44,11 +45,15 @@ public class GridQueryNextPageResponse implements Message {
     private int allRows;
 
     /** */
-    private byte[] rows;
+    private int cols;
+
+    /** */
+    @GridDirectCollection(Message.class)
+    private Collection<Message> vals;
 
     /** */
     @GridDirectTransient
-    private transient Object plainRows;
+    private transient Collection<?> plainRows;
 
     /**
      * For {@link Externalizable}.
@@ -62,18 +67,21 @@ public class GridQueryNextPageResponse implements Message {
      * @param qry Query.
      * @param page Page.
      * @param allRows All rows count.
-     * @param rows Rows.
+     * @param cols Number of columns in row.
+     * @param vals Values for rows in this page added sequentially.
      * @param plainRows Not marshalled rows for local node.
      */
-    public GridQueryNextPageResponse(long qryReqId, int qry, int page, int 
allRows,
-        byte[] rows, Object plainRows) {
-        assert rows != null ^ plainRows != null;
+    public GridQueryNextPageResponse(long qryReqId, int qry, int page, int 
allRows, int cols,
+        Collection<Message> vals, Collection<?> plainRows) {
+        assert vals != null ^ plainRows != null;
+        assert cols > 0 : cols;
 
         this.qryReqId = qryReqId;
         this.qry = qry;
         this.page = page;
         this.allRows = allRows;
-        this.rows = rows;
+        this.cols = cols;
+        this.vals = vals;
         this.plainRows = plainRows;
     }
 
@@ -106,16 +114,23 @@ public class GridQueryNextPageResponse implements Message 
{
     }
 
     /**
-     * @return Rows.
+     * @return Columns in row.
      */
-    public byte[] rows() {
-        return rows;
+    public int columns() {
+        return cols;
+    }
+
+    /**
+     * @return Values.
+     */
+    public Collection<Message> values() {
+        return vals;
     }
 
     /**
      * @return Plain rows.
      */
-    public Object plainRows() {
+    public Collection<?> plainRows() {
         return plainRows;
     }
 
@@ -143,29 +158,34 @@ public class GridQueryNextPageResponse implements Message 
{
                 writer.incrementState();
 
             case 1:
-                if (!writer.writeInt("page", page))
+                if (!writer.writeInt("cols", cols))
                     return false;
 
                 writer.incrementState();
 
             case 2:
-                if (!writer.writeInt("qry", qry))
+                if (!writer.writeInt("page", page))
                     return false;
 
                 writer.incrementState();
 
             case 3:
-                if (!writer.writeLong("qryReqId", qryReqId))
+                if (!writer.writeInt("qry", qry))
                     return false;
 
                 writer.incrementState();
 
             case 4:
-                if (!writer.writeByteArray("rows", rows))
+                if (!writer.writeLong("qryReqId", qryReqId))
                     return false;
 
                 writer.incrementState();
 
+            case 5:
+                if (!writer.writeCollection("vals", vals, 
MessageCollectionItemType.MSG))
+                    return false;
+
+                writer.incrementState();
         }
 
         return true;
@@ -188,7 +208,7 @@ public class GridQueryNextPageResponse implements Message {
                 reader.incrementState();
 
             case 1:
-                page = reader.readInt("page");
+                cols = reader.readInt("cols");
 
                 if (!reader.isLastRead())
                     return false;
@@ -196,7 +216,7 @@ public class GridQueryNextPageResponse implements Message {
                 reader.incrementState();
 
             case 2:
-                qry = reader.readInt("qry");
+                page = reader.readInt("page");
 
                 if (!reader.isLastRead())
                     return false;
@@ -204,7 +224,7 @@ public class GridQueryNextPageResponse implements Message {
                 reader.incrementState();
 
             case 3:
-                qryReqId = reader.readLong("qryReqId");
+                qry = reader.readInt("qry");
 
                 if (!reader.isLastRead())
                     return false;
@@ -212,7 +232,15 @@ public class GridQueryNextPageResponse implements Message {
                 reader.incrementState();
 
             case 4:
-                rows = reader.readByteArray("rows");
+                qryReqId = reader.readLong("qryReqId");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+            case 5:
+                vals = reader.readCollection("vals", 
MessageCollectionItemType.MSG);
 
                 if (!reader.isLastRead())
                     return false;
@@ -231,6 +259,6 @@ public class GridQueryNextPageResponse implements Message {
 
     /** {@inheritDoc} */
     @Override public byte fieldsCount() {
-        return 5;
+        return 6;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java
index b4c6668..3d3bcf9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.*;
 import org.apache.ignite.internal.processors.cache.query.*;
 import org.apache.ignite.internal.util.tostring.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
-import org.apache.ignite.marshaller.*;
 import org.apache.ignite.plugin.extensions.communication.*;
 
 import java.nio.*;
@@ -46,12 +45,9 @@ public class GridQueryRequest implements Message {
 
     /** */
     @GridToStringInclude
-    @GridDirectTransient
+    @GridDirectCollection(GridCacheSqlQuery.class)
     private Collection<GridCacheSqlQuery> qrys;
 
-    /** */
-    private byte[] qrysBytes;
-
     /**
      * Default constructor.
      */
@@ -64,17 +60,13 @@ public class GridQueryRequest implements Message {
      * @param pageSize Page size.
      * @param space Space.
      * @param qrys Queries.
-     * @param qrysBytes Marshalled queries.
      */
-    public GridQueryRequest(long reqId, int pageSize, String space, 
Collection<GridCacheSqlQuery> qrys, byte[] qrysBytes) {
+    public GridQueryRequest(long reqId, int pageSize, String space, 
Collection<GridCacheSqlQuery> qrys) {
         this.reqId = reqId;
         this.pageSize = pageSize;
         this.space = space;
 
-        assert qrysBytes != null;
-
         this.qrys = qrys;
-        this.qrysBytes = qrysBytes;
     }
 
     /**
@@ -101,10 +93,7 @@ public class GridQueryRequest implements Message {
     /**
      * @return Queries.
      */
-    public Collection<GridCacheSqlQuery> queries(Marshaller m) throws 
IgniteCheckedException {
-        if (qrys == null && qrysBytes != null)
-            qrys = m.unmarshal(qrysBytes, null);
-
+    public Collection<GridCacheSqlQuery> queries() throws 
IgniteCheckedException {
         return qrys;
     }
 
@@ -132,7 +121,7 @@ public class GridQueryRequest implements Message {
                 writer.incrementState();
 
             case 1:
-                if (!writer.writeByteArray("qrysBytes", qrysBytes))
+                if (!writer.writeCollection("qrys", qrys, 
MessageCollectionItemType.MSG))
                     return false;
 
                 writer.incrementState();
@@ -171,7 +160,7 @@ public class GridQueryRequest implements Message {
                 reader.incrementState();
 
             case 1:
-                qrysBytes = reader.readByteArray("qrysBytes");
+                qrys = reader.readCollection("qrys", 
MessageCollectionItemType.MSG);
 
                 if (!reader.isLastRead())
                     return false;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/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 46e2d5c..01eb855 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
@@ -31,6 +31,7 @@ import org.apache.ignite.internal.processors.query.*;
 import org.apache.ignite.internal.processors.query.h2.opt.*;
 import org.apache.ignite.internal.processors.query.h2.sql.*;
 import org.apache.ignite.internal.processors.query.h2.twostep.*;
+import org.apache.ignite.internal.processors.query.h2.twostep.msg.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.lang.*;
 import org.apache.ignite.internal.util.offheap.unsafe.*;
@@ -39,6 +40,7 @@ import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.lang.*;
 import org.apache.ignite.marshaller.*;
 import org.apache.ignite.marshaller.jdk.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 import org.apache.ignite.resources.*;
 import org.apache.ignite.spi.*;
 import org.apache.ignite.spi.indexing.*;
@@ -1346,6 +1348,11 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
         };
     }
 
+    /** {@inheritDoc} */
+    @Override public MessageFactory messageFactory() {
+        return new GridH2ValueMessageFactory();
+    }
+
     /**
      * Wrapper to store connection and flag is schema set or not.
      */
@@ -1965,7 +1972,7 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
                 CacheObjectContext coctx = objectContext(schema.spaceName);
 
                 if (type == Value.JAVA_OBJECT)
-                    return new ValueCacheObject(coctx, co);
+                    return new GridH2ValueCacheObject(coctx, co);
 
                 obj = co.value(coctx, false);
             }
@@ -2103,147 +2110,4 @@ 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() {
-            if (obj.type() == CacheObject.TYPE_REGULAR) {
-                // Result must be the same as 
`marshaller.marshall(obj.value(coctx, false));`
-                try {
-                    return obj.valueBytes(coctx);
-                }
-                catch (IgniteCheckedException e) {
-                    throw DbException.convert(e);
-                }
-            }
-
-            // For portables and byte array cache object types.
-            return Utils.serialize(obj.value(coctx, false), null);
-        }
-
-        /** {@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/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2ValueCacheObject.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2ValueCacheObject.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2ValueCacheObject.java
new file mode 100644
index 0000000..0bb2a89
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2ValueCacheObject.java
@@ -0,0 +1,160 @@
+package org.apache.ignite.internal.processors.query.h2.opt;
+
+import org.apache.ignite.*;
+import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.*;
+import org.h2.message.*;
+import org.h2.util.*;
+import org.h2.value.*;
+
+import java.sql.*;
+
+/**
+ * H2 Value over {@link CacheObject}. Replacement for {@link ValueJavaObject}.
+ */
+public class GridH2ValueCacheObject extends Value {
+    /** */
+    private CacheObject obj;
+
+    /** */
+    private CacheObjectContext coctx;
+
+    /**
+     * @param coctx Cache object context.
+     * @param obj Object.
+     */
+    public GridH2ValueCacheObject(CacheObjectContext coctx, CacheObject obj) {
+        assert obj != null;
+
+        this.obj = obj;
+        this.coctx = coctx; // Allowed to be null in tests.
+    }
+
+    /**
+     * @return Cache object.
+     */
+    public CacheObject getCacheObject() {
+        return obj;
+    }
+
+    /** {@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() {
+        if (obj.type() == CacheObject.TYPE_REGULAR) {
+            // Result must be the same as 
`marshaller.marshall(obj.value(coctx, false));`
+            try {
+                return obj.valueBytes(coctx);
+            }
+            catch (IgniteCheckedException e) {
+                throw DbException.convert(e);
+            }
+        }
+
+        // For portables and byte array cache object types.
+        return Utils.serialize(obj.value(coctx, false), null);
+    }
+
+    /** {@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/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
index 918a541..66b3636 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
@@ -30,6 +30,8 @@ import 
org.apache.ignite.internal.processors.query.h2.twostep.messages.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.marshaller.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 import org.h2.jdbc.*;
 import org.h2.result.*;
 import org.h2.store.*;
@@ -44,6 +46,7 @@ import java.util.concurrent.*;
 import java.util.concurrent.atomic.*;
 
 import static org.apache.ignite.events.EventType.*;
+import static 
org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory.*;
 
 /**
  * Map query executor.
@@ -203,7 +206,14 @@ public class GridMapQueryExecutor {
         Collection<GridCacheSqlQuery> qrys;
 
         try {
-            qrys = req.queries(ctx.config().getMarshaller());
+            qrys = req.queries();
+
+            if (!node.isLocal()) {
+                Marshaller m = ctx.config().getMarshaller();
+
+                for (GridCacheSqlQuery qry : qrys)
+                    qry.unmarshallParams(m);
+            }
         }
         catch (IgniteCheckedException e) {
             throw new IgniteException(e);
@@ -344,7 +354,10 @@ public class GridMapQueryExecutor {
             boolean loc = node.isLocal();
 
             GridQueryNextPageResponse msg = new 
GridQueryNextPageResponse(qr.qryReqId, qry, page,
-                page == 0 ? res.rowCount : -1, loc ? null : 
marshallRows(rows), loc ? rows : null);
+                page == 0 ? res.rowCount : -1 ,
+                res.cols,
+                loc ? null : toMessages(rows, new 
ArrayList<Message>(res.cols)),
+                loc ? rows : null);
 
             if (loc)
                 h2.reduceQueryExecutor().onMessage(ctx.localNodeId(), msg);
@@ -510,6 +523,9 @@ public class GridMapQueryExecutor {
         private final UUID qrySrcNodeId;
 
         /** */
+        private final int cols;
+
+        /** */
         private int page;
 
         /** */
@@ -538,6 +554,7 @@ public class GridMapQueryExecutor {
             }
 
             rowCount = res.getRowCount();
+            cols = res.getVisibleColumnCount();
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
index 407341e..2b5c895 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
@@ -103,7 +103,7 @@ public abstract class GridMergeIndex extends BaseIndex {
      * @param page Page.
      */
     public final void addPage(GridResultPage page) {
-        int pageRowsCnt = page.rows().size();
+        int pageRowsCnt = page.rowsInPage();
 
         if (pageRowsCnt != 0)
             addPage0(page);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
index 93c9482..76a52e9 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
@@ -44,7 +44,7 @@ public class GridMergeIndexUnsorted extends GridMergeIndex {
 
     /** {@inheritDoc} */
     @Override protected void addPage0(GridResultPage page) {
-        if (!page.rows().isEmpty() || page.isLast() || queue.isEmpty())
+        if (page.rowsInPage() != 0 || page.isLast() || queue.isEmpty())
             queue.add(page);
     }
 
@@ -75,7 +75,7 @@ public class GridMergeIndexUnsorted extends GridMergeIndex {
 
                     fetchNextPage(page);
 
-                    iter = page.rows().iterator();
+                    iter = page.rows();
                 }
 
                 return true;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
index 7f42e0d..d7832f0 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
@@ -33,6 +33,7 @@ import 
org.apache.ignite.internal.processors.query.h2.twostep.messages.*;
 import org.apache.ignite.internal.util.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.marshaller.*;
 import org.apache.ignite.plugin.extensions.communication.*;
 import org.h2.command.ddl.*;
 import org.h2.command.dml.Query;
@@ -317,8 +318,14 @@ public class GridReduceQueryExecutor {
         runs.put(qryReqId, r);
 
         try {
-            send(nodes, new GridQueryRequest(qryReqId, r.pageSize, space, 
qry.mapQueries(),
-                ctx.config().getMarshaller().marshal(qry.mapQueries())));
+            if (nodes.size() != 1 || !F.first(nodes).isLocal()) { // Marshall 
params for remotes.
+                Marshaller m = ctx.config().getMarshaller();
+
+                for (GridCacheSqlQuery mapQry : qry.mapQueries())
+                    mapQry.marshallParams(m);
+            }
+
+            send(nodes, new GridQueryRequest(qryReqId, r.pageSize, space, 
qry.mapQueries()));
 
             r.latch.await();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridResultPage.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridResultPage.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridResultPage.java
index 5f58b95..af1bb4f 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridResultPage.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridResultPage.java
@@ -19,10 +19,13 @@ package 
org.apache.ignite.internal.processors.query.h2.twostep;
 
 import org.apache.ignite.internal.processors.query.h2.twostep.messages.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.plugin.extensions.communication.*;
 import org.h2.value.*;
 
 import java.util.*;
 
+import static 
org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory.*;
+
 /**
  * Page result.
  */
@@ -34,11 +37,14 @@ public class GridResultPage {
     protected final GridQueryNextPageResponse res;
 
     /** */
-    private final Collection<Value[]> rows;
+    private final int rowsInPage;
 
     /** */
     private final boolean last;
 
+    /** */
+    private Iterator<Value[]> rows;
+
     /**
      * @param src Source.
      * @param res Response.
@@ -57,12 +63,48 @@ public class GridResultPage {
 
         // res == null means that it is a terminating dummy page for the given 
source node ID.
         if (res != null) {
-            Object plainRows = res.plainRows();
+            Collection<?> plainRows = res.plainRows();
+
+            if (plainRows != null) {
+                rowsInPage = plainRows.size();
+
+                rows = (Iterator<Value[]>)plainRows.iterator();
+            }
+            else {
+                final int cols = res.columns();
+
+                rowsInPage = res.values().size() / cols;
+
+                final Iterator<Message> valsIter = res.values().iterator();
+
+                rows = new Iterator<Value[]>() {
+                    /** */
+                    int rowIdx;
+
+                    @Override public boolean hasNext() {
+                        return rowIdx < rowsInPage;
+                    }
+
+                    @Override public Value[] next() {
+                        if (!hasNext())
+                            throw new NoSuchElementException();
+
+                        rowIdx++;
 
-            rows = plainRows != null ? (Collection<Value[]>)plainRows : 
GridMapQueryExecutor.unmarshallRows(res.rows());
+                        return fillArray(valsIter, new Value[cols], null); // 
TODO coctx
+                    }
+
+                    @Override public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        }
+        else {
+            rowsInPage = 0;
+
+            rows = Collections.emptyIterator();
         }
-        else
-            rows = Collections.emptySet();
     }
 
     /**
@@ -73,10 +115,23 @@ public class GridResultPage {
     }
 
     /**
+     * @return Number on rows in this page.
+     */
+    public int rowsInPage() {
+        return rowsInPage;
+    }
+
+    /**
      * @return Rows.
      */
-    public Collection<Value[]> rows() {
-        return rows;
+    public Iterator<Value[]> rows() {
+        Iterator<Value[]> r = rows;
+
+        assert r != null;
+
+        rows = null;
+
+        return r;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Array.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Array.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Array.java
new file mode 100644
index 0000000..0354a93
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Array.java
@@ -0,0 +1,106 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.internal.*;
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+import java.util.*;
+
+import static 
org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2ValueMessageFactory.*;
+
+/**
+ * H2 Array.
+ */
+public class GridH2Array extends GridH2ValueMessage {
+    /** */
+    @GridDirectCollection(Message.class)
+    private Collection<Message> x;
+
+    /**
+     *
+     */
+    public GridH2Array() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Array(Value val) {
+        assert val.getType() == Value.ARRAY : val.getType();
+
+        ValueArray arr = (ValueArray)val;
+
+        x = new ArrayList<>(arr.getList().length);
+
+        for (Value v : arr.getList())
+            x.add(toMessage(v));
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        // TODO we need cache object context
+        return ValueArray.get(fillArray(x.iterator(), new Value[x.size()], 
null));
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeCollection("x", x, 
MessageCollectionItemType.MSG))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readCollection("x", MessageCollectionItemType.MSG);
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -18;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Boolean.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Boolean.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Boolean.java
new file mode 100644
index 0000000..0cae9cd
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Boolean.java
@@ -0,0 +1,94 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Boolean.
+ */
+public class GridH2Boolean extends GridH2ValueMessage {
+    /** */
+    private boolean x;
+
+    /**
+     *
+     */
+    public GridH2Boolean() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Boolean(Value val) {
+        assert val.getType() == Value.BOOLEAN : val.getType();
+
+        x = val.getBoolean();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueBoolean.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeBoolean("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readBoolean("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -5;
+    }
+
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Byte.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Byte.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Byte.java
new file mode 100644
index 0000000..73fce14
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Byte.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Byte.
+ */
+public class GridH2Byte extends GridH2ValueMessage {
+    /** */
+    private byte x;
+
+    /**
+     *
+     */
+    public GridH2Byte() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Byte(Value val) {
+        assert val.getType() == Value.BYTE : val.getType();
+
+        x = val.getByte();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueByte.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeByte("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readByte("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -6;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Bytes.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Bytes.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Bytes.java
new file mode 100644
index 0000000..e139da8
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Bytes.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Bytes.
+ */
+public class GridH2Bytes extends GridH2ValueMessage {
+    /** */
+    private byte[] b;
+
+    /**
+     *
+     */
+    public GridH2Bytes() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Bytes(Value val) {
+        assert val.getType() == Value.BYTES : val.getType();
+
+        b = val.getBytesNoCopy();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueBytes.getNoCopy(b);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeByteArray("b", b))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                b = reader.readByteArray("b");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -16;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Date.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Date.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Date.java
new file mode 100644
index 0000000..f6cef67
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Date.java
@@ -0,0 +1,97 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Date.
+ */
+public class GridH2Date extends GridH2ValueMessage {
+    /** */
+    private long date;
+
+    /**
+     *
+     */
+    public GridH2Date() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Date(Value val) {
+        assert val.getType() == Value.DATE : val.getType();
+
+        ValueDate d = (ValueDate)val;
+
+        date = d.getDateValue();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueDate.fromDateValue(date);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeLong("date", date))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                date = reader.readLong("date");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -14;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Decimal.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Decimal.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Decimal.java
new file mode 100644
index 0000000..b3b3adc
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Decimal.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Decimal.
+ */
+public class GridH2Decimal extends GridH2ValueMessage {
+    /** */
+    private byte[] b;
+
+    /**
+     *
+     */
+    public GridH2Decimal() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Decimal(Value val) {
+        assert val.getType() == Value.DECIMAL : val.getType();
+
+        b = val.getBytesNoCopy();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueBytes.getNoCopy(b).convertTo(Value.DECIMAL);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeByteArray("b", b))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                b = reader.readByteArray("b");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -10;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Double.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Double.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Double.java
new file mode 100644
index 0000000..eed3d87
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Double.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Double.
+ */
+public class GridH2Double extends GridH2ValueMessage {
+    /** */
+    private double x;
+
+    /**
+     *
+     */
+    public GridH2Double() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Double(Value val) {
+        assert val.getType() == Value.DOUBLE : val.getType();
+
+        x = val.getDouble();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueDouble.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeDouble("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readDouble("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -11;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Float.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Float.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Float.java
new file mode 100644
index 0000000..8e860b5
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Float.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Float.
+ */
+public class GridH2Float extends GridH2ValueMessage {
+    /** */
+    private float x;
+
+    /**
+     *
+     */
+    public GridH2Float() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Float(Value val) {
+        assert val.getType() == Value.FLOAT : val.getType();
+
+        x = val.getFloat();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueFloat.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeFloat("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readFloat("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -12;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Geometry.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Geometry.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Geometry.java
new file mode 100644
index 0000000..15a260a
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Geometry.java
@@ -0,0 +1,116 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.lang.reflect.*;
+import java.nio.*;
+
+/**
+ * H2 Geometry.
+ */
+public class GridH2Geometry extends GridH2ValueMessage {
+    /** */
+    private static final Method GEOMETRY_FROM_BYTES;
+
+    /**
+     * Initialize field.
+     */
+    static {
+        try {
+            GEOMETRY_FROM_BYTES = 
Class.forName("org.h2.value.ValueGeometry").getMethod("get", byte[].class);
+        }
+        catch (NoSuchMethodException | ClassNotFoundException e) {
+            throw new IllegalStateException("Check H2 version in classpath.");
+        }
+    }
+
+    /** */
+    private byte[] b;
+
+    /**
+     *
+     */
+    public GridH2Geometry() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Geometry(Value val) {
+        assert val.getType() == Value.GEOMETRY : val.getType();
+
+        b = val.getBytesNoCopy();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        try {
+            return (Value)GEOMETRY_FROM_BYTES.invoke(null, new Object[]{b});
+        }
+        catch (IllegalAccessException | InvocationTargetException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeByteArray("b", b))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                b = reader.readByteArray("b");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -21;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Integer.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Integer.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Integer.java
new file mode 100644
index 0000000..7d2e80b
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Integer.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Integer.
+ */
+public class GridH2Integer extends GridH2ValueMessage {
+    /** */
+    private int x;
+
+    /**
+     *
+     */
+    public GridH2Integer() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Integer(Value val) {
+        assert val.getType() == Value.INT : val.getType();
+
+        x = val.getInt();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueInt.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeInt("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readInt("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -8;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2JavaObject.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2JavaObject.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2JavaObject.java
new file mode 100644
index 0000000..b7da4f1
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2JavaObject.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Java Object.
+ */
+public class GridH2JavaObject extends GridH2ValueMessage {
+    /** */
+    private byte[] b;
+
+    /**
+     *
+     */
+    public GridH2JavaObject() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2JavaObject(Value val) {
+        assert val.getType() == Value.JAVA_OBJECT : val.getType();
+
+        b = val.getBytesNoCopy();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueJavaObject.getNoCopy(null, b, null);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeByteArray("b", b))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                b = reader.readByteArray("b");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -19;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Long.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Long.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Long.java
new file mode 100644
index 0000000..7d850b5
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Long.java
@@ -0,0 +1,95 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * H2 Long.
+ */
+public class GridH2Long extends GridH2ValueMessage {
+    /** */
+    private long x;
+
+    /**
+     *
+     */
+    public GridH2Long() {
+        // No-op.
+    }
+
+    /**
+     * @param val Value.
+     */
+    public GridH2Long(Value val) {
+        assert val.getType() == Value.LONG : val.getType();
+
+        x = val.getLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueLong.get(x);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeLong("x", x))
+                    return false;
+
+                writer.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                x = reader.readLong("x");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -9;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/351001bd/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
new file mode 100644
index 0000000..7968998
--- /dev/null
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
@@ -0,0 +1,66 @@
+package org.apache.ignite.internal.processors.query.h2.twostep.msg;
+
+import org.apache.ignite.plugin.extensions.communication.*;
+import org.h2.value.*;
+
+import java.nio.*;
+
+/**
+ * Message for {@link Value#NULL}.
+ */
+public class GridH2Null extends GridH2ValueMessage {
+    /** */
+    public static GridH2Null INSTANCE = new GridH2Null();
+
+    /**
+     * Disallow new instance creation.
+     */
+    private GridH2Null() {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value value() {
+        return ValueNull.INSTANCE;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!super.writeTo(buf, writer))
+            return false;
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        if (!super.readFrom(buf, reader))
+            return false;
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte directType() {
+        return -4;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 0;
+    }
+}

Reply via email to