contrueCT commented on code in PR #2994:
URL: https://github.com/apache/hugegraph/pull/2994#discussion_r3371869110


##########
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/tx/GraphIndexTransaction.java:
##########
@@ -657,6 +663,185 @@ private IdHolder doIndexQuery(IndexLabel indexLabel, 
ConditionQuery query) {
         }
     }
 
+    private boolean needHstoreRangeIndexOrder(IndexLabel indexLabel) {
+        return this.store().provider().isHstore() &&
+               indexLabel.indexType().isRange();
+    }
+
+    private IdHolder doHstoreRangeIndexQuery(IndexLabel indexLabel,
+                                             ConditionQuery query) {
+        if (!query.paging()) {
+            if (query.noLimitAndOffset()) {
+                return this.doIndexQueryBatch(indexLabel, query);
+            }
+            Set<Id> ids = this.querySortedRangeIndexIds(indexLabel, query);
+            return this.newSortedRangeIndexBatchHolder(query, ids);
+        }
+        return new PagingIdHolder(query, q -> {
+            return this.querySortedRangeIndexPage(indexLabel, q);
+        });
+    }
+
+    private BatchIdHolder newSortedRangeIndexBatchHolder(ConditionQuery query,
+                                                         Set<Id> ids) {
+        List<Id> idList = new ArrayList<>(ids);
+        return new BatchIdHolder(query, Collections.emptyIterator(), batch -> {
+            throw new IllegalStateException("Unexpected sorted index fetcher");
+        }) {
+            private int offset = 0;
+
+            @Override
+            public boolean hasNext() {
+                return this.offset < idList.size();
+            }
+
+            @Override
+            public IdHolder next() {
+                if (!this.hasNext()) {
+                    throw new java.util.NoSuchElementException();
+                }
+                return this;
+            }
+
+            @Override
+            public PageIds fetchNext(String page, long batchSize) {

Review Comment:
   Good catch, thanks. I replaced the ad hoc holder with a dedicated 
SortedRangeBatchIdHolder that preserves the batch returned by peekNext() and 
then serves the same batch from fetchNext(), so joint-index/filtering won't 
skip the first prefetched ids. I also added GraphIndexTransactionTest coverage 
for both the peek-then-fetch path and the zero-remaining batch case.



##########
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/tx/GraphIndexTransaction.java:
##########
@@ -657,6 +663,185 @@ private IdHolder doIndexQuery(IndexLabel indexLabel, 
ConditionQuery query) {
         }
     }
 
+    private boolean needHstoreRangeIndexOrder(IndexLabel indexLabel) {
+        return this.store().provider().isHstore() &&
+               indexLabel.indexType().isRange();
+    }
+
+    private IdHolder doHstoreRangeIndexQuery(IndexLabel indexLabel,
+                                             ConditionQuery query) {
+        if (!query.paging()) {
+            if (query.noLimitAndOffset()) {
+                return this.doIndexQueryBatch(indexLabel, query);
+            }
+            Set<Id> ids = this.querySortedRangeIndexIds(indexLabel, query);
+            return this.newSortedRangeIndexBatchHolder(query, ids);
+        }
+        return new PagingIdHolder(query, q -> {
+            return this.querySortedRangeIndexPage(indexLabel, q);
+        });
+    }
+
+    private BatchIdHolder newSortedRangeIndexBatchHolder(ConditionQuery query,
+                                                         Set<Id> ids) {
+        List<Id> idList = new ArrayList<>(ids);
+        return new BatchIdHolder(query, Collections.emptyIterator(), batch -> {
+            throw new IllegalStateException("Unexpected sorted index fetcher");
+        }) {
+            private int offset = 0;
+
+            @Override
+            public boolean hasNext() {
+                return this.offset < idList.size();
+            }
+
+            @Override
+            public IdHolder next() {
+                if (!this.hasNext()) {
+                    throw new java.util.NoSuchElementException();
+                }
+                return this;
+            }
+
+            @Override
+            public PageIds fetchNext(String page, long batchSize) {
+                E.checkArgument(page == null,
+                                "Not support page parameter by BatchIdHolder");
+                if (!this.hasNext()) {
+                    return PageIds.EMPTY;
+                }
+
+                int end;
+                if (batchSize == Query.NO_LIMIT) {
+                    end = idList.size();
+                } else {
+                    end = (int) Math.min((long) idList.size(),
+                                         this.offset + batchSize);
+                }
+                Set<Id> batchIds = InsertionOrderUtil.newSet();
+                batchIds.addAll(idList.subList(this.offset, end));
+                this.offset = end;
+                return new PageIds(batchIds, PageState.EMPTY);
+            }
+
+            @Override
+            public Set<Id> all() {
+                Set<Id> allIds = InsertionOrderUtil.newSet();
+                allIds.addAll(idList);
+                return allIds;
+            }
+
+            @Override
+            public void close() {
+                this.offset = idList.size();
+            }
+        };
+    }
+
+    private Set<Id> querySortedRangeIndexIds(IndexLabel indexLabel,
+                                             ConditionQuery query) {
+        List<HugeIndex> indexes = this.querySortedRangeIndexes(indexLabel,
+                                                               query);
+        Set<Id> ids = InsertionOrderUtil.newSet();

Review Comment:
   Thanks, fixed. The sorted range fallback now propagates keepOrder() through 
QueryList batch/paging paths, and GraphTransaction will keep the input id order 
whenever the generated IdQuery explicitly requires it, even on backends that 
report supportsQuerySortByInputIds(). I also added QueryResultsTest coverage 
and registered the new unit tests in UnitTestSuite so this path is exercised by 
the unit-test profile.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to