[graphl-cvs] graphl/src/org/mediavirus/graphl/graph/filter TransitiveCompressionFilter.java EdgeCom
Status: Pre-Alpha
Brought to you by:
flo1
From: Flo L. <fl...@us...> - 2006-07-11 18:34:46
|
Update of /cvsroot/graphl/graphl/src/org/mediavirus/graphl/graph/filter In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv16361/src/org/mediavirus/graphl/graph/filter Modified Files: FilteredGraph.java XPathFilteredGraph.java Added Files: TransitiveCompressionFilter.java EdgeCompressionFilter.java Log Message: backup commit - first implementation of xpath-based structural filters --- NEW FILE: TransitiveCompressionFilter.java --- /* * Created on 10.07.2006 */ package org.mediavirus.graphl.graph.filter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.jaxen.JaxenException; import org.jaxen.XPath; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.GraphElement; import org.mediavirus.graphl.graph.Node; import org.mediavirus.graphl.jaxen.GraphlXPath; public class TransitiveCompressionFilter { GraphlXPath selector; String edgeType; public TransitiveCompressionFilter(GraphlXPath selector, String newType) { this.selector = selector; this.edgeType = newType; } public String getEdgeType() { return edgeType; } public XPath getSelector() { return selector; } public void filterGraph(XPathFilteredGraph graph) { try { Object paths = selector.selectPaths(graph); if (paths instanceof List) { for (List path : (List<List>)paths) { if (path.get(0) instanceof Node && path.get(path.size()-1) instanceof Node) { Node startNode = (Node)path.get(0); Node endNode = (Node)path.get(path.size()-1); Edge newEdge = graph.createEdge(startNode, endNode); newEdge.setType(edgeType); path.remove(path.size()-1); path.remove(0); graph.removeElements(path); graph.addElements(null, Collections.singleton(newEdge)); } } } } catch (JaxenException jexdasdu) { System.err.println("Error evaluation XPath " + selector.toString() + " on graph: " + jexdasdu); } } } --- NEW FILE: EdgeCompressionFilter.java --- /* * Created on 10.07.2006 */ package org.mediavirus.graphl.graph.filter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.jaxen.JaxenException; import org.jaxen.XPath; import org.mediavirus.graphl.graph.Edge; import org.mediavirus.graphl.graph.GraphElement; import org.mediavirus.graphl.graph.Node; public class EdgeCompressionFilter { XPath selector; XPath groupBy; String newType; public EdgeCompressionFilter(XPath selector, XPath groupBy, String newType) { this.selector = selector; this.groupBy = groupBy; this.newType = newType; } public XPath getGroupBy() { return groupBy; } public String getNewType() { return newType; } public XPath getSelector() { return selector; } public void filterGraph(XPathFilteredGraph graph) { try { Object elements = selector.evaluate(graph); if (elements instanceof List && ((List)elements).size() > 1) { // this maps edges by to and from nodes Map<Set<Node>, List<Edge>> groups = new HashMap<Set<Node>, List<Edge>>(); for (Edge edge : (List<Edge>)elements) { Object groupElements = groupBy.evaluate(edge); Set nodeSet; if (groupElements instanceof List) { nodeSet = new HashSet((List)groupElements); } else { nodeSet = Collections.singleton(groupElements); } if (groups.get(nodeSet) == null) { groups.put(nodeSet, new ArrayList<Edge>()); } groups.get(nodeSet).add(edge); } List<Edge> newEdges = new ArrayList<Edge>(); List<Edge> edgesToRemove = new ArrayList<Edge>(); for (Set<Node> group : groups.keySet()) { // only compress if more than 1 edge and exactly 2 endnodes if (group.size() == 2 && groups.get(group).size() > 1) { Node[] endnodes = new Node[2]; int i = 0; for (Iterator<Node> groupIter = group.iterator(); groupIter.hasNext();) { Node node = groupIter.next(); endnodes[i++] = node; if (i==2) break; } Edge newEdge = graph.getSource().createEdge(endnodes[0], endnodes[1]); newEdge.setType(newType); newEdges.add(newEdge); edgesToRemove.addAll(groups.get(group)); } else if (group.size() != 2) { System.err.println("Warning: Edge compression grouping expression (" + groupBy.toString() + ") does not result in 2 elements - ignoring compression."); } } graph.removeElements(edgesToRemove); graph.addElements(null, newEdges); } } catch (JaxenException jexdasdu) { System.err.println("Error evaluation XPath " + selector.toString() + " on graph: " + jexdasdu); } } } Index: XPathFilteredGraph.java =================================================================== RCS file: /cvsroot/graphl/graphl/src/org/mediavirus/graphl/graph/filter/XPathFilteredGraph.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** XPathFilteredGraph.java 3 Jul 2006 15:26:33 -0000 1.1 --- XPathFilteredGraph.java 11 Jul 2006 18:34:31 -0000 1.2 *************** *** 22,25 **** --- 22,27 ---- List<XPathFilter> omissionFilters = new ArrayList<XPathFilter>(); List<NodeCompressionFilter> nodeCompressionFilters = new ArrayList<NodeCompressionFilter>(); + List<EdgeCompressionFilter> edgeCompressionFilters = new ArrayList<EdgeCompressionFilter>(); + List<TransitiveCompressionFilter> transitiveCompressionFilters = new ArrayList<TransitiveCompressionFilter>(); List<Node> overlayNodes = new ArrayList<Node>(); *************** *** 39,48 **** } ! public void addEdgeCompressionFilter(XPath selector, String newType) { ! } ! public void addTransitiveCompressionFilter(XPath selector, String newType) { ! } --- 41,50 ---- } ! public void addEdgeCompressionFilter(EdgeCompressionFilter filter) { ! edgeCompressionFilters.add(filter); } ! public void addTransitiveCompressionFilter(TransitiveCompressionFilter filter) { ! transitiveCompressionFilters.add(filter); } *************** *** 70,73 **** --- 72,81 ---- filter.filterGraph(this); } + for (EdgeCompressionFilter filter : edgeCompressionFilters) { + filter.filterGraph(this); + } + for (TransitiveCompressionFilter filter : transitiveCompressionFilters) { + filter.filterGraph(this); + } fireGraphContentsChanged(); Index: FilteredGraph.java =================================================================== RCS file: /cvsroot/graphl/graphl/src/org/mediavirus/graphl/graph/filter/FilteredGraph.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** FilteredGraph.java 3 Jul 2006 15:26:33 -0000 1.7 --- FilteredGraph.java 11 Jul 2006 18:34:31 -0000 1.8 *************** *** 247,252 **** public void addElements(Collection<Node> nodes, Collection<Edge> edges) { ! cachedNodes.addAll(nodes); ! cachedEdges.addAll(edges); sourceGraph.addElements(nodes, edges); } --- 247,252 ---- public void addElements(Collection<Node> nodes, Collection<Edge> edges) { ! if (nodes != null) cachedNodes.addAll(nodes); ! if (edges != null) cachedEdges.addAll(edges); sourceGraph.addElements(nodes, edges); } |