Release notes

1.9.1 (2017-05-12):

Changes:
– Improved type guessing and automatic conversion.
Fixes:
– Fixed problem causing unexpected results on type detection and automatic conversions if generics are not available for input data (for example, if a Map is used as input bean).

1.9.0 (2017-03-08):

Changes:
– Added support for functions, allowing arguments, return value and recursive calls.
– Added Sudoku Solver Demo, with Drools comparison.
– Added possibility to change compilation level in an execution block.
– Compilation context is now using input and output types, instead of instances, allowing to use interface for this lifecycle phase.
– Added MVariablePropertyAccessor (VPROPERTY) allowing to access properties with dynamical names.
– Added converter from execution context to compilation context.
– Added possibility to return value with an executable, wrapped in the Execution Result.
– Added possibility to wrap an executable as an accessor (done automatically). Used for functions.
– Improved XML Factory to accept more cases for sub-objects.
– Execution context now returns Execution result.
– Improved classes “forName” to handle arrays.
– Added “returnValue” property to Flow Control Action.
– Added For Each Number Addon (FOREACHNUMBER) allowing to iterate on a range of numbers.
– Improved automatic cast if types can’t be detected at compilation time.
– Execution context wrappers are now deprecated. It’s more efficient to instantiate a new sub context.
– Added String Format accessor (FORMAT), allowing to format a String, in a way similar to Java Message Format.
– Added PrintF Action, based on FORMAT (PRINTF). Updated some demos to use it.
– Added marker “FATAL” to slf4j interface for Fatal logs.
– Various internal code optimizations, slightly improving performances.

Fixes:
– Corrected potential bug on cache if input and output beans have the same property name.
– Complex strict properties failed to compile, with array access directly after a function invocation, if it was used as an argument. For example :
“!myFunction(!myFunctionReturningArray()[!myFunctionReturningInt()])” failed to compile.

Extensions:
– New extension allowing to integrate MRules in Spring based projects.

1.8.0 (2016-12-15):

Changes:
– Added NOTCONTAINS operator, which is the inversion of CONTAINS.
– Added automatic wrapper to allow execution of accessors, mainly to execute direct method calls from property framework.
– Improved and optimized type detections for operators on collections.
– Improved optimization process to reduce the number of casts during runtime when possible, by casting more accurately constant values.
– Improved property framework to perform auto casts for strict method access with arguments.
– Factory does not anymore create Set for multiple constant values, but List. The optimizer will do transform it to Set only if necessary and no information can be lost.
– Consequent improvements made on cache system, allowing to increase hit ratio and minimize possibility to find in cache a value which has been changed by a previous rule.
– Improved cache usage, by deactivating reset by default at each “FOREACH” iteration.
– Added global cache default activation configuration.
– Added global cache default activation configuration by feature (2 features for the moment: property access and condition evaluation result).
– Global cache default activation might be overridden for a specific ruleset or a specific compilation.
– Added automatic cache deactivation if its usage is computed as unuseful (for example if a temporary result is used as an input for another computation also put in cache) allowing to minimize cache accesses an updates.
– Introduced possibility to force an Addon to reset its cached data.
– Native property extension deactivates globally the cache by default for property access.
– Optimization process is more accurate and proceeds to more modifications:
    – Inverting conditions to always have the eventual constant value as the reference.
    – Changing operator if possible for faster evaluation.
– Changed addon registering API and concept (registered addons is an image at a specific point, which can be reset and redone, possibility to unregister is removed).
– Added optimizer to call “optimize” method of addons, instead of doing it in global optimize process, after optimization chain.
– Added new PropertyUtils to ease access to property framework.
– Some MRulesUtils methods are now deprecated because moved to PropertyUtils.
– Added new IReadWriteAccessor interface.
– Strong optimization of local variables accesses (reads and writes).
– Significantly optimized Collection conversions.
– Added more explicit error message if add or clear fails for a Collection.
– Made resource loading more reliable in multiple classloader environments.

