split legacyGetSortFromOp/getSortFromOp and reinstate legacy sort for legacy ops

This commit is contained in:
Stefano Lottini committed 2026-09-28 10:30:22 +02:00
1 parent aca86cdd7d
commit 8a3b2d60b1
16 files changed
+119 -56

No files matched your search

@@ -55,9 +55,9 @@ public class DataApiCollectionDeleteOneOpDispenser extends DataApiOpDispenser {
private CollectionDeleteOneOptions getCollectionDeleteOneOptions(ParsedOp op, long l) {
CollectionDeleteOneOptions options = new CollectionDeleteOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = getSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
return options;
}
@@ -56,9 +56,9 @@ public class DataApiCollectionFindOneAndDeleteOpDispenser extends DataApiOpDispe
private CollectionFindOneAndDeleteOptions getCollectionFindOneAndDeleteOptions(ParsedOp op, long l) {
CollectionFindOneAndDeleteOptions options = new CollectionFindOneAndDeleteOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = getSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -60,9 +60,9 @@ public class DataApiCollectionFindOneAndReplaceOpDispenser extends DataApiOpDisp
private CollectionFindOneAndReplaceOptions getCollectionFindOneAndReplaceOptions(ParsedOp op, long l) {
CollectionFindOneAndReplaceOptions options = new CollectionFindOneAndReplaceOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = getSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -59,10 +59,10 @@ public class DataApiCollectionFindOneAndUpdateOpDispenser extends DataApiOpDispe
private CollectionFindOneAndUpdateOptions getCollectionFindOneAndUpdateOptions(ParsedOp op, long l) {
CollectionFindOneAndUpdateOptions options = new CollectionFindOneAndUpdateOptions();
Sort sort = getSortFromOp(op, l);
Sort[] sorts = getSortFromOp(op, l);
Boolean upsert = getUpsertFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
if (sorts != null) {
options = options.sort(sorts);
}
if ( upsert != null ){
options = options.upsert(upsert);
@@ -55,9 +55,9 @@ public class DataApiCollectionFindOneOpDispenser extends DataApiOpDispenser {
private CollectionFindOneOptions getCollectionFindOneOptions(ParsedOp op, long l) {
CollectionFindOneOptions options = new CollectionFindOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = getSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -55,9 +55,9 @@ public class DataApiCollectionFindOpDispenser extends DataApiOpDispenser {
private CollectionFindOptions getCollectionFindOptions(ParsedOp op, long l) {
CollectionFindOptions options = new CollectionFindOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = getSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -55,9 +55,9 @@ public class DataApiCollectionLegacyDeleteOneOpDispenser extends DataApiOpDispen
private CollectionDeleteOneOptions getCollectionDeleteOneOptions(ParsedOp op, long l) {
CollectionDeleteOneOptions options = new CollectionDeleteOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
return options;
}
@@ -56,9 +56,9 @@ public class DataApiCollectionLegacyFindOneAndDeleteOpDispenser extends DataApiO
private CollectionFindOneAndDeleteOptions getCollectionFindOneAndDeleteOptions(ParsedOp op, long l) {
CollectionFindOneAndDeleteOptions options = new CollectionFindOneAndDeleteOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -63,9 +63,9 @@ public class DataApiCollectionLegacyFindOneAndReplaceOpDispenser extends DataApi
private CollectionFindOneAndReplaceOptions getCollectionFindOneAndReplaceOptions(ParsedOp op, long l) {
CollectionFindOneAndReplaceOptions options = new CollectionFindOneAndReplaceOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -58,10 +58,10 @@ public class DataApiCollectionLegacyFindOneAndUpdateOpDispenser extends DataApiO
private CollectionFindOneAndUpdateOptions getCollectionLegacyFindOneAndUpdateOptions(ParsedOp op, long l) {
CollectionFindOneAndUpdateOptions options = new CollectionFindOneAndUpdateOptions();
Sort sort = getSortFromOp(op, l);
Sort[] sorts = legacyGetSortFromOp(op, l);
Boolean upsert = getUpsertFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
if (sorts != null) {
options = options.sort(sorts);
}
if ( upsert != null ){
options = options.upsert(upsert);
@@ -55,9 +55,9 @@ public class DataApiCollectionLegacyFindOneOpDispenser extends DataApiOpDispense
private CollectionFindOneOptions getCollectionFindOneOptions(ParsedOp op, long l) {
CollectionFindOneOptions options = new CollectionFindOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -55,9 +55,9 @@ public class DataApiCollectionLegacyFindOpDispenser extends DataApiOpDispenser {
private CollectionFindOptions getCollectionFindOptions(ParsedOp op, long l) {
CollectionFindOptions options = new CollectionFindOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -63,9 +63,9 @@ public class DataApiCollectionLegacyReplaceOneOpDispenser extends DataApiOpDispe
private CollectionReplaceOneOptions getCollectionReplaceOneOptions(ParsedOp op, long l) {
CollectionReplaceOneOptions options = new CollectionReplaceOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Projection[] projection = getProjectionFromOp(op, l);
if (projection != null) {
@@ -60,11 +60,10 @@ public class DataApiCollectionLegacyUpdateOneOpDispenser extends DataApiOpDispen
private CollectionUpdateOneOptions getCollectionUpdateOneOptions(ParsedOp op, long l) {
CollectionUpdateOneOptions options = new CollectionUpdateOneOptions();
Sort sort = getSortFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
Sort[] sorts = legacyGetSortFromOp(op, l);
if (sorts != null) {
options = options.sort(sorts);
}
Optional<LongFunction<Boolean>> upsertFunction = op.getAsOptionalFunction("upsert", Boolean.class);
if (upsertFunction.isPresent()) {
options = options.upsert(upsertFunction.get().apply(l));
@@ -60,10 +60,10 @@ public class DataApiCollectionUpdateOneOpDispenser extends DataApiOpDispenser {
private CollectionUpdateOneOptions getCollectionUpdateOneOptions(ParsedOp op, long l) {
CollectionUpdateOneOptions options = new CollectionUpdateOneOptions();
Sort sort = getSortFromOp(op, l);
Sort[] sorts = getSortFromOp(op, l);
Boolean upsert = getUpsertFromOp(op, l);
if (sort != null) {
options = options.sort(sort);
if (sorts != null) {
options = options.sort(sorts);
}
if ( upsert != null ){
options = options.upsert(upsert);
@@ -39,6 +39,7 @@ import io.nosqlbench.adapters.api.templating.ParsedOp;
import java.util.*;
import java.util.function.LongFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public abstract class DataApiOpDispenser extends BaseOpDispenser<DataApiBaseOp, DataApiSpace> {
@@ -52,8 +53,8 @@ public abstract class DataApiOpDispenser extends BaseOpDispenser<DataApiBaseOp,
this.spaceFunction = adapter.getSpaceFunc(op);
}
protected Sort getSortFromOp(ParsedOp op, long l) {
Sort sort = null;
protected Sort[] getSortFromOp(ParsedOp op, long l) {
List<Sort> sorts = null;
long sortKeyCount = Stream.of("sort", "vector", "vectorize").filter(op::isDefined).count();
if (sortKeyCount > 1) {
@@ -66,19 +67,30 @@ public abstract class DataApiOpDispenser extends BaseOpDispenser<DataApiBaseOp,
if (sortFunction.isPresent()) {
@SuppressWarnings("unchecked")
Map<String,Object> sortFields = sortFunction.get().apply(l);
String sortOrder = sortFields.get("type").toString();
String sortField = sortFields.get("field").toString();
switch(sortOrder) {
case "asc" -> sort = Sort.ascending(sortField);
case "desc" -> sort = Sort.descending(sortField);
sorts = sortFields.entrySet().stream()
.map(e -> {
String field = e.getKey();
String sortOrder = String.valueOf(e.getValue()).trim();
if (sortOrder.equalsIgnoreCase("asc") || sortOrder.equalsIgnoreCase("ascending")) {
return Sort.ascending(field);
} else if (sortOrder.equalsIgnoreCase("desc") || sortOrder.equalsIgnoreCase("descending")) {
return Sort.descending(field);
} else {
throw new OpConfigError(
"Invalid sort order '" + sortOrder + "' for field '" + field +
"'; expected 'asc' or 'desc' (case-insensitive)."
);
}
})
.collect(Collectors.toList());
}
if (op.isDefined("vector")) {
float[] vector = getVectorValues(op, l);
if (vector != null) {
// TODO use DataAPIVector as soon as the client allows here:
sort = Sort.vector(vector);
sorts = List.of(Sort.vector(vector));
}
}
@@ -86,11 +98,14 @@ public abstract class DataApiOpDispenser extends BaseOpDispenser<DataApiBaseOp,
Optional<LongFunction<String>> vzeFunction = op.getAsOptionalFunction("vectorize", String.class);
if (vzeFunction.isPresent()){
String vectorize = vzeFunction.get().apply(l);
sort = Sort.vectorize(vectorize);
sorts = List.of(Sort.vectorize(vectorize));
}
}
return sort;
if (sorts != null) {
return sorts.toArray(new Sort[0]);
}
return null;
}
protected Filter getFilterFromOp(ParsedOp op, long l) {
@@ -534,6 +549,55 @@ public abstract class DataApiOpDispenser extends BaseOpDispenser<DataApiBaseOp,
return filter;
}
/*
sort:
field: the_field
type: desc
*/
protected Sort[] legacyGetSortFromOp(ParsedOp op, long l) {
List<Sort> sorts = null;
long sortKeyCount = Stream.of("sort", "vector", "vectorize").filter(op::isDefined).count();
if (sortKeyCount > 1) {
throw new OpConfigError(
"Can sort by only one of: 'sort' (regular asc/desc), 'vector', 'vectorize' in an op."
);
}
Optional<LongFunction<Map>> sortFunction = op.getAsOptionalFunction("sort", Map.class);
if (sortFunction.isPresent()) {
@SuppressWarnings("unchecked")
Map<String,Object> sortFields = sortFunction.get().apply(l);
String sortOrder = sortFields.get("type").toString();
String sortField = sortFields.get("field").toString();
switch(sortOrder) {
case "asc" -> sorts = List.of(Sort.ascending(sortField));
case "desc" -> sorts = List.of(Sort.descending(sortField));
}
}
if (op.isDefined("vector")) {
float[] vector = getVectorValues(op, l);
if (vector != null) {
// TODO use DataAPIVector as soon as the client allows here:
sorts = List.of(Sort.vector(vector));
}
}
if (op.isDefined("vectorize")) {
Optional<LongFunction<String>> vzeFunction = op.getAsOptionalFunction("vectorize", String.class);
if (vzeFunction.isPresent()){
String vectorize = vzeFunction.get().apply(l);
sorts = List.of(Sort.vectorize(vectorize));
}
}
if (sorts != null) {
return sorts.toArray(new Sort[0]);
}
return null;
}
@SuppressWarnings("unchecked")
protected CollectionDefinition legacyGetCollectionDefinitionFromOp(ParsedOp op, long l) {
CollectionDefinition optionsBldr = new CollectionDefinition();