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,
