LogicBlox 4.6.0

Release Date: September 12, 2018

What's New

LogicBlox 4.6.0 introduces the following enhancements:

  • Modeler
    • The performance of Modeler's Export to Excel functionality has been improved significantly.

    • Modeler now supports the configuration of an empty value for measures. When there is no value returned for a measure for a cell, this configured value will be shown instead.

      Empty values can be defined in the EmptyValue column of the measures configuration file measures.csv like so:

      Measure,Label,Intersection,DataType,DefaultValue,DefaultAgg,DefaultSpread,RecalcRuleName,PercentBase,PercentParentDimension,Format,HAlignment,Readonly,SpreadByMetric,DerivationType,EmptyValue
      EmptyValueDecimal,EmptyValueDecimal,sku,decimal,,,,,,,"$#,###.00",right,,,,0d
      

      Unlike default values, which are a performance optimization/convenience, empty values are only displayed in Modeler's UI. If a measure has both a default value and an empty value, the default value will take precedence. However, there are some instances where even though a measure is declared to have a default value, the rule defined for the measure does not allow it and in these cases the empty value will be used, if defined.

    • Modeler's filter panel has been enhanced with a number of new options to improve the searching and filtering experience:

      • We have added the Exact decimal filter. This filter allows the user to specify an exact decimal value to filter on. Using the "exclude from results" option, the user can choose whether Modeler needs to include or exclude the specified value from the filter result.

        This decimal filter can be defined in the sheet configuration JSON by configuring an equal or not_equal filter.

        Example 1. 

        The following filter gives all SKU's where Sales is exactly $ 15,000.

        {
          "pivotConfig": {
              "axis": {
                  "x": [{ "qualifiedName": "Product:Sku" }],
                  "y": [{ "qualifiedName": "-:Measures" }],
                  "z": [{ "qualifiedName": "Sales" }]
              },
              "filter": {
                  "Sales": {
                      "type": "equal",
                      "value": 15000
                  }
              }
          }
        }
        

        Example 2. 

        The following filter excludes all SKU's from the results where Returns is equal to zero.

        {
          "pivotConfig": {
              "axis": {
                  "x": [{ "qualifiedName": "Product:Sku" }],
                  "y": [{ "qualifiedName": "-:Measures" }],
                  "z": [{ "qualifiedName": "Returns" }]
              },
              "filter": {
                  "Returns": {
                      "type": "not_equal",
                      "value": 0
                  }
              }
          }
        }
        

      • In the Range, At Most, and At Least decimal filters, the new "include empty values" option allows users to specify whether they want to include empty cells in the filter results.

        The "include empty values" option of a filter can be defined in the sheet configuration JSON using the includeEmpty property.

        Example 3. 

        {
            "pivotConfig": {
                "axis": {
                    "x": [{ "qualifiedName": "Product:Sku" }],
                    "y": [{ "qualifiedName": "-:Measures" }],
                    "z": [{ "qualifiedName": "Sales" }]
                },
                "filter": {
                    "Sales": {
                        "type": "range",
                        "includeEmpty": false,
                        "min": 1000,
                        "max": 10000
                    }
                }
            }
        }
        

      • The "exclude from results" option has also been added to the string filter. This option allows the user to inverse the filter result.

        The "exclude from results" option of a string filter can be defined in the sheet configuration JSON using the exclude property.

        Example 4. 

        The following filter returns all SKU's except the ones with a color equal to Red.

        {
            "id": "my-view",
            "pivotConfig": {
                "axis": {
                    "x": [{ "qualifiedName": "Product:Sku" }],
                    "y": [{ "qualifiedName": "-:Measures" }],
                    "z": [{ "qualifiedName": "SkuColor" }]
                },
                "filter": {
                    "SkuColor": {
                        "type": "match",
                        "exclude": true,
                        "selection": {
                            "Red": true
                        }
                    }
                }
            }
        }
        

    • Modeler's fonts and buttons have been updated to Infor Design System's latest SoHo XI standards.

  • Tools and Services
    • We now enable domain parallelism for incremental maintenance of more rules, including those that have sensitivity indices. With previous releases, rules with sensitivity indices were maintained sequentially, which could perform badly. As an example, the rule below can now use domain parallelism when incrementally maintained.

      r(x,y) <- a(x), b(x,y), c(y).

    • Added a timeout parameter to lb-workflow's workbook tasks.

  • Measure service
    • Introduced the cover aggregation method for position-only expressions as a dual to the already existing collect aggregation method. For a position-only expression, collect will yield a position at the aggregated level if there is position in the source that maps to the aggregated intersection. This is analogous to Boolean or.

      The new cover aggregation will yield a position at the aggregated level if all positions mapping to the aggregated position exist (not that this does not apply in the vacuous case where there are no level members for the base position).

      Currently, cover may only be used for position-only expressions. It could maybe be extended to handle CubiQL expressions with values, but we want to see real-world use cases first.

    • Improvements to measure service error reporting:
      • We more reliably collect all relevant errors and warnings in more cases, where we would often only report the first error encountered previously.

      • We've introduced a first step towards more structured error reporting. We've refined the Problem message in the protocol into AtomicProblem and NestedProblem so that it is possible to group related errors and warnings together. The old fields in the Problem message will be removed in 4.7.0

    • Improved support for working with locks.

      • There is now textual syntax for specifying locks with updates. The changes to the grammar include:

        <update> ::= do <update-expr>
                  |  do <update-expr> locking <locks>
        <locks> ::= <lock> and ... and <lock>
        
        <lock> ::= <dimension-lock>
                |  <target-lock>
        
        <target-lock> ::= <convertibility> <target> to <expr>
        
        <convertibility> ::= convertible
                          |  fixed
        
        <dimension-lock> ::= dimension <dim-ref> to <expr>
        
        <dim-ref> ::= <dim-name>
                   |  <label> : <dim-name>
        

      • The CubiQL REPL now provides stateful support for working with locks, so that you can define them as part of an ongoing interactive session. The new commands are:

         :set-lock
           -- define a lock for adding to update requests
              lock names are only used within REPL, for referencing across lock commands
              for target locks:
                :set-lock <name> = (convertible|fixed) <target> to <expr>
              for dimension locks:
                :set-lock <name> = dimension [<label> :]<dimension> to <expr>
         :release-lock <name>n
           -- remove a previously-set per-request lock
         :release-all-locks
           -- remove all previously-set per-request locks
         :disable-locks
           -- do not add currently-set locks to requests
         :enable-locks
           -- resume adding currently-set locks to update requests
         :print-lock <name>
           -- print a lock, or all locks if the name is omitted
        

    • Dimension and non-convertible target locks will now be projected to the appropriate base intersection (bottom of the dimension, and base intersection of the target respectively). We didn't do this previously for dimension locks, so it was not really possible to use dimension locks in realistic use cases. We didn't support this previously for non-convertible target locks to encourage people to define them at the correct intersection and avoid confusion, but we do so now for consistency with dimension locks.

    • There is now syntax for updating level map targets:

      <target> ::=  <ident>                   // metric
                |   <level>                   // level
                |   <level>.<ident>           // attribute
                |   <level> -> <level>        // level map
      

    • It is now possible to clear out the data of an EDB measure service model from the command line. This will not work if you are using an IDB version of the protobuf predicates corresponding to the model. For example, lb measure-service model clear -w workspace.

    • The measure service has been split into smaller components, including jars for the Java protobuf bindings and the textual syntax parser, mostly of interest to downstream developers.

