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

bchapuis pushed a commit to branch collection
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git

commit 0ecc7f131ed681fa31344639671abf566a49f8b0
Author: Bertil Chapuis <[email protected]>
AuthorDate: Sat May 4 13:53:38 2024 +0200

    Dissociate the data collection api from the standard library
---
 .../baremaps/database/algorithm/BinarySearch.java  |   4 +-
 .../database/algorithm/ExternalMergeSort.java      |   4 +-
 .../baremaps/database/calcite/SqlDataTable.java    |   8 +-
 .../database/collection/AppendOnlyLog.java         |  13 ++-
 .../database/collection/DataCollection.java        |  74 ++++++++++++--
 ...ctionAdapter.java => DataCollectionMapper.java} |  24 ++---
 .../baremaps/database/collection/DataList.java     |  18 ++--
 .../baremaps/database/collection/DataMap.java      | 109 +++++++--------------
 .../database/collection/FixedSizeDataList.java     |  14 +--
 .../database/collection/IndexedDataList.java       |  16 +--
 .../database/collection/IndexedDataMap.java        |  22 ++---
 ...AbstractDataCollection.java => MapAdapter.java} |  38 ++++---
 .../database/collection/MemoryAlignedDataList.java |   4 +-
 .../database/collection/MemoryAlignedDataMap.java  |  27 +++--
 .../database/collection/MonotonicDataMap.java      |  30 +++---
 .../collection/MonotonicFixedSizeDataMap.java      |  24 ++---
 .../collection/MonotonicPairedDataMap.java         |  26 ++---
 .../database/schema/AbstractDataTable.java         |  28 ------
 .../baremaps/database/schema/DataTableAdapter.java |  16 +--
 .../baremaps/database/schema/DataTableImpl.java    |  29 +++---
 .../openstreetmap/xml/XmlEntityReader.java         |  14 +--
 .../storage/flatgeobuf/FlatGeoBufDataTable.java    |  19 ++--
 .../storage/geopackage/GeoPackageDataTable.java    |  10 +-
 .../storage/postgres/PostgresDataTable.java        |  11 ++-
 .../storage/shapefile/ShapefileDataTable.java      |  17 ++--
 .../apache/baremaps/workflow/WorkflowContext.java  |   8 +-
 .../tasks/CreateGeocoderOpenStreetMap.java         |   6 +-
 .../baremaps/database/AppendOnlyLogTest.java       |   6 +-
 .../org/apache/baremaps/database/DataMapTest.java  |   6 +-
 .../database/sort/ExternalMergeSortTest.java       |   2 +-
 .../apache/baremaps/openstreetmap/OsmTestData.java |   9 +-
 .../EntityDataTypeGeometryBuilderTest.java         |  10 +-
 .../baremaps/openstreetmap/store/MockDataMap.java  |  90 -----------------
 .../org/apache/baremaps/storage/MockDataTable.java |  11 ++-
 .../flatgeobuf/FlatGeoBufDataTableTest.java        |   5 +-
 .../geopackage/GeoPackageDataSchemaTest.java       |   2 +-
 .../geopackage/GeoPackageToPostgresTest.java       |   2 +-
 .../storage/postgres/PostgresDataTableTest.java    |   2 +-
 .../workflow/tasks/ImportUpdateSampleTest.java     |   9 +-
 39 files changed, 349 insertions(+), 418 deletions(-)

diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/BinarySearch.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/BinarySearch.java
index cc9bf656..2bd799a7 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/BinarySearch.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/BinarySearch.java
@@ -38,7 +38,7 @@ public class BinarySearch {
    * @param <E> the type of the elements in the list
    */
   public static <E> Long binarySearch(DataList<E> list, E value, Comparator<E> 
comparator) {
-    return binarySearch(list, value, comparator, 0, list.sizeAsLong() - 1l);
+    return binarySearch(list, value, comparator, 0, list.size() - 1l);
   }
 
   /**
@@ -87,7 +87,7 @@ public class BinarySearch {
       A value,
       Comparator<A> comparator) {
     long lo = 0;
-    long hi = list.sizeAsLong() - 1l;
+    long hi = list.size() - 1l;
     while (lo <= hi) {
       long mi = (lo + hi) >>> 1;
       E e = list.get(mi);
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/ExternalMergeSort.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/ExternalMergeSort.java
index 270b34e9..6480ab72 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/ExternalMergeSort.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/algorithm/ExternalMergeSort.java
@@ -78,7 +78,7 @@ public class ExternalMergeSort {
         new PriorityQueue<>(batches.size(), (i, j) -> 
comparator.compare(i.peek(), j.peek()));
 
     for (DataList<T> input : batches) {
-      if (input.sizeAsLong() == 0) {
+      if (input.size() == 0) {
         continue;
       }
       DataStack stack = new DataStack(input);
@@ -221,7 +221,7 @@ public class ExternalMergeSort {
     }
 
     public boolean empty() {
-      return this.index > list.sizeAsLong();
+      return this.index > list.size();
     }
 
     public T peek() {
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/calcite/SqlDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/calcite/SqlDataTable.java
index b6e03adc..133ec26e 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/calcite/SqlDataTable.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/calcite/SqlDataTable.java
@@ -17,8 +17,8 @@
 
 package org.apache.baremaps.database.calcite;
 
-import java.util.Collection;
-import org.apache.baremaps.database.collection.DataCollectionAdapter;
+import org.apache.baremaps.database.collection.DataCollection;
+import org.apache.baremaps.database.collection.DataCollectionMapper;
 import org.apache.baremaps.database.schema.DataColumn;
 import org.apache.baremaps.database.schema.DataTable;
 import org.apache.calcite.DataContext;
@@ -44,8 +44,8 @@ class SqlDataTable extends AbstractTable implements 
ScannableTable {
 
   @Override
   public Enumerable<Object[]> scan(final DataContext root) {
-    Collection<Object[]> collection =
-        new DataCollectionAdapter<>(table, row -> row.values().toArray());
+    DataCollection<Object[]> collection =
+        new DataCollectionMapper<>(table, row -> row.values().toArray());
     return Linq4j.asEnumerable(collection);
   }
 
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AppendOnlyLog.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AppendOnlyLog.java
index e3f41709..ea4cd2db 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AppendOnlyLog.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AppendOnlyLog.java
@@ -36,7 +36,7 @@ import org.apache.baremaps.database.type.DataType;
  *
  * @param <E> The type of the data.
  */
-public class AppendOnlyLog<E> implements Iterable<E> {
+public class AppendOnlyLog<E> implements DataCollection<E> {
 
   private final DataType<E> dataType;
   private final Memory<?> memory;
@@ -75,7 +75,7 @@ public class AppendOnlyLog<E> implements Iterable<E> {
    * @param value the value
    * @return the position of the value in the memory.
    */
-  public long add(E value) {
+  public long addPositioned(E value) {
     int valueSize = dataType.size(value);
     if (valueSize > segmentSize) {
       throw new DataCollectionException("The value is too big to fit in a 
segment");
@@ -101,6 +101,13 @@ public class AppendOnlyLog<E> implements Iterable<E> {
     return position;
   }
 
+  @Override
+  public boolean add(E e) {
+    addPositioned(e);
+    return true;
+  }
+
+
   /**
    * Returns a values at the specified position in the memory.
    *
@@ -143,6 +150,7 @@ public class AppendOnlyLog<E> implements Iterable<E> {
 
   /**
    * Returns an iterator over the values of the log.
+   * 
    * @return an iterator over the values of the log
    */
   @Override
@@ -153,6 +161,7 @@ public class AppendOnlyLog<E> implements Iterable<E> {
 
   /**
    * Returns true if the log contains the specified value.
+   * 
    * @param value the value
    * @return true if the log contains the specified value
    */
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollection.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollection.java
index f6b46112..bbf1b316 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollection.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollection.java
@@ -18,19 +18,81 @@
 package org.apache.baremaps.database.collection;
 
 import java.util.Collection;
+import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
-public interface DataCollection<E> extends Collection<E> {
+public interface DataCollection<E> extends Iterable<E> {
 
   /**
-   * Returns the number of values stored in the data store.
+   * Returns the number of values stored in the data collection.
    *
    * @return the number of values
    */
-  long sizeAsLong();
+  long size();
 
-  /** {@inheritDoc} */
-  default int size() {
-    return (int) Math.min(sizeAsLong(), Integer.MAX_VALUE);
+  default boolean isEmpty() {
+    return size() == 0;
   }
 
+  Iterator<E> iterator();
+
+  default Spliterator<E> spliterator() {
+    return Spliterators.spliterator(iterator(), size(), Spliterator.ORDERED);
+  }
+
+  default Stream<E> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
+  default boolean add(E e) {
+    throw new UnsupportedOperationException();
+  }
+
+  default boolean addAll(Collection<? extends E> c) {
+    boolean modified = false;
+    for (E e : c) {
+      if (add(e)) {
+        modified = true;
+      }
+    }
+    return modified;
+  }
+
+  default boolean remove(Object o) {
+    throw new UnsupportedOperationException();
+  }
+
+  default boolean removeAll(Collection<?> c) {
+    boolean modified = false;
+    for (Object o : c) {
+      if (remove(o)) {
+        modified = true;
+      }
+    }
+    return modified;
+  }
+
+  default boolean contains(Object o) {
+    for (E e : this) {
+      if (e.equals(o)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  default boolean containsAll(Collection<?> c) {
+    for (Object o : c) {
+      if (!contains(o)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  void clear();
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionAdapter.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionMapper.java
similarity index 73%
rename from 
baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionAdapter.java
rename to 
baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionMapper.java
index be04534d..70b0ecc5 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionAdapter.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataCollectionMapper.java
@@ -24,21 +24,26 @@ import java.util.function.Function;
 /**
  * A decorator for a table that transforms the geometries of the rows.
  */
-public class DataCollectionAdapter<S, T> extends AbstractDataCollection<T> {
+public class DataCollectionMapper<S, T> implements DataCollection<T> {
 
   private final DataCollection<S> collection;
 
-  private final Function<S, T> transformer;
+  private final Function<S, T> mapper;
 
   /**
    * Constructs a new table decorator.
    *
    * @param collection the table to decorate
-   * @param transformer the row transformer
+   * @param mapper the row transformer
    */
-  public DataCollectionAdapter(DataCollection<S> collection, Function<S, T> 
transformer) {
+  public DataCollectionMapper(DataCollection<S> collection, Function<S, T> 
mapper) {
     this.collection = collection;
-    this.transformer = transformer;
+    this.mapper = mapper;
+  }
+
+  @Override
+  public long size() {
+    return collection.size();
   }
 
   /**
@@ -46,14 +51,11 @@ public class DataCollectionAdapter<S, T> extends 
AbstractDataCollection<T> {
    */
   @Override
   public Iterator<T> iterator() {
-    return collection.stream().map(this.transformer).iterator();
+    return collection.stream().map(this.mapper).iterator();
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public long sizeAsLong() {
-    return collection.sizeAsLong();
+  public void clear() {
+    collection.clear();
   }
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataList.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataList.java
index c6a46d92..41f08e28 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataList.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataList.java
@@ -27,7 +27,7 @@ import java.util.NoSuchElementException;
  *
  * @param <E> The type of the data.
  */
-public abstract class DataList<E> extends AbstractDataCollection<E> {
+public interface DataList<E> extends DataCollection<E> {
 
   /**
    * Appends a value to the list and returns its index.
@@ -35,13 +35,13 @@ public abstract class DataList<E> extends 
AbstractDataCollection<E> {
    * @param value the value
    * @return the index of the value.
    */
-  public abstract long addIndexed(E value);
+  long addIndexed(E value);
 
   /**
    * {@inheritDoc}
    */
   @Override
-  public boolean add(E value) {
+  default boolean add(E value) {
     addIndexed(value);
     return true;
   }
@@ -52,7 +52,7 @@ public abstract class DataList<E> extends 
AbstractDataCollection<E> {
    * @param index the index
    * @param value the value
    */
-  public abstract void set(long index, E value);
+  void set(long index, E value);
 
   /**
    * Returns the value at the specified index.
@@ -60,20 +60,16 @@ public abstract class DataList<E> extends 
AbstractDataCollection<E> {
    * @param index the index
    * @return the value
    */
-  public abstract E get(long index);
+  E get(long index);
 
   /** {@inheritDoc} */
   @Override
-  public abstract void clear();
-
-  /** {@inheritDoc} */
-  @Override
-  public Iterator<E> iterator() {
+  default Iterator<E> iterator() {
     return new Iterator<>() {
 
       private long index = 0;
 
-      private long size = sizeAsLong();
+      private long size = size();
 
       @Override
       public boolean hasNext() {
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataMap.java
index 925b002c..b2d5258e 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/DataMap.java
@@ -18,20 +18,32 @@
 package org.apache.baremaps.database.collection;
 
 
-
 import com.google.common.collect.Streams;
 import java.util.*;
+import java.util.Map.Entry;
 
 /**
  * An abstract map of data elements that can hold a large number of elements.
  *
  * @param <V> The type of the elements.
  */
-public abstract class DataMap<K, V> implements Map<K, V> {
+public interface DataMap<K, V> {
 
-  /** {@inheritDoc} */
-  @Override
-  public void putAll(Map<? extends K, ? extends V> m) {
+  long size();
+
+  V get(Object key);
+
+  V put(K key, V value);
+
+  V remove(Object key);
+
+  void clear();
+
+  boolean containsKey(Object key);
+
+  boolean containsValue(Object value);
+
+  default void putAll(Map<? extends K, ? extends V> m) {
     m.forEach(this::put);
   }
 
@@ -41,100 +53,51 @@ public abstract class DataMap<K, V> implements Map<K, V> {
    * @param keys the keys
    * @return the values
    */
-  public List<V> getAll(List<K> keys) {
+  default List<V> getAll(List<K> keys) {
     return Streams.stream(keys).map(this::get).toList();
   }
 
   /** {@inheritDoc} */
-  @Override
-  public boolean isEmpty() {
+  default boolean isEmpty() {
     return size() == 0;
   }
 
-  /**
-   * Returns the size of the map as a long.
-   *
-   * @return the size of the map
-   */
-  public abstract long sizeAsLong();
-
-  /** {@inheritDoc} */
-  public int size() {
-    return (int) Math.min(sizeAsLong(), Integer.MAX_VALUE);
-  }
-
   /**
    * Returns an iterator over the keys of the map.
    *
    * @return an iterator
    */
-  protected abstract Iterator<K> keyIterator();
-
-  /** {@inheritDoc} */
-  @Override
-  public Set<K> keySet() {
-    return new KeySet();
-  }
-
-  private class KeySet extends AbstractSet<K> {
-    @Override
-    public Iterator<K> iterator() {
-      return keyIterator();
-    }
-
-    @Override
-    public int size() {
-      return DataMap.this.size();
-    }
-  }
+  Iterator<K> keyIterator();
 
   /**
    * Returns an iterator over the values of the map.
    *
    * @return an iterator
    */
-  protected abstract Iterator<V> valueIterator();
-
-  /** {@inheritDoc} */
-  @Override
-  public Collection<V> values() {
-    return new ValueCollection();
-  }
-
-  private class ValueCollection extends AbstractCollection<V> {
-    @Override
-    public Iterator<V> iterator() {
-      return valueIterator();
-    }
-
-    @Override
-    public int size() {
-      return DataMap.this.size();
-    }
-  }
+  Iterator<V> valueIterator();
 
   /**
    * Returns an iterator over the entries of the map.
    *
    * @return an iterator
    */
-  protected abstract Iterator<Entry<K, V>> entryIterator();
+  Iterator<Entry<K, V>> entryIterator();
 
   /** {@inheritDoc} */
-  @Override
-  public Set<Entry<K, V>> entrySet() {
-    return new EntrySet();
+  default Set<Entry<K, V>> entrySet() {
+    int size = (int) size();
+    return new AbstractSet<>() {
+
+      @Override
+      public Iterator<Entry<K, V>> iterator() {
+        return entryIterator();
+      }
+
+      @Override
+      public int size() {
+        return size;
+      }
+    };
   }
 
-  private class EntrySet extends AbstractSet<Entry<K, V>> {
-    @Override
-    public Iterator<Entry<K, V>> iterator() {
-      return entryIterator();
-    }
-
-    @Override
-    public int size() {
-      return DataMap.this.size();
-    }
-  }
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/FixedSizeDataList.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/FixedSizeDataList.java
index e48dad64..a12c9d8f 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/FixedSizeDataList.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/FixedSizeDataList.java
@@ -19,7 +19,6 @@ package org.apache.baremaps.database.collection;
 
 
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.baremaps.database.memory.Memory;
@@ -33,7 +32,7 @@ import org.apache.baremaps.database.type.FixedSizeDataType;
  *
  * @param <E> The type of the elements.
  */
-public class FixedSizeDataList<E> extends DataList<E> {
+public class FixedSizeDataList<E> implements DataList<E> {
 
   private final FixedSizeDataType<E> dataType;
 
@@ -88,7 +87,7 @@ public class FixedSizeDataList<E> extends DataList<E> {
    */
   @Override
   public void set(long index, E value) {
-    if (index >= sizeAsLong()) {
+    if (index >= size()) {
       throw new IndexOutOfBoundsException();
     }
     write(index, value);
@@ -110,7 +109,7 @@ public class FixedSizeDataList<E> extends DataList<E> {
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     return size.get();
   }
 
@@ -119,11 +118,6 @@ public class FixedSizeDataList<E> extends DataList<E> {
    */
   @Override
   public void clear() {
-    try {
-      size.set(0);
-      memory.clear();
-    } catch (IOException e) {
-      throw new DataCollectionException(e);
-    }
+    size.set(0);
   }
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataList.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataList.java
index 5bb51c63..a74dac94 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataList.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataList.java
@@ -28,7 +28,7 @@ import org.apache.baremaps.database.type.LongDataType;
  *
  * @param <E> The type of the elements.
  */
-public class IndexedDataList<E> extends DataList<E> {
+public class IndexedDataList<E> implements DataList<E> {
 
   private final DataList<Long> index;
 
@@ -60,7 +60,7 @@ public class IndexedDataList<E> extends DataList<E> {
    */
   @Override
   public long addIndexed(E value) {
-    long position = values.add(value);
+    long position = values.addPositioned(value);
     return index.addIndexed(position);
   }
 
@@ -69,7 +69,7 @@ public class IndexedDataList<E> extends DataList<E> {
    */
   @Override
   public void set(long index, E value) {
-    long position = values.add(value);
+    long position = values.addPositioned(value);
     this.index.set(index, position);
   }
 
@@ -82,17 +82,11 @@ public class IndexedDataList<E> extends DataList<E> {
     return values.read(position);
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public long sizeAsLong() {
-    return index.sizeAsLong();
+  public long size() {
+    return index.size();
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
   public void clear() {
     index.clear();
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataMap.java
index 610e67ef..82d33018 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/IndexedDataMap.java
@@ -23,6 +23,7 @@ import com.google.common.collect.Streams;
 import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * A map that can hold a large number of variable size data elements.
@@ -31,7 +32,7 @@ import java.util.Map;
  *
  * @param <E> The type of the elements.
  */
-public class IndexedDataMap<E> extends DataMap<Long, E> {
+public class IndexedDataMap<E> implements DataMap<Long, E> {
 
   private final Map<Long, Long> index;
 
@@ -63,7 +64,7 @@ public class IndexedDataMap<E> extends DataMap<Long, E> {
   @Override
   public E put(Long key, E value) {
     var oldIndex = index.get(key);
-    var position = values.add(value);
+    var position = values.addPositioned(value);
     index.put(key, position);
     return oldIndex == null ? null : values.read(oldIndex);
   }
@@ -81,7 +82,7 @@ public class IndexedDataMap<E> extends DataMap<Long, E> {
    * {@inheritDoc}
    */
   @Override
-  protected Iterator<Long> keyIterator() {
+  public Iterator<Long> keyIterator() {
     return index.keySet().iterator();
   }
 
@@ -89,15 +90,12 @@ public class IndexedDataMap<E> extends DataMap<Long, E> {
    * {@inheritDoc}
    */
   @Override
-  protected Iterator<E> valueIterator() {
+  public Iterator<E> valueIterator() {
     return Streams.stream(keyIterator()).map(this::get).iterator();
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  protected Iterator<Entry<Long, E>> entryIterator() {
+  public Iterator<Entry<Long, E>> entryIterator() {
     return Streams.stream(keyIterator()).map(k -> Map.entry(k, 
get(k))).iterator();
   }
 
@@ -113,12 +111,8 @@ public class IndexedDataMap<E> extends DataMap<Long, E> {
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
-    if (index instanceof DataMap<?, ?>dataMap) {
-      return dataMap.sizeAsLong();
-    } else {
-      return index.size();
-    }
+  public long size() {
+    return index.size();
   }
 
   /**
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AbstractDataCollection.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MapAdapter.java
similarity index 58%
rename from 
baremaps-core/src/main/java/org/apache/baremaps/database/collection/AbstractDataCollection.java
rename to 
baremaps-core/src/main/java/org/apache/baremaps/database/collection/MapAdapter.java
index 49087b37..303c9c3c 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/AbstractDataCollection.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MapAdapter.java
@@ -17,25 +17,33 @@
 
 package org.apache.baremaps.database.collection;
 
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.Set;
 
+public class MapAdapter<K, V> extends AbstractMap<K, V> {
 
-import java.util.AbstractCollection;
-
-/**
- * An abstract collection of data elements that can hold a large number of 
elements.
- *
- * @param <E> The type of the data.
- */
-public abstract class AbstractDataCollection<E> extends AbstractCollection<E>
-    implements DataCollection<E> {
+  private final DataMap<K, V> dataMap;
+  private final int size;
 
+  public MapAdapter(DataMap<K, V> dataMap) {
+    this.dataMap = dataMap;
+    this.size = (int) dataMap.size();
+  }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public int size() {
-    return (int) Math.min(sizeAsLong(), Integer.MAX_VALUE);
+  public Set<Entry<K, V>> entrySet() {
+    return new AbstractSet<>() {
+      @Override
+      public Iterator<Entry<K, V>> iterator() {
+        return dataMap.entryIterator();
+      }
+
+      @Override
+      public int size() {
+        return size;
+      }
+    };
   }
-
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataList.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataList.java
index e4afb006..931ed536 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataList.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataList.java
@@ -33,7 +33,7 @@ import org.apache.baremaps.database.type.FixedSizeDataType;
  *
  * @param <E> The type of the elements.
  */
-public class MemoryAlignedDataList<E> extends DataList<E> {
+public class MemoryAlignedDataList<E> implements DataList<E> {
 
   private final FixedSizeDataType<E> dataType;
 
@@ -114,7 +114,7 @@ public class MemoryAlignedDataList<E> extends DataList<E> {
 
   /** {@inheritDoc} */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     return size.get();
   }
 
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataMap.java
index ee7a4bdb..db439637 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MemoryAlignedDataMap.java
@@ -22,6 +22,7 @@ package org.apache.baremaps.database.collection;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import org.apache.baremaps.database.memory.Memory;
 import org.apache.baremaps.database.type.FixedSizeDataType;
@@ -32,7 +33,7 @@ import org.apache.baremaps.database.type.FixedSizeDataType;
  * <p>
  * This code has been adapted from Planetiler (Apache license).
  */
-public class MemoryAlignedDataMap<E> extends DataMap<Long, E> {
+public class MemoryAlignedDataMap<E> implements DataMap<Long, E> {
 
   private final FixedSizeDataType<E> dataType;
 
@@ -108,12 +109,18 @@ public class MemoryAlignedDataMap<E> extends 
DataMap<Long, E> {
   /** {@inheritDoc} */
   @Override
   public boolean containsValue(Object value) {
-    return values().contains(value);
+    Iterator<E> iterator = valueIterator();
+    while (iterator.hasNext()) {
+      if (iterator.next().equals(value)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   /** {@inheritDoc} */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     return memory.size() / dataType.size();
   }
 
@@ -125,12 +132,12 @@ public class MemoryAlignedDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<Long> keyIterator() {
+  public Iterator<Long> keyIterator() {
     return new Iterator<>() {
 
       private long index = 0;
 
-      private long size = sizeAsLong();
+      private long size = size();
 
       @Override
       public boolean hasNext() {
@@ -149,12 +156,12 @@ public class MemoryAlignedDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<E> valueIterator() {
+  public Iterator<E> valueIterator() {
     return new Iterator<>() {
 
       private long index = 0;
 
-      private long size = sizeAsLong();
+      private long size = size();
 
       @Override
       public boolean hasNext() {
@@ -171,14 +178,13 @@ public class MemoryAlignedDataMap<E> extends 
DataMap<Long, E> {
     };
   }
 
-  /** {@inheritDoc} */
   @Override
-  protected Iterator<Entry<Long, E>> entryIterator() {
+  public Iterator<Entry<Long, E>> entryIterator() {
     return new Iterator<>() {
 
       private long index = 0;
 
-      private long size = sizeAsLong();
+      private long size = size();
 
       @Override
       public boolean hasNext() {
@@ -195,4 +201,5 @@ public class MemoryAlignedDataMap<E> extends DataMap<Long, 
E> {
       }
     };
   }
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicDataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicDataMap.java
index 01f24842..732a63d2 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicDataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicDataMap.java
@@ -21,6 +21,7 @@ package org.apache.baremaps.database.collection;
 
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import org.apache.baremaps.database.type.LongDataType;
 import org.apache.baremaps.database.type.PairDataType;
 import org.apache.baremaps.database.type.PairDataType.Pair;
@@ -36,7 +37,7 @@ import org.apache.baremaps.database.type.PairDataType.Pair;
  * <p>
  * Copyright (c) Planetiler.
  */
-public class MonotonicDataMap<E> extends DataMap<Long, E> {
+public class MonotonicDataMap<E> implements DataMap<Long, E> {
 
   private final DataList<Long> offsets;
   private final DataList<Pair<Long, Long>> keys;
@@ -85,15 +86,15 @@ public class MonotonicDataMap<E> extends DataMap<Long, E> {
 
   /** {@inheritDoc} */
   public E put(Long key, E value) {
-    long index = keys.sizeAsLong();
+    long index = keys.size();
     long chunk = key >>> 8;
     if (chunk != lastChunk) {
-      while (offsets.sizeAsLong() <= chunk) {
+      while (offsets.size() <= chunk) {
         offsets.add(index);
       }
       lastChunk = chunk;
     }
-    long position = values.add(value);
+    long position = values.addPositioned(value);
     keys.add(new Pair<>(key, position));
     return null;
   }
@@ -102,15 +103,15 @@ public class MonotonicDataMap<E> extends DataMap<Long, E> 
{
   public E get(Object keyObject) {
     long key = (long) keyObject;
     long chunk = key >>> 8;
-    if (chunk >= offsets.sizeAsLong()) {
+    if (chunk >= offsets.size()) {
       return null;
     }
     long lo = offsets.get(chunk);
     long hi =
         Math.min(
-            keys.sizeAsLong(),
-            chunk >= offsets.sizeAsLong() - 1
-                ? keys.sizeAsLong()
+            keys.size(),
+            chunk >= offsets.size() - 1
+                ? keys.size()
                 : offsets.get(chunk + 1))
             - 1;
     while (lo <= hi) {
@@ -131,28 +132,28 @@ public class MonotonicDataMap<E> extends DataMap<Long, E> 
{
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<Long> keyIterator() {
+  public Iterator<Long> keyIterator() {
     return keys.stream().map(Pair::left).iterator();
   }
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<E> valueIterator() {
+  public Iterator<E> valueIterator() {
     return keys.stream().map(Pair::right).map(values::read).iterator();
   }
 
-  /** {@inheritDoc} */
   @Override
-  protected Iterator<Entry<Long, E>> entryIterator() {
+  public Iterator<Entry<Long, E>> entryIterator() {
     return keys.stream()
         .map(p -> Map.entry(p.left(), values.read(p.right())))
         .iterator();
   }
 
+
   /** {@inheritDoc} */
   @Override
-  public long sizeAsLong() {
-    return keys.sizeAsLong();
+  public long size() {
+    return keys.size();
   }
 
   /** {@inheritDoc} */
@@ -180,4 +181,5 @@ public class MonotonicDataMap<E> extends DataMap<Long, E> {
     keys.clear();
     values.clear();
   }
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicFixedSizeDataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicFixedSizeDataMap.java
index 88db61cd..dfd99409 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicFixedSizeDataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicFixedSizeDataMap.java
@@ -22,6 +22,7 @@ package org.apache.baremaps.database.collection;
 import com.google.common.collect.Streams;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import org.apache.baremaps.database.type.LongDataType;
 
 /**
@@ -35,7 +36,7 @@ import org.apache.baremaps.database.type.LongDataType;
  * <p>
  * Copyright (c) Planetiler.
  */
-public class MonotonicFixedSizeDataMap<E> extends DataMap<Long, E> {
+public class MonotonicFixedSizeDataMap<E> implements DataMap<Long, E> {
 
   private final DataList<Long> offsets;
   private final DataList<Long> keys;
@@ -76,8 +77,8 @@ public class MonotonicFixedSizeDataMap<E> extends 
DataMap<Long, E> {
       return null;
     }
     long lo = offsets.get(chunk);
-    long hi = Math.min(keys.sizeAsLong(),
-        chunk >= offsets.sizeAsLong() - 1 ? keys.sizeAsLong() : 
offsets.get(chunk + 1)) - 1;
+    long hi = Math.min(keys.size(),
+        chunk >= offsets.size() - 1 ? keys.size() : offsets.get(chunk + 1)) - 
1;
     while (lo <= hi) {
       long index = (lo + hi) >>> 1;
       long value = keys.get(index);
@@ -94,10 +95,10 @@ public class MonotonicFixedSizeDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   public E put(Long key, E value) {
-    long size = keys.sizeAsLong();
+    long size = keys.size();
     long chunk = key >>> 8;
     if (chunk != lastChunk) {
-      while (offsets.sizeAsLong() <= chunk) {
+      while (offsets.size() <= chunk) {
         offsets.add(size);
       }
       lastChunk = chunk;
@@ -115,8 +116,8 @@ public class MonotonicFixedSizeDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  public long sizeAsLong() {
-    return keys.sizeAsLong();
+  public long size() {
+    return keys.size();
   }
 
   /** {@inheritDoc} */
@@ -133,23 +134,23 @@ public class MonotonicFixedSizeDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<Long> keyIterator() {
+  public Iterator<Long> keyIterator() {
     return keys.iterator();
   }
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<E> valueIterator() {
+  public Iterator<E> valueIterator() {
     return values.iterator();
   }
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<Entry<Long, E>> entryIterator() {
+  public Iterator<Entry<Long, E>> entryIterator() {
     return Streams.zip(
         Streams.stream(keyIterator()),
         Streams.stream(valueIterator()),
-        (k, v) -> Map.entry(k, v)).iterator();
+        Map::entry).iterator();
   }
 
   /** {@inheritDoc} */
@@ -159,4 +160,5 @@ public class MonotonicFixedSizeDataMap<E> extends 
DataMap<Long, E> {
     keys.clear();
     values.clear();
   }
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicPairedDataMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicPairedDataMap.java
index d5bbf7d1..11394602 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicPairedDataMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/collection/MonotonicPairedDataMap.java
@@ -21,6 +21,7 @@ package org.apache.baremaps.database.collection;
 
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import org.apache.baremaps.database.type.LongDataType;
 import org.apache.baremaps.database.type.PairDataType.Pair;
 
@@ -29,7 +30,7 @@ import org.apache.baremaps.database.type.PairDataType.Pair;
  * their key and inserted in a monotonic way. The elements cannot be removed 
or updated once
  * inserted.
  */
-public class MonotonicPairedDataMap<E> extends DataMap<Long, E> {
+public class MonotonicPairedDataMap<E> implements DataMap<Long, E> {
 
   private final DataList<Long> offsets;
   private final MemoryAlignedDataList<Pair<Long, E>> values;
@@ -54,10 +55,10 @@ public class MonotonicPairedDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   public E put(Long key, E value) {
-    long index = values.sizeAsLong();
+    long index = values.size();
     long chunk = key >>> 8;
     if (chunk != lastChunk) {
-      while (offsets.sizeAsLong() <= chunk) {
+      while (offsets.size() <= chunk) {
         offsets.add(index);
       }
       lastChunk = chunk;
@@ -70,15 +71,15 @@ public class MonotonicPairedDataMap<E> extends 
DataMap<Long, E> {
   public E get(Object keyObject) {
     long key = (long) keyObject;
     long chunk = key >>> 8;
-    if (chunk >= offsets.sizeAsLong()) {
+    if (chunk >= offsets.size()) {
       return null;
     }
     long lo = offsets.get(chunk);
     long hi =
         Math.min(
-            values.sizeAsLong(),
-            chunk >= offsets.sizeAsLong() - 1
-                ? values.sizeAsLong()
+            values.size(),
+            chunk >= offsets.size() - 1
+                ? values.size()
                 : offsets.get(chunk + 1))
             - 1;
     while (lo <= hi) {
@@ -99,19 +100,18 @@ public class MonotonicPairedDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<Long> keyIterator() {
+  public Iterator<Long> keyIterator() {
     return values.stream().map(Pair::left).iterator();
   }
 
   /** {@inheritDoc} */
   @Override
-  protected Iterator<E> valueIterator() {
+  public Iterator<E> valueIterator() {
     return values.stream().map(Pair::right).iterator();
   }
 
-  /** {@inheritDoc} */
   @Override
-  protected Iterator<Entry<Long, E>> entryIterator() {
+  public Iterator<Entry<Long, E>> entryIterator() {
     return values.stream()
         .map(p -> Map.entry(p.left(), p.right()))
         .iterator();
@@ -119,8 +119,8 @@ public class MonotonicPairedDataMap<E> extends 
DataMap<Long, E> {
 
   /** {@inheritDoc} */
   @Override
-  public long sizeAsLong() {
-    return values.sizeAsLong();
+  public long size() {
+    return values.size();
   }
 
   /** {@inheritDoc} */
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/AbstractDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/schema/AbstractDataTable.java
deleted file mode 100644
index d777dd44..00000000
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/AbstractDataTable.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.baremaps.database.schema;
-
-import org.apache.baremaps.database.collection.AbstractDataCollection;
-
-/**
- * A table is a collection of rows respecting a row type.
- */
-public abstract class AbstractDataTable extends AbstractDataCollection<DataRow>
-    implements DataTable {
-
-}
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableAdapter.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableAdapter.java
index cfc73d2a..7b248f56 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableAdapter.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableAdapter.java
@@ -20,12 +20,11 @@ package org.apache.baremaps.database.schema;
 
 import java.util.Iterator;
 import java.util.function.Function;
-import org.apache.baremaps.database.collection.AbstractDataCollection;
 
 /**
  * A decorator for a table that transforms the geometries of the rows.
  */
-public class DataTableAdapter extends AbstractDataCollection<DataRow> 
implements DataTable {
+public class DataTableAdapter implements DataTable {
 
   private final DataTable table;
 
@@ -50,6 +49,11 @@ public class DataTableAdapter extends 
AbstractDataCollection<DataRow> implements
     return table.rowType();
   }
 
+  @Override
+  public long size() {
+    return table.size();
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -58,11 +62,9 @@ public class DataTableAdapter extends 
AbstractDataCollection<DataRow> implements
     return table.stream().map(this.transformer).iterator();
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public long sizeAsLong() {
-    return table.sizeAsLong();
+  public void clear() {
+    table.clear();
   }
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableImpl.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableImpl.java
index 2f628a8c..e0fd6c5f 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableImpl.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/schema/DataTableImpl.java
@@ -17,19 +17,17 @@
 
 package org.apache.baremaps.database.schema;
 
-import java.util.Collection;
 import java.util.Iterator;
-import org.apache.baremaps.database.collection.AbstractDataCollection;
 import org.apache.baremaps.database.collection.DataCollection;
 
 /**
  * A table is a collection of rows respecting a row type.
  */
-public class DataTableImpl extends AbstractDataCollection<DataRow> implements 
DataTable {
+public class DataTableImpl implements DataTable {
 
   private final DataRowType rowType;
 
-  private final Collection<DataRow> rows;
+  private final DataCollection<DataRow> rows;
 
   /**
    * Constructs a table with the specified row type.
@@ -37,7 +35,7 @@ public class DataTableImpl extends 
AbstractDataCollection<DataRow> implements Da
    * @param rowType the row type of the table
    * @param rows the collection of rows
    */
-  public DataTableImpl(DataRowType rowType, Collection<DataRow> rows) {
+  public DataTableImpl(DataRowType rowType, DataCollection<DataRow> rows) {
     this.rowType = rowType;
     this.rows = rows;
   }
@@ -58,23 +56,22 @@ public class DataTableImpl extends 
AbstractDataCollection<DataRow> implements Da
     return rows.add(e);
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public Iterator<DataRow> iterator() {
-    return rows.iterator();
+  public void clear() {
+    rows.clear();
+  }
+
+  @Override
+  public long size() {
+    return rows.size();
   }
 
   /**
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
-    if (rows instanceof DataCollection<DataRow>dataCollection) {
-      return dataCollection.sizeAsLong();
-    } else {
-      return rows.size();
-    }
+  public Iterator<DataRow> iterator() {
+    return rows.iterator();
   }
+
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/xml/XmlEntityReader.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/xml/XmlEntityReader.java
index e3afb5f7..40e1bd44 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/xml/XmlEntityReader.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/xml/XmlEntityReader.java
@@ -23,9 +23,9 @@ import static 
org.apache.baremaps.stream.ConsumerUtils.consumeThenReturn;
 
 import java.io.InputStream;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
-import org.apache.baremaps.database.collection.DataMap;
 import org.apache.baremaps.openstreetmap.OsmReader;
 import org.apache.baremaps.openstreetmap.function.CoordinateMapBuilder;
 import org.apache.baremaps.openstreetmap.function.EntityGeometryBuilder;
@@ -41,9 +41,9 @@ public class XmlEntityReader implements OsmReader<Entity> {
 
   private int srid = 4326;
 
-  private DataMap<Long, Coordinate> coordinateMap;
+  private Map<Long, Coordinate> coordinateMap;
 
-  private DataMap<Long, List<Long>> referenceMap;
+  private Map<Long, List<Long>> referenceMap;
 
   public boolean geometries() {
     return geometry;
@@ -63,20 +63,20 @@ public class XmlEntityReader implements OsmReader<Entity> {
     return this;
   }
 
-  public DataMap<Long, Coordinate> coordinateMap() {
+  public Map<Long, Coordinate> coordinateMap() {
     return coordinateMap;
   }
 
-  public XmlEntityReader coordinateMap(DataMap<Long, Coordinate> 
coordinateMap) {
+  public XmlEntityReader coordinateMap(Map<Long, Coordinate> coordinateMap) {
     this.coordinateMap = coordinateMap;
     return this;
   }
 
-  public DataMap<Long, List<Long>> referenceMap() {
+  public Map<Long, List<Long>> referenceMap() {
     return referenceMap;
   }
 
-  public XmlEntityReader referenceMap(DataMap<Long, List<Long>> referenceMap) {
+  public XmlEntityReader referenceMap(Map<Long, List<Long>> referenceMap) {
     this.referenceMap = referenceMap;
     return this;
   }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTable.java
index fe3238b4..c30680aa 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTable.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTable.java
@@ -24,13 +24,12 @@ import java.nio.ByteOrder;
 import java.nio.channels.*;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.apache.baremaps.database.collection.AbstractDataCollection;
-import org.apache.baremaps.database.schema.AbstractDataTable;
+import org.apache.baremaps.database.collection.DataCollection;
 import org.apache.baremaps.database.schema.DataRow;
 import org.apache.baremaps.database.schema.DataRowType;
+import org.apache.baremaps.database.schema.DataTable;
 import org.locationtech.jts.geom.*;
 import org.wololo.flatgeobuf.Constants;
 import org.wololo.flatgeobuf.GeometryConversions;
@@ -42,7 +41,7 @@ import org.wololo.flatgeobuf.generated.GeometryType;
 /**
  * A table that stores rows in a flatgeobuf file.
  */
-public class FlatGeoBufDataTable extends AbstractDataTable {
+public class FlatGeoBufDataTable implements DataTable {
 
   private final Path file;
 
@@ -118,11 +117,16 @@ public class FlatGeoBufDataTable extends 
AbstractDataTable {
     }
   }
 
+  @Override
+  public void clear() {
+
+  }
+
   /**
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     try (var channel = FileChannel.open(file, StandardOpenOption.READ)) {
       var buffer = ByteBuffer.allocate(1 << 20).order(ByteOrder.LITTLE_ENDIAN);
       HeaderMeta headerMeta = readHeaderMeta(channel, buffer);
@@ -153,7 +157,7 @@ public class FlatGeoBufDataTable extends AbstractDataTable {
    * @param features the collection of rows to write
    * @throws IOException if an error occurs while writing the rows
    */
-  public void write(Collection<DataRow> features) throws IOException {
+  public void write(DataCollection<DataRow> features) throws IOException {
     try (
         var channel = FileChannel.open(file, StandardOpenOption.CREATE, 
StandardOpenOption.WRITE);
         var outputStream = Channels.newOutputStream(channel)) {
@@ -165,8 +169,7 @@ public class FlatGeoBufDataTable extends AbstractDataTable {
       headerMeta.geometryType = GeometryType.Unknown;
       headerMeta.indexNodeSize = 16;
       headerMeta.srid = 3857;
-      headerMeta.featuresCount =
-          features instanceof AbstractDataCollection<DataRow>c ? 
c.sizeAsLong() : features.size();
+      headerMeta.featuresCount = features.size();
       headerMeta.name = rowType.name();
       headerMeta.columns = 
FlatGeoBufTypeConversion.asColumns(rowType.columns());
       HeaderMeta.write(headerMeta, outputStream, bufferBuilder);
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDataTable.java
index e59e4f20..90cd8bd9 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDataTable.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/geopackage/GeoPackageDataTable.java
@@ -23,7 +23,6 @@ import mil.nga.geopackage.features.user.FeatureColumn;
 import mil.nga.geopackage.features.user.FeatureDao;
 import mil.nga.geopackage.features.user.FeatureResultSet;
 import mil.nga.geopackage.geom.GeoPackageGeometryData;
-import org.apache.baremaps.database.collection.AbstractDataCollection;
 import org.apache.baremaps.database.schema.*;
 import org.apache.baremaps.database.schema.DataColumn.Type;
 import org.locationtech.jts.geom.*;
@@ -31,7 +30,7 @@ import org.locationtech.jts.geom.*;
 /**
  * A table that stores rows in a GeoPackage table.
  */
-public class GeoPackageDataTable extends AbstractDataCollection<DataRow> 
implements DataTable {
+public class GeoPackageDataTable implements DataTable {
 
   private final FeatureDao featureDao;
 
@@ -73,11 +72,16 @@ public class GeoPackageDataTable extends 
AbstractDataCollection<DataRow> impleme
     return new GeopackageIterator(featureDao.queryForAll(), rowType);
   }
 
+  @Override
+  public void clear() {
+    // Do nothing
+  }
+
   /**
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     return featureDao.count();
   }
 
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataTable.java
index 52083dc0..b0ed666d 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataTable.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataTable.java
@@ -23,17 +23,17 @@ import java.util.*;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 import javax.sql.DataSource;
-import org.apache.baremaps.database.schema.AbstractDataTable;
 import org.apache.baremaps.database.schema.DataRow;
 import org.apache.baremaps.database.schema.DataRowImpl;
 import org.apache.baremaps.database.schema.DataRowType;
+import org.apache.baremaps.database.schema.DataTable;
 import org.apache.baremaps.utils.GeometryUtils;
 import org.locationtech.jts.geom.*;
 
 /**
  * A table that stores rows in a Postgres table.
  */
-public class PostgresDataTable extends AbstractDataTable {
+public class PostgresDataTable implements DataTable {
 
   private final DataSource dataSource;
 
@@ -73,7 +73,7 @@ public class PostgresDataTable extends AbstractDataTable {
    * {@inheritDoc}
    */
   @Override
-  public long sizeAsLong() {
+  public long size() {
     var countQuery = count(rowType);
     try (var connection = dataSource.getConnection();
         var statement = connection.prepareStatement(countQuery);
@@ -126,6 +126,11 @@ public class PostgresDataTable extends AbstractDataTable {
     }
   }
 
+  @Override
+  public void clear() {
+
+  }
+
   /**
    * Set the parameters of a prepared statement with the values of a row.
    * 
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataTable.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataTable.java
index 412b19ca..50fe5aa2 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataTable.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/shapefile/ShapefileDataTable.java
@@ -22,9 +22,9 @@ import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.apache.baremaps.database.schema.AbstractDataTable;
 import org.apache.baremaps.database.schema.DataRow;
 import org.apache.baremaps.database.schema.DataRowType;
+import org.apache.baremaps.database.schema.DataTable;
 import org.apache.baremaps.database.schema.DataTableException;
 import org.apache.baremaps.storage.shapefile.internal.ShapefileInputStream;
 import org.apache.baremaps.storage.shapefile.internal.ShapefileReader;
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
 /**
  * A table that stores rows in a shapefile.
  */
-public class ShapefileDataTable extends AbstractDataTable {
+public class ShapefileDataTable implements DataTable {
 
   private static final Logger logger = 
LoggerFactory.getLogger(ShapefileDataTable.class);
 
@@ -61,6 +61,11 @@ public class ShapefileDataTable extends AbstractDataTable {
     }
   }
 
+  @Override
+  public long size() {
+    return 0;
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -73,14 +78,10 @@ public class ShapefileDataTable extends AbstractDataTable {
     }
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  public long sizeAsLong() {
-    return Long.MAX_VALUE;
-  }
+  public void clear() {
 
+  }
 
   /**
    * An iterator over the rows of a shapefile.
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowContext.java 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowContext.java
index b16f52f6..66daaac0 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowContext.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowContext.java
@@ -64,12 +64,12 @@ public class WorkflowContext {
     return dataSources.computeIfAbsent(database, 
PostgresUtils::createDataSourceFromObject);
   }
 
-  public DataMap<Long, Coordinate> getCoordinateMap() throws IOException {
-    return getMemoryAlignedDataMap("coordinates", new LonLatDataType());
+  public Map<Long, Coordinate> getCoordinateMap() throws IOException {
+    return new MapAdapter<>(getMemoryAlignedDataMap("coordinates", new 
LonLatDataType()));
   }
 
-  public DataMap<Long, List<Long>> getReferenceMap() throws IOException {
-    return getMonotonicDataMap("references", new LongListDataType());
+  public Map<Long, List<Long>> getReferenceMap() throws IOException {
+    return new MapAdapter<>(getMonotonicDataMap("references", new 
LongListDataType()));
   }
 
   public <T> DataMap<Long, T> getMemoryAlignedDataMap(String name, 
FixedSizeDataType<T> dataType)
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/CreateGeocoderOpenStreetMap.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/CreateGeocoderOpenStreetMap.java
index 347fd794..e0c0f87e 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/CreateGeocoderOpenStreetMap.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/CreateGeocoderOpenStreetMap.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
+import java.util.Map;
 import java.util.StringJoiner;
-import org.apache.baremaps.database.collection.DataMap;
 import org.apache.baremaps.geocoder.GeocoderConstants;
 import org.apache.baremaps.geocoderosm.GeocoderOsmConsumerEntity;
 import org.apache.baremaps.openstreetmap.pbf.PbfEntityReader;
@@ -86,8 +86,8 @@ public class CreateGeocoderOpenStreetMap implements Task {
 
   public static void execute(
       Path path,
-      DataMap<Long, Coordinate> coordinateMap,
-      DataMap<Long, List<Long>> referenceMap,
+      Map<Long, Coordinate> coordinateMap,
+      Map<Long, List<Long>> referenceMap,
       GeocoderOsmConsumerEntity importer) throws IOException {
 
     // configure the block reader
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/database/AppendOnlyLogTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/database/AppendOnlyLogTest.java
index 70554f4c..140b94ce 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/database/AppendOnlyLogTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/database/AppendOnlyLogTest.java
@@ -37,7 +37,7 @@ class AppendOnlyLogTest {
   void addFixedSizeData() {
     var collection = new AppendOnlyLog<>(new IntegerDataType(), new 
OffHeapMemory(1 << 10));
     for (int i = 0; i < 1 << 20; i++) {
-      assertEquals(Long.BYTES + (i << 2), collection.add(i));
+      assertEquals(Long.BYTES + (i << 2), collection.addPositioned(i));
     }
     for (int i = 0; i < 1 << 20; i++) {
       assertEquals(i, collection.read(Long.BYTES + (i << 2)));
@@ -56,7 +56,7 @@ class AppendOnlyLogTest {
       for (int j = 0; j < size; j++) {
         value.add(random.nextInt(1 << 20));
       }
-      positions.add(collection.add(value));
+      positions.add(collection.addPositioned(value));
       values.add(value);
     }
     for (int i = 0; i < positions.size(); i++) {
@@ -73,7 +73,7 @@ class AppendOnlyLogTest {
 
     // write values
     for (int i = 0; i < num; i++) {
-      collection.add(value);
+      collection.addPositioned(value);
     }
     collection.close();
 
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/database/DataMapTest.java 
b/baremaps-core/src/test/java/org/apache/baremaps/database/DataMapTest.java
index c09203dc..d3bdd263 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/database/DataMapTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/database/DataMapTest.java
@@ -105,7 +105,7 @@ class DataMapTest {
       set.add(i);
       map.put(i, i);
     }
-    var res = map.keySet();
+    var res = new MapAdapter<>(map).keySet();
     assertEquals(set, res);
   }
 
@@ -117,7 +117,7 @@ class DataMapTest {
       set.add(i);
       map.put(i, i);
     }
-    assertEquals(set, new HashSet(map.values()));
+    assertEquals(set, new HashSet(new MapAdapter<>(map).values()));
   }
 
   @ParameterizedTest
@@ -156,7 +156,7 @@ class DataMapTest {
     assertEquals(15l, map.get(15l));
     assertEquals(20l, map.get(20l));
 
-    assertEquals(Set.of(10l, 15l, 20l), map.keySet());;
+    assertEquals(Set.of(10l, 15l, 20l), new MapAdapter<>(map).keySet());;
   }
 
 
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/database/sort/ExternalMergeSortTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/database/sort/ExternalMergeSortTest.java
index f5a4208a..c8a29069 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/database/sort/ExternalMergeSortTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/database/sort/ExternalMergeSortTest.java
@@ -61,7 +61,7 @@ class ExternalMergeSortTest {
 
   public List<String> stringList(DataList<String> list) {
     var l = new ArrayList<String>();
-    for (long i = 0; i < list.sizeAsLong(); i++) {
+    for (long i = 0; i < list.size(); i++) {
       l.add(list.get(i));
     }
     return l;
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OsmTestData.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OsmTestData.java
index ac228a08..775212d3 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OsmTestData.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OsmTestData.java
@@ -29,7 +29,6 @@ import java.util.stream.Stream;
 import org.apache.baremaps.openstreetmap.model.Element;
 import org.apache.baremaps.openstreetmap.model.Entity;
 import org.apache.baremaps.openstreetmap.pbf.PbfEntityReader;
-import org.apache.baremaps.openstreetmap.store.MockDataMap;
 import org.apache.baremaps.openstreetmap.xml.XmlEntityReader;
 import org.apache.baremaps.testing.TestFiles;
 import org.apache.baremaps.utils.RoundingTransformer;
@@ -70,13 +69,13 @@ public class OsmTestData {
         String.format(displayNameFormat, osmTest.getId(), "pbf", 
osmTest.getDescription());
     return Stream.<DynamicTest>builder()
         .add(DynamicTest.dynamicTest(xmlDisplayName, () -> runTest(osmTest, 
new XmlEntityReader()
-            .coordinateMap(new MockDataMap<>())
-            .referenceMap(new MockDataMap<>())
+            .coordinateMap(new HashMap<>())
+            .referenceMap(new HashMap<>())
             .geometries(true)
             .stream(Files.newInputStream(osmTest.getOsmXml())))))
         .add(DynamicTest.dynamicTest(pbfDisplayName, () -> runTest(osmTest, 
new PbfEntityReader()
-            .coordinateMap(new MockDataMap<>())
-            .referenceMap(new MockDataMap<>())
+            .coordinateMap(new HashMap<>())
+            .referenceMap(new HashMap<>())
             .geometries(true)
             .stream(Files.newInputStream(osmTest.getOsmPbf())))))
         .build();
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/geometry/EntityDataTypeGeometryBuilderTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/geometry/EntityDataTypeGeometryBuilderTest.java
index c9fb84f3..1fc7cc8f 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/geometry/EntityDataTypeGeometryBuilderTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/geometry/EntityDataTypeGeometryBuilderTest.java
@@ -23,9 +23,10 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.time.LocalDateTime;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.baremaps.database.collection.DataMap;
 import org.apache.baremaps.openstreetmap.function.EntityGeometryBuilder;
 import org.apache.baremaps.openstreetmap.model.Info;
 import org.apache.baremaps.openstreetmap.model.Member;
@@ -33,7 +34,6 @@ import 
org.apache.baremaps.openstreetmap.model.Member.MemberType;
 import org.apache.baremaps.openstreetmap.model.Node;
 import org.apache.baremaps.openstreetmap.model.Relation;
 import org.apache.baremaps.openstreetmap.model.Way;
-import org.apache.baremaps.openstreetmap.store.MockDataMap;
 import org.apache.baremaps.utils.CRSUtils;
 import org.junit.jupiter.api.Test;
 import org.locationtech.jts.geom.Coordinate;
@@ -110,7 +110,7 @@ class EntityDataTypeGeometryBuilderTest {
 
   static final Node NODE_15 = new Node(15L, INFO, ImmutableMap.of(), 3d, 1d);
 
-  static final DataMap<Long, Coordinate> COORDINATE_CACHE = new 
MockDataMap(Arrays
+  static final Map<Long, Coordinate> COORDINATE_CACHE = new HashMap<>(Arrays
       .asList(NODE_0, NODE_1, NODE_2, NODE_3, NODE_4, NODE_5, NODE_6, NODE_7, 
NODE_8, NODE_9,
           NODE_10, NODE_11, NODE_12, NODE_13, NODE_14, NODE_15)
       .stream()
@@ -132,8 +132,8 @@ class EntityDataTypeGeometryBuilderTest {
   static final Way WAY_5 =
       new Way(5L, INFO, ImmutableMap.of(), ImmutableList.of(12L, 13L, 14L, 
15L, 12L));
 
-  static final DataMap<Long, List<Long>> REFERENCE_CACHE =
-      new MockDataMap(Arrays.asList(WAY_0, WAY_1, WAY_2, WAY_3, WAY_4, 
WAY_5).stream()
+  static final Map<Long, List<Long>> REFERENCE_CACHE =
+      new HashMap<>(Arrays.asList(WAY_0, WAY_1, WAY_2, WAY_3, WAY_4, 
WAY_5).stream()
           .collect(Collectors.toMap(w -> w.getId(), w -> w.getNodes())));
 
   static final Relation RELATION_0 = new Relation(0L, INFO, ImmutableMap.of(), 
List.of());
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/store/MockDataMap.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/store/MockDataMap.java
deleted file mode 100644
index f1059b50..00000000
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/store/MockDataMap.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.baremaps.openstreetmap.store;
-
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import org.apache.baremaps.database.collection.DataMap;
-import org.jetbrains.annotations.Nullable;
-
-public class MockDataMap<K, T> extends DataMap<K, T> {
-
-  private final Map<K, T> values;
-
-  public MockDataMap() {
-    this.values = new HashMap<>();
-  }
-
-  public MockDataMap(Map<K, T> values) {
-    this.values = values;
-  }
-
-  @Override
-  protected Iterator<K> keyIterator() {
-    return values.keySet().iterator();
-  }
-
-  @Override
-  protected Iterator<T> valueIterator() {
-    return values.values().iterator();
-  }
-
-  @Override
-  protected Iterator<Entry<K, T>> entryIterator() {
-    return values.entrySet().iterator();
-  }
-
-  @Override
-  public long sizeAsLong() {
-    return values.size();
-  }
-
-  @Override
-  public boolean containsKey(Object key) {
-    return values.containsKey(key);
-  }
-
-  @Override
-  public boolean containsValue(Object value) {
-    return values.containsValue(value);
-  }
-
-  @Override
-  public T get(Object key) {
-    return values.get(key);
-  }
-
-  @Nullable
-  @Override
-  public T put(K key, T value) {
-    return values.put(key, value);
-  }
-
-  @Override
-  public T remove(Object key) {
-    return values.remove(key);
-  }
-
-  @Override
-  public void clear() {
-    values.clear();
-  }
-}
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/MockDataTable.java 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/MockDataTable.java
index 2ae48bc9..126558a5 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/storage/MockDataTable.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/storage/MockDataTable.java
@@ -25,7 +25,7 @@ import org.apache.baremaps.database.schema.*;
 import org.apache.baremaps.database.schema.DataColumn.Type;
 import org.locationtech.jts.geom.Coordinate;
 
-public class MockDataTable extends AbstractDataTable {
+public class MockDataTable implements DataTable {
 
   private final DataRowType rowType;
 
@@ -51,14 +51,19 @@ public class MockDataTable extends AbstractDataTable {
             List.of("string", 5, 5.0, 5.0f, GEOMETRY_FACTORY.createPoint(new 
Coordinate(5, 5)))));
   }
 
+  @Override
+  public long size() {
+    return rows.size();
+  }
+
   @Override
   public Iterator<DataRow> iterator() {
     return rows.iterator();
   }
 
   @Override
-  public long sizeAsLong() {
-    return rows.size();
+  public void clear() {
+    rows.clear();
   }
 
   @Override
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTableTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTableTest.java
index 6b886f51..9d094007 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTableTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/flatgeobuf/FlatGeoBufDataTableTest.java
@@ -37,7 +37,7 @@ class FlatGeoBufDataTableTest {
   @Test
   void read() throws IOException {
     var table = new 
FlatGeoBufDataTable(TestFiles.resolve("data/countries.fgb"));
-    assertEquals(179, table.sizeAsLong());
+    assertEquals(179, table.size());
     assertEquals(179, table.stream().count());
   }
 
@@ -46,9 +46,8 @@ class FlatGeoBufDataTableTest {
     var file = Files.createTempFile("countries", ".fgb");
     file.toFile().deleteOnExit();
     var table1 = new 
FlatGeoBufDataTable(TestFiles.resolve("data/countries.fgb"));
-    var rows = table1.stream().toList();
     var table2 = new FlatGeoBufDataTable(file, table1.rowType());
-    table2.write(rows);
+    table2.write(table1);
 
     var featureSet = new FlatGeoBufDataTable(file);
     assertEquals(179, featureSet.stream().count());
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageDataSchemaTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageDataSchemaTest.java
index 57d037d8..b8a5c8ad 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageDataSchemaTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageDataSchemaTest.java
@@ -37,7 +37,7 @@ class GeoPackageDataSchemaTest {
   void read() {
     var geoPackageStore = new 
GeoPackageDataSchema(TestFiles.resolve("data/countries.gpkg"));
     var table = geoPackageStore.get("countries");
-    assertEquals(179, table.sizeAsLong());
+    assertEquals(179, table.size());
     assertEquals(179, table.stream().count());
   }
 }
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageToPostgresTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageToPostgresTest.java
index caff9cb4..b1df6687 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageToPostgresTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/geopackage/GeoPackageToPostgresTest.java
@@ -42,7 +42,7 @@ public class GeoPackageToPostgresTest extends 
PostgresContainerTest {
     var postgresTable = postgresStore.get("countries");
     assertEquals("countries", postgresTable.rowType().name());
     assertEquals(4, postgresTable.rowType().columns().size());
-    assertEquals(179l, postgresTable.sizeAsLong());
+    assertEquals(179l, postgresTable.size());
     assertEquals(179l, postgresTable.stream().count());
   }
 }
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/postgres/PostgresDataTableTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/postgres/PostgresDataTableTest.java
index 9cb99765..17d5f789 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/storage/postgres/PostgresDataTableTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/storage/postgres/PostgresDataTableTest.java
@@ -51,7 +51,7 @@ class PostgresDataTableTest extends PostgresContainerTest {
   @Tag("integration")
   void sizeAsLong() {
     var table = schema.get("mock");
-    assertEquals(5, table.sizeAsLong());
+    assertEquals(5, table.size());
   }
 
   @Test
diff --git 
a/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ImportUpdateSampleTest.java
 
b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ImportUpdateSampleTest.java
index 125b24f0..dd019048 100644
--- 
a/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ImportUpdateSampleTest.java
+++ 
b/baremaps-core/src/test/java/org/apache/baremaps/workflow/tasks/ImportUpdateSampleTest.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.baremaps.database.collection.AppendOnlyLog;
 import org.apache.baremaps.database.collection.IndexedDataMap;
+import org.apache.baremaps.database.collection.MapAdapter;
 import org.apache.baremaps.database.memory.OnHeapMemory;
 import org.apache.baremaps.database.type.LongListDataType;
 import org.apache.baremaps.database.type.geometry.CoordinateDataType;
@@ -58,10 +59,10 @@ class ImportUpdateSampleTest extends PostgresRepositoryTest 
{
     PostgresRelationRepository relationRepository = new 
PostgresRelationRepository(dataSource());
 
     // Initialize the data maps
-    Map<Long, Coordinate> coordinateMap =
-        new IndexedDataMap<>(new AppendOnlyLog<>(new CoordinateDataType(), new 
OnHeapMemory()));
-    Map<Long, List<Long>> referenceMap =
-        new IndexedDataMap<>(new AppendOnlyLog<>(new LongListDataType(), new 
OnHeapMemory()));
+    Map<Long, Coordinate> coordinateMap = new MapAdapter<>(
+        new IndexedDataMap<>(new AppendOnlyLog<>(new CoordinateDataType(), new 
OnHeapMemory())));
+    Map<Long, List<Long>> referenceMap = new MapAdapter<>(
+        new IndexedDataMap<>(new AppendOnlyLog<>(new LongListDataType(), new 
OnHeapMemory())));
 
     // Import the sample data
     ImportOsmPbf.execute(OsmSample.SAMPLE_OSM_PBF, coordinateMap, 
referenceMap, headerRepository,

Reply via email to