You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2021/11/03 13:28:50 UTC

[ignite-3] branch main updated: IGNITE-15462 Replace usages of map of int to IntMap where possible in Calcite module. (#411)

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

amashenkov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new a323c22  IGNITE-15462 Replace usages of map of int to IntMap where possible in Calcite module. (#411)
a323c22 is described below

commit a323c22d371972f6e3af935e5b9b455b5d5f00b0
Author: Vladimir Ermakov <85...@users.noreply.github.com>
AuthorDate: Wed Nov 3 18:58:43 2021 +0530

    IGNITE-15462 Replace usages of map of int to IntMap where possible in Calcite module. (#411)
---
 .../calcite/metadata/FragmentDescription.java      |   8 +-
 .../query/calcite/metadata/IgniteMdCollation.java  |  19 +-
 .../calcite/prepare/AbstractMultiStepPlan.java     |   9 +-
 .../query/calcite/prepare/MultiStepPlan.java       |   4 +-
 .../query/calcite/prepare/QueryTemplate.java       |  10 +-
 .../query/calcite/rel/IgniteMergeJoin.java         |  36 ++-
 .../query/calcite/rel/IgniteProject.java           |   9 +-
 .../processors/query/calcite/trait/TraitUtils.java |   5 +-
 .../processors/query/calcite/util/RexUtils.java    |  19 +-
 modules/core/pom.xml                               | 293 +++++++++++++++++++++
 parent/pom.xml                                     |   7 +
 11 files changed, 365 insertions(+), 54 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
index b95349a..469e144 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.processors.query.calcite.metadata;
 
+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import java.io.Serializable;
 import java.util.List;
-import java.util.Map;
 
 /**
  *
@@ -43,7 +43,7 @@ public class FragmentDescription implements Serializable {
     /**
      *
      */
-    private Map<Long, List<String>> remoteSources;
+    private Long2ObjectOpenHashMap<List<String>> remoteSources;
 
     /**
      *
@@ -55,7 +55,7 @@ public class FragmentDescription implements Serializable {
      *
      */
     public FragmentDescription(long fragmentId, FragmentMapping mapping, ColocationGroup target,
-            Map<Long, List<String>> remoteSources) {
+            Long2ObjectOpenHashMap<List<String>> remoteSources) {
         this.fragmentId = fragmentId;
         this.mapping = mapping;
         this.target = target;
@@ -86,7 +86,7 @@ public class FragmentDescription implements Serializable {
     /**
      *
      */
-    public Map<Long, List<String>> remotes() {
+    public Long2ObjectOpenHashMap<List<String>> remotes() {
         return remoteSources;
     }
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdCollation.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdCollation.java
index c4e7ab1..d2a823d 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdCollation.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/IgniteMdCollation.java
@@ -20,12 +20,13 @@ package org.apache.ignite.internal.processors.query.calcite.metadata;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import com.google.common.collect.ImmutableList;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -300,9 +301,9 @@ public class IgniteMdCollation implements MetadataHandler<BuiltInMetadata.Collat
         if (inputCollations == null || inputCollations.isEmpty()) {
             return List.of();
         }
-        final Map<Integer, List<Integer>> targets = new HashMap<>();
-        final Map<Integer, SqlMonotonicity> targetsWithMonotonicity =
-                new HashMap<>();
+        final Int2ObjectOpenHashMap<List<Integer>> targets = new Int2ObjectOpenHashMap<>();
+        final Int2ObjectOpenHashMap<SqlMonotonicity> targetsWithMonotonicity =
+                new Int2ObjectOpenHashMap<>();
         for (Ord<RexNode> project : Ord.<RexNode>zip(projects)) {
             if (project.e instanceof RexInputRef) {
                 targets.compute(((RexSlot) project.e).getIndex(), (k, v) -> {
@@ -349,10 +350,8 @@ public class IgniteMdCollation implements MetadataHandler<BuiltInMetadata.Collat
             collations.add(RelCollations.of(fieldCollations));
         }
 
-        final List<RelFieldCollation> fieldCollationsForRexCalls =
-                new ArrayList<>();
-        for (Map.Entry<Integer, SqlMonotonicity> entry
-                : targetsWithMonotonicity.entrySet()) {
+        final List<RelFieldCollation> fieldCollationsForRexCalls = new ArrayList<>();
+        for (Int2ObjectMap.Entry<SqlMonotonicity> entry : targetsWithMonotonicity.int2ObjectEntrySet()) {
             final SqlMonotonicity value = entry.getValue();
             switch (value) {
                 case NOT_MONOTONIC:
@@ -360,8 +359,8 @@ public class IgniteMdCollation implements MetadataHandler<BuiltInMetadata.Collat
                     break;
                 default:
                     fieldCollationsForRexCalls.add(
-                            new RelFieldCollation(entry.getKey(),
-                                    RelFieldCollation.Direction.of(value)));
+                        new RelFieldCollation(entry.getIntKey(),
+                            RelFieldCollation.Direction.of(value)));
                     break;
             }
         }
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
index ac8652b..967e5c1 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/AbstractMultiStepPlan.java
@@ -18,11 +18,10 @@
 package org.apache.ignite.internal.processors.query.calcite.prepare;
 
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
-import static org.apache.ignite.internal.util.IgniteUtils.newHashMap;
+import static org.apache.ignite.internal.util.IgniteUtils.capacity;
 
-import java.util.HashMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import org.apache.ignite.internal.processors.query.calcite.metadata.ColocationGroup;
 import org.apache.ignite.internal.processors.query.calcite.metadata.FragmentMapping;
@@ -99,14 +98,14 @@ public abstract class AbstractMultiStepPlan implements MultiStepPlan {
     
     /** {@inheritDoc} */
     @Override
-    public Map<Long, List<String>> remotes(Fragment fragment) {
+    public Long2ObjectOpenHashMap<List<String>> remotes(Fragment fragment) {
         List<IgniteReceiver> remotes = fragment.remotes();
     
         if (nullOrEmpty(remotes)) {
             return null;
         }
         
-        HashMap<Long, List<String>> res = newHashMap(remotes.size());
+        Long2ObjectOpenHashMap<List<String>> res = new Long2ObjectOpenHashMap<>(capacity(remotes.size()));
     
         for (IgniteReceiver remote : remotes) {
             res.put(remote.exchangeId(), mapping(remote.sourceFragmentId()).nodeIds());
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/MultiStepPlan.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/MultiStepPlan.java
index da13521..2fe8614 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/MultiStepPlan.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/MultiStepPlan.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.processors.query.calcite.prepare;
 
+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
 import java.util.List;
-import java.util.Map;
 import org.apache.ignite.internal.processors.query.calcite.metadata.ColocationGroup;
 import org.apache.ignite.internal.processors.query.calcite.metadata.FragmentMapping;
 
@@ -50,7 +50,7 @@ public interface MultiStepPlan extends QueryPlan {
     /**
      *
      */
-    Map<Long, List<String>> remotes(Fragment fragment);
+    Long2ObjectOpenHashMap<List<String>> remotes(Fragment fragment);
 
     /**
      * Inits query fragments.
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryTemplate.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryTemplate.java
index 1b09c6c..c2c6d54 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryTemplate.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/QueryTemplate.java
@@ -20,10 +20,9 @@ package org.apache.ignite.internal.processors.query.calcite.prepare;
 import static org.apache.ignite.internal.util.CollectionUtils.first;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
+import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
@@ -124,7 +123,7 @@ public class QueryTemplate {
     private List<Fragment> replace(List<Fragment> fragments, Fragment fragment, List<Fragment> replacement) {
         assert !nullOrEmpty(replacement);
 
-        Map<Long, Long> newTargets = new HashMap<>();
+        Long2LongOpenHashMap newTargets = new Long2LongOpenHashMap();
         for (Fragment fragment0 : replacement) {
             for (IgniteReceiver remote : fragment0.remotes()) {
                 newTargets.put(remote.exchangeId(), fragment0.fragmentId());
@@ -137,9 +136,10 @@ public class QueryTemplate {
                 fragment0 = first(replacement);
             } else if (!fragment0.rootFragment()) {
                 IgniteSender sender = (IgniteSender) fragment0.root();
-                Long newTargetId = newTargets.get(sender.exchangeId());
 
-                if (newTargetId != null) {
+                long newTargetId = newTargets.getOrDefault(sender.exchangeId(), Long.MIN_VALUE);
+
+                if (newTargetId != Long.MIN_VALUE) {
                     sender = new IgniteSender(sender.getCluster(), sender.getTraitSet(),
                             sender.getInput(), sender.exchangeId(), newTargetId, sender.distribution());
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java
index e89e069..c5a845b 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteMergeJoin.java
@@ -21,10 +21,10 @@ import static org.apache.ignite.internal.processors.query.calcite.trait.TraitUti
 import static org.apache.ignite.internal.processors.query.calcite.util.Commons.isPrefix;
 import static org.apache.ignite.internal.processors.query.calcite.util.Commons.maxPrefix;
 
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.calcite.plan.RelOptCluster;
@@ -33,6 +33,7 @@ import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelCollations;
+import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelInput;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelWriter;
@@ -42,6 +43,7 @@ import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.mapping.IntPair;
 import org.apache.ignite.internal.processors.query.calcite.externalize.RelInputEx;
 import org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCost;
 import org.apache.ignite.internal.processors.query.calcite.metadata.cost.IgniteCostFactory;
@@ -177,17 +179,21 @@ public class IgniteMergeJoin extends AbstractIgniteJoin {
             List<RelTraitSet> inputTraits
     ) {
         RelCollation collation = TraitUtils.collation(nodeTraits);
-        RelTraitSet left = inputTraits.get(0);
-        RelTraitSet right = inputTraits.get(1);
         
         int rightOff = this.left.getRowType().getFieldCount();
         
-        Map<Integer, Integer> rightToLeft = joinInfo.pairs().stream()
-                .collect(Collectors.toMap(p -> p.target, p -> p.source));
+        List<IntPair> pairs = joinInfo.pairs();
+        
+        Int2IntOpenHashMap rightToLeft = new Int2IntOpenHashMap(pairs.size());
+        
+        for (IntPair pair : pairs) {
+            rightToLeft.put(pair.target, pair.source);
+        }
         
         List<Integer> collationLeftPrj = new ArrayList<>();
         
-        for (Integer c : collation.getKeys()) {
+        for (RelFieldCollation fieldCollation : collation.getFieldCollations()) {
+            int c = fieldCollation.getFieldIndex();
             collationLeftPrj.add(
                     c >= rightOff ? rightToLeft.get(c - rightOff) : c
             );
@@ -197,16 +203,21 @@ public class IgniteMergeJoin extends AbstractIgniteJoin {
         
         List<Integer> newLeftCollation;
         List<Integer> newRightCollation;
-        
-        Map<Integer, Integer> leftToRight = joinInfo.pairs().stream()
-                .collect(Collectors.toMap(p -> p.source, p -> p.target));
-        
+
+        Int2IntOpenHashMap leftToRight = new Int2IntOpenHashMap(pairs.size());
+
+        for (IntPair pair : pairs) {
+            leftToRight.put(pair.source, pair.target);
+        }
+
         if (isPrefix(collationLeftPrj, joinInfo.leftKeys)) { // preserve collation
             newLeftCollation = new ArrayList<>();
             newRightCollation = new ArrayList<>();
             
             int ind = 0;
-            for (Integer c : collation.getKeys()) {
+            for (RelFieldCollation fieldCollation : collation.getFieldCollations()) {
+                int c = fieldCollation.getFieldIndex();
+
                 if (c < rightOff) {
                     newLeftCollation.add(c);
     
@@ -241,6 +252,9 @@ public class IgniteMergeJoin extends AbstractIgniteJoin {
         RelCollation leftCollation = createCollation(newLeftCollation);
         RelCollation rightCollation = createCollation(newRightCollation);
         
+        RelTraitSet left = inputTraits.get(0);
+        RelTraitSet right = inputTraits.get(1);
+        
         return Pair.of(
                 nodeTraits.replace(preserveNodeCollation ? collation : leftCollation),
                 List.of(
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteProject.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteProject.java
index fe0407f..ffd743e 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteProject.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/rel/IgniteProject.java
@@ -22,10 +22,9 @@ import static org.apache.ignite.internal.processors.query.calcite.trait.IgniteDi
 import static org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions.single;
 import static org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils.changeTraits;
 
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.RelOptCluster;
@@ -143,7 +142,7 @@ public class IgniteProject extends Project implements TraitsAwareIgniteRel {
             return Pair.of(nodeTraits, List.of(in.replace(RelCollations.EMPTY)));
         }
         
-        Map<Integer, Integer> targets = new HashMap<>();
+        Int2IntOpenHashMap targets = new Int2IntOpenHashMap();
         for (Ord<RexNode> project : Ord.zip(getProjects())) {
             if (project.e instanceof RexInputRef) {
                 targets.putIfAbsent(project.i, ((RexSlot) project.e).getIndex());
@@ -152,8 +151,8 @@ public class IgniteProject extends Project implements TraitsAwareIgniteRel {
         
         List<RelFieldCollation> inFieldCollations = new ArrayList<>();
         for (RelFieldCollation inFieldCollation : fieldCollations) {
-            Integer newIndex = targets.get(inFieldCollation.getFieldIndex());
-            if (newIndex == null) {
+            int newIndex = targets.getOrDefault(inFieldCollation.getFieldIndex(), Integer.MIN_VALUE);
+            if (newIndex == Integer.MIN_VALUE) {
                 break;
             } else {
                 inFieldCollations.add(inFieldCollation.withFieldIndex(newIndex));
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java
index 7f90cb8..3499b80 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/trait/TraitUtils.java
@@ -28,12 +28,11 @@ import static org.apache.ignite.internal.util.CollectionUtils.first;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import com.google.common.collect.ImmutableList;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.calcite.linq4j.Ord;
@@ -557,7 +556,7 @@ public class TraitUtils {
      * @param projects        Projections.
      */
     private static Mappings.TargetMapping createProjectionMapping(int inputFieldCount, List<? extends RexNode> projects) {
-        Map<Integer, Integer> src2target = new HashMap<>();
+        Int2IntOpenHashMap src2target = new Int2IntOpenHashMap();
         
         for (Ord<RexNode> exp : Ord.<RexNode>zip(projects)) {
             if (exp.e instanceof RexInputRef) {
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RexUtils.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RexUtils.java
index b06b341..f90aa78 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RexUtils.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/RexUtils.java
@@ -24,14 +24,14 @@ import static org.apache.calcite.sql.SqlKind.LESS_THAN;
 import static org.apache.calcite.sql.SqlKind.LESS_THAN_OR_EQUAL;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectIterator;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.RelOptCluster;
@@ -192,7 +192,7 @@ public class RexUtils {
         
         condition = RexUtil.toCnf(builder(cluster), condition);
         
-        Map<Integer, List<RexCall>> fieldsToPredicates = mapPredicatesToFields(condition, cluster);
+        Int2ObjectOpenHashMap<List<RexCall>> fieldsToPredicates = mapPredicatesToFields(condition, cluster);
         
         if (nullOrEmpty(fieldsToPredicates)) {
             return new IndexConditions();
@@ -203,7 +203,7 @@ public class RexUtils {
         
         // Force collation for all fields of the condition.
         if (collation == null || collation.isDefault()) {
-            collation = RelCollations.of(ImmutableIntList.copyOf(fieldsToPredicates.keySet()));
+            collation = RelCollations.of(ImmutableIntList.of(fieldsToPredicates.keySet().toIntArray()));
         }
         
         for (int i = 0; i < collation.getFieldCollations().size(); i++) {
@@ -324,7 +324,7 @@ public class RexUtils {
     ) {
         condition = RexUtil.toCnf(builder(cluster), condition);
         
-        Map<Integer, List<RexCall>> fieldsToPredicates = mapPredicatesToFields(condition, cluster);
+        Int2ObjectOpenHashMap<List<RexCall>> fieldsToPredicates = mapPredicatesToFields(condition, cluster);
         
         if (nullOrEmpty(fieldsToPredicates)) {
             return null;
@@ -332,8 +332,9 @@ public class RexUtils {
         
         List<RexNode> searchPreds = null;
         
-        for (int fldIdx : fieldsToPredicates.keySet()) {
-            List<RexCall> collFldPreds = fieldsToPredicates.get(fldIdx);
+        ObjectIterator<List<RexCall>> iterator = fieldsToPredicates.values().iterator();
+        while (iterator.hasNext()) {
+            List<RexCall> collFldPreds = iterator.next();
             
             if (nullOrEmpty(collFldPreds)) {
                 break;
@@ -368,10 +369,10 @@ public class RexUtils {
     /**
      *
      */
-    private static Map<Integer, List<RexCall>> mapPredicatesToFields(RexNode condition, RelOptCluster cluster) {
+    private static Int2ObjectOpenHashMap<List<RexCall>> mapPredicatesToFields(RexNode condition, RelOptCluster cluster) {
         List<RexNode> conjunctions = RelOptUtil.conjunctions(condition);
         
-        Map<Integer, List<RexCall>> res = new HashMap<>(conjunctions.size());
+        Int2ObjectOpenHashMap<List<RexCall>> res = new Int2ObjectOpenHashMap<>(conjunctions.size());
         
         for (RexNode rexNode : conjunctions) {
             if (!isBinaryComparison(rexNode)) {
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index f207b01..f8ddc98 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -39,6 +39,11 @@
             <artifactId>annotations</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>it.unimi.dsi</groupId>
+            <artifactId>fastutil-core</artifactId>
+        </dependency>
+
         <!-- Test dependencies -->
         <dependency>
             <groupId>org.hamcrest</groupId>
@@ -86,6 +91,294 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <finalName>${artifactId}-shaded-${version}</finalName>
+                            <relocations>
+                                <relocation>
+                                    <pattern>it.unimi.dsi.fastutil</pattern>
+                                    <shadedPattern>it.unimi.dsi.shaded.fastutil</shadedPattern>
+                                </relocation>
+                            </relocations>
+                            <filters>
+                                <filter>
+                                    <artifact>it.unimi.dsi:fastutil-core</artifact>
+                                    <includes>
+<!--                                        /it/unimi/dsi/fastutil/-->
+                                        <include>it/unimi/dsi/fastutil/Arrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/BidirectionalIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/BigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/BigListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/BigSwapper.**</include>
+                                        <include>it/unimi/dsi/fastutil/Function.**</include>
+                                        <include>it/unimi/dsi/fastutil/Hash.**</include>
+                                        <include>it/unimi/dsi/fastutil/HashCommon.**</include>
+                                        <include>it/unimi/dsi/fastutil/Pair.**</include>
+                                        <include>it/unimi/dsi/fastutil/SafeMath.**</include>
+                                        <include>it/unimi/dsi/fastutil/Size64.**</include>
+                                        <include>it/unimi/dsi/fastutil/Stack.**</include>
+                                        <include>it/unimi/dsi/fastutil/Swapper.**</include>
+<!--                                        /it/unimi/dsi/fastutil/booleans/-->
+                                        <include>it/unimi/dsi/fastutil/booleans/BooleanArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/booleans/BooleanBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/booleans/BooleanComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/booleans/BooleanComparators.**</include>
+<!--                                        /it/unimi/dsi/fastutil/bytes/-->
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/Byte2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteConsumer.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/bytes/ByteSpliterator.**</include>
+<!--                                        /it/unimi/dsi/fastutil/chars/-->
+                                        <include>it/unimi/dsi/fastutil/chars/Char2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/Char2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharConsumer.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/chars/CharSpliterator.**</include>
+<!--                                        /it/unimi/dsi/fastutil/doubles/-->
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/Double2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/DoubleArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/DoubleBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/DoubleComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/doubles/DoubleComparators.**</include>
+<!--                                        /it/unimi/dsi/fastutil/floats/-->
+                                        <include>it/unimi/dsi/fastutil/floats/Float2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/Float2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/FloatArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/FloatBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/FloatComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/floats/FloatComparators.**</include>
+<!--                                        /it/unimi/dsi/fastutil/ints/-->
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractInt2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractInt2IntMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractInt2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractInt2ObjectMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractIntCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractIntIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractIntList.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractIntSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/AbstractIntSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2IntFunctions.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2IntMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2IntMaps.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2IntOpenHashMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ObjectFunctions.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ObjectMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ObjectMaps.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ObjectOpenHashMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/Int2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntArrayList.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntArraySet.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntBidirectionalIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntBigListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntBinaryOperator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntCollections.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntConsumer.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntImmutableList.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntIntImmutablePair.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntIntPair.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntIterable.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntIterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntList.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntLists.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntObjectImmutablePair.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntObjectPair.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntOpenHashSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntPredicate.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntSets.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntSpliterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntStack.**</include>
+                                        <include>it/unimi/dsi/fastutil/ints/IntUnaryOperator.**</include>
+<!--                                        /it/unimi/dsi/fastutil/longs/-->
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLong2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLong2LongMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLong2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLong2ObjectMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLongCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLongIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLongList.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLongSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/AbstractLongSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2LongFunctions.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2LongMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2LongMaps.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2LongOpenHashMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ObjectFunctions.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ObjectMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ObjectMaps.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ObjectOpenHashMap.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/Long2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongArrayList.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongArraySet.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongBidirectionalIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongBigListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongBinaryOperator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongCollections.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongConsumer.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongImmutableList.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongIterable.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongIterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongList.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongLists.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongLongImmutablePair.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongLongPair.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongObjectImmutablePair.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongObjectPair.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongOpenHashSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongPredicate.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongSets.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongSpliterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongStack.**</include>
+                                        <include>it/unimi/dsi/fastutil/longs/LongUnaryOperator.**</include>
+<!--                                        /it/unimi/dsi/fastutil/objects/-->
+                                        <include>it/unimi/dsi/fastutil/objects/AbstractObjectCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/AbstractObjectIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/AbstractObjectList.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/AbstractObjectSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/AbstractObjectSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Object2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectArrayList.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectArraySet.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectBidirectionalIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectBigListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectCollection.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectCollections.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectImmutableList.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectIterable.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectIterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectList.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectListIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectLists.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectObjectImmutablePair.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectOpenHashSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectSet.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectSets.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectSpliterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/ObjectSpliterators.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/objects/Reference2ShortFunction.**</include>
+<!--                                        /it/unimi/dsi/fastutil/shorts/-->
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2ByteFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2CharFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2DoubleFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2FloatFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2IntFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2LongFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2ObjectFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2ReferenceFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/Short2ShortFunction.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortBigArrays.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortComparator.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortComparators.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortConsumer.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortIterator.**</include>
+                                        <include>it/unimi/dsi/fastutil/shorts/ShortSpliterator.**</include>
+                                    </includes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/parent/pom.xml b/parent/pom.xml
index bdb12fd..a5dd401 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -83,6 +83,7 @@
         <jctools.version>3.3.0</jctools.version>
         <msgpack.version>0.8.21</msgpack.version>
         <caffeine.version>3.0.4</caffeine.version>
+        <fastutil.version>8.5.6</fastutil.version>
 
         <!-- Plugins versions -->
         <apache.rat.plugin.version>0.13</apache.rat.plugin.version>
@@ -636,6 +637,12 @@
                 <artifactId>slf4j-jdk14</artifactId>
                 <version>${slf4j.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>it.unimi.dsi</groupId>
+                <artifactId>fastutil-core</artifactId>
+                <version>${fastutil.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>