This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 987a3262e4a03f757cad94739a843640949543c7
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri Sep 10 10:35:30 2021 +0200

    Apply filter optimization before to create a feature subset.
---
 .../src/main/java/org/apache/sis/storage/FeatureQuery.java   | 12 ++++++++++--
 .../src/main/java/org/apache/sis/storage/FeatureSubset.java  |  1 +
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureQuery.java 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureQuery.java
index d34fa2e..927ec64 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureQuery.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureQuery.java
@@ -30,6 +30,7 @@ import org.apache.sis.feature.builder.PropertyTypeBuilder;
 import org.apache.sis.internal.feature.FeatureExpression;
 import org.apache.sis.internal.filter.SortByComparator;
 import org.apache.sis.internal.storage.Resources;
+import org.apache.sis.filter.Optimization;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.Classes;
 import org.apache.sis.util.collection.Containers;
@@ -498,10 +499,17 @@ public class FeatureQuery extends Query implements 
Cloneable, Serializable {
      *
      * @param  source  the set of features to filter, sort or process.
      * @return a view over the given feature set containing only the filtered 
feature instances.
+     * @throws DataStoreException if an error occurred during creation of the 
subset.
      */
-    final FeatureSet execute(final FeatureSet source) {
+    final FeatureSet execute(final FeatureSet source) throws 
DataStoreException {
         ArgumentChecks.ensureNonNull("source", source);
-        return new FeatureSubset(source, clone());
+        final FeatureQuery query = clone();
+        if (query.selection != null) {
+            final Optimization optimization = new Optimization();
+            optimization.setFeatureType(source.getType());
+            query.selection = optimization.apply(query.selection);
+        }
+        return new FeatureSubset(source, query);
     }
 
     /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
index 47c98e0..5ee4507 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/FeatureSubset.java
@@ -62,6 +62,7 @@ final class FeatureSubset extends AbstractFeatureSet {
 
     /**
      * Creates a new set of features by filtering the given set using the 
given query.
+     * This given query is stored as-is (it is not cloned neither optimized).
      */
     FeatureSubset(final FeatureSet source, final FeatureQuery query) {
         super(source instanceof StoreListeners ? (StoreListeners) source : 
null);

Reply via email to