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/01/25 15:00:25 UTC

ignite git commit: ignite-3477 tmp int-field index impl

Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-idx [created] 225218e88


ignite-3477 tmp int-field index impl


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

Branch: refs/heads/ignite-3477-idx
Commit: 225218e8814d3472829bf20fa256a683a5b5a54d
Parents: 788d9bb
Author: sboikov <sb...@gridgain.com>
Authored: Wed Jan 25 16:51:07 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Jan 25 17:43:03 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheOffheapManagerImpl.java    |  10 +-
 .../cache/database/MetadataStorage.java         |   4 +-
 .../cache/database/tree/BPlusTree.java          |  10 +-
 .../cache/database/tree/io/BPlusIO.java         |   4 +-
 .../cache/database/tree/io/BPlusInnerIO.java    |   2 +-
 .../cache/database/tree/io/BPlusLeafIO.java     |   2 +-
 .../cache/database/tree/io/PageIO.java          |  30 +++++-
 .../processors/database/BPlusTreeSelfTest.java  |  10 +-
 .../processors/query/h2/IgniteH2Indexing.java   |   4 +-
 .../processors/query/h2/database/H2IntTree.java |  85 ++++++++++++++++
 .../processors/query/h2/database/H2Tree.java    |   2 +-
 .../query/h2/database/H2TreeIndex.java          |  86 ++++++++++++++--
 .../query/h2/database/io/H2InnerIO.java         |   2 +-
 .../query/h2/database/io/H2IntInnerIO.java      |  99 ++++++++++++++++++
 .../query/h2/database/io/H2IntLeafIO.java       | 100 +++++++++++++++++++
 .../query/h2/database/io/H2LeafIO.java          |   2 +-
 .../query/h2/opt/GridH2AbstractKeyValueRow.java |   2 +
 .../processors/query/h2/opt/GridH2Row.java      |   2 +
 .../processors/query/h2/opt/GridH2Table.java    |   2 +
 19 files changed, 422 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index e1ea6d1..1cac7eb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -1531,7 +1531,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         }
 
         /** {@inheritDoc} */
-        @Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long pageAddr, int idx) {
+        @Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long pageAddr, int idx, CacheSearchRow r) {
             int hash = getHash(pageAddr, idx);
             long link = getLink(pageAddr, idx);
 
@@ -1597,7 +1597,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         }
 
         /** {@inheritDoc} */
-        @Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long buf, int idx) {
+        @Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long buf, int idx, CacheSearchRow r) {
             int hash = getHash(buf, idx);
             long link = getLink(buf, idx);
 
@@ -1727,7 +1727,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         /** {@inheritDoc} */
         @Override protected PendingRow getRow(BPlusIO<PendingRow> io, long pageAddr, int idx)
             throws IgniteCheckedException {
-            return io.getLookupRow(this, pageAddr, idx);
+            return io.getLookupRow(this, pageAddr, idx, null);
         }
     }
 
@@ -1800,7 +1800,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         }
 
         /** {@inheritDoc} */
