package prefuse.data.expression; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * Library class that computes some simple analyses of an expression. Each * analysis is computed using a visitor instance. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class ExpressionAnalyzer { /** * Determine if an expression has a dependency on a data field. * @param expr the expression to analyze * @return true if the expression has at least one tuple data * field dependency. */ public static boolean hasDependency(Expression expr) { ColumnCollector cc = new ColumnCollector(false); expr.visit(cc); return cc.getColumnCount() > 0; } /** * Get the set of data fields the expression is dependent upon. * @param expr the expression to analyze * @return a set of all data field names the expression references */ public static Set getReferencedColumns(Expression expr) { ColumnCollector cc = new ColumnCollector(true); expr.visit(cc); return cc.getColumnSet(); } /** * ExpressionVisitor that collects all referenced columns / data fields * in an Expression. */ private static class ColumnCollector implements ExpressionVisitor { private boolean store; private Set m_cols; private int m_count; public ColumnCollector(boolean store) { this.store = store; } public int getColumnCount() { return m_count; } public Set getColumnSet() { if ( m_cols == null ) { return Collections.EMPTY_SET; } else { return m_cols; } } public void visitExpression(Expression expr) { if ( expr instanceof ColumnExpression ) { ++m_count; if ( store ) { String field = ((ColumnExpression)expr).getColumnName(); if ( m_cols == null ) m_cols = new HashSet(); m_cols.add(field); } } } public void down() { // do nothing } public void up() { // do nothing } } } // end of class ExpressionAnalyzer