Skip to content

Commit fff5c02

Browse files
committed
Fix limitPushed not set when limit comes through pushDownSort count path
pushDownSort with a non-zero sort.getCount() pushes a limit to requestBuilder directly, bypassing pushDownLimit() and leaving limitPushed=false. This causes build() to incorrectly reject radial vector search when the limit arrives via the sort-with-count path (e.g. PPL sort command). Set limitPushed=true in the sort.getCount() block alongside the existing requestBuilder.pushDownLimit() call. Signed-off-by: Eric Wei <mengwei.eric@gmail.com>
1 parent 1090b36 commit fff5c02

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/scan/VectorSearchQueryBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ public boolean pushDownSort(LogicalSort sort) {
118118
// but PPL or future callers may set a non-zero count to combine sort+limit in one node.
119119
if (sort.getCount() != 0) {
120120
validateLimitWithinK(sort.getCount());
121+
limitPushed = true;
121122
requestBuilder.pushDownLimit(sort.getCount(), 0);
122123
}
123124
return true;

opensearch/src/test/java/org/opensearch/sql/opensearch/storage/scan/VectorSearchQueryBuilderTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,31 @@ void pushDownSortNonScoreRejectedUnderEfficientMode() {
536536
assertTrue(ex.getMessage().contains("unsupported sort expression"));
537537
}
538538

539+
@Test
540+
void buildSucceedsRadialWithSortEmbeddedLimit() {
541+
var requestBuilder = createRequestBuilder();
542+
var knnQuery = new WrapperQueryBuilder("{\"knn\":{}}");
543+
var builder =
544+
new VectorSearchQueryBuilder(requestBuilder, knnQuery, Map.of("max_distance", "10.0"));
545+
546+
var dummyChild = new LogicalValues(Collections.emptyList());
547+
// LogicalSort with count=50 simulates PPL sort-with-limit path
548+
var sort =
549+
new org.opensearch.sql.planner.logical.LogicalSort(
550+
dummyChild,
551+
50,
552+
List.of(
553+
org.apache.commons.lang3.tuple.ImmutablePair.of(
554+
org.opensearch.sql.ast.tree.Sort.SortOption.DEFAULT_DESC,
555+
new ReferenceExpression("_score", ExprCoreType.FLOAT))));
556+
557+
builder.pushDownSort(sort);
558+
559+
// build() should not reject — limitPushed must be true via pushDownSort's count path
560+
OpenSearchRequestBuilder result = builder.build();
561+
assertNotNull(result);
562+
}
563+
539564
private OpenSearchRequestBuilder createRequestBuilder() {
540565
return new OpenSearchRequestBuilder(
541566
mock(OpenSearchExprValueFactory.class), 10000, mock(Settings.class));

0 commit comments

Comments
 (0)