You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tk...@apache.org on 2022/09/20 16:27:08 UTC

[ignite-3] branch main updated: IGNITE-17672 Support BinaryTuple comparator for sorted index B+Tree (#1107)

This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 1be060af0a IGNITE-17672 Support BinaryTuple comparator for sorted index B+Tree (#1107)
1be060af0a is described below

commit 1be060af0a4ef88bf14b272094f39a1f0fbbeb4d
Author: Kirill Tkalenko <tk...@yandex.ru>
AuthorDate: Tue Sep 20 19:27:03 2022 +0300

    IGNITE-17672 Support BinaryTuple comparator for sorted index B+Tree (#1107)
---
 .../pagememory/index/sorted/SortedIndexTree.java      | 13 +++++++++++--
 .../pagememory/index/sorted/io/SortedIndexTreeIo.java | 19 +++++++++++++++----
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
index d03afdffd5..4903c794e6 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
@@ -24,6 +24,8 @@ import org.apache.ignite.internal.pagememory.reuse.ReuseList;
 import org.apache.ignite.internal.pagememory.tree.BplusTree;
 import org.apache.ignite.internal.pagememory.tree.io.BplusIo;
 import org.apache.ignite.internal.pagememory.util.PageLockListener;
+import org.apache.ignite.internal.schema.BinaryTuple;
+import org.apache.ignite.internal.storage.index.BinaryTupleComparator;
 import org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeInnerIo;
 import org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeIo;
 import org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeLeafIo;
@@ -38,6 +40,9 @@ public class SortedIndexTree extends BplusTree<SortedIndexRowKey, SortedIndexRow
     /** Data page reader instance to read payload from data pages. */
     private final DataPageReader dataPageReader;
 
+    /** Comparator of index columns {@link BinaryTuple}s. */
+    private final BinaryTupleComparator binaryTupleComparator;
+
     /**
      * Constructor.
      *
@@ -50,6 +55,7 @@ public class SortedIndexTree extends BplusTree<SortedIndexRowKey, SortedIndexRow
      * @param metaPageId Meta page ID.
      * @param reuseList Reuse list.
      * @param initNew {@code True} if new tree should be created.
+     * @param binaryTupleComparator Comparator of index columns {@link BinaryTuple}s.
      * @throws IgniteInternalCheckedException If failed.
      */
     public SortedIndexTree(
@@ -61,7 +67,8 @@ public class SortedIndexTree extends BplusTree<SortedIndexRowKey, SortedIndexRow
             AtomicLong globalRmvId,
             long metaPageId,
             @Nullable ReuseList reuseList,
-            boolean initNew
+            boolean initNew,
+            BinaryTupleComparator binaryTupleComparator
     ) throws IgniteInternalCheckedException {
         super("SortedIndexTree_" + grpId, grpId, grpName, partId, pageMem, lockLsnr, globalRmvId, metaPageId, reuseList);
 
@@ -69,6 +76,8 @@ public class SortedIndexTree extends BplusTree<SortedIndexRowKey, SortedIndexRow
 
         dataPageReader = new DataPageReader(pageMem, grpId, statisticsHolder());
 
+        this.binaryTupleComparator = binaryTupleComparator;
+
         initTree(initNew);
     }
 
@@ -91,7 +100,7 @@ public class SortedIndexTree extends BplusTree<SortedIndexRowKey, SortedIndexRow
             throws IgniteInternalCheckedException {
         SortedIndexTreeIo sortedIndexTreeIo = (SortedIndexTreeIo) io;
 
-        return sortedIndexTreeIo.compare(dataPageReader, partId, pageAddr, idx, row);
+        return sortedIndexTreeIo.compare(dataPageReader, binaryTupleComparator, partId, pageAddr, idx, row);
     }
 
     @Override
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
index c912aa23d1..8deac78c54 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
@@ -28,7 +28,9 @@ import java.util.UUID;
 import org.apache.ignite.internal.pagememory.datapage.DataPageReader;
 import org.apache.ignite.internal.pagememory.tree.io.BplusIo;
 import org.apache.ignite.internal.pagememory.util.PageUtils;
+import org.apache.ignite.internal.schema.BinaryTuple;
 import org.apache.ignite.internal.storage.RowId;
+import org.apache.ignite.internal.storage.index.BinaryTupleComparator;
 import org.apache.ignite.internal.storage.pagememory.index.freelist.IndexColumns;
 import org.apache.ignite.internal.storage.pagememory.index.freelist.ReadIndexColumnsValue;
 import org.apache.ignite.internal.storage.pagememory.index.sorted.SortedIndexRow;
@@ -97,13 +99,23 @@ public interface SortedIndexTreeIo {
     /**
      * Compare the {@link SortedIndexRowKey} from the page with passed {@link SortedIndexRowKey}.
      *
+     * @param dataPageReader Data page reader.
+     * @param binaryTupleComparator Comparator of index columns {@link BinaryTuple}s.
+     * @param partitionId Partition ID.
      * @param pageAddr Page address.
      * @param idx Element's index.
      * @param rowKey Lookup index row key.
      * @return Comparison result.
+     * @throws IgniteInternalCheckedException If failed.
      */
-    default int compare(DataPageReader dataPageReader, int partitionId, long pageAddr, int idx, SortedIndexRowKey rowKey)
-            throws IgniteInternalCheckedException {
+    default int compare(
+            DataPageReader dataPageReader,
+            BinaryTupleComparator binaryTupleComparator,
+            int partitionId,
+            long pageAddr,
+            int idx,
+            SortedIndexRowKey rowKey
+    ) throws IgniteInternalCheckedException {
         assert rowKey instanceof SortedIndexRow;
 
         SortedIndexRow sortedIndexRow = (SortedIndexRow) rowKey;
@@ -119,8 +131,7 @@ public interface SortedIndexTreeIo {
 
         ByteBuffer indexColumnsBuffer = ByteBuffer.wrap(indexColumnsTraversal.result());
 
-        // TODO: IGNITE-17672 Compare by BinaryTuple
-        int cmp = indexColumnsBuffer.compareTo(sortedIndexRow.indexColumns().valueBuffer());
+        int cmp = binaryTupleComparator.compare(indexColumnsBuffer, sortedIndexRow.indexColumns().valueBuffer());
 
         if (cmp != 0) {
             return cmp;