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 17 public class RangePredicate extends BinaryExpression implements Predicate { 18 19 20 public static final int IN_IN = 0; 21 22 public static final int IN_EX = 1; 23 24 public static final int EX_IN = 2; 25 26 public static final int EX_EX = 3; 27 28 private Expression m_middle; 29 private Comparator m_cmp; 30 31 34 40 public RangePredicate(Expression middle, 41 Expression left, Expression right) 42 { 43 this(IN_IN, middle, left, right, 44 DefaultLiteralComparator.getInstance()); 45 } 46 47 54 public RangePredicate(Expression middle, 55 Expression left, Expression right, Comparator cmp) 56 { 57 this(IN_IN, middle, left, right, cmp); 58 } 59 60 68 public RangePredicate(int operation, Expression middle, 69 Expression left, Expression right) 70 { 71 this(operation, middle, left, right, 72 DefaultLiteralComparator.getInstance()); 73 } 74 75 84 public RangePredicate(int operation, Expression middle, 85 Expression left, Expression right, Comparator cmp) 86 { 87 super(operation, IN_IN, EX_EX, left, right); 88 89 this.m_middle = middle; 90 this.m_cmp = cmp; 91 } 92 93 96 100 public Expression getMiddleExpression() { 101 return m_middle; 102 } 103 104 108 public Comparator getComparator() { 109 return m_cmp; 110 } 111 112 115 118 public boolean getBoolean(Tuple t) { 119 Class lType = m_left.getType(t.getSchema()); 120 Class rType = m_right.getType(t.getSchema()); 121 Class mType = m_middle.getType(t.getSchema()); 122 Class sType = null; 123 124 if ( lType.isAssignableFrom(rType) ) { 126 sType = lType; 127 } else if ( rType.isAssignableFrom(lType) ) { 128 sType = rType; 129 } 130 131 int c1, c2 = 0; 132 if ( sType != null && TypeLib.isNumericType(sType) && 133 TypeLib.isNumericType(mType) ) 134 { 135 Class type = TypeLib.getNumericType(sType, mType); 137 if ( type == int.class ) { 138 int lo = m_left.getInt(t); 139 int hi = m_right.getInt(t); 140 int x = m_middle.getInt(t); 141 c1 = ((LiteralComparator)m_cmp).compare(x,lo); 142 c2 = ((LiteralComparator)m_cmp).compare(x,hi); 143 } else if ( type == long.class ) { 144 long lo = m_left.getLong(t); 145 long hi = m_right.getLong(t); 146 long x = m_middle.getLong(t); 147 c1 = ((LiteralComparator)m_cmp).compare(x,lo); 148 c2 = ((LiteralComparator)m_cmp).compare(x,hi); 149 } else if ( type == float.class ) { 150 float lo = m_left.getFloat(t); 151 float hi = m_right.getFloat(t); 152 float x = m_middle.getFloat(t); 153 c1 = ((LiteralComparator)m_cmp).compare(x,lo); 154 c2 = ((LiteralComparator)m_cmp).compare(x,hi); 155 } else if ( type == double.class ) { 156 double lo = m_left.getDouble(t); 157 double hi = m_right.getDouble(t); 158 double x = m_middle.getDouble(t); 159 c1 = ((LiteralComparator)m_cmp).compare(x,lo); 160 c2 = ((LiteralComparator)m_cmp).compare(x,hi); 161 } else { 162 throw new IllegalStateException (); 163 } 164 } else { 165 Object lo = m_left.get(t); 166 Object hi = m_right.get(t); 167 Object x = m_middle.get(t); 168 c1 = m_cmp.compare(x, lo); 169 c2 = m_cmp.compare(x, hi); 170 } 171 172 switch ( m_op ) { 174 case IN_IN: 175 return ( c1 >= 0 && c2 <= 0 ); 176 case IN_EX: 177 return ( c1 >= 0 && c2 < 0 ); 178 case EX_IN: 179 return ( c1 > 0 && c2 <= 0 ); 180 case EX_EX: 181 return ( c1 > 0 && c2 < 0 ); 182 default: 183 throw new IllegalStateException ("Unknown operation."); 184 } 185 } 186 187 190 public Class getType(Schema s) { 191 return boolean.class; 192 } 193 194 197 public Object get(Tuple t) { 198 return ( getBoolean(t) ? Boolean.TRUE : Boolean.FALSE ); 199 } 200 201 204 public void visit(ExpressionVisitor v) { 205 v.visitExpression(this); 206 v.down(); m_left.visit(v); v.up(); 207 v.down(); m_middle.visit(v); v.up(); 208 v.down(); m_right.visit(v); v.up(); 209 } 210 211 214 protected void addChildListeners() { 215 super.addChildListeners(); 216 m_middle.addExpressionListener(this); 217 } 218 219 222 protected void removeChildListeners() { 223 super.removeChildListeners(); 224 m_middle.removeExpressionListener(this); 225 } 226 227 230 public String toString() { 231 String lop = "?", rop = "?"; 232 switch ( m_op ) { 233 case IN_IN: 234 lop = rop = "<="; 235 break; 236 case IN_EX: 237 lop = "<="; rop = "<"; 238 break; 239 case EX_IN: 240 lop = "<"; rop = "<="; 241 break; 242 case EX_EX: 243 lop = rop = "<"; 244 break; 245 } 246 return '('+m_left.toString()+' '+lop+' '+m_middle.toString()+" AND "+ 247 m_middle.toString()+' '+rop+' '+m_right.toString()+')'; 248 } 249 250 } | Popular Tags |