Fixes:
– Corrected bug on native property extension and improved impossible native access detection.
– Corrected ADD and ADDALL actions, which used context read target and now use write target.
– Corrected bug on collection access via property framework, if a Collection nested inside a Map had to be automatically created to add an element.
– Corrected toString on some addons.

Extensions:
– MRulesNativeProperties version now follows core project’s version, to make its integration easier.

1.7.0 (2016-11-14):

Changes:
– Added ADDALL Action, to add all elements from an iterable source to a target.
– Optimized iterations on fixed lists.
– Optimized evaluation condition for LIGHT mode.
– Improved memory footprint for reflexion invocation. Introduced “ArrayProvider” API.
– Other small optimizations on rules optimizer and license reading.
– Improved javadoc.

Fixes:
– Fixed a bug in compilation process which made it fail with no reasons in very rare and specific cases when conversions to Strings had to be made.
– Fixed problem on cache which could be abusively deactivated sometimes.

Extensions:
– MRulesNativeProperties is now in version 1.2, in order to follow changes in configuration syntax made in previous version.
v1.0 is bound to MRules 1.4.x ; v1.1 is bound to MRules versions 1.5.x and 1.6.x ; version 1.2 is bound to MRules version 1.7.0.

1.6.1 (2016-09-14):

Changes:
– Improved types and conversions handling for complex cases involving Collections.
– Removed partial support for Arrays in SPLIT Accessor, as arrays are not fully supported by other Addons. Global array support may be added in future releases.

Fixes:
– Missing check on evaluation condition.
– Property Accessor does not handle well iterable sub-source.

1.6.0 (2016-09-04):

Changes:
– Added Accessor DATEOP, allowing to perform operations on date.
– Added Accessor DATEDIFF, allowing to compute duration between two dates.
– Added Accessor ABS, allowing to compute absolute value of numbers.
– Added Operator NOTEMPTY, negation of EMTY.
– Several improvements where made to Collection handling: Some Accessors which did not allow requesting Collections as results now allow it.

1.5.1 (2016-08-31):

Fix:
– Dates where badly parsed from String or an error occurred if their format was different from preferred format.

1.5.0 (2016-08-05):

Changes:
– Optimization cycle
    – Optimization is now a separated phase of the life cycle. Phase named “OPTIMIZE” is now between the “COMPILE” and “EXECUTE” phases.
    – Addons registration is now done recursively by a generic module and is no more responsability of the parent Addon.
    – Improved optimization phase (split into 2 steps: global and specific per Addon).
    – Added Optimizer modules for global step:
        – Created the optimizer chain, handling the optimizers launch and configured by the global configuration.
        – Added optimizer: Constant detection. Searches for expressions which might be turned into constant values.
        – Added optimizer: Expression optimizer. Searched for simplifications which might be applied on conditions. For example: (A or A) is simply A.
        – Added optimizer: Deduplication detection. Searches for similar objects in the ruleset object tree, in order to reuse instances and optimize memory footprint.
    – Optimizer chain is customizable on a per-ruleset basis via the custom properties. Updated advanced demo to demonstrate deactivation of an optimizer for a specific rule set.
    – Optimization process might be fully disabled for a specific execution via the compilation context, the Inject annotation or the JNDI properties.
– XML Configuration now persists rule set custom properties.
– Added “not” flag to ICondition API, in order to make optimization process more efficient.
– All Addons have now a generic toString method to simplify debug.
– Improved conversions between Files, URIs and URLs.
– Improved global variable to better cast their values to other types.
– Improved Date objects conversions. Added global, specific and preferred patterns to date converters. Native configuration has been improved.
– Added JDK7 extensions, in order to handle new Path object for conversions.
– Added JDK8 extensions, handling new types provided by date / time API:
    – Global variables #NOW, #TIME, #DATE, #DATETIME handle these new types.
    – Date / Time converter handle conversions between legacy java.util.Date, Calendar implementations and SQL date / time types.
– Slightly optimized size of binary code.
– Other internal code optimizations.

Fixes:
– Corrected toString method for MActionAdd, which inverted source value and target collection.

1.4.1 (2016-07-27):

Fix:
– Corrected problem on licence reading for some non-Oracle JVM, for example Android.

