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

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit acb36e62fccae5602f7e6fa343d42d37c419a626
Author: Ritik Raj <raj.ritik9...@gmail.com>
AuthorDate: Tue Jul 15 16:30:14 2025 +0530

    [ASTERIXDB-3601][STO] Remove unnecessary present column calculation for 
flush
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    1. present column calculation not needed during flush.
    2. added log line for counting pages flushed in dense or sparse format.
    
    Ext-ref: MB-66306
    Change-Id: I70e3a7cddd1c744b651ff69cb0122b22ae60e0f1
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20106
    Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Peeyush Gupta <peeyush.gu...@couchbase.com>
    Tested-by: Ritik Raj <ritik....@couchbase.com>
---
 .../lsm/flush/FlushColumnTupleWriter.java          |  5 ++++
 .../lsm/merge/MergeColumnTupleWriter.java          |  5 ++++
 .../zero/readers/DefaultColumnPageZeroReader.java  |  6 ++--
 .../zero/readers/SparseColumnPageZeroReader.java   | 19 ++++++++-----
 .../DefaultColumnMultiPageZeroReader.java          |  9 +++---
 .../multipage/SparseColumnMultiPageZeroReader.java | 14 ++++++----
 .../column/api/AbstractColumnTupleWriter.java      |  8 ++++++
 .../buffercache/read/CloudColumnReadContext.java   | 32 ----------------------
 .../column/impls/btree/ColumnBTreeBulkloader.java  | 18 ++++++++++--
 .../impls/btree/ColumnBTreeLeafFrameFactory.java   |  4 ++-
 .../impls/btree/ColumnBTreeReadLeafFrame.java      | 11 +++++---
 .../column/impls/btree/IColumnPageZeroReader.java  |  7 +++--
 12 files changed, 78 insertions(+), 60 deletions(-)

diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnTupleWriter.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnTupleWriter.java
index bf76a6b42f..b33a2b4c00 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnTupleWriter.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/flush/FlushColumnTupleWriter.java
@@ -253,6 +253,11 @@ public class FlushColumnTupleWriter extends 
AbstractColumnTupleWriter {
         presentColumnsIndexes.clear();
     }
 
