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

[4/7] ignite git commit: IGNITE-6632: SQL: simplified GridH2Row inheritance tree. This closes #2856.

IGNITE-6632: SQL: simplified GridH2Row inheritance tree. This closes #2856.


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

Branch: refs/heads/ignite-3478
Commit: 0323468816f3bb5fa8cdcaa3cac1958f3dc89f6e
Parents: 583e3461
Author: devozerov <vo...@gridgain.com>
Authored: Mon Oct 16 12:38:54 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Mon Oct 16 12:38:54 2017 +0300

----------------------------------------------------------------------
 .../processors/query/h2/IgniteH2Indexing.java   |   4 +-
 .../query/h2/database/H2RowFactory.java         |   2 +-
 .../query/h2/database/io/H2ExtrasInnerIO.java   |   4 +-
 .../query/h2/database/io/H2ExtrasLeafIO.java    |   4 +-
 .../query/h2/database/io/H2InnerIO.java         |   4 +-
 .../query/h2/database/io/H2LeafIO.java          |   4 +-
 .../query/h2/opt/GridH2KeyRowOnheap.java        |  59 +++
 .../query/h2/opt/GridH2KeyValueRowOnheap.java   |  35 --
 .../query/h2/opt/GridH2MetaTable.java           |  13 +-
 .../query/h2/opt/GridH2PlainRowFactory.java     | 181 +++++++++
 .../processors/query/h2/opt/GridH2Row.java      | 122 ++----
 .../query/h2/opt/GridH2RowDescriptor.java       |  12 +-
 .../query/h2/opt/GridH2RowFactory.java          | 194 ----------
 .../query/h2/opt/GridH2SearchRowAdapter.java    | 103 ++++++
 .../processors/query/h2/opt/GridH2Table.java    |   2 +-
 .../query/h2/twostep/GridMergeIndexSorted.java  |   4 +-
 .../h2/twostep/GridMergeIndexUnsorted.java      |   4 +-
 .../query/h2/opt/GridH2TableSelfTest.java       | 369 -------------------
 18 files changed, 400 insertions(+), 720 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/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 dd35723..0fdc2e4 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
@@ -106,7 +106,7 @@ import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryContext;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
 import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser;
 import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter;
@@ -199,7 +199,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     private static final String DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" +
         ";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0" +
         ";RECOMPILE_ALWAYS=1;MAX_OPERATION_MEMORY=0;NESTED_JOINS=0;BATCH_JOINS=1" +
-        ";ROW_FACTORY=\"" + GridH2RowFactory.class.getName() + "\"" +
+        ";ROW_FACTORY=\"" + GridH2PlainRowFactory.class.getName() + "\"" +
         ";DEFAULT_TABLE_ENGINE=" + GridH2DefaultTableEngine.class.getName();
 
         // Uncomment this setting to get debug output from H2 to sysout.

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
index 92ecd3d..7116fe7 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
@@ -71,7 +71,7 @@ public class H2RowFactory {
             throw new IgniteException(e);
         }
 
-        assert row.ver != null;
+        assert row.version() != null;
 
         return row;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
index 7d41617..b8877e9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
@@ -81,7 +81,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
     @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
         GridH2Row row0 = (GridH2Row)row;
 
-        assert row0.link != 0 : row0;
+        assert row0.link() != 0 : row0;
 
         List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes();
 
@@ -101,7 +101,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
             fieldOff += size;
         }
 
-        PageUtils.putLong(pageAddr, off + payloadSize, row0.link);
+        PageUtils.putLong(pageAddr, off + payloadSize, row0.link());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
index 3fe72b7..6161f8d 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
@@ -81,7 +81,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
     @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
         GridH2Row row0 = (GridH2Row)row;
 
-        assert row0.link != 0;
+        assert row0.link() != 0;
 
         List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes();
 
@@ -100,7 +100,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
             fieldOff += size;
         }
 
