1 10 package org.mmbase.storage.search.implementation; 11 12 import org.mmbase.bridge.Field; 13 import org.mmbase.core.CoreField; 14 import org.mmbase.storage.search.*; 15 16 24 public class BasicStepField implements StepField { 25 26 27 private CoreField field = null; 28 29 30 private Step step = null; 31 32 33 private String alias = null; 34 35 42 static void testValue(Object value, StepField field) { 44 int type = field.getType(); 45 46 if (value == null) { 48 throw new IllegalArgumentException ("Invalid value for " + org.mmbase.core.util.Fields.getTypeDescription(type) + " field: " + value); 49 } 50 51 boolean ok; 53 switch (type) { 54 case Field.TYPE_BINARY: 55 ok = value instanceof byte[]; 56 break; 57 case Field.TYPE_INTEGER: 59 case Field.TYPE_FLOAT: 60 case Field.TYPE_DOUBLE: 61 case Field.TYPE_LONG: 62 case Field.TYPE_NODE: 63 ok = value instanceof Number ; 64 break; 65 66 case Field.TYPE_XML: 68 69 case Field.TYPE_STRING: 70 ok = value instanceof String ; 71 break; 72 case Field.TYPE_BOOLEAN: 73 ok = value instanceof Boolean ; 74 break; 75 case Field.TYPE_DATETIME: 76 ok = value instanceof java.util.Date || value instanceof Number ; 77 break; 78 case Field.TYPE_LIST: 79 ok = value instanceof java.util.List ; 80 break; 81 82 83 default: throw new IllegalStateException ("Unknown field type: " + type); 85 } 86 87 if (!ok) { 88 throw new IllegalArgumentException ("Invalid value for " + org.mmbase.core.util.Fields.getTypeDescription(type) + " field: " 89 + value + ", of type " + value.getClass().getName()); 90 } 91 } 92 93 104 static boolean equalFieldValues(Object value1, Object value2) { 106 if (value1 instanceof Number ) { 107 if (value2 instanceof Number ) { 108 Number number1 = (Number ) value1; 109 Number number2 = (Number ) value2; 110 return Double.doubleToLongBits(number1.doubleValue()) == Double.doubleToLongBits(number2.doubleValue()); 111 } else { 112 return false; 113 } 114 } else { 115 return (value1 == null? value2 == null: value1.equals(value2)); 116 } 117 } 118 119 126 public BasicStepField(Step step, CoreField field) { 127 if (step == null) { 128 throw new IllegalArgumentException ( 129 "Invalid step value: " + step); 130 } 131 this.step = step; 132 133 if (field == null) { 134 throw new IllegalArgumentException ( 135 "Invalid field value: " + field); 136 } 137 if (!step.getTableName().equals(field.getParent().getTableName())) { 139 throw new IllegalArgumentException ( 140 "Invalid field value, belongs to step " + field.getParent().getTableName() 141 + " instead of step " + step.getTableName() + ": " 142 + field); 143 } 144 this.field = field; 145 } 146 147 154 public BasicStepField setAlias(String alias) { 155 if (alias != null && alias.trim().length() == 0) { 156 throw new IllegalArgumentException ("Invalid alias value: " + alias); 157 } 158 this.alias = alias; 159 return this; 160 } 161 162 167 public CoreField getField() { 168 return field; 169 } 170 171 public String getFieldName() { 173 return field.getName(); 174 } 175 176 public String getAlias() { 178 return alias; 179 } 180 181 public Step getStep() { 183 return step; 184 } 185 186 public int getType() { 188 return field.getType(); 189 } 190 191 public boolean equals(Object obj) { 193 if (obj instanceof StepField) { 194 StepField field = (StepField) obj; 195 return BasicStepField.compareSteps(getStep(), field.getStep()) 196 && getFieldName().equals(field.getFieldName()) 197 && (alias == null? field.getAlias() == null : alias.equals(field.getAlias())); 198 } else { 199 return false; 200 } 201 } 202 203 public int hashCode() { 205 return (getStep().getAlias() == null? 206 47 * getStep().getTableName().hashCode(): 207 51 * getStep().getAlias().hashCode()) 208 + 53 * getFieldName().hashCode() 209 + (alias == null? 0: 59 * alias.hashCode()); 210 } 211 212 228 static boolean compareSteps(Step step1, Step step2) { 230 String alias1 = step1.getAlias(); 231 if (alias1 == null) { 232 return step2.getAlias() == null 233 && step1.getTableName().equals(step2.getTableName()); 234 } else { 235 return alias1.equals(step2.getAlias()); 236 } 237 } 238 239 244 static public String getFieldName(StepField field) { 245 String fieldName = null; 246 if (field != null) { 247 fieldName = field.getAlias(); 248 if (fieldName == null) { 249 fieldName = field.getFieldName(); 250 } 251 Step step = field.getStep(); 252 if (step != null) { 253 if (step.getAlias() != null) { 254 fieldName = step.getAlias() + "." + fieldName; 255 } else { 256 fieldName = step.getTableName() + "." + fieldName; 257 } 258 } 259 } 260 return fieldName; 261 } 262 263 264 public String toString() { 266 StringBuffer sb = new StringBuffer (""); 267 Step step = getStep(); 268 if (step == null) { 269 sb.append("null"); 270 } else { 271 String stepAlias = step.getAlias(); 272 if (stepAlias == null) { 273 sb.append(getStep().getTableName()); 274 } else { 275 sb.append(stepAlias); 276 } 277 } 278 sb.append(".").append(getFieldName()); 279 String alias = getAlias(); 280 if (alias != null) { 281 sb.append(" as ").append(alias); 282 } 283 return sb.toString(); 284 } 285 286 } 287 | Popular Tags |