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

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


The following commit(s) were added to refs/heads/master by this push:
     new c9bb808863 [ASTERIXDB-3159][STO] Fix point lookups on columnar dataseet
c9bb808863 is described below

commit c9bb8088631bc0d0bab62d319f9fc532caa33e59
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Tue Mar 28 17:02:51 2023 -0700

    [ASTERIXDB-3159][STO] Fix point lookups on columnar dataseet
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    This patch fixes the issue of running out of values
    when point lookups are performed against columnar
    datasets. The issue was that the next point lookup
    (using the stateful batch point lookup) would
    proceed without testing if:
       - the tuple key == the required key
    
    Change-Id: I46075b62daa2389f83f214cbe76e41a48763b9ed
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17455
    Reviewed-by: Murtadha Hubail <[email protected]>
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
---
 .../column/assembler/PrimitiveValueAssembler.java  |  2 +-
 .../assembler/RepeatedPrimitiveValueAssembler.java |  2 +-
 .../column/operation/query/ColumnAssembler.java    |  1 +
 .../impls/btree/ColumnBTreePointSearchCursor.java  | 11 ++++++++++
 .../impls/btree/ColumnBTreeRangeSearchCursor.java  | 24 ++++++++++++++--------
 5 files changed, 29 insertions(+), 11 deletions(-)

diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
index 9592a12da9..4f7778c2a0 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/PrimitiveValueAssembler.java
@@ -31,7 +31,7 @@ public class PrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
     @Override
     public int next() throws HyracksDataException {
         if (!reader.next()) {
-            throw new IllegalAccessError("no more values");
+            throw new IllegalAccessError("no more values, column index: " + 
getColumnIndex());
         } else if (reader.isNull() && (isDelegate() || reader.getLevel() + 1 
== level)) {
             addNullToAncestor(reader.getLevel());
         } else if (reader.isValue()) {
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
index 8fa228f0df..d4455ecb57 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/assembler/RepeatedPrimitiveValueAssembler.java
@@ -41,7 +41,7 @@ class RepeatedPrimitiveValueAssembler extends 
AbstractPrimitiveValueAssembler {
     @Override
     public int next() throws HyracksDataException {
         if (!reader.next()) {
-            throw new IllegalStateException("No more values");
+            throw new IllegalAccessError("no more values, column index: " + 
getColumnIndex());
         } else if (reader.isNull() && (!arrays.isEmpty() || reader.getLevel() 
+ 1 == level)) {
             /*
              * There are two cases here for where the null belongs to:
diff --git 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
index c329d67916..2e60ee72c2 100644
--- 
a/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
+++ 
b/asterixdb/asterix-column/src/main/java/org/apache/asterix/column/operation/query/ColumnAssembler.java
@@ -92,6 +92,7 @@ public final class ColumnAssembler {
     }
 
     public void skip(int count) throws HyracksDataException {
+        tupleIndex += count;
         for (int i = 0; i < assemblers.size(); i++) {
             assemblers.get(i).skip(count);
         }
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/ColumnBTreePointSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreePointSearchCursor.java
index c93e77e1c8..683e0995da 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreePointSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreePointSearchCursor.java
@@ -32,6 +32,17 @@ public class ColumnBTreePointSearchCursor extends 
ColumnBTreeRangeSearchCursor
         super(frame, stats, index);
     }
 
+    @Override
+    public boolean doHasNext() {
+        // If we found the exact key, return true
+        return yieldFirstCall;
+    }
+
+    @Override
+    protected boolean shouldYieldFirstCall() throws HyracksDataException {
+        return pred.getLowKeyComparator().compare(lowKey, frameTuple) == 0;
+    }
+
     @Override
     public void doClose() throws HyracksDataException {
         pageId = IBufferCache.INVALID_PAGEID;
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/ColumnBTreeRangeSearchCursor.java
 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeRangeSearchCursor.java
index 7ebdc8bef6..33234944cb 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeRangeSearchCursor.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree-column/src/main/java/org/apache/hyracks/storage/am/lsm/btree/column/impls/btree/ColumnBTreeRangeSearchCursor.java
@@ -53,7 +53,7 @@ public class ColumnBTreeRangeSearchCursor extends 
EnforcedIndexCursor
     protected RangePredicate pred;
     protected ITupleReference lowKey;
     protected ITupleReference highKey;
-    protected boolean firstNextCall;
+    protected boolean yieldFirstCall;
 
     protected final IIndexCursorStats stats;
 
@@ -92,7 +92,7 @@ public class ColumnBTreeRangeSearchCursor extends 
EnforcedIndexCursor
     @Override
     public boolean doHasNext() throws HyracksDataException {
         int nextLeafPage;
-        if (frameTuple.isConsumed() && !firstNextCall) {
+        if (frameTuple.isConsumed() && !yieldFirstCall) {
             frameTuple.lastTupleReached();
             nextLeafPage = frame.getNextLeaf();
             if (nextLeafPage >= 0) {
@@ -132,14 +132,14 @@ public class ColumnBTreeRangeSearchCursor extends 
EnforcedIndexCursor
         reusablePredicate.setLowKeyComparator(originalKeyCmp);
         reusablePredicate.setHighKeyComparator(pred.getHighKeyComparator());
         reusablePredicate.setHighKey(pred.getHighKey(), 
pred.isHighKeyInclusive());
-        firstNextCall = true;
+        yieldFirstCall = false;
         advanceTupleToLowKey();
     }
 
     protected boolean isNextIncluded() throws HyracksDataException {
-        if (firstNextCall) {
+        if (yieldFirstCall) {
             //The first call of frameTuple.next() was done during the opening 
of the cursor
-            firstNextCall = false;
+            yieldFirstCall = false;
             return true;
         } else if (frameTuple.isConsumed()) {
             //All tuple were consumed
@@ -162,12 +162,10 @@ public class ColumnBTreeRangeSearchCursor extends 
EnforcedIndexCursor
              * Then:
              * No tuple will satisfy the search key. Consume the frameTuple to 
stop the search.
              */
-            firstNextCall = false;
             frameTuple.consume();
             return;
         } else if (lowKey == null) {
             // no lowKey was specified, start from tupleIndex = 0
-            frameTuple.next();
             return;
         }
 
@@ -179,12 +177,20 @@ public class ColumnBTreeRangeSearchCursor extends 
EnforcedIndexCursor
             stop = isLessOrEqual(lowKey, frameTuple, pred.isLowKeyInclusive());
             counter++;
         }
-        //Advance all columns to the proper position if needed
-        if (counter - 1 > 0) {
+
+        // Only proceed if needed
+        yieldFirstCall = shouldYieldFirstCall();
+        // Advance all columns to the proper position if needed
+        if (yieldFirstCall && counter - 1 > 0) {
             frameTuple.skip(counter - 1);
         }
     }
 
+    protected boolean shouldYieldFirstCall() throws HyracksDataException {
+        // Proceed if the highKey is null or the current tuple's key is less 
than (or equal) the highKey
+        return highKey == null || isLessOrEqual(frameTuple, highKey, 
pred.isHighKeyInclusive());
+    }
+
     protected void releasePages() throws HyracksDataException {
         //Unpin all column pages first
         frameTuple.unpinColumnsPages();

Reply via email to