-        PageUtils.putLong(pageAddr, off + payloadSize, row0.link);
+        PageUtils.putLong(pageAddr, off + payloadSize, row0.link());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
index 4d7b3a2..a1f1ce9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
@@ -47,9 +47,9 @@ public class H2InnerIO extends BPlusInnerIO<SearchRow> implements H2RowLinkIO {
     @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
         GridH2Row row0 = (GridH2Row)row;
 
-        assert row0.link != 0;
+        assert row0.link() != 0;
 
-        PageUtils.putLong(pageAddr, off, row0.link);
+        PageUtils.putLong(pageAddr, off, row0.link());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
index f292fc1..85dcf50 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
@@ -47,9 +47,9 @@ public class H2LeafIO extends BPlusLeafIO<SearchRow> implements H2RowLinkIO {
     @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
         GridH2Row row0 = (GridH2Row)row;
 
-        assert row0.link != 0;
+        assert row0.link() != 0;
 
-        PageUtils.putLong(pageAddr, off, row0.link);
+        PageUtils.putLong(pageAddr, off, row0.link());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
new file mode 100644
index 0000000..a0716c9
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2.opt;
+
+import org.h2.value.Value;
+
+/**
+ * Heap-based key-only row for remove operations.
+ */
+public class GridH2KeyRowOnheap extends GridH2Row {
+    /** */
+    private Value key;
+
+    /**
+     * @param key Key.
+     */
+    public GridH2KeyRowOnheap(Value key) {
+        this.key = key;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getColumnCount() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value getValue(int idx) {
+        assert idx == 0 : idx;
+
+        return key;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setValue(int idx, Value v) {
+        assert idx == 0 : idx;
+
+        key = v;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long expireTime() {
+        return 0;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
index 63b4606..ad93fec 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
@@ -89,11 +89,6 @@ public class GridH2KeyValueRowOnheap extends GridH2Row {
     }
 
     /** {@inheritDoc} */
-    @Override public Value[] getValueList() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
     @Override public long expireTime() {
         return expirationTime;
     }
@@ -225,41 +220,11 @@ public class GridH2KeyValueRowOnheap extends GridH2Row {
     }
 
     /** {@inheritDoc} */
-    @Override public void setKeyAndVersion(SearchRow old) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
     @Override public void setKey(long key) {
         throw new UnsupportedOperationException();
     }
 
     /** {@inheritDoc} */
-    @Override public Row getCopy() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setDeleted(boolean deleted) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getKey() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setSessionId(int sesId) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setVersion(int ver) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
     @Override public void setValue(int idx, Value v) {
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
index d23515b..5e09a86 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
@@ -86,7 +86,7 @@ public class GridH2MetaTable extends TableBase {
     /** {@inheritDoc} */
     @Override public SearchRow getTemplateSimpleRow(boolean singleColumn) {
         if (singleColumn)
-            return GridH2RowFactory.create((Value)null);
+            return GridH2PlainRowFactory.create((Value)null);
 
         return new MetaRow();
     }
@@ -219,7 +219,7 @@ public class GridH2MetaTable extends TableBase {
     /**
      * Get value row.
      */
-    private static class MetaRow extends GridH2Row {
+    private static class MetaRow extends GridH2SearchRowAdapter {
         /** */
         private Value v0;
 
@@ -284,11 +284,6 @@ public class GridH2MetaTable extends TableBase {
                     throw new IllegalStateException("Index: " + idx);
             }
         }
-
-        /** {@inheritDoc} */
-        @Override public long expireTime() {
-            return 0;
-        }
     }
 
     /**
@@ -296,7 +291,7 @@ public class GridH2MetaTable extends TableBase {
      */
     private static class MetaIndex extends BaseIndex {
         /** */
-        private final ConcurrentMap<ValueInt, GridH2Row> rows = new ConcurrentHashMap8<>();
+        private final ConcurrentMap<ValueInt, Row> rows = new ConcurrentHashMap8<>();
 
         /** {@inheritDoc} */
         @Override public void checkRename() {
@@ -322,7 +317,7 @@ public class GridH2MetaTable extends TableBase {
 
         /** {@inheritDoc} */
         @Override public void add(Session session, Row row) {
-            rows.put(id(row), (GridH2Row)row);
+            rows.put(id(row), row);
         }
 
         /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
new file mode 100644
index 0000000..fd8a613
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2.opt;
+
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.h2.result.Row;
+import org.h2.result.RowFactory;
+import org.h2.value.Value;
+
+/**
+ * Row factory.
+ */
+public class GridH2PlainRowFactory extends RowFactory {
+    /**
+     * @param v Value.
+     * @return Row.
+     */
+    public static Row create(Value v) {
+        return new RowKey(v);
+    }
+
+    /**
+     * @param data Values.
+     * @return Row.
+     */
+    public static Row create(Value... data) {
+        switch (data.length) {
+            case 0:
+                throw new IllegalStateException("Zero columns row.");
+
+            case 1:
+                return new RowKey(data[0]);
+
+            case 2:
+                return new RowPair(data[0], data[1]);
+
+            default:
+                return new RowSimple(data);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public Row createRow(Value[] data, int memory) {
+        return create(data);
+    }
+
+    /**
+     * Single value row.
+     */
+    private static final class RowKey extends GridH2SearchRowAdapter {
+        /** */
+        private Value key;
+
+        /**
+         * @param key Key.
+         */
+        public RowKey(Value key) {
+            this.key = key;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getColumnCount() {
+            return 1;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Value getValue(int idx) {
+            assert idx == 0 : idx;
+            return key;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void setValue(int idx, Value v) {
+            assert idx == 0 : idx;
+            key = v;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(RowKey.class, this);
+        }
+    }
+
+    /**
+     * Row of two values.
+     */
+    private static final class RowPair extends GridH2SearchRowAdapter  {
+        /** */
+        private Value v1;
+
+        /** */
+        private Value v2;
+
+        /**
+         * @param v1 First value.
+         * @param v2 Second value.
+         */
+        private RowPair(Value v1, Value v2) {
+            this.v1 = v1;
+            this.v2 = v2;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getColumnCount() {
+            return 2;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Value getValue(int idx) {
+            return idx == 0 ? v1 : v2;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void setValue(int idx, Value v) {
+            if (idx == 0)
+                v1 = v;
+            else {
+                assert idx == 1 : idx;
+
+                v2 = v;
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(RowPair.class, this);
+        }
+    }
+
+    /**
+     * Simple array based row.
+     */
+    private static final class RowSimple extends GridH2SearchRowAdapter {
+        /** */
+        @GridToStringInclude
+        private Value[] vals;
+
+        /**
+         * @param vals Values.
+         */
+        private RowSimple(Value[] vals) {
+            this.vals = vals;
+        }
+
+        /** {@inheritDoc} */
+        @Override public int getColumnCount() {
+            return vals.length;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Value getValue(int idx) {
+            return vals[idx];
+        }
+
+        /** {@inheritDoc} */
+        @Override public void setValue(int idx, Value v) {
+            vals[idx] = v;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(RowSimple.class, this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
index fdeb009..4cb603b 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
@@ -21,29 +21,25 @@ import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
-import org.h2.result.Row;
-import org.h2.result.SearchRow;
-import org.h2.store.Data;
-import org.h2.value.Value;
 
 /**
  * Row with locking support needed for unique key conflicts resolution.
  */
-public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
-    /** */
-    public long link; // TODO remove
+public abstract class GridH2Row extends GridH2SearchRowAdapter implements CacheDataRow {
+    /** Link. */
+    private long link;
 
-    /** */
-    public KeyCacheObject key; // TODO remove
+    /** Key. */
+    private KeyCacheObject key;
 
-    /** */
-    public CacheObject val; // TODO remove
+    /** Value. */
+    private CacheObject val;
 
-    /** */
-    public GridCacheVersion ver; // TODO remove
+    /** Version. */
+    private GridCacheVersion ver;
 
-    /** */
-    public int partId; // TODO remove
+    /** Partition. */
+    private int partId;
 
     /** {@inheritDoc} */
     @Override public KeyCacheObject key() {
@@ -60,16 +56,37 @@ public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
         return val;
     }
 
+    /**
+     * @param val Value.
+     */
+    public void value(CacheObject val) {
+        this.val = val;
+    }
+
     /** {@inheritDoc} */
     @Override public GridCacheVersion version() {
         return ver;
     }
 
+    /**
+     * @param ver Version.
+     */
+    public void version(GridCacheVersion ver) {
+        this.ver = ver;
+    }
+
     /** {@inheritDoc} */
     @Override public int partition() {
         return partId;
     }
 
+    /**
+     * @param partId Partition.
+     */
+    public void partition(int partId) {
+        this.partId = partId;
+    }
+
     /** {@inheritDoc} */
     @Override public long link() {
         return link;
@@ -81,81 +98,6 @@ public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
     }
 
     /** {@inheritDoc} */
-    @Override public Row getCopy() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setVersion(int version) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getByteCount(Data dummy) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean isEmpty() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setDeleted(boolean deleted) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setSessionId(int sessionId) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getSessionId() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void commit() {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean isDeleted() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setKeyAndVersion(SearchRow old) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getVersion() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void setKey(long key) {
-        // No-op, may be set in H2 INFORMATION_SCHEMA.
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getKey() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMemory() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
-    @Override public Value[] getValueList() {
-        throw new UnsupportedOperationException();
-    }
-
-    /** {@inheritDoc} */
     @Override public int hash() {
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
index 081805e..503e487 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
@@ -287,7 +287,7 @@ public class GridH2RowDescriptor {
 
         try {
             if (val == null) // Only can happen for remove operation, can create simple search row.
-                row = GridH2RowFactory.create(wrap(key, keyType));
+                row = new GridH2KeyRowOnheap(wrap(key, keyType));
             else
                 row = new GridH2KeyValueRowOnheap(this, key, keyType, val, valType, ver, expirationTime);
         }
@@ -297,12 +297,10 @@ public class GridH2RowDescriptor {
                 "or configure key type as common super class for all actual keys for this value type.", e);
         }
 
-        row.ver = ver;
-
-        row.key = key;
-        row.val = val;
-        row.partId = partId;
-
+        row.version(ver);
+        row.key(key);
+        row.value(val);
+        row.partition(partId);
         row.link(link);
 
         return row;

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
deleted file mode 100644
index d33917f..0000000
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.query.h2.opt;
-
-import org.apache.ignite.internal.util.tostring.GridToStringInclude;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.h2.result.RowFactory;
-import org.h2.value.Value;
-
-/**
- * Row factory.
- */
-public class GridH2RowFactory extends RowFactory {
-    /**
-     * @param v Value.
-     * @return Row.
-     */
-    public static GridH2Row create(Value v) {
-        return new RowKey(v);
-    }
-
-    /**
-     * @param v1 Value 1.
-     * @param v2 Value 2.
-     * @return Row.
-     */
-    public static GridH2Row create(Value v1, Value v2) {
-        return new RowPair(v1, v2);
-    }
-
-    /**
-     * @param data Values.
-     * @return Row.
-     */
-    public static GridH2Row create(Value... data) {
-        switch (data.length) {
-            case 0:
-                throw new IllegalStateException("Zero columns row.");
-
-            case 1:
-                return new RowKey(data[0]);
-
-            case 2:
-                return new RowPair(data[0], data[1]);
-
-            default:
-                return new RowSimple(data);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public GridH2Row createRow(Value[] data, int memory) {
-        return create(data);
-    }
-
-    /**
-     * Single value row.
-     */
-    private static final class RowKey extends GridH2Row {
-        /** */
-        private Value key;
-
-        /**
-         * @param key Key.
-         */
-        public RowKey(Value key) {
-            this.key = key;
-        }
-
-        /** {@inheritDoc} */
-        @Override public int getColumnCount() {
-            return 1;
-        }
-
-        /** {@inheritDoc} */
-        @Override public Value getValue(int idx) {
-            assert idx == 0 : idx;
-            return key;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void setValue(int idx, Value v) {
-            assert idx == 0 : idx;
-            key = v;
-        }
-
-        /** {@inheritDoc} */
-        @Override public long expireTime() {
-            return 0;
-        }
-    }
-
-    /**
-     * Row of two values.
-     */
-    private static final class RowPair extends GridH2Row  {
-        /** */
-        private Value v1;
-
-        /** */
-        private Value v2;
-
-        /**
-         * @param v1 First value.
-         * @param v2 Second value.
-         */
-        private RowPair(Value v1, Value v2) {
-            this.v1 = v1;
-            this.v2 = v2;
-        }
-
-        /** {@inheritDoc} */
-        @Override public int getColumnCount() {
-            return 2;
-        }
-
-        /** {@inheritDoc} */
-        @Override public Value getValue(int idx) {
-            return idx == 0 ? v1 : v2;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void setValue(int idx, Value v) {
-            if (idx == 0)
-                v1 = v;
-            else {
-                assert idx == 1 : idx;
-
-                v2 = v;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public long expireTime() {
-            return 0;
-        }
-    }
-
-    /**
-     * Simple array based row.
-     */
-    private static final class RowSimple extends GridH2Row {
-        /** */
-        @GridToStringInclude
-        private Value[] vals;
-
-        /**
-         * @param vals Values.
-         */
-        private RowSimple(Value[] vals) {
-            this.vals = vals;
-        }
-
-        /** {@inheritDoc} */
-        @Override public int getColumnCount() {
-            return vals.length;
-        }
-
-        /** {@inheritDoc} */
-        @Override public Value getValue(int idx) {
-            return vals[idx];
-        }
-
-        /** {@inheritDoc} */
-        @Override public void setValue(int idx, Value v) {
-            vals[idx] = v;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String toString() {
-            return S.toString(RowSimple.class, this);
-        }
-
-        /** {@inheritDoc} */
-        @Override public long expireTime() {
-            return 0;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
new file mode 100644
index 0000000..24a90b3
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2.opt;
+
+import org.h2.result.Row;
+import org.h2.result.SearchRow;
+import org.h2.store.Data;
+import org.h2.value.Value;
+
+/**
+ * Dummy H2 search row adadpter.
+ */
+public abstract class GridH2SearchRowAdapter implements Row {
+    /** {@inheritDoc} */
+    @Override public void setKeyAndVersion(SearchRow old) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getVersion() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setKey(long key) {
+        // No-op, may be set in H2 INFORMATION_SCHEMA.
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getKey() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMemory() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Row getCopy() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setVersion(int version) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getByteCount(Data dummy) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isEmpty() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setDeleted(boolean deleted) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setSessionId(int sessionId) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getSessionId() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void commit() {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isDeleted() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Value[] getValueList() {
+        throw new UnsupportedOperationException();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index d20b56b..add2488 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -463,7 +463,7 @@ public class GridH2Table extends TableBase {
             GridH2IndexBase pk = pk();
 
             if (!del) {
-                assert rowFactory == null || row.link != 0 : row;
+                assert rowFactory == null || row.link() != 0 : row;
 
                 GridH2Row old = pk.put(row); // Put to PK.
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
index 54c8dd4..0dc8354 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
@@ -33,7 +33,7 @@ import java.util.concurrent.locks.ReentrantLock;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Cursor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.h2.engine.Session;
@@ -368,7 +368,7 @@ public final class GridMergeIndexSorted extends GridMergeIndex {
             if (!iter.hasNext())
                 return false;
 
-            cur = GridH2RowFactory.create(iter.next());
+            cur = GridH2PlainRowFactory.create(iter.next());
 
             return true;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/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 c53b58f..487d386 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
@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Cursor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
 import org.h2.engine.Session;
 import org.h2.index.Cursor;
 import org.h2.index.IndexType;
@@ -139,7 +139,7 @@ public final class GridMergeIndexUnsorted extends GridMergeIndex {
             }
 
             @Override public Row next() {
-                return GridH2RowFactory.create(iter.next());
+                return GridH2PlainRowFactory.create(iter.next());
             }
 
             @Override public void remove() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
deleted file mode 100644
index a1a64e8..0000000
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.query.h2.opt;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.h2.value.ValueLong;
-import org.h2.value.ValueString;
-import org.h2.value.ValueTimestamp;
-import org.h2.value.ValueUuid;
-
-/**
- * Tests H2 Table.
- */
-@SuppressWarnings({"TypeMayBeWeakened", "FieldAccessedSynchronizedAndUnsynchronized"})
-public class GridH2TableSelfTest extends GridCommonAbstractTest {
-    /** */
-    private static final long MAX_X = 2000;
-
-    /** */
-    private static final String DB_URL = "jdbc:h2:mem:gg_table_engine;MULTI_THREADED=1;OPTIMIZE_REUSE_RESULTS=0;" +
-        "QUERY_CACHE_SIZE=0;RECOMPILE_ALWAYS=1";
-
-    /** */
-    private static final String CREATE_TABLE_SQL = "CREATE TABLE T(ID UUID, T TIMESTAMP, STR VARCHAR, X BIGINT)";
-
-    /** */
-    private static final String PK_NAME = "__GG_PK_";
-
-    /** Hash. */
-    private static final String HASH = "__GG_HASH";
-
-    /** */
-    private static final String STR_IDX_NAME = "__GG_IDX_";
-
-    /** */
-    private static final String NON_UNIQUE_IDX_NAME = "__GG_IDX_";
-
-    /** */
-    private static final String SCAN_IDX_NAME = GridH2PrimaryScanIndex.SCAN_INDEX_NAME_SUFFIX;
-
-    /** */
-    private Connection conn;
-
-    /** */
-    private GridH2Table tbl;
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTest() throws Exception {
-        // TODO: IGNITE-4994: Restore mock.
-//        Driver.load();
-//
-//        conn = DriverManager.getConnection(DB_URL);
-//
-//        tbl = GridH2Table.Engine.createTable(conn, CREATE_TABLE_SQL, null, new GridH2Table.IndexesFactory() {
-//            @Override public void onTableCreated(GridH2Table tbl) {
-//                // No-op.
-//            }
-//
-//            @Override public H2RowFactory createRowFactory(GridH2Table tbl) {
-//                return null;
-//            }
-//
-//            @Override public ArrayList<Index> createIndexes(GridH2Table tbl) {
-//                ArrayList<Index> idxs = new ArrayList<>();
-//
-//                IndexColumn id = tbl.indexColumn(0, SortOrder.ASCENDING);
-//                IndexColumn t = tbl.indexColumn(1, SortOrder.ASCENDING);
-//                IndexColumn str = tbl.indexColumn(2, SortOrder.DESCENDING);
-//                IndexColumn x = tbl.indexColumn(3, SortOrder.DESCENDING);
-//
-//                idxs.add(new H2PkHashIndex(null, tbl, HASH, F.asList(id)));
-//                idxs.add(new GridH2TreeIndex(PK_NAME, tbl, true, F.asList(id)));
-//                idxs.add(new GridH2TreeIndex(NON_UNIQUE_IDX_NAME, tbl, false, F.asList(x, t, id)));
-//                idxs.add(new GridH2TreeIndex(STR_IDX_NAME, tbl, false, F.asList(str, id)));
-//
-//                return idxs;
-//            }
-//        }, null);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        conn.close();
-
-        conn = null;
-        tbl = null;
-    }
-
-    /**
-     * @param id Id.
-     * @param t Timestamp.
-     * @param str String.
-     * @param x X.
-     * @return New row.
-     */
-    private GridH2Row row(UUID id, long t, String str, long x) {
-        return GridH2RowFactory.create(
-            ValueUuid.get(id.getMostSignificantBits(), id.getLeastSignificantBits()),
-            ValueTimestamp.get(new Timestamp(t)),
-            ValueString.get(str),
-            ValueLong.get(x));
-    }
-
-
-    /**
-     * Simple table test.
-     *
-     * @throws Exception If failed.
-     */
-    public void testTable() throws Exception {
-        // Test insert.
-        long x = MAX_X;
-
-        Random rnd = new Random();
-
-        while(x-- > 0) {
-            UUID id = UUID.randomUUID();
-
-            GridH2Row row = row(id, System.currentTimeMillis(), rnd.nextBoolean() ? id.toString() :
-                UUID.randomUUID().toString(), rnd.nextInt(100));
-
-            tbl.doUpdate(row, false);
-        }
-
-        assertEquals(MAX_X, tbl.getRowCountApproximation());
-        assertEquals(MAX_X, tbl.getRowCount(null));
-
-        for (GridH2IndexBase idx : tbl.indexes()) {
-            assertEquals(MAX_X, idx.getRowCountApproximation());
-            assertEquals(MAX_X, idx.getRowCount(null));
-        }
-
-        // Check unique index.
-        UUID id = UUID.randomUUID();
-        UUID id2 = UUID.randomUUID();
-
-        assertTrue(tbl.doUpdate(row(id, System.currentTimeMillis(), id.toString(), rnd.nextInt(100)), false));
-        assertTrue(tbl.doUpdate(row(id2, System.currentTimeMillis(), id2.toString(), rnd.nextInt(100)), false));
-
-        // Check index selection.
-        checkQueryPlan(conn, "SELECT * FROM T", SCAN_IDX_NAME);
-
-        checkQueryPlan(conn, "SELECT * FROM T WHERE ID IS NULL", PK_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE ID = RANDOM_UUID()", PK_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE ID > RANDOM_UUID()", PK_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T ORDER BY ID", PK_NAME);
-
-        checkQueryPlan(conn, "SELECT * FROM T WHERE STR IS NULL", STR_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE STR = 'aaaa'", STR_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE STR > 'aaaa'", STR_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T ORDER BY STR DESC", STR_IDX_NAME);
-
-        checkQueryPlan(conn, "SELECT * FROM T WHERE X IS NULL", NON_UNIQUE_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE X = 10000", NON_UNIQUE_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T WHERE X > 10000", NON_UNIQUE_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T ORDER BY X DESC", NON_UNIQUE_IDX_NAME);
-        checkQueryPlan(conn, "SELECT * FROM T ORDER BY X DESC, T", NON_UNIQUE_IDX_NAME);
-
-        checkQueryPlan(conn, "SELECT * FROM T ORDER BY T, X DESC", SCAN_IDX_NAME);
-
-        // Simple queries.
-
-        Statement s = conn.createStatement();
-
-        ResultSet rs = s.executeQuery("select id from t where x between 0 and 100");
-
-        int i = 0;
-        while (rs.next())
-            i++;
-
-        assertEquals(MAX_X + 2, i);
-
-        // -----
-
-        rs = s.executeQuery("select id from t where t is not null");
-
-        i = 0;
-        while (rs.next())
-            i++;
-
-        assertEquals(MAX_X + 2, i);
-
-        // ----
-
-        int cnt = 10 + rnd.nextInt(25);
-
-        long t = System.currentTimeMillis();
-
-        for (i = 0; i < cnt; i++) {
-            id = UUID.randomUUID();
-
-            assertTrue(tbl.doUpdate(row(id, t, id.toString(), 51), false));
-        }
-
-        rs = s.executeQuery("select x, id from t where x = 51 limit " + cnt);
-
-        i = 0;
-
-        while (rs.next()) {
-            assertEquals(51, rs.getInt(1));
-
-            i++;
-        }
-
-        assertEquals(cnt, i);
-    }
-
-    /**
-      * @throws Exception If failed.
-     */
-    public void testRangeQuery() throws Exception {
-        int rows = 3000;
-        int xs = 37;
-
-        long t = System.currentTimeMillis();
-
-        Random rnd = new Random();
-
-        for (int i = 0 ; i < rows; i++) {
-            UUID id = UUID.randomUUID();
-
-            GridH2Row row = row(id, t++, id.toString(), rnd.nextInt(xs));
-
-            assertTrue(tbl.doUpdate(row, false));
-        }
-
-        PreparedStatement ps = conn.prepareStatement("select count(*) from t where x = ?");
-
-        int cnt = 0;
-
-        for (int x = 0; x < xs; x++) {
-            ps.setInt(1, x);
-
-            ResultSet rs = ps.executeQuery();
-
-            assertTrue(rs.next());
-
-            cnt += rs.getInt(1);
-        }
-
-        assertEquals(rows, cnt);
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDataLoss() throws Exception {
-        final int threads = 37;
-        final int iterations = 15000;
-
-        final AtomicInteger cntr = new AtomicInteger();
-
-        final UUID[] ids = new UUID[threads * iterations];
-
-        for (int i = 0; i < ids.length; i++)
-            ids[i] = UUID.randomUUID();
-
-        final long t = System.currentTimeMillis();
-
-        final AtomicInteger deleted = new AtomicInteger();
-
-        multithreaded(new Callable<Void>() {
-            @Override public Void call() throws Exception {
-                Random rnd = new Random();
-
-                int offset = cntr.getAndIncrement() * iterations;
-
-                synchronized (ids[offset]) {
-                    for (int i = 0; i < iterations; i++) {
-                        UUID id = ids[offset + i];
-
-                        int x = rnd.nextInt(50);
-
-                        GridH2Row row = row(id, t, id.toString(), x);
-
-                        assertTrue(tbl.doUpdate(row, false));
-                    }
-                }
-
-                offset = (offset + iterations) % ids.length;
-
-                synchronized (ids[offset]) {
-                    for (int i = 0; i < iterations; i += 2) {
-                        UUID id = ids[offset + i];
-
-                        int x = rnd.nextInt(50);
-
-                        GridH2Row row = row(id, t, id.toString(), x);
-
-                        if (tbl.doUpdate(row, true))
-                            deleted.incrementAndGet();
-                    }
-                }
-
-                return null;
-            }
-        }, threads);
-
-        assertTrue(deleted.get() > 0);
-
-        PreparedStatement p = conn.prepareStatement("select count(*) from t where id = ?");
-
-        for (int i = 1; i < ids.length; i += 2) {
-            p.setObject(1, ids[i]);
-
-            ResultSet rs = p.executeQuery();
-
-            assertTrue(rs.next());
-
-            assertEquals(1, rs.getInt(1));
-        }
-
-        Statement s = conn.createStatement();
-
-        ResultSet rs = s.executeQuery("select count(*) from t");
-
-        assertTrue(rs.next());
-
-        assertEquals(ids.length - deleted.get(), rs.getInt(1));
-    }
-
-
-    /**
-     * Check query plan to correctly select index.
-     *
-     * @param conn Connection.
-     * @param sql Select.
-     * @param search Search token in result.
-     * @throws SQLException If failed.
-     */
-    private void checkQueryPlan(Connection conn, String sql, String search) throws SQLException {
-
-        try (Statement s = conn.createStatement()) {
-            try (ResultSet r = s.executeQuery("EXPLAIN ANALYZE " + sql)) {
-                assertTrue(r.next());
-
-                String plan = r.getString(1);
-
-                assertTrue("Execution plan for '" + sql + "' query should contain '" + search + "'",
-                        plan.contains(search));
-            }
-        }
-    }
-}
\ No newline at end of file