1 28 package net.sf.jasperreports.engine.fill; 29 30 import net.sf.jasperreports.engine.JRVariable; 31 32 33 37 public class JRDoubleIncrementerFactory extends JRAbstractExtendedIncrementerFactory 38 { 39 40 41 44 protected static final Double ZERO = new Double (0); 45 46 47 50 private static JRDoubleIncrementerFactory mainInstance = new JRDoubleIncrementerFactory(); 51 52 53 56 private JRDoubleIncrementerFactory() 57 { 58 } 59 60 61 64 public static JRDoubleIncrementerFactory getInstance() 65 { 66 return mainInstance; 67 } 68 69 70 73 public JRExtendedIncrementer getExtendedIncrementer(byte calculation) 74 { 75 JRExtendedIncrementer incrementer = null; 76 77 switch (calculation) 78 { 79 case JRVariable.CALCULATION_COUNT : 80 { 81 incrementer = JRDoubleCountIncrementer.getInstance(); 82 break; 83 } 84 case JRVariable.CALCULATION_SUM : 85 { 86 incrementer = JRDoubleSumIncrementer.getInstance(); 87 break; 88 } 89 case JRVariable.CALCULATION_AVERAGE : 90 { 91 incrementer = JRDoubleAverageIncrementer.getInstance(); 92 break; 93 } 94 case JRVariable.CALCULATION_LOWEST : 95 case JRVariable.CALCULATION_HIGHEST : 96 { 97 incrementer = JRComparableIncrementerFactory.getInstance().getExtendedIncrementer(calculation); 98 break; 99 } 100 case JRVariable.CALCULATION_STANDARD_DEVIATION : 101 { 102 incrementer = JRDoubleStandardDeviationIncrementer.getInstance(); 103 break; 104 } 105 case JRVariable.CALCULATION_VARIANCE : 106 { 107 incrementer = JRDoubleVarianceIncrementer.getInstance(); 108 break; 109 } 110 case JRVariable.CALCULATION_DISTINCT_COUNT : 111 { 112 incrementer = JRDoubleDistinctCountIncrementer.getInstance(); 113 break; 114 } 115 case JRVariable.CALCULATION_SYSTEM : 116 case JRVariable.CALCULATION_NOTHING : 117 case JRVariable.CALCULATION_FIRST : 118 default : 119 { 120 incrementer = JRDefaultIncrementerFactory.getInstance().getExtendedIncrementer(calculation); 121 break; 122 } 123 } 124 125 return incrementer; 126 } 127 128 129 } 130 131 132 135 class JRDoubleCountIncrementer extends JRAbstractExtendedIncrementer 136 { 137 140 private static JRDoubleCountIncrementer mainInstance = new JRDoubleCountIncrementer(); 141 142 145 private JRDoubleCountIncrementer() 146 { 147 } 148 149 152 public static JRDoubleCountIncrementer getInstance() 153 { 154 return mainInstance; 155 } 156 157 160 public Object increment( 161 JRCalculable variable, 162 Object expressionValue, 163 AbstractValueProvider valueProvider 164 ) 165 { 166 Number value = (Number )variable.getIncrementedValue(); 167 168 if (value == null || variable.isInitialized()) 169 { 170 value = JRDoubleIncrementerFactory.ZERO; 171 } 172 173 if (expressionValue == null) 174 { 175 return value; 176 } 177 178 return new Double (value.doubleValue() + 1); 179 } 180 181 182 public Object combine(JRCalculable calculable, JRCalculable calculableValue, AbstractValueProvider valueProvider) 183 { 184 Number value = (Number )calculable.getIncrementedValue(); 185 Number combineValue = (Number ) calculableValue.getValue(); 186 187 if (value == null || calculable.isInitialized()) 188 { 189 value = JRDoubleIncrementerFactory.ZERO; 190 } 191 192 if (combineValue == null) 193 { 194 return value; 195 } 196 197 return new Double (value.doubleValue() + combineValue.doubleValue()); 198 } 199 200 201 public Object initialValue() 202 { 203 return JRDoubleIncrementerFactory.ZERO; 204 } 205 } 206 207 208 211 class JRDoubleDistinctCountIncrementer extends JRAbstractExtendedIncrementer 212 { 213 216 private static JRDoubleDistinctCountIncrementer mainInstance = new JRDoubleDistinctCountIncrementer(); 217 218 221 private JRDoubleDistinctCountIncrementer() 222 { 223 } 224 225 228 public static JRDoubleDistinctCountIncrementer getInstance() 229 { 230 return mainInstance; 231 } 232 233 236 public Object increment( 237 JRCalculable variable, 238 Object expressionValue, 239 AbstractValueProvider valueProvider 240 ) 241 { 242 DistinctCountHolder holder = 243 (DistinctCountHolder)valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_COUNT)); 244 245 if (variable.isInitialized()) 246 { 247 holder.init(); 248 } 249 250 return new Double (holder.getCount()); 251 } 252 253 public Object combine(JRCalculable calculable, JRCalculable calculableValue, AbstractValueProvider valueProvider) 254 { 255 DistinctCountHolder holder = 256 (DistinctCountHolder)valueProvider.getValue(calculable.getHelperVariable(JRCalculable.HELPER_COUNT)); 257 258 return new Double (holder.getCount()); 259 } 260 261 public Object initialValue() 262 { 263 return JRDoubleIncrementerFactory.ZERO; 264 } 265 } 266 267 268 271 class JRDoubleSumIncrementer extends JRAbstractExtendedIncrementer 272 { 273 276 private static JRDoubleSumIncrementer mainInstance = new JRDoubleSumIncrementer(); 277 278 281 private JRDoubleSumIncrementer() 282 { 283 } 284 285 288 public static JRDoubleSumIncrementer getInstance() 289 { 290 return mainInstance; 291 } 292 293 296 public Object increment( 297 JRCalculable variable, 298 Object expressionValue, 299 AbstractValueProvider valueProvider 300 ) 301 { 302 Number value = (Number )variable.getIncrementedValue(); 303 Number newValue = (Number )expressionValue; 304 305 if (newValue == null) 306 { 307 if (variable.isInitialized()) 308 { 309 return null; 310 } 311 312 return value; 313 } 314 315 if (value == null || variable.isInitialized()) 316 { 317 value = JRDoubleIncrementerFactory.ZERO; 318 } 319 320 return new Double (value.doubleValue() + newValue.doubleValue()); 321 } 322 323 324 public Object initialValue() 325 { 326 return JRDoubleIncrementerFactory.ZERO; 327 } 328 } 329 330 331 334 class JRDoubleAverageIncrementer extends JRAbstractExtendedIncrementer 335 { 336 339 private static JRDoubleAverageIncrementer mainInstance = new JRDoubleAverageIncrementer(); 340 341 344 private JRDoubleAverageIncrementer() 345 { 346 } 347 348 351 public static JRDoubleAverageIncrementer getInstance() 352 { 353 return mainInstance; 354 } 355 356 359 public Object increment( 360 JRCalculable variable, 361 Object expressionValue, 362 AbstractValueProvider valueProvider 363 ) 364 { 365 if (expressionValue == null) 366 { 367 if (variable.isInitialized()) 368 { 369 return null; 370 } 371 return variable.getValue(); 372 } 373 Number countValue = (Number )valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_COUNT)); 374 Number sumValue = (Number )valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_SUM)); 375 return new Double (sumValue.doubleValue() / countValue.doubleValue()); 376 } 377 378 379 public Object initialValue() 380 { 381 return JRDoubleIncrementerFactory.ZERO; 382 } 383 } 384 385 386 389 class JRDoubleStandardDeviationIncrementer extends JRAbstractExtendedIncrementer 390 { 391 394 private static JRDoubleStandardDeviationIncrementer mainInstance = new JRDoubleStandardDeviationIncrementer(); 395 396 399 private JRDoubleStandardDeviationIncrementer() 400 { 401 } 402 403 406 public static JRDoubleStandardDeviationIncrementer getInstance() 407 { 408 return mainInstance; 409 } 410 411 414 public Object increment( 415 JRCalculable variable, 416 Object expressionValue, 417 AbstractValueProvider valueProvider 418 ) 419 { 420 if (expressionValue == null) 421 { 422 if (variable.isInitialized()) 423 { 424 return null; 425 } 426 return variable.getValue(); 427 } 428 Number varianceValue = (Number )valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_VARIANCE)); 429 return new Double ( Math.sqrt(varianceValue.doubleValue()) ); 430 } 431 432 433 public Object initialValue() 434 { 435 return JRDoubleIncrementerFactory.ZERO; 436 } 437 } 438 439 440 443 class JRDoubleVarianceIncrementer extends JRAbstractExtendedIncrementer 444 { 445 448 private static JRDoubleVarianceIncrementer mainInstance = new JRDoubleVarianceIncrementer(); 449 450 453 private JRDoubleVarianceIncrementer() 454 { 455 } 456 457 460 public static JRDoubleVarianceIncrementer getInstance() 461 { 462 return mainInstance; 463 } 464 465 468 public Object increment( 469 JRCalculable variable, 470 Object expressionValue, 471 AbstractValueProvider valueProvider 472 ) 473 { 474 Number value = (Number )variable.getIncrementedValue(); 475 Number newValue = (Number )expressionValue; 476 477 if (newValue == null) 478 { 479 if (variable.isInitialized()) 480 { 481 return null; 482 } 483 return value; 484 } 485 else if (value == null || variable.isInitialized()) 486 { 487 return JRDoubleIncrementerFactory.ZERO; 488 } 489 else 490 { 491 Number countValue = (Number )valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_COUNT)); 492 Number sumValue = (Number )valueProvider.getValue(variable.getHelperVariable(JRCalculable.HELPER_SUM)); 493 return 494 new Double ( 495 (countValue.doubleValue() - 1) * value.doubleValue() / countValue.doubleValue() + 496 ( sumValue.doubleValue() / countValue.doubleValue() - newValue.doubleValue() ) * 497 ( sumValue.doubleValue() / countValue.doubleValue() - newValue.doubleValue() ) / 498 (countValue.doubleValue() - 1) 499 ); 500 } 501 } 502 503 public Object combine(JRCalculable calculable, JRCalculable calculableValue, AbstractValueProvider valueProvider) 504 { 505 Number value = (Number )calculable.getIncrementedValue(); 506 507 if (calculableValue.getValue() == null) 508 { 509 if (calculable.isInitialized()) 510 { 511 return null; 512 } 513 514 return value; 515 } 516 else if (value == null || calculable.isInitialized()) 517 { 518 return new Double (((Number ) calculableValue.getIncrementedValue()).doubleValue()); 519 } 520 521 double v1 = value.doubleValue(); 522 double c1 = ((Number ) valueProvider.getValue(calculable.getHelperVariable(JRCalculable.HELPER_COUNT))).doubleValue(); 523 double s1 = ((Number ) valueProvider.getValue(calculable.getHelperVariable(JRCalculable.HELPER_SUM))).doubleValue(); 524 525 double v2 = ((Number ) calculableValue.getIncrementedValue()).doubleValue(); 526 double c2 = ((Number ) valueProvider.getValue(calculableValue.getHelperVariable(JRCalculable.HELPER_COUNT))).doubleValue(); 527 double s2 = ((Number ) valueProvider.getValue(calculableValue.getHelperVariable(JRCalculable.HELPER_SUM))).doubleValue(); 528 529 c1 -= c2; 530 s1 -= s2; 531 532 double c = c1 + c2; 533 534 return new Double ( 535 c1 / c * v1 + 536 c2 / c * v2 + 537 c2 / c1 * s1 / c * s1 / c + 538 c1 / c2 * s2 / c * s2 / c - 539 2 * s1 / c * s2 /c 540 ); 541 } 542 543 544 public Object initialValue() 545 { 546 return JRDoubleIncrementerFactory.ZERO; 547 } 548 } 549 | Popular Tags |