jAgg 0.9.0 (Beta) Released - 13 Nov 2014

New in jAgg 0.9.0:

  • Ticket #7. An aggregator specification string for ConcatAggregator isn't working: Aggregator agg = Aggregator.getAggregator("Concat(property, \",\")") The one-arg constructor for ConcatAggregator has been fixed.
  • Ticket #8. Create Analytic Functions. jAgg now supports analytic functions that return a value for every row, depending on a dynamic window of values around the current value. The AnalyticFunction interface has been created to facilitate the creation of analytic functions. It extends the new AggregateFunction interface, which has been pulled out of Aggregator. Built-in analytic functions include CumeDist, DenseRank, Lag, Lead, Ntile, PercentRank, Rank, RatioToReport, and RowNumber. All existing built-in Aggregators can now be used as analytic functions too. Internally, an AnalyticAggregator contains the AnalyticFunction and has knowledge of the PartitionClause, the OrderByClause, and the WindowClause. More details can be found on the AnalyticFunctions page and on the AnalyticAggregator page.
  • Ticket #9. jAgg Exceptions. Prior to 0.9.0, jAgg threw Java built-in exceptions such as IllegalArgumentException, NoSuchMethodException, and UnsupportedOperationException. Now, jAgg wraps these in its own defined exceptions, each of which is a JaggException, which is a RuntimeException. If you are catching exceptions coming from jAgg, please consider catching a JaggException, which may be a subclass: AggregatorCreationException, AnalyticCreationException, ExpectedComparableException, ExpectedNumberException, ParseException, or PropertyAccessException.
  • Additionally, the package hierarchy is a bit more organized, with the addition of the exception, math, model, and util packages under net.sf.jagg.

jAgg 0.8.1 (Beta) Released - 10 Jul 2014

New in jAgg 0.8.1:

  • Ticket #6. Allow dynamic property names. If there is no bean method matching the property name, e.g. getProperty() for the property property, then jAgg will now look for a get(String) or a get(Object) method, and pass the property name as a parameter. In this example, get("property") would be called.

jAgg 0.8.0 (Beta) Released - 02 May 2014

New in jAgg 0.8.0:

  • Ticket #4. When a Web Server such as Tomcat reloads an web appplication, it creates a new ClassLoader and reloads the classes for the web application. But if jAgg is also deployed, the Methods in its internal MethodCache still refer to the old classes. This class has been changed so that if the class is reloaded, separate cache entries will be made, so that a stale entry isn't used. It can also be cleared explicitly with the new clear() method.
  • Ticket #5. Nested properties are here! Now it is possible to provide a property such as "item.objectB.displayName", with the "." character representing nested access to properties.

jAgg 0.7.2 (Beta) Released - 22 Oct 2013

New in jAgg 0.7.2:

  • Bug fix for Ticket #3. When using super-aggregation, a StdDevAggregator could return NaN instead of the correct result. This has been fixed.
  • The Aggregator.getValueFromProperty method was protected. It has been made public so outside code can use it freely.
  • The property name mechanism in jAgg has always assumed that there is a method called "getProperty()", if the property name is "property". Starting with this version, "isProperty()" is also checked, to fit the bean naming convention for getter methods that return a boolean.

jAgg 0.7.1 (Beta) Released - 05 Jul 2013

New in jAgg 0.7.1:

  • 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.

jAgg 0.7.0 (Beta) Released - 05 Nov 2012

New in jAgg 0.7.0:

  • 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.

jAgg 0.6.0 (Beta) Released - 14 Aug 2012

New in jAgg 0.6.0:

  • 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.

jAgg 0.5.0 (Beta) Released - 03 May 2012

New in jAgg 0.5.0:

  • 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.

jAgg 0.4.0 (Beta) Released - 12 Aug 2011

New in jAgg 0.4.0:

  • Bug fix for Ticket #1: 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.

jAgg 0.3.0 (Beta) Released - 25 Jul 2011

New in jAgg 0.3.0:

  • 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.

jAgg 0.2.0 (Beta) Released - 18 Apr 2011

New in jAgg 0.2.0:

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

jAgg 0.1.0 (Beta) Released - 9 Nov 2010

This is the initial release of jAgg.