1 package prefuse.data.expression; 2 3 import java.util.Comparator ; 4 5 import prefuse.data.Schema; 6 import prefuse.data.Tuple; 7 import prefuse.util.TypeLib; 8 import prefuse.util.collections.DefaultLiteralComparator; 9 import prefuse.util.collections.LiteralComparator; 10 11 18 public class ComparisonPredicate extends BinaryExpression implements Predicate { 19 20 21 public static final int LT = 0; 22 23 public static final int GT = 1; 24 25 public static final int EQ = 2; 26 27 public static final int NEQ = 3; 28 29 public static final int LTEQ = 4; 30 31 public static final int GTEQ = 5; 32 33 private Comparator m_cmp; 34 35 41 public ComparisonPredicate(int operation, 42 Expression left, Expression right) 43 { 44 this(operation, left, right, DefaultLiteralComparator.getInstance()); 45 } 46 47 54 public ComparisonPredicate(int operation, 55 Expression left, Expression right, Comparator cmp) 56 { 57 super(operation, LT, GTEQ, left, right); 58 this.m_cmp = cmp; 59 } 60 61 62 66 public Comparator getComparator() { 67 return m_cmp; 68 } 69 70 72 75 public Class getType(Schema s) { 76 return boolean.class; 77 } 78 79 82 public boolean getBoolean(Tuple t) { 83 Class lType = m_left.getType(t.getSchema()); 84 Class rType = m_right.getType(t.getSchema()); 85 86 int c = 0; 87 if ( TypeLib.isNumericType(lType) && TypeLib.isNumericType(rType) ) { 88 Class type = TypeLib.getNumericType(lType, rType); 89 if ( type == int.class || type == byte.class ) { 90 int x = m_left.getInt(t); 91 int y = m_right.getInt(t); 92 c = ((LiteralComparator)m_cmp).compare(x,y); 93 } else if ( type == long.class ) { 94 long x = m_left.getLong(t); 95 long y = m_right.getLong(t); 96 c = ((LiteralComparator)m_cmp).compare(x,y); 97 } else if ( type == float.class ) { 98 float x = m_left.getFloat(t); 99 float y = m_right.getFloat(t); 100 c = ((LiteralComparator)m_cmp).compare(x,y); 101 } else if ( type == double.class ) { 102 double x = m_left.getDouble(t); 103 double y = m_right.getDouble(t); 104 c = ((LiteralComparator)m_cmp).compare(x,y); 105 } else { 106 throw new IllegalStateException (); 107 } 108 } else { 109 c = m_cmp.compare(m_left.get(t), m_right.get(t)); 110 } 111 112 switch ( m_op ) { 113 case LT: 114 return ( c == -1 ); 115 case GT: 116 return ( c == 1 ); 117 case EQ: 118 return ( c == 0 ); 119 case NEQ: 120 return ( c != 0 ); 121 case LTEQ: 122 return ( c <= 0 ); 123 case GTEQ: 124 return ( c >= 0 ); 125 default: 126 throw new IllegalStateException ("Unknown operation."); 127 } 128 } 129 130 133 public Object get(Tuple t) { 134 return ( getBoolean(t) ? Boolean.TRUE : Boolean.FALSE ); 135 } 136 137 140 public String toString() { 141 String op = "?"; 142 switch ( m_op ) { 143 case LT: 144 op = "<"; 145 break; 146 case GT: 147 op = ">"; 148 break; 149 case EQ: 150 op = "="; 151 break; 152 case NEQ: 153 op = "!="; 154 break; 155 case LTEQ: 156 op = "<="; 157 break; 158 case GTEQ: 159 op = ">="; 160 break; 161 } 162 return m_left.toString()+' '+op+' '+m_right.toString(); 163 } 164 165 } | Popular Tags |