Corrected Issues

The issues listed below have been corrected since the 4.5.0 release:

  • Modeler
    • Fixed a Javascript error that occured when using DROP expressions for target locks.

    • Fixed an issue where entering number with a lot of significant digits could result in an "inconsistent edit".

    • Action buttons are now disabled everywhere while the corresponding action is still running.

  • Tools and Services
    • Corrected a problem where some rule rewrites using inside-out evaluation would cause segmentation violations and server crashes.

    • TDX services requests were not properly reported to the tracing infrastructure. This has now been fixed.

    • Fixed an issue in TDX import for the ignore entity accumulation policy. When this policy was used for a given column, the entity would not be created but entities bound to other columns would still be created. Now for a column flagged with ignore accumulation, the entire row is skipped if the entity is not found for a given row and no entity will be created for that row.

    • The lb-web-client utility now uses compression on the wire by default. This used to be the case in the past but was broken in recent releases.

    • Corrected a problem which caused SAML metadata responses to be empty.

    • Cleanup of temporary TDX files was not working as expected, this has been fixed.

  • Measure service
    • Ensure that a dimension lock applies to any target whose intersection involves the dimension, by widening the positions of the lock to the intersection. This corrected an issue where a metric with multiple keys in the keyspace could not be edited if only a single key is dimension locked.

      Also, the treatment of target locks is now harmonized with dimension locks: where a non-convertible target lock given above the base intersection would previously be prohibited, it is now implemented by inserting a projection to the base intersection.

    • Introduced a fix with labeling in spreading.

Installation Information

Install LogicBlox 4.6.0 by following the steps outlined below:

  1. Download the LogicBlox installation package for Linux or macOS from the LogicBlox developer website.
  2. Extract the tarball into a directory, which we refer to as <LOGICBLOX_HOME>.
  3. Run the following commands:
    source <LOGICBLOX_HOME>/etc/profile.d/logicblox.sh
    source <LOGICBLOX_HOME>/etc/bash_completion.d/logicblox.sh
    NOTE: these scripts automatically set all the necessary environment variables (please be aware that this script only works if you use bash as your shell). You might want to add these commands to your .bashrc.

Upgrade Information

  • Modeler
    • The library containing the Modeler migration tool is included in the distribution under <LOGICBLOX_HOME>/lib/npm/modeler-migrations-<VERSION>.tgz and contains a command line tool for doing various transformations/migrations of modeler configurations.

      To use the npm module, you first need to install it by running npm install <LOGICBLOX_HOME>/lib/npm/modeler-migrations-<VERSION>.tgz. You will then be able to use the command line tool. The module contains a README.md file that lists all available transformations as well as detailed instructions for use.

      To automatically upgrade a Modeler application from one version to another, run the upgrade script to upgrade between versions:

      ./node_modules/.bin/migrate-modeler --fromVersion <prevVer> --toVersion <toVer> /path/to/my/modelerapp

      where the version numbers refer to LogicBlox releases (e.g. 4.6.0).

      NOTE: If you installed the npm module globally, you won't need the ./node_modules/.bin prefix on the command.

Release Information

  • Server requirements
    • Operating System: 64-bit Linux; Apple macOS 10.10+ is supported for local development
    • Java Runtime Environment 8, update 101 or higher
    • Python 2.7 or higher
  • Client requirements
    • Applications using LogicBlox Modeler: Modeler supports major browsers not older than 1 year. Google Chrome provides the best performance.
    • Requirements for applications using non-LogicBlox Modeler components may vary per application.