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.