use of org.apache.sis.internal.geoapi.filter.SortBy in project sis by apache.
the class FeatureSubset method features.
/**
* Returns a stream of all features contained in this dataset.
*/
@Override
public Stream<AbstractFeature> features(final boolean parallel) throws DataStoreException {
Stream<AbstractFeature> stream = source.features(parallel);
/*
* Apply filter.
*/
final Filter<? super AbstractFeature> selection = query.getSelection();
if (selection != null && !selection.equals(Filter.include())) {
stream = stream.filter(selection);
}
/*
* Apply sorting.
*/
final SortBy<AbstractFeature> sortBy = query.getSortBy();
if (sortBy != null) {
stream = stream.sorted(sortBy);
}
/*
* Apply offset.
*/
final long offset = query.getOffset();
if (offset > 0) {
stream = stream.skip(offset);
}
/*
* Apply limit.
*/
final OptionalLong limit = query.getLimit();
if (limit.isPresent()) {
stream = stream.limit(limit.getAsLong());
}
/*
* Transform feature instances.
* Note: "projection" here is in relational database sense, not map projection.
*/
final FeatureQuery.NamedExpression[] projection = query.getProjection();
if (projection != null) {
@SuppressWarnings({ "unchecked", "rawtypes" }) final Expression<? super AbstractFeature, ?>[] expressions = new Expression[projection.length];
for (int i = 0; i < expressions.length; i++) {
expressions[i] = projection[i].expression;
}
final DefaultFeatureType type = getType();
final String[] names = FeatureUtilities.getNames(type.getProperties(false));
stream = stream.map(t -> {
final AbstractFeature f = type.newInstance();
for (int i = 0; i < expressions.length; i++) {
f.setPropertyValue(names[i], expressions[i].apply(t));
}
return f;
});
}
return stream;
}
Aggregations