1.4.0 (2016-06-24):

Changes:
– Added RESET_CACHE Addon, allowing to flush all data for the current execution.
– Removed previously added interface IAddonCache, moving declared method to IAddon.
– Dropped addon(s) de-duplication methods from MAddonsUtils, replaced by addon(s) registration in compilation context, improved with parent link information.
– Non public methods are now accessible with property framework.
– Added abstraction layer for accessing fields or invoking methods via Reflection, in order to ease extensions development.
– Added interfaces to describe property access and property compilation.
– Added possibility to configure the implementation to use for property access and property compilation.
– Added possibility to disable cache globally for a ruleset (by config) or for a specific execution (by code).
– Added SPLIT Accessor, to split a String using a specified separator.
– Added customizable default type to TypedMap, in order to created automatically nested beans.
– Added new Demo, for online tutorial.
– Added context factory handling to SimpleXMLFactory
– Compilation is now automatic for LIGHT level even if no context factory id provided
– Added AbstractSrcTgtAction abstraction Layer for actions defining a source and a target. Actions SET and ADD now extend this layer.
– Added two extensions (see documentation/extentions):
    – MRulesNativeProperties: allows to generate bytecode to access properties instead of using reflection. Defers to reflection if field or method is not public.
    – MRulesWS: Simple JSON Rest Web Service allowing to run rule sets remotely.

Fixes:
– Corrected bug on automatic addon wrapping (Accessor <–> Condition), which was not done if inserted in a Collection of addons.
– Registering TransferQueue for JDK7+ was searching in package java.util instead of java.util.concurrent.

1.3.0 (2016-05-19):

Changes:
– Added support for CDI (the Java native Context and Dependency Injection) to retrieve engine or session. Available only for JDK6+.
– Improved internal property acess framework. Memory impact is drastically improved.
– Improved internal cache of input data for better performances.
– Improved equals and hashcode on Arrays.
– Added check for SIZE, NULLIFEMPTY and EMPY addons: if source type is not handled a warning is raised. For example the size of a String or of an Array is handled, but there’s no point in retrieving the size of an Integer.
– Removed Exception for CLEAR Addon if type is not handled, replaced by a warning. It’s possible to clear a List for example, but not a String.

Fixes:
– Corrected bug on comparison utility methods.

1.2.0 (2016-04-28):

Changes:
– Added direct access to fields and methods in property access framework.
– Added new global variable: #NULL, to get the null value.
– Added log information.
– Improved config syntax ; Simplified demo accordingly.
– Simplified ITERATE Accessor.
– Optimized properties reading for STANDARD compilation.
– Renamed MAccessorWrappercondition into MAccessorWrapperCondition.
– Improved types guessing for parameterized types.
– Added demo for bench against Drools.
– Added AVAILABLE Accessor, to check if a property is available, at runtime.
– All “Property2” framework is now available.
– Adding more explicit “FATAL” trace for licence problem.
– Internal optimizations.

Fixes:
– Logger name was sometimes wrong at compilation process.
– Error at loading for framework jar.
– Bug on COLINCLUDED / COLINCLUDED when a collection is null or empty : results were inverted.

1.1.0 (2016-04-03):

Changes:
– Added new Map Accessors: MAPVALUES: to get values as a Collection.
– Added new Map Accessors: MAPKEYS: to get keys as a Collection.
– Added new Map Accessors: MAPENTRIES: to get entries as a Collection.
– Added new evaluation operator: EMPTY: to test if object has content (Collection, Map, String, etc).
– Added new action: CLEAR: to clear object’s content (Collection, Map, etc).
– Property access: Allowed Map access with Integer key.
– Constants: Improved guessing of constant values types.
– Configuration: Improved configuration syntax for most used Addons.
– Added new demo.

Fixes:
– Constant values are casted inacurately in some rare cases.
– Set is sometimes transformed into List for IN / NOTIN operators when values must be casted to another type, which degrades performances.
– Comparing values might give unexepected result if one is null.
– Error is malformed if Licence file is not found.
– Corrected defect on generation of toString.