+    @Override
+    public byte getWriterFlag() {
+        return pageZeroWriterFlavorSelector.getWriterFlag();
+    }
+
     public static int[] toIndexArray(BitSet bitSet) {
         int[] result = new int[bitSet.cardinality()];
         int idx = 0;
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
index fb5cfdb982..cce694da38 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/lsm/merge/MergeColumnTupleWriter.java
@@ -245,6 +245,11 @@ public class MergeColumnTupleWriter extends 
AbstractColumnTupleWriter {
         return FlushColumnTupleWriter.toIndexArray(bitSet);
     }
 
+    @Override
+    public byte getWriterFlag() {
+        return pageZeroWriterFlavorSelector.getWriterFlag();
+    }
+
     @Override
     public void close() {
         columnMetadata.close();
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
index a8d159f0e0..a60757eb4b 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/DefaultColumnPageZeroReader.java
@@ -32,6 +32,7 @@ import java.util.BitSet;
 import org.apache.asterix.column.zero.writers.DefaultColumnPageZeroWriter;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.impls.btree.IColumnPageZeroReader;
@@ -52,13 +53,14 @@ public class DefaultColumnPageZeroReader implements 
IColumnPageZeroReader {
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf, int headerSize) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int headerSize) {
         this.pageZeroBuf = pageZeroBuf;
         this.numberOfPresentColumns = 
pageZeroBuf.getInt(NUMBER_OF_COLUMNS_OFFSET);
         this.headerSize = headerSize;
     }
 
-    public void reset(ByteBuffer pageZeroBuf, int numberOfPresentColumns, int 
headerSize) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int numberOfPresentColumns,
+            int headerSize) {
         this.pageZeroBuf = pageZeroBuf;
         this.numberOfPresentColumns = numberOfPresentColumns;
         this.headerSize = headerSize;
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/SparseColumnPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/SparseColumnPageZeroReader.java
index 3fd7a117dc..0360352bd5 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/SparseColumnPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/readers/SparseColumnPageZeroReader.java
@@ -23,6 +23,7 @@ import java.util.BitSet;
 
 import org.apache.asterix.column.zero.writers.DefaultColumnPageZeroWriter;
 import org.apache.asterix.column.zero.writers.SparseColumnPageZeroWriter;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
 
 import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
@@ -38,18 +39,22 @@ public class SparseColumnPageZeroReader extends 
DefaultColumnPageZeroReader {
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf, int headerSize) {
-        super.reset(pageZeroBuf, headerSize);
-        setPresentColumnsIndices();
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int headerSize) {
+        super.reset(pageZeroBuf, projectorType, headerSize);
         columnIndexToRelativeColumnIndex.clear();
-
+        if (projectorType == ColumnProjectorType.MERGE) {
+            setPresentColumnsIndices();
+        }
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf, int numberOfPresentColumns, int 
headerSize) {
-        super.reset(pageZeroBuf, numberOfPresentColumns, headerSize);
-        setPresentColumnsIndices();
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int numberOfPresentColumns,
+            int headerSize) {
+        super.reset(pageZeroBuf, projectorType, numberOfPresentColumns, 
headerSize);
         columnIndexToRelativeColumnIndex.clear();
+        if (projectorType == ColumnProjectorType.MERGE) {
+            setPresentColumnsIndices();
+        }
     }
 
     @Override
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
index 8eaaed2b1a..88c1b445e4 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/DefaultColumnMultiPageZeroReader.java
@@ -39,6 +39,7 @@ import org.apache.hyracks.data.std.primitive.IntegerPointable;
 import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
 
@@ -72,17 +73,17 @@ public class DefaultColumnMultiPageZeroReader extends 
AbstractColumnMultiPageZer
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType) {
         this.pageZeroBuf = pageZeroBuf;
         zerothSegmentMaxColumns = 
pageZeroBuf.getInt(MAX_COLUMNS_IN_ZEROTH_SEGMENT);
-        zerothSegmentReader.reset(pageZeroBuf, 
Math.min(zerothSegmentMaxColumns, getNumberOfPresentColumns()),
-                headerSize);
+        zerothSegmentReader.reset(pageZeroBuf, projectorType,
+                Math.min(zerothSegmentMaxColumns, 
getNumberOfPresentColumns()), headerSize);
         numberOfPageZeroSegments = 
pageZeroBuf.getInt(NUMBER_OF_PAGE_ZERO_SEGMENTS_OFFSET);
         numberOfColumns = pageZeroBuf.getInt(NUMBER_OF_COLUMNS_OFFSET);
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf, int headerSize) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int headerSize) {
         throw new UnsupportedOperationException("This method should not be 
called for multi-page readers.");
     }
 
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
index 379d81c9d0..d0d620db72 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/zero/writers/multipage/SparseColumnMultiPageZeroReader.java
@@ -39,6 +39,7 @@ import org.apache.hyracks.data.std.primitive.IntegerPointable;
 import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import org.apache.hyracks.storage.am.lsm.btree.column.cloud.IntPairUtil;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.error.ColumnarValueException;
 
@@ -78,20 +79,23 @@ public class SparseColumnMultiPageZeroReader extends 
AbstractColumnMultiPageZero
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType) {
         this.pageZeroBuf = pageZeroBuf;
         numberOfPageZeroSegments = 
pageZeroBuf.getInt(NUMBER_OF_PAGE_ZERO_SEGMENTS_OFFSET);
         numberOfColumnInZerothSegment = 
pageZeroBuf.getInt(MAX_COLUMNS_IN_ZEROTH_SEGMENT);
         maxColumnIndexInZerothSegment = 
pageZeroBuf.getInt(MAX_COLUMNS_INDEX_IN_ZEROTH_SEGMENT_OFFSET);
         headerSize = MAX_COLUMNS_INDEX_IN_ZEROTH_SEGMENT_OFFSET + 
numberOfPageZeroSegments * Integer.BYTES;
-        zerothSegmentReader.reset(pageZeroBuf, 
Math.min(numberOfColumnInZerothSegment, getNumberOfPresentColumns()),
-                headerSize);
-        setPresentColumnsIndices();
+        zerothSegmentReader.reset(pageZeroBuf, projectorType,
+                Math.min(numberOfColumnInZerothSegment, 
getNumberOfPresentColumns()), headerSize);
         columnIndexToRelativeColumnIndex.clear();
+        if (projectorType == ColumnProjectorType.MERGE) {
+            //This Info is only required for the merge operation, hence we can 
skip it for the projection operation.
+            setPresentColumnsIndices();
+        }
     }
 
     @Override
