jAgg Changelog

What's new in jAgg 0.7.1 Beta

Jul 6, 2013
  • Bug fix for Ticket #2. A NullPointerException could occur when using MaxAggregator or MinAggregator when using super aggregation or parallelism. Specifically, the merge method wasn't null-checking its values before comparing them. Now it null-checks its values. A null merged with a non-null will yield the non-null counterpart.

New in jAgg 0.7.0 Beta (Mar 5, 2013)

  • There is support for "super aggregation" - grouping sets, rollups, and cubes. New methods in the AggregateValue class determine which properties represent "all values" in an AggregateValue that represents a super-aggregate value.
  • The new class Aggregation now handles the aggregation duties. It contains a static Builder class that builds the Aggregation object based on different parameters. The old API in the Aggregations class still works, but it simply delegates to Aggregation.
  • There is a new "readme.txt" file.
  • This site has been reorganized to provide more documentation and more examples.

New in jAgg 0.6.0 Beta (Mar 5, 2013)

  • There are two new Aggregators - ModeAggregator, which finds the statistical mode for a set of values, and CollectAggregator, which adds all values found into a List.
  • There are two new Discriminators, for use in Multiset Discrimination: DateDiscriminator and CalendarDiscriminator.
  • This is the first jAgg release to be submitted to the Sonatype OSS Maven Repository, which will make jAgg available in the Maven Central Repository.

New in jAgg 0.5.0 Beta (Mar 5, 2013)

  • In 0.4.0 and before, if there were no values to aggregate, then an empty List of AggregateValues was returned. While this is correct for grouping by one or more properties, this is incorrect when grouping by no properties. Now, in 0.5.0, if there are no values to aggregate, and there are no properties to group by, then a List of one AggregateValue is returned, with each desired Aggregator returning initial values.
  • In 0.4.0 and before, for parallel processing, a NullPointerException could result when using a high degree of parallelism and a low cardinality in the group-by properties. This has been resolved in 0.5.0.
  • A new option in 0.5.0 is to use Multiset Discrimination instead of sorting to gather groups of identical properties prior to the actual aggregation. This is only valid when specifying a group of properties, so each groupBy method that takes a List of properties now takes an optional boolean parameter that indicates whether to use Multiset Discrimination or to rely on the older sorting method. If at any time Multiset Discrimination does not work, jAgg falls back on sorting.

New in jAgg 0.4.0 Beta (Mar 5, 2013)

  • Bug fix for Bug Artifact 3390269: In 0.3.0 and before, only for Variance- and Covariance-related Aggregators, and only in parallel execution, sometimes the results were way off from the correct values. This was caused due to integer division in the merge method, and this has been fixed.
  • Explicit "merge" JUnit test cases have been added for all relevant Aggregators and for the internal "indexOfLastMatching" method, which is used to determine the end of a run of objects that are equivalent.
  • The "count" member variables for all relevant Aggregators has been changed from an int to a long.
  • In 0.3.0 and before, for parallel processing, n threads were used for each run of objects that compared the same. This was overkill, especially when cardinality was high. Now, n threads are used only once for the entire run.
  • In 0.3.0 and before, because double floating-point precision was used, this led to floating-point errors would affected the precision of the results. Now, all Aggregators use "Double-Double" precision internally where appropriate. These now use the new DoubleDouble class internally, to provide much higher precision for calculations. This class provides the following arithmetic operations: addition, subtraction, negation, multiplication, division, squaring, taking the square root, raising to an integer power, and taking the nth root. All operations are now correct to a precision of 1 ulp (unit in the last place) in a double.

New in jAgg 0.3.0 Beta (Mar 5, 2013)

  • JUnit test cases added (using JUnit 4.8.2).
  • ConcatAggregator - Don't add the separator if a retrieved property value was null.
  • LinearRegressionAggregator - Avoid ArithmeticException (divide by zero) if the variance of either variable was zero.
  • HarmonicMeanAggregator - Avoid ArithmeticException (divide by zero) if a retrieved property value was zero.
  • Ensure order is maintained in parallel aggregations, if a thread that was started later finished earlier.
  • When sorting a copy of the original list of objects to aggregate, avoid a NullPointerException by allowing null objects.
  • Fixed bug in parallel processing where the same Aggregator object could have been used by multiple threads at the same time.
  • The static method Aggregator.getValueFromProperty is now protected so that all custom Aggregators can access it. (It was package scope before.)
  • In addition to retrieving aggregated values by calling AggregateValue.getAggregateValue(Aggregator), one can now also retrieve aggregate values by index, with the overloaded AggregateValue.getAggregateValue(int) method.
  • The inheritance hierarchy has been reorganized for Variance, VariancePop, StdDev, StdDevPop, Covariance, and CovariancePop Aggregators to avoid the earlier awkward inheritance hierarchy.
  • The internally used ExecutorCompletionService (and associated ThreadPoolExecutor and Threads) is now saved for future calls.
  • For cleaner code, the Aggregator cache is now in its own class, AggregatorCache.

New in jAgg 0.2.0 Beta (Mar 5, 2013)

  • One-argument String constructors added where missing, to allow Aggregator Specification Strings on all built-in Aggregators.