-        @Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx)
+        @Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx, PendingRow r)
             throws IgniteCheckedException {
             return PendingRow.createRowWithKey(((PendingEntriesTree)tree).cctx,
                 getExpireTime(pageAddr, idx),
@@ -1868,7 +1868,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         }
 
         /** {@inheritDoc} */
-        @Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx)
+        @Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx, PendingRow r)
             throws IgniteCheckedException {
             return PendingRow.createRowWithKey(((PendingEntriesTree)tree).cctx,
                 getExpireTime(pageAddr, idx),

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
index 34bd280..c15b039 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/MetadataStorage.java
@@ -397,7 +397,7 @@ public class MetadataStorage implements MetaStore {
 
         /** {@inheritDoc} */
         @Override public IndexItem getLookupRow(final BPlusTree<IndexItem, ?> tree, final long pageAddr,
-            final int idx) throws IgniteCheckedException {
+            final int idx, IndexItem r) throws IgniteCheckedException {
             return readRow(pageAddr, offset(idx));
         }
 
@@ -446,7 +446,7 @@ public class MetadataStorage implements MetaStore {
         /** {@inheritDoc} */
         @Override public IndexItem getLookupRow(final BPlusTree<IndexItem, ?> tree,
             final long pageAddr,
-            final int idx) throws IgniteCheckedException {
+            final int idx, IndexItem r) throws IgniteCheckedException {
             return readRow(pageAddr, offset(idx));
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index 07829bf..d49c3cf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -1015,7 +1015,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                         if (minRow != null && compare(io, pageAddr, i, minRow) <= 0)
                             fail("Wrong sort order: " + U.hexLong(pageId) + " , at " + i + " , minRow: " + minRow);
 
-                        minRow = io.getLookupRow(this, pageAddr, i);
+                        minRow = io.getLookupRow(this, pageAddr, i, null);
                     }
 
                     return;
@@ -1023,7 +1023,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
                 // To find our inner key we have to go left and then always go to the right.
                 for (int i = 0; i < cnt; i++) {
-                    L row = io.getLookupRow(this, pageAddr, i);
+                    L row = io.getLookupRow(this, pageAddr, i, null);
 
                     if (minRow != null && compare(io, pageAddr, i, minRow) <= 0)
                         fail("Min row violated: " + row + " , minRow: " + minRow);
@@ -1072,7 +1072,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                     if (cnt <= 0) // This code is called only if the tree is not empty, so we can't see empty leaf.
                         fail("Invalid leaf count: " + cnt + " " + U.hexLong(pageId));
 
-                    return io.getLookupRow(this, pageAddr, cnt - 1);
+                    return io.getLookupRow(this, pageAddr, cnt - 1, null);
                 }
 
                 long rightId = inner(io).getLeft(pageAddr, cnt);// The same as getRight(cnt - 1), but good for routing pages.
@@ -1258,7 +1258,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             if (i != 0)
                 b.append(',');
 
-            b.append(io.isLeaf() || canGetRowFromInner ? getRow(io, pageAddr, i) : io.getLookupRow(this, pageAddr, i));
+            b.append(io.isLeaf() || canGetRowFromInner ? getRow(io, pageAddr, i) : io.getLookupRow(this, pageAddr, i, null));
         }
 
         b.append(']');
@@ -2322,7 +2322,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                     cnt = io.getCount(pageAddr);
 
                     // Last item from backward row goes up.
-                    L moveUpRow = io.getLookupRow(BPlusTree.this, pageAddr, cnt - 1);
+                    L moveUpRow = io.getLookupRow(BPlusTree.this, pageAddr, cnt - 1, row);
 
                     if (!io.isLeaf()) { // Leaf pages must contain all the links, inner pages remove moveUpLink.
                         io.setCount(pageAddr, cnt - 1);

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
index c34296a..b0955ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
@@ -186,7 +186,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param idx Index of element.
      * @return Offset from byte buffer begin in bytes.
      */
-    protected abstract int offset(int idx);
+    public abstract int offset(int idx);
 
     /**
      * Store the needed info about the row in the page. Leaf and inner pages can store different info.
@@ -231,7 +231,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @return Lookup row.
      * @throws IgniteCheckedException If failed.
      */
-    public abstract L getLookupRow(BPlusTree<L, ?> tree, long pageAddr, int idx) throws IgniteCheckedException;
+    public abstract L getLookupRow(BPlusTree<L, ?> tree, long pageAddr, int idx, L r0) throws IgniteCheckedException;
 
     /**
      * Copy items from source page to destination page.

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
index c7018bd..468c618 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
@@ -123,7 +123,7 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
     }
 
     /** {@inheritDoc} */
-    @Override protected final int offset(int idx) {
+    @Override public final int offset(int idx) {
         return offset(idx, SHIFT_LINK);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
index f3dccee..d40c848 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
@@ -47,7 +47,7 @@ public abstract class BPlusLeafIO<L> extends BPlusIO<L> {
     }
 
     /** {@inheritDoc} */
-    @Override protected final int offset(int idx) {
+    @Override public final int offset(int idx) {
         assert idx >= 0: idx;
 
         return ITEMS_OFF + idx * itemSize;

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
index f6ac905..c514cba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
@@ -77,6 +77,12 @@ public abstract class PageIO {
     private static IOVersions<? extends BPlusLeafIO<?>> h2LeafIOs;
 
     /** */
+    private static IOVersions<? extends BPlusInnerIO<?>> h2IntInnerIOs;
+
+    /** */
+    private static IOVersions<? extends BPlusLeafIO<?>> h2IntLeafIOs;
+
+    /** */
     public static final int TYPE_OFF = 0;
 
     /** */
@@ -148,6 +154,12 @@ public abstract class PageIO {
     public static final short T_PAGE_UPDATE_TRACKING = 15;
 
     /** */
+    public static final short T_H2_INT_REF_LEAF = 16;
+
+    /** */
+    public static final short T_H2_INT_REF_INNER = 17;
+
+    /** */
     private final int ver;
 
     /** */
@@ -283,10 +295,14 @@ public abstract class PageIO {
      */
     public static void registerH2(
         IOVersions<? extends BPlusInnerIO<?>> innerIOs,
-        IOVersions<? extends BPlusLeafIO<?>> leafIOs
+        IOVersions<? extends BPlusLeafIO<?>> leafIOs,
+        IOVersions<? extends BPlusInnerIO<?>> intInnerIOs,
+        IOVersions<? extends BPlusLeafIO<?>> intLeafIOs
     ) {
         h2InnerIOs = innerIOs;
         h2LeafIOs = leafIOs;
+        h2IntInnerIOs = intInnerIOs;
+        h2IntLeafIOs = intLeafIOs;
     }
 
     /**
@@ -415,6 +431,18 @@ public abstract class PageIO {
 
                 return (Q)h2LeafIOs.forVersion(ver);
 
+            case T_H2_INT_REF_INNER:
+                if (h2IntInnerIOs == null)
+                    break;
+
+                return (Q)h2IntInnerIOs.forVersion(ver);
+
+            case T_H2_INT_REF_LEAF:
+                if (h2IntLeafIOs == null)
+                    break;
+
+                return (Q)h2IntLeafIOs.forVersion(ver);
+
             case T_DATA_REF_INNER:
                 return (Q)IgniteCacheOffheapManagerImpl.DataInnerIO.VERSIONS.forVersion(ver);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
index a2f1bdf..fbdd901 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
@@ -1235,7 +1235,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         /** {@inheritDoc} */
         @Override protected int compare(BPlusIO<Long> io, long pageAddr, int idx, Long n2)
             throws IgniteCheckedException {
-            Long n1 = io.getLookupRow(this, pageAddr, idx);
+            Long n1 = io.getLookupRow(this, pageAddr, idx, null);
 
             return Long.compare(n1, n2);
         }
@@ -1244,7 +1244,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         @Override protected Long getRow(BPlusIO<Long> io, long pageAddr, int idx) throws IgniteCheckedException {
             assert io.canGetRow() : io;
 
-            return io.getLookupRow(this, pageAddr, idx);
+            return io.getLookupRow(this, pageAddr, idx, null);
         }
 
         /**
@@ -1402,7 +1402,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         /** {@inheritDoc} */
         @Override public void store(long dst, int dstIdx, BPlusIO<Long> srcIo, long src, int srcIdx)
             throws IgniteCheckedException {
-            Long row = srcIo.getLookupRow(null, src, srcIdx);
+            Long row = srcIo.getLookupRow(null, src, srcIdx, null);
 
             store(dst, dstIdx, row, null);
         }
@@ -1428,7 +1428,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
-        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx)
+        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx, Long r)
             throws IgniteCheckedException {
             Long row = PageUtils.getLong(pageAddr, offset(idx));
 
@@ -1497,7 +1497,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
-        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx)
+        @Override public Long getLookupRow(BPlusTree<Long,?> tree, long pageAddr, int idx, Long r)
             throws IgniteCheckedException {
             return PageUtils.getLong(pageAddr, offset(idx));
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/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 98b5b7f..9883b62 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
@@ -96,6 +96,8 @@ import org.apache.ignite.internal.processors.query.GridQueryProperty;
 import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.h2.database.H2PkHashIndex;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2IntInnerIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2IntLeafIO;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2DefaultTableEngine;
 import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory;
 import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
@@ -213,7 +215,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
      * Register IO for indexes.
      */
     static {
-        PageIO.registerH2(H2InnerIO.VERSIONS, H2LeafIO.VERSIONS);
+        PageIO.registerH2(H2InnerIO.VERSIONS, H2LeafIO.VERSIONS, H2IntInnerIO.VERSIONS, H2IntLeafIO.VERSIONS);
     }
 
     /** Default DB options. */

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2IntTree.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2IntTree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2IntTree.java
new file mode 100644
index 0000000..905db64
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2IntTree.java
@@ -0,0 +1,85 @@
+/*
+ * 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.database;
+
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO;
+import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2InnerIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2IntInnerIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2IntLeafIO;
+import org.apache.ignite.internal.processors.query.h2.database.io.H2LeafIO;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
+import org.h2.result.SearchRow;
+
+/**
+ */
+public abstract class H2IntTree extends BPlusTree<SearchRow, GridH2Row> {
+    /** */
+    private final H2RowFactory rowStore;
+
+    /**
+     * @param name Tree name.
+     * @param reuseList Reuse list.
+     * @param cacheId Cache ID.
+     * @param pageMem Page memory.
+     * @param wal Write ahead log manager.
+     * @param rowStore Row data store.
+     * @param metaPageId Meta page ID.
+     * @param initNew Initialize new index.
+     * @throws IgniteCheckedException If failed.
+     */
+    public H2IntTree(
+        String name,
+        ReuseList reuseList,
+        int cacheId,
+        PageMemory pageMem,
+        IgniteWriteAheadLogManager wal,
+        AtomicLong globalRmvId,
+        H2RowFactory rowStore,
+        long metaPageId,
+        boolean initNew
+    ) throws IgniteCheckedException {
+        super(name, cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList, H2IntInnerIO.VERSIONS, H2IntLeafIO.VERSIONS);
+
+        assert rowStore != null;
+
+        this.rowStore = rowStore;
+
+        initTree(initNew);
+    }
+
+    /**
+     * @return Row store.
+     */
+    public H2RowFactory getRowFactory() {
+        return rowStore;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected GridH2Row getRow(BPlusIO<SearchRow> io, long pageAddr, int idx)
+        throws IgniteCheckedException {
+        return (GridH2Row)io.getLookupRow(this, pageAddr, idx, null);
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
index 19e05ed..d004dff 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
@@ -76,7 +76,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
     /** {@inheritDoc} */
     @Override protected GridH2Row getRow(BPlusIO<SearchRow> io, long pageAddr, int idx)
         throws IgniteCheckedException {
-        return (GridH2Row)io.getLookupRow(this, pageAddr, idx);
+        return (GridH2Row)io.getLookupRow(this, pageAddr, idx, null);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
index 9bcdab5..99b611d 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.query.h2.database;
 import java.util.List;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.database.IgniteCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cache.database.RootPage;
@@ -39,6 +40,8 @@ import org.h2.result.SearchRow;
 import org.h2.result.SortOrder;
 import org.h2.table.IndexColumn;
 import org.h2.table.TableFilter;
+import org.h2.value.Value;
+import org.h2.value.ValueInt;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -46,7 +49,7 @@ import org.jetbrains.annotations.Nullable;
  */
 public class H2TreeIndex extends GridH2IndexBase {
     /** */
-    private final H2Tree tree;
+    private final BPlusTree<SearchRow, GridH2Row> tree;
 
     /** Cache context. */
     private GridCacheContext<?, ?> cctx;
@@ -83,14 +86,66 @@ public class H2TreeIndex extends GridH2IndexBase {
 
             RootPage page = cctx.offheap().rootPageForIndex(name);
 
-            tree = new H2Tree(name, cctx.offheap().reuseListForIndex(name), cctx.cacheId(),
-                dbMgr.pageMemory(), cctx.shared().wal(), cctx.offheap().globalRemoveId(),
-                tbl.rowFactory(), page.pageId().pageId(), page.isAllocated()) {
-                @Override protected int compare(BPlusIO<SearchRow> io, long pageAddr, int idx, SearchRow row)
-                    throws IgniteCheckedException {
-                    return compareRows(getRow(io, pageAddr, idx), row);
-                }
-            };
+            if (pk || !"atomic-index".equals(tbl.spaceName())) {
+                tree = new H2Tree(name, cctx.offheap().reuseListForIndex(name), cctx.cacheId(),
+                    dbMgr.pageMemory(), cctx.shared().wal(), cctx.offheap().globalRemoveId(),
+                    tbl.rowFactory(), page.pageId().pageId(), page.isAllocated()) {
+                    @Override protected int compare(BPlusIO<SearchRow> io, long pageAddr, int idx, SearchRow row)
+                        throws IgniteCheckedException {
+                        return compareRows(getRow(io, pageAddr, idx), row);
+                    }
+                };
+            }
+            else {
+                if (colsList.size() > 2)
+                    throw new IgniteCheckedException("err1");
+
+                IndexColumn col = colsList.get(0);
+
+                if (col.column.getType() != Value.INT)
+                    throw new IgniteCheckedException("err2");
+
+                System.out.println("\n int index: " + name + "\n");
+
+                tree = new H2IntTree(name, cctx.offheap().reuseListForIndex(name), cctx.cacheId(),
+                    dbMgr.pageMemory(), cctx.shared().wal(), cctx.offheap().globalRemoveId(),
+                    tbl.rowFactory(), page.pageId().pageId(), page.isAllocated()) {
+                    @Override protected int compare(BPlusIO<SearchRow> io, long pageAddr, int idx, SearchRow row)
+                        throws IgniteCheckedException {
+                        int off = io.offset(idx);
+
+                        int intVal = PageUtils.getInt(pageAddr, off);
+
+                        Value v1 = ValueInt.get(intVal);
+                        Value v2 = row.getValue(columnIds[0]);
+                        if (v1 == null || v2 == null) {
+                            // can't compare further
+                            return 0;
+                        }
+                        int c = compareValues(v1, v2, indexColumns[0].sortType);
+                        if (c != 0) {
+                            return c;
+                        }
+
+                        SearchRow rowData = getRow(io, pageAddr, idx);
+
+                        for (int i = 1, len = indexColumns.length; i < len; i++) {
+                            int index = columnIds[i];
+                            v1 = rowData.getValue(index);
+                            v2 = row.getValue(index);
+                            if (v1 == null || v2 == null) {
+                                // can't compare further
+                                return 0;
+                            }
+                            c = compareValues(v1, v2, indexColumns[i].sortType);
+                            if (c != 0) {
+                                return c;
+                            }
+                        }
+                        return 0;
+                    }
+                };
+            }
         }
         else
             // We need indexes on the client node, but index will not contain any data.
@@ -99,10 +154,21 @@ public class H2TreeIndex extends GridH2IndexBase {
         initDistributedJoinMessaging(tbl);
     }
 
+    private int compareValues(Value a, Value b, int sortType) {
+        if (a == b) {
+            return 0;
+        }
+        int comp = table.compareTypeSafe(a, b);
+        if ((sortType & SortOrder.DESCENDING) != 0) {
+            comp = -comp;
+        }
+        return comp;
+    }
+
     /**
      * @return Tree.
      */
-    public H2Tree tree() {
+    public BPlusTree<SearchRow, GridH2Row> tree() {
         return tree;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/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 f697121..594fcb7 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
@@ -63,7 +63,7 @@ public class H2InnerIO extends BPlusInnerIO<SearchRow> implements H2RowLinkIO {
     }
 
     /** {@inheritDoc} */
-    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx)
+    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx, SearchRow row)
         throws IgniteCheckedException {
         long link = getLink(pageAddr, idx);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntInnerIO.java
new file mode 100644
index 0000000..87a44c7
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntInnerIO.java
@@ -0,0 +1,99 @@
+/*
+ * 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.database.io;
+
+import java.nio.ByteBuffer;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusInnerIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
+import org.apache.ignite.internal.processors.query.h2.database.H2IntTree;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
+import org.h2.result.SearchRow;
+
+/**
+ * Inner page for H2 row references.
+ */
+public class H2IntInnerIO extends BPlusInnerIO<SearchRow> {
+    /** */
+    public static final IOVersions<H2IntInnerIO> VERSIONS = new IOVersions<>(
+        new H2IntInnerIO(1)
+    );
+
+    /**
+     * @param ver Page format version.
+     */
+    private H2IntInnerIO(int ver) {
+        super(T_H2_INT_REF_INNER, ver, true, 12);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void storeByOffset(ByteBuffer buf, int off, SearchRow row) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
+        GridH2Row row0 = (GridH2Row)row;
+
+        assert row0.link != 0;
+
+        int val = row.getValue(row0.colId).getInt();
+        assert val >= 0;
+
+        PageUtils.putInt(pageAddr, off, val);
+        PageUtils.putLong(pageAddr, off + 4, row0.link);
+    }
+
+    /** {@inheritDoc} */
+    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx, SearchRow r)
+        throws IgniteCheckedException {
+        long link = getLink(pageAddr, idx);
+
+        assert link != 0;
+
+        GridH2Row r0 = ((H2IntTree)tree).getRowFactory().getRow(link);
+
+        if (r != null)
+            r0.colId = ((GridH2Row)r).colId;
+
+        return r0;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
+        int srcOff = srcIo.offset(srcIdx);
+
+        int val = PageUtils.getInt(srcPageAddr, srcOff);
+        long link = PageUtils.getInt(srcPageAddr, srcOff + 4);
+
+        assert link != 0;
+        assert val >= 0;
+
+        int dstOff = offset(dstIdx);
+
+        PageUtils.putInt(dstPageAddr, dstOff, val);
+        PageUtils.putLong(dstPageAddr, dstOff + 4, link);
+    }
+
+    private long getLink(long pageAddr, int idx) {
+        return PageUtils.getLong(pageAddr, offset(idx) + 4);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntLeafIO.java
new file mode 100644
index 0000000..b465883
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2IntLeafIO.java
@@ -0,0 +1,100 @@
+/*
+ * 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.database.io;
+
+import java.nio.ByteBuffer;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusLeafIO;
+import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
+import org.apache.ignite.internal.processors.query.h2.database.H2IntTree;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
+import org.h2.result.SearchRow;
+
+/**
+ * Leaf page for H2 row references.
+ */
+public class H2IntLeafIO extends BPlusLeafIO<SearchRow> {
+    /** */
+    public static final IOVersions<H2IntLeafIO> VERSIONS = new IOVersions<>(
+        new H2IntLeafIO(1)
+    );
+
+    /**
+     * @param ver Page format version.
+     */
+    protected H2IntLeafIO(int ver) {
+        super(T_H2_INT_REF_LEAF, ver, 12);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void storeByOffset(ByteBuffer buf, int off, SearchRow row) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
+        GridH2Row row0 = (GridH2Row)row;
+
+        assert row0.link != 0;
+
+        int val = row.getValue(row0.colId).getInt();
+
+        assert val >= 0;
+
+        PageUtils.putInt(pageAddr, off, val);
+        PageUtils.putLong(pageAddr, off + 4, row0.link);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<SearchRow> srcIo, long srcPageAddr, int srcIdx) {
+        assert srcIo == this;
+
+        int srcOff = srcIo.offset(srcIdx);
+
+        int val = PageUtils.getInt(srcPageAddr, srcOff);
+        assert val >= 0;
+
+        long link = PageUtils.getLong(srcPageAddr, srcOff + 4);
+        assert link > 0;
+
+        int dstOff = offset(dstIdx);
+
+        PageUtils.putInt(dstPageAddr, dstOff, val);
+        PageUtils.putLong(dstPageAddr, dstOff + 4, link);
+    }
+
+    /** {@inheritDoc} */
+    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx, SearchRow r)
+        throws IgniteCheckedException {
+        long link = getLink(pageAddr, idx);
+
+        GridH2Row r0 = ((H2IntTree)tree).getRowFactory().getRow(link);
+
+        if (r != null)
+            r0.colId = ((GridH2Row)r).colId;
+
+        return r0;
+    }
+
+    private long getLink(long pageAddr, int idx) {
+        return PageUtils.getLong(pageAddr, offset(idx) + 4);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/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 26cbdc5..40dea44 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
@@ -70,7 +70,7 @@ public class H2LeafIO extends BPlusLeafIO<SearchRow> implements H2RowLinkIO {
     }
 
     /** {@inheritDoc} */
-    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx)
+    @Override public SearchRow getLookupRow(BPlusTree<SearchRow,?> tree, long pageAddr, int idx, SearchRow row)
         throws IgniteCheckedException {
         long link = getLink(pageAddr, idx);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java
index e9970af..2304d24 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java
@@ -272,6 +272,8 @@ public abstract class GridH2AbstractKeyValueRow extends GridH2Row {
                 }
             }
             else {
+                if (col != KEY_COL)
+                    System.out.println();
                 assert col == KEY_COL : col;
 
                 v = peekValue(KEY_COL);

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/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 bdd43ef..1a1f16c 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
@@ -45,6 +45,8 @@ public abstract class GridH2Row extends Row implements GridSearchRowPointer, Cac
     /** */
     public int partId; // TODO remove
 
+    public int colId = -1;
+
     /** {@inheritDoc} */
     @Override public long pointer() {
         throw new IllegalStateException();

http://git-wip-us.apache.org/repos/asf/ignite/blob/225218e8/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 5024959..4630848 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
@@ -607,6 +607,8 @@ public class GridH2Table extends TableBase {
 
                     assert !idx.getIndexType().isUnique() : "Unique indexes are not supported: " + idx;
 
+                    row.colId = idx.getColumns()[0].getColumnId();
+
                     GridH2Row old2 = idx.put(row);
 
                     if (old2 != null) { // Row was replaced in index.