-    public void reset(ByteBuffer pageZeroBuf, int headerSize) {
+    public void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType, int headerSize) {
         throw new UnsupportedOperationException("This method is not supported 
for multi-page zero readers.");
     }
 
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/api/AbstractColumnTupleWriter.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/api/AbstractColumnTupleWriter.java
index 8b3abd610d..60f7967cbd 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/api/AbstractColumnTupleWriter.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/api/AbstractColumnTupleWriter.java
@@ -107,9 +107,17 @@ public abstract class AbstractColumnTupleWriter extends 
AbstractTupleWriterDisab
      */
     public abstract IColumnPageZeroWriterFlavorSelector 
getColumnPageZeroWriterFlavorSelector();
 
+    /**
+     * Get writer flag for accounting sparse vs dense leafs.
+     *
+     * @return
+     */
+    public abstract byte getWriterFlag();
+
     public void setWriterType(IColumnPageZeroWriter.ColumnPageZeroWriterType 
pageZeroWriterType) {
         if (pageZeroWriterType != 
IColumnPageZeroWriter.ColumnPageZeroWriterType.ADAPTIVE) {
             
getColumnPageZeroWriterFlavorSelector().setPageZeroWriterFlag(pageZeroWriterType.getWriterFlag());
         }
     }
+
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java
index b499a50e09..bceec56c51 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/cloud/buffercache/read/CloudColumnReadContext.java
@@ -137,8 +137,6 @@ public final class CloudColumnReadContext implements 
IColumnReadContext {
             return;
         }
 
-        // pin the required page segments
-        //        mergedPageRanges.clear();
         int pageZeroId = leafFrame.getPageId();
         // Pinning all the segments of the page zero
         // as the column eviction logic is based on the length of the columns 
which
@@ -222,36 +220,6 @@ public final class CloudColumnReadContext implements 
IColumnReadContext {
         mergedPageRanges.pin(columnCtx, bufferCache, fileId, pageZeroId);
     }
 
-    private void mergePageZeroSegmentRanges(BitSet pageZeroSegmentRanges) {
-        // Since the 0th segment is already pinned, we can skip it
-        pageZeroSegmentRanges.clear(0);
-        if (pageZeroSegmentRanges.cardinality() == 0) {
-            // No page zero segments, nothing to merge
-            return;
-        }
-
-        int start = -1;
-        int prev = -1;
-
-        int current = pageZeroSegmentRanges.nextSetBit(0);
-        while (current >= 0) {
-            if (start == -1) {
-                // Start of a new range
-                start = current;
-            } else if (current != prev + 1) {
-                // Discontinuous: close the current range
-                mergedPageRanges.addRange(start, prev);
-                start = current;
-            }
-
-            prev = current;
-            current = pageZeroSegmentRanges.nextSetBit(current + 1);
-        }
-
-        // Close the final range
-        mergedPageRanges.addRange(start, prev);
-    }
-
     @Override
     public void release(IBufferCache bufferCache) throws HyracksDataException {
         // Release might differ in the future if prefetching is supported
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeBulkloader.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeBulkloader.java
index 9ca57dd33c..244cf47601 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeBulkloader.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeBulkloader.java
@@ -69,6 +69,8 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
     private int maxNumberOfPagesInALeafNode;
     private int maxTupleCount;
     private int lastRequiredFreeSpace;
+    private int sparseLeafsCount;
+    private int densePagesCount;
 
     public ColumnBTreeBulkloader(NCConfig storageConfig, float fillFactor, 
boolean verifyInput,
             IPageWriteCallback callback, ITreeIndex index, ITreeIndexFrame 
leafFrame,
@@ -98,6 +100,8 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
         numberOfLeafNodes = 1;
         maxTupleCount = 0;
         lastRequiredFreeSpace = 0;
+        sparseLeafsCount = 0;
+        densePagesCount = 0;
     }
 
     @Override
@@ -161,6 +165,7 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
             try {
                 columnarFrame.flush(columnWriter, tupleCount, 
maxColumnsInPageZerothSegment, lowKey.getTuple(),
                         splitKey.getTuple(), this);
+                updatePageLayoutStat();
             } catch (Exception e) {
                 logState(e);
                 throw e;
@@ -191,6 +196,7 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
             try {
                 columnarFrame.flush(columnWriter, tupleCount, 
maxColumnsInPageZerothSegment, lowKey.getTuple(),
                         splitKey.getTuple(), this);
+                updatePageLayoutStat();
             } catch (Exception e) {
                 logState(e);
                 throw e;
@@ -240,6 +246,14 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
         super.writeLastLeaf(page);
     }
 
+    private void updatePageLayoutStat() {
+        if (columnWriter.getWriterFlag() == 
IColumnPageZeroWriter.MULTI_PAGE_DEFAULT_WRITER_FLAG) {
+            densePagesCount++;
+        } else {
+            sparseLeafsCount++;
+        }
+    }
+
     private void writeColumnAndSegmentPages() throws HyracksDataException {
         for (ICachedPage c : columnsPages) {
             write(c);
@@ -315,9 +329,9 @@ public final class ColumnBTreeBulkloader extends 
BTreeNSMBulkLoader implements I
         }
 
         LOGGER.debug(
-                "{} columnar bulkloader wrote maximum {} and last {} and used 
leafNodes: {}, tempPagesAllocated: {}, maxPagesPerColumn: {}, and 
maxLeafNodePages: {}",
+                "{} columnar bulkloader wrote maximum {} and last {} and used 
leafNodes: {}, tempPagesAllocated: {}, maxPagesPerColumn: {}, maxLeafNodePages: 
{}, denseLeafCount: {}, and sparseLeafCount: {}",
                 status, maxTupleCount, tupleCount, numberOfLeafNodes, 
numberOfTempConfiscatedPages,
-                maxNumberOfPagesForAColumn, maxNumberOfPagesInALeafNode);
+                maxNumberOfPagesForAColumn, maxNumberOfPagesInALeafNode, 
densePagesCount, sparseLeafsCount);
     }
 
     /*
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeLeafFrameFactory.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeLeafFrameFactory.java
index 93e68b0e4a..824ec8acf3 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeLeafFrameFactory.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeLeafFrameFactory.java
@@ -27,6 +27,7 @@ import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleRea
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleReaderWriterFactory;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleWriter;
 import org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnMetadata;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.IColumnProjectionInfo;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.cloud.buffercache.IColumnWriteContext;
 
@@ -63,6 +64,7 @@ public class ColumnBTreeLeafFrameFactory implements 
ITreeIndexFrameFactory {
     public ColumnBTreeReadLeafFrame createReadFrame(IColumnProjectionInfo 
columnProjectionInfo) {
         ITreeIndexTupleWriter rowTupleWriter = 
rowTupleWriterFactory.createTupleWriter();
         AbstractColumnTupleReader columnTupleReader = 
columnTupleWriterFactory.createColumnReader(columnProjectionInfo);
-        return new ColumnBTreeReadLeafFrame(rowTupleWriter, columnTupleReader);
+        ColumnProjectorType projectorType = 
columnProjectionInfo.getProjectorType();
+        return new ColumnBTreeReadLeafFrame(rowTupleWriter, columnTupleReader, 
projectorType);
     }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
index 33074238fb..bfd26d0be4 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeReadLeafFrame.java
@@ -28,6 +28,7 @@ import 
org.apache.hyracks.storage.am.common.api.ITreeIndexTupleWriter;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.AbstractColumnTupleReader;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnReadMultiPageOp;
 import org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnTupleIterator;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 import org.apache.hyracks.storage.common.buffercache.CachedPage;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.storage.common.buffercache.ICachedPage;
@@ -38,12 +39,14 @@ public final class ColumnBTreeReadLeafFrame extends 
AbstractColumnBTreeLeafFrame
     private final AbstractColumnTupleReader columnarTupleReader;
     private final ITreeIndexTupleReference leftMostTuple;
     private final ITreeIndexTupleReference rightMostTuple;
+    private final ColumnProjectorType projectorType;
     private IColumnPageZeroReader columnPageZeroReader;
 
-    public ColumnBTreeReadLeafFrame(ITreeIndexTupleWriter rowTupleWriter,
-            AbstractColumnTupleReader columnarTupleReader) {
+    public ColumnBTreeReadLeafFrame(ITreeIndexTupleWriter rowTupleWriter, 
AbstractColumnTupleReader columnarTupleReader,
+            ColumnProjectorType projectorType) {
         super(rowTupleWriter, 
columnarTupleReader.getPageZeroWriterFlavorSelector());
         this.columnarTupleReader = columnarTupleReader;
+        this.projectorType = projectorType;
         leftMostTuple = rowTupleWriter.createTupleReference();
         rightMostTuple = rowTupleWriter.createTupleReference();
     }
@@ -51,7 +54,7 @@ public final class ColumnBTreeReadLeafFrame extends 
AbstractColumnBTreeLeafFrame
     @Override
     protected void resetPageZeroReader() {
         columnPageZeroReader = 
pageZeroWriterFlavorSelector.createPageZeroReader(getFlagByte(), 
buf.capacity());
-        columnPageZeroReader.reset(buf);
+        columnPageZeroReader.reset(buf, projectorType);
         buf.position(columnPageZeroReader.getHeaderSize());
     }
 
@@ -170,7 +173,7 @@ public final class ColumnBTreeReadLeafFrame extends 
AbstractColumnBTreeLeafFrame
     }
 
     public ColumnBTreeReadLeafFrame createCopy() {
-        return new ColumnBTreeReadLeafFrame(rowTupleWriter, 
columnarTupleReader);
+        return new ColumnBTreeReadLeafFrame(rowTupleWriter, 
columnarTupleReader, projectorType);
     }
 
     @Override
diff --git 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
index f57eba3916..3f837a1d71 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/IColumnPageZeroReader.java
@@ -23,14 +23,15 @@ import java.util.BitSet;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import 
org.apache.hyracks.storage.am.lsm.btree.column.api.IColumnBufferProvider;
+import 
org.apache.hyracks.storage.am.lsm.btree.column.api.projection.ColumnProjectorType;
 
 public interface IColumnPageZeroReader {
 
-    default void reset(ByteBuffer pageZeroBuf) {
-        reset(pageZeroBuf, AbstractColumnBTreeLeafFrame.HEADER_SIZE);
+    default void reset(ByteBuffer pageZeroBuf, ColumnProjectorType 
projectorType) {
+        reset(pageZeroBuf, projectorType, 
AbstractColumnBTreeLeafFrame.HEADER_SIZE);
     }
 
-    void reset(ByteBuffer pageZeroBuf, int headerSize);
+    void reset(ByteBuffer pageZeroBuf, ColumnProjectorType projectorType, int 
headerSize);
 
     int getColumnOffset(int columnIndex) throws HyracksDataException;
 

Reply via email to