diff --git a/xtraplatform-features-sql/src/main/java/de/ii/xtraplatform/features/sql/app/FeatureDecoderSql.java b/xtraplatform-features-sql/src/main/java/de/ii/xtraplatform/features/sql/app/FeatureDecoderSql.java index f246e7a7d..e80a2a678 100644 --- a/xtraplatform-features-sql/src/main/java/de/ii/xtraplatform/features/sql/app/FeatureDecoderSql.java +++ b/xtraplatform-features-sql/src/main/java/de/ii/xtraplatform/features/sql/app/FeatureDecoderSql.java @@ -7,6 +7,7 @@ */ package de.ii.xtraplatform.features.sql.app; +import com.google.common.collect.ImmutableSet; import de.ii.xtraplatform.features.domain.Decoder; import de.ii.xtraplatform.features.domain.DecoderFactory; import de.ii.xtraplatform.features.domain.FeatureEventHandler; @@ -34,6 +35,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +48,7 @@ public class FeatureDecoderSql private final Map mappings; private final Query query; - private final List> mainTablePaths; + private final Set> mainTablePaths; private final FeatureStoreMultiplicityTracker multiplicityTracker; private final boolean isSingleFeature; private final Map subDecoderFactories; @@ -79,7 +81,9 @@ public FeatureDecoderSql( this.wkbDialect = wkbDialect; this.mainTablePaths = - sqlQueryMappings.stream().map(s -> s.getMainTable().getFullPath()).toList(); + sqlQueryMappings.stream() + .map(s -> s.getMainTable().getFullPath()) + .collect(ImmutableSet.toImmutableSet()); List> multiTables = sqlQueryMappings.stream() .flatMap(s -> s.getTables().stream()) diff --git a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/NestingTracker.java b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/NestingTracker.java index 615d4bbfa..449062923 100644 --- a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/NestingTracker.java +++ b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/NestingTracker.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +26,9 @@ public class NestingTracker { private final FeatureEventHandler> downstream; private final ModifiableContext context; - private final List> mainPaths; + // a Set so the per-value isNotMain() membership test is O(1) instead of a linear scan of + // List> with element-wise list equality + private final Set> mainPaths; private final boolean flattenObjects; private final boolean flattenArrays; private final List nestingStack; @@ -36,7 +39,7 @@ public class NestingTracker { public > NestingTracker( FeatureEventHandler downstream, T context, - List> mainPaths, + Set> mainPaths, boolean flattenObjects, boolean flattenArrays, boolean skippable) {