planetiler/planetiler-core/src/main/java/com/onthegomap/planetiler/collection/FeatureSort.java

80 wiersze
2.0 KiB
Java

package com.onthegomap.planetiler.collection;
import com.onthegomap.planetiler.util.DiskBacked;
import com.onthegomap.planetiler.util.MemoryEstimator;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import javax.annotation.concurrent.NotThreadSafe;
/**
* A utility that accepts {@link SortableFeature} instances in any order and lets you iterate through them ordered by
* {@link SortableFeature#key()}.
* <p>
* Only supports single-threaded writes and reads.
*/
@NotThreadSafe
interface FeatureSort extends Iterable<SortableFeature>, DiskBacked, MemoryEstimator.HasEstimate {
/*
* Idea graveyard (all too slow):
* - sqlite (close runner-up to external merge sort - only 50% slower)
* - mapdb b-tree
* - rockdb
* - berkeley db
*/
/** Returns a feature sorter that sorts all features in memory. Suitable for toy examples (unit tests). */
static FeatureSort newInMemory() {
List<SortableFeature> list = new ArrayList<>();
return new FeatureSort() {
@Override
public void sort() {
list.sort(Comparator.naturalOrder());
}
@Override
public long numFeaturesWritten() {
return list.size();
}
@Override
public void add(SortableFeature newEntry) {
list.add(newEntry);
}
@Override
public long estimateMemoryUsageBytes() {
return 0;
}
@Override
public long diskUsageBytes() {
return 0;
}
@Override
public Iterator<SortableFeature> iterator() {
return list.iterator();
}
};
}
void sort();
long numFeaturesWritten();
/** Returns all elements in a list. WARNING: this will materialize all elements in-memory. */
default List<SortableFeature> toList() {
List<SortableFeature> list = new ArrayList<>();
for (SortableFeature entry : this) {
list.add(entry);
}
return list;
}
void add(SortableFeature newEntry);
}