package com.revolsys.geometry.graph.visitor;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.Consumer;
import com.revolsys.datatype.DataType;
import com.revolsys.geometry.graph.Edge;
import com.revolsys.geometry.graph.Node;
import com.revolsys.geometry.graph.RecordGraph;
import com.revolsys.geometry.model.End;
import com.revolsys.record.Record;
import com.revolsys.record.schema.RecordDefinition;
public class PolygonNodeRemovalVisitor implements Consumer<Node<Record>> {
private final Collection<String> excludedAttributes = new HashSet<>();
private final RecordGraph graph;
public PolygonNodeRemovalVisitor(final RecordDefinition recordDefinition, final RecordGraph graph,
final Collection<String> excludedFieldNames) {
super();
this.graph = graph;
if (excludedFieldNames != null) {
this.excludedAttributes.addAll(excludedFieldNames);
}
}
@Override
public void accept(final Node<Record> node) {
final Set<Edge<Record>> edges = new LinkedHashSet<>(node.getEdges());
while (edges.size() > 1) {
final Edge<Record> edge = edges.iterator().next();
final Record object = edge.getObject();
final Set<Edge<Record>> matchedEdges = new HashSet<>();
final End end = edge.getEnd(node);
for (final Edge<Record> matchEdge : edges) {
final Record matchObject = matchEdge.getObject();
if (edge != matchEdge) {
final End matchEnd = matchEdge.getEnd(node);
if (end != matchEnd) {
if (DataType.equal(object, matchObject, this.excludedAttributes)) {
matchedEdges.add(matchEdge);
}
}
}
}
if (matchedEdges.size() == 1) {
final Edge<Record> matchedEdge = matchedEdges.iterator().next();
if (end.isFrom()) {
this.graph.merge(node, matchedEdge, edge);
} else {
this.graph.merge(node, edge, matchedEdge);
}
}
edges.removeAll(matchedEdges);
edges.remove(edge);
}
}
}