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>