private RTree() { this(Optional.<Node<T, S>>absent(), 0, null); }
private Rectangle calculateMaxView(RTree<T, S> tree) { return tree.entries().reduce(Optional.<Rectangle>absent(), new Func2<Optional<Rectangle>, Entry<T, S>, Optional<Rectangle>>() { @Override public Optional<Rectangle> call(Optional<Rectangle> r, Entry<T, S> entry) { if (r.isPresent()) return of(r.get().add(entry.geometry().mbr())); else return of(entry.geometry().mbr()); } }).toBlocking().single().or(rectangle(0, 0, 0, 0)); }
public static <T, S extends Geometry> NodeAndEntries<T, S> delete( Entry<? extends T, ? extends S> entry, boolean all, Leaf<T, S> leaf) { List<Entry<T, S>> entries = leaf.entries(); if (!entries.contains(entry)) { return new NodeAndEntries<T, S>(of(leaf), Collections.<Entry<T, S>> emptyList(), 0); } else { final List<Entry<T, S>> entries2 = new ArrayList<Entry<T, S>>(entries); entries2.remove(entry); int numDeleted = 1; // keep deleting if all specified while (all && entries2.remove(entry)) numDeleted += 1; if (entries2.size() >= leaf.context().minChildren()) { Leaf<T, S> node = leaf.context().factory().createLeaf(entries2, leaf.context()); return new NodeAndEntries<T, S>(of(node), Collections.<Entry<T, S>> emptyList(), numDeleted); } else { return new NodeAndEntries<T, S>(Optional.<Node<T, S>> absent(), entries2, numDeleted); } } }
/** * If the RTree has no entries returns {@link Optional#absent} otherwise returns * the minimum bounding rectangle of all entries in the RTree. * * @return minimum bounding rectangle of all entries in RTree */ public Optional<Rectangle> mbr() { if (!root.isPresent()) return absent(); else return of(root.get().geometry().mbr()); }
@VisibleForTesting static <T extends HasGeometry> Pair<T> worstCombination(List<T> items) { //TODO reduce allocations by not using Optional Optional<T> e1 = absent(); Optional<T> e2 = absent(); { Optional<Double> maxArea = absent(); for (int i = 0; i < items.size(); i++) { for (int j = i + 1; j < items.size(); j++) { T entry1 = items.get(i); T entry2 = items.get(j); final double area = entry1.geometry().mbr().add(entry2.geometry().mbr()).area(); if (!maxArea.isPresent() || area > maxArea.get()) { e1 = of(entry1); e2 = of(entry2); maxArea = of(area); } } } } if (e1.isPresent()) return new Pair<T>(e1.get(), e2.get()); else // all items are the same item return new Pair<T>(items.get(0), items.get(1)); } }
@VisibleForTesting static <T extends HasGeometry> T getBestCandidateForGroup(List<T> list, List<T> group, Rectangle groupMbr) { // TODO reduce allocations by not using Optional Optional<T> minEntry = absent(); Optional<Double> minArea = absent(); for (final T entry : list) { final double area = groupMbr.add(entry.geometry().mbr()).area(); if (!minArea.isPresent() || area < minArea.get()) { minArea = of(area); minEntry = of(entry); } } return minEntry.get(); }
private static <T, S extends Geometry> RTree<T, S> read(Input input) { Context<T, S> context = readContext(input); boolean hasRoot = input.readBoolean(); int size = input.readInt(); final Optional<Node<T, S>> root; if (hasRoot) { root = Optional.of(SerializerKryo.<T, S>readNode(input)); } else { root = Optional.absent(); } return SerializerHelper.create(root, size, context); }
/** * Builds the {@link RTree}. * * @param <T> * value type * @param <S> * geometry type * @return RTree */ @SuppressWarnings("unchecked") public <T, S extends Geometry> RTree<T, S> create() { setDefaultCapacity(); return new RTree<T, S>(Optional.<Node<T, S>>absent(), 0, new Context<T, S>(minChildren.get(), maxChildren.get(), selector, splitter, (Factory<T, S>) factory)); }
nodes.addAll(addTheseNodes); if (nodes.size() == 0) return new NodeAndEntries<T, S>(Optional.<Node<T, S>> absent(), addTheseEntries, countDeleted); else {
private RTree() { this(Optional.<Node<T, S>>absent(), 0, null); }
public static <T> Optional<T> fromNullable(T t) { if (t == null) return Optional.absent(); else return Optional.of(t); }
@Override public RTree<T, S> read(InputStream is, long sizeBytes, InternalStructure structure) throws IOException { byte[] bytes = readFully(is, (int) sizeBytes); Tree_ t = Tree_.getRootAsTree_(ByteBuffer.wrap(bytes)); Context<T, S> context = new Context<T, S>(t.context().minChildren(), t.context().maxChildren(), new SelectorRStar(), new SplitterRStar(), factory); Node_ node = t.root(); if (node == null) { return SerializerHelper.create(Optional.<Node<T, S>>absent(), 0, context); } else { final Node<T, S> root; if (structure == InternalStructure.SINGLE_ARRAY) { if (node.childrenLength() > 0) { root = new NonLeafFlatBuffers<T, S>(node, context, factory.deserializer()); } else { root = new LeafFlatBuffers<T, S>(node, context, factory.deserializer()); } } else { root = toNodeDefault(node, context, factory.deserializer()); } return SerializerHelper.create(Optional.of(root), (int) t.size(), context); } }
private Rectangle calculateMaxView(RTree<T, S> tree) { return tree.entries().reduce(Optional.<Rectangle>absent(), new Func2<Optional<Rectangle>, Entry<T, S>, Optional<Rectangle>>() { @Override public Optional<Rectangle> call(Optional<Rectangle> r, Entry<T, S> entry) { if (r.isPresent()) return of(r.get().add(entry.geometry().mbr())); else return of(entry.geometry().mbr()); } }).toBlocking().single().or(rectangle(0, 0, 0, 0)); }
/** * If the RTree has no entries returns {@link Optional#absent} otherwise returns * the minimum bounding rectangle of all entries in the RTree. * * @return minimum bounding rectangle of all entries in RTree */ public Optional<Rectangle> mbr() { if (!root.isPresent()) return absent(); else return of(root.get().geometry().mbr()); }
@VisibleForTesting static <T extends HasGeometry> T getBestCandidateForGroup(List<T> list, List<T> group, Rectangle groupMbr) { // TODO reduce allocations by not using Optional Optional<T> minEntry = absent(); Optional<Double> minArea = absent(); for (final T entry : list) { final double area = groupMbr.add(entry.geometry().mbr()).area(); if (!minArea.isPresent() || area < minArea.get()) { minArea = of(area); minEntry = of(entry); } } return minEntry.get(); }
private static <T, S extends Geometry> RTree<T, S> read(Input input) { Context<T, S> context = readContext(input); boolean hasRoot = input.readBoolean(); int size = input.readInt(); final Optional<Node<T, S>> root; if (hasRoot) { root = Optional.of(SerializerKryo.<T, S>readNode(input)); } else { root = Optional.absent(); } return SerializerHelper.create(root, size, context); }