package com.revolsys.geometry.graph.visitor; import java.util.Collection; import java.util.HashSet; import java.util.List; 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 NodeRemovalVisitor implements Consumer<Node<Record>> { private final Collection<String> excludedFieldNames = new HashSet<>(); private final RecordGraph graph; public NodeRemovalVisitor(final RecordDefinition recordDefinition, final RecordGraph graph, final Collection<String> excludedFieldNames) { super(); this.graph = graph; if (excludedFieldNames != null) { this.excludedFieldNames.addAll(excludedFieldNames); } } @Override public void accept(final Node<Record> node) { if (node.getDegree() == 2) { final List<Edge<Record>> edges = node.getEdges(); if (edges.size() == 2) { final Edge<Record> edge1 = edges.get(0); final Edge<Record> edge2 = edges.get(1); if (edge1 != edge2) { final Record object1 = edge1.getObject(); final Record object2 = edge2.getObject(); if (DataType.equal(object1, object2, this.excludedFieldNames)) { final End end1 = edge1.getEnd(node); if (end1 == edge2.getEnd(node)) { // if (!fixReversedEdges(node, reversedEdges, edge1, edge2)) { return; // } } if (end1.isFrom()) { this.graph.merge(node, edge2, edge1); } else { this.graph.merge(node, edge1, edge2); } } } } } } }