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.