Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import de.ii.xtraplatform.features.domain.Tuple;
import de.ii.xtraplatform.features.sql.app.SqlQueryTemplates.MetaQueryTemplate;
import de.ii.xtraplatform.features.sql.app.SqlQueryTemplates.ValueQueryTemplate;
import de.ii.xtraplatform.features.sql.domain.FeatureProviderSqlData.QueryGeneratorSettings;
import de.ii.xtraplatform.features.sql.domain.SchemaSql;
import de.ii.xtraplatform.features.sql.domain.SqlDialect;
import java.sql.Timestamp;
Expand All @@ -42,18 +43,28 @@ public class SqlQueryTemplatesDeriver
private final FilterEncoderSql filterEncoder;
private final boolean computeNumberMatched;
private final boolean computeNumberSkipped;
private final String nullOrder;

public SqlQueryTemplatesDeriver(
SchemaSql queryablesSchema,
FilterEncoderSql filterEncoder,
SqlDialect sqlDialect,
boolean computeNumberMatched,
boolean computeNumberSkipped) {
boolean computeNumberSkipped,
Optional<QueryGeneratorSettings.NullOrder> nullOrder) {
this.queryablesSchema = queryablesSchema;
this.sqlDialect = sqlDialect;
this.filterEncoder = filterEncoder;
this.computeNumberMatched = computeNumberMatched;
this.computeNumberSkipped = computeNumberSkipped;
this.nullOrder =
nullOrder
.map(
nulls ->
nulls == QueryGeneratorSettings.NullOrder.FIRST
? " NULLS FIRST"
: " NULLS LAST")
.orElse("");
}

@Override
Expand Down Expand Up @@ -252,9 +263,9 @@ private String getTableQuery(
index -> {
if (index < additionalSortKeys.size()
&& additionalSortKeys.get(index).getDirection() == Direction.DESCENDING) {
return sortFields.get(index) + " DESC";
return sortFields.get(index) + " DESC" + nullOrder;
}
return sortFields.get(index);
return sortFields.get(index) + nullOrder;
})
.filter(sortField -> sortField.startsWith("A."))
.map(sortField -> sortField.replace("A.", aliasesNested.get(0) + "."))
Expand Down Expand Up @@ -282,9 +293,9 @@ private String getTableQuery(
index -> {
if (index <= additionalSortKeys.size()
&& additionalSortKeys.get(index - 1).getDirection() == Direction.DESCENDING) {
return index + " DESC";
return index + " DESC" + nullOrder;
}
return String.valueOf(index);
return index + nullOrder;
})
.collect(Collectors.joining(","));

Expand Down Expand Up @@ -434,7 +445,12 @@ private String getOrderBy(List<SortKey> sortKeys) {
SortKey sortKey = sortKeys.get(i);

orderBy +=
CSKEY + "_" + i + (sortKey.getDirection() == Direction.DESCENDING ? " DESC" : "") + ", ";
CSKEY
+ "_"
+ i
+ (sortKey.getDirection() == Direction.DESCENDING ? " DESC" : "")
+ nullOrder
+ ", ";
}

orderBy += SKEY;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,8 @@ protected boolean onStartup() throws InterruptedException {
filterEncoder,
sqlDialect,
getData().getQueryGeneration().getComputeNumberMatched(),
true)))
true,
getData().getQueryGeneration().getNullOrder())))
.collect(Collectors.toList()));
})
.collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));
Expand All @@ -544,7 +545,8 @@ protected boolean onStartup() throws InterruptedException {
filterEncoder,
sqlDialect,
getData().getQueryGeneration().getComputeNumberMatched(),
false)))))
false,
getData().getQueryGeneration().getNullOrder())))))
.collect(ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue));

this.queryTransformer =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,11 @@ public ImmutableFeatureProviderSqlData.Builder fillRequiredFieldsWithPlaceholder
@JsonDeserialize(builder = ImmutableQueryGeneratorSettings.Builder.class)
interface QueryGeneratorSettings {

enum NullOrder {
FIRST,
LAST
}

@DocIgnore
@Value.Default
default int getChunkSize() {
Expand All @@ -159,6 +164,22 @@ default boolean getComputeNumberMatched() {
return true;
}

/**
* @langEn If no value is provided, the sort order of the underlying feature provider (typically
* `last` for ascending and `first` for descending) is used. `last` or `first` can be used
* to force a specific sort order, if some rows have null values.
* @langDe Ohne Angabe wird die Sortierreihenfolge des zugrunde liegenden Feature-Providers
* verwendet (normalerweise `last` für aufsteigend und `first` für absteigend). `last` oder
* `first` kann verwendet werden, um eine bestimmte Sortierreihenfolge für Spalten mit
* Nullwerten zu erzwingen.
* @default -
* @since v4.3
*/
@Value.Default
default Optional<NullOrder> getNullOrder() {
return Optional.empty();
}

// TODO
@DocIgnore
@Value.Default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ class SqlQueryTemplatesDeriverSpec extends Specification {
@Shared
FilterEncoderSql filterEncoder = new FilterEncoderSql(OgcCrs.CRS84, new SqlDialectPgis(), null, null, new CqlImpl(), null)
@Shared
SqlQueryTemplatesDeriver td = new SqlQueryTemplatesDeriver(null, filterEncoder, new SqlDialectPgis(), true, false)
SqlQueryTemplatesDeriver td = new SqlQueryTemplatesDeriver(null, filterEncoder, new SqlDialectPgis(), true, false, Optional.empty())
@Shared
SqlQueryTemplatesDeriver tdNoNm = new SqlQueryTemplatesDeriver(null, filterEncoder, new SqlDialectPgis(), false, false)
SqlQueryTemplatesDeriver tdNoNm = new SqlQueryTemplatesDeriver(null, filterEncoder, new SqlDialectPgis(), false, false, Optional.empty())

@Shared
QuerySchemaDeriver schemaDeriver
Expand Down