LogicBlox 4.22


LogicBlox 4.22.1

Release Date: September 7, 2020

Corrected Issues

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

  • Tools, Database, and Services
    • Added a special handling of differences in the boost cdf function between lb3 boost version and lb4 boost version. The differences are handled so to mimic the lb3 version behavior.

Known Issues

The issues listed below are known to exist in the 4.22.1 release.

  • Tools, Database, and Services
    • This release contains changes to some lb-workflow tasks related to workbook creation. These fixes have not been applied yet to lb.wb.CreateWorkbook, which means errors related to recent changes in the LB runtime that imposes restrictions on string lengths can still occur. Please note that this known issue does apply to lb.wb.util.CreateWorkbook.

LogicBlox 4.22.0

Release Date: April 13, 2020

What's New

LogicBlox 4.22.0 introduces the following enhancements:

  • Modeler IDE
    • The Modeler IDE now supports sheets creation and configuration for Modeler applications. This means application developers are no longer responsible for creating JSON sheet configurations.

      The new "Sheets" view of the Modeler IDE allows you to

      • edit sheet settings such as the sheet title, the default view mode, which axes should be visible, and the displayable measures and dimensions.
      • configure the fields displayed on the Measures, Columns, Rows, and Slices axis.
      • edit field settings such as sorting behavior, filtering, sheet synchronization (signals), header cell sizing, and conditional formatting.

      Displayable measures and dimensions are configured in the new "Displayable Dimensions" and "Displayable Measures" views. These configurations can be reused in all sheets configured with the IDE.

      Example 1. 

      The following example shows how to change the configuration of a sheet in the Modeler IDE. We add a new measure to the Measures axis and update the way we want to display the rollup of the level Subclass.

      The Modeler IDE will automatically generate a navigation tree for the Modeler application. If you want more control over the navigation tree, you can your own navigation and canvases JSONs by adding them to the src/views/<template> folder of your Modeler IDE project. Please note that the IDE will no longer include JSON sheet configurations found in the src/views folder.

    • The Modeler IDE now supports the generation of predicates for user data access permissions for Modeler workbooks.

      To enable the generation of data access permission predicates for a level, check the new level setting "Generate Permission Predicates". When permissions are enabled for one or more levels in the model, the IDE automatically takes care of adding the built-in modeler library permissions as a dependency of the generated_schema project.

      Example 2. 

      In the following screenshot, we've configured the generation of user data permission predicates for the Class level in the Product dimension by checking the "Generate Permission Predicates" setting.

      Please note that these generated predicates must be populated for permissions to be applied.

    • Language selection in the "Settings" view has been improved. Users can now quickly select a specific locale for some language (e.g. en-US for English). In previous versions of the Modeler IDE, you first had to select a language in the "Language" column before being able to select the locale in the "Value" column.

      Example 3. 

      In the following screenshot, the user selects "English (en-US)" directly from the dropdown list in "Language" column.

    • The Modeler IDE contains the new action type "Copy" which can be used for copying data from one Measure Component to another. In planning applications, this type of action will typically be used for seeding, approval, and actualization.

      Example 4. 

      The following screenshot contains an example of a copy action for actualization. This action can be used to copy measure data from the This Year (TY) version to the Working Plan (WP) version.

      The Modeler IDE will generate the required inactive LogiQL blocks, services and Modeler actions that can then be executed either in batch or from the Modeler application itself.

      This functionality supports the configuration of

      • multiple measure component mappings.
      • multiple measure mappings.
      • multiple filters.
      • action tracking by logging which user called the action at what time. This logging information can be stored in measures.

    • The Modeler IDE now contains copy functionality for both measures and actions. This functionality improves the productivity of the application developer by eliminating the tedious and error-prone process of manually repeating the creation of similar measures and their variants, rules, and overrides.

      Example 5. 

      Copy an existing action or measure (including its variants) by clicking on the new copy icon in its row in the view.

      Example 6. 

      Create a new action based on an existing action using the new copy icon.

    • Users can now export the measure configuration of the Modeler IDE to a CSV file using the "Export to CSV" option in the "Measures" view.

      This functionality can be used by application developers to check the measure configuration without going into each measure and clicking the "Preview All" option. Additionally, business consultants can use this export to tracking progress and validate the application over time.

      Example 7. 

      The following example shows an export of the concrete and derived measures in the measure model of an example planning application.

      Name,Label,Locks,Intersection,Value Type,Aggregation Method,Spread Method,Spread By Metric,Default Value,Horizontal Alignment,Readonly,Base Ambigous,Empty Value,Percent parent - Base metric,Percent parent - Dimension,Format,Format - currency symbol,Format - precision,Format - is thousand separated,Format - symbol position,Format - is space separated,Format - scale factor,Workbooks,Commit Groups,Refresh Groups,Rule,Inverse 0 rule,Inverse 0 update measure,Inverse 1 rule,Inverse 1 update measure
      SkuDescription,Sku Description,,Sku,String,- None -,- None -,,,,,,,,,,,,,,,,,,,,,,,
      ElapsedWeek,Elapsed Week,,Week,None,- None -,- None -,,,,,,,,,,,,,,,,,,,,,,,
      SkuAdded,Sku Added,,Sku,Datetime,- None -,- None -,,,,,,,,,DATETIME,,,,,,,,,,,,,,
      Returns_R_TY_PLN,Returns Retail This Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_R_TY_MGR,Returns Retail This Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_R_WP_PLN,Returns Retail Working Plan Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_R_WP_MGR,Returns Retail Working Plan Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_R_LY_PLN,Returns Retail Last Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_R_LY_MGR,Returns Retail Last Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,,,,,
      Returns_U_TY_PLN,Returns Units This Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      Returns_U_TY_MGR,Returns Units This Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      Returns_U_WP_PLN,Returns Units Working Plan Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      Returns_U_WP_MGR,Returns Units Working Plan Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      Returns_U_LY_PLN,Returns Units Last Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      Returns_U_LY_MGR,Returns Units Last Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,,,,,
      NetSales_R_TY_PLN,Net Sales Retail This Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_TY_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_TY_PLN
      NetSales_R_TY_MGR,Net Sales Retail This Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_TY_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_TY_MGR
      NetSales_R_WP_PLN,Net Sales Retail Working Plan Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_WP_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_WP_PLN
      NetSales_R_WP_MGR,Net Sales Retail Working Plan Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_WP_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_WP_MGR
      NetSales_R_LY_PLN,Net Sales Retail Last Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_LY_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_LY_PLN
      NetSales_R_LY_MGR,Net Sales Retail Last Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,CURRENCY,$,2,True,prefix,,1,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_R_LY_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_R_LY_MGR
      NetSales_U_TY_PLN,Net Sales Units This Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_TY_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_TY_PLN
      NetSales_U_TY_MGR,Net Sales Units This Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_TY_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_TY_MGR
      NetSales_U_WP_PLN,Net Sales Units Working Plan Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_WP_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_WP_PLN
      NetSales_U_WP_MGR,Net Sales Units Working Plan Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_WP_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_WP_MGR
      NetSales_U_LY_PLN,Net Sales Units Last Year Planner,,"Sku, Store, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_LY_PLN,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_LY_PLN
      NetSales_U_LY_MGR,Net Sales Units Last Year Manager,,"Class, City, Week",Decimal,Total,Ratio,,,,,,,,,NUMBER,,,True,,,,,,,"{{ defaultValue = 0d }}
      $Sales - $Returns","{{ defaultValue = 0d }}
      $Returns + Input",Sales_U_LY_MGR,"{{ defaultValue = 0d }}
      $Sales - Input",Returns_U_LY_MGR
      ...

    • The ability to configure header action buttons in the Modeler IDE has been moved from the "Header Action Buttons" tab of the "Settings" view to the new "Header Actions" action tab in the "Workbook Template" view.

      This change allows users to configure header action buttons per workbook template for actions such as Commit and Refresh, which is the common use-case for header action buttons. The IDE will remove any header action button from the project configuration that was previously configured under the "Settings" view.

    • The "Measures" view of the Modeler IDE no longer shows the columns "Value Type" and "Intersection" in the list of configured measures because these columns only contained information for concrete measures (measures without variants).

  • Tools, Database, and Services
    • The LogiQL compiler will no longer report errors about disjunctions in aggregations (AGG_DISJ) for P2Ps other than agg. It is now the responsibility of the implementations of P2Ps to detect disjunction and report an error or warning as appropriate.

    • Implemented the regression p2p with optional vif and stepwise feature selection procedures. This was originally supported in LB3 releases and heavily used by the forecasting engine but had not been implemented in LB4. Details on how to use the regression functionality will be in forthcoming updates to the LogicBlox LogicBlox Core Reference Manual.

    • Added --duration and --duration-file options to many lb commands to allow more accurate reporting of the time taken to execute the command.

  • Measure service
    • Added a new --raw flag to lb measure-service query so that no protocol translation is applied when communicating with the asynchronous measure service.

    • A few usability improvements were made for the measure service recording feature. A boolean recording field was added to the AdminResponse message returned in response to the AdminRequest message used to toggle recording. The recording field indicates if recording has been toggled on or off. The :record REPL command uses this field to print the state of recording.

      Also, deleting the directory where recordings are being actively stored will no longer cause the measure service to fail. Instead, recording will be stopped.

    • The all aggregation grouping has been extended to support hierarchy annotations. This means the following:

      • It is now allowable to set the hierarchy field of the Grouping when the kind field is set to ALL.

      • In the CubiQL textual format, this winds up looking like total Sales by all Calendar.Seasonal. Previously it was only possible to specify the dimension or a label like total Sales by all Calendar.

      • Previously, using an all aggregation grouping would immediately project the specified dimension. For CubiQL like total Sales by all Calendar this would produce LogiQL like ... <- agg<<v=total(v0)>> Sales[sku,store,_]=v0. This behavior was suboptimal in a few different ways. The first major issue was that it was not possible to aggregate away a particular dimension along a specified hierarchy. This would most often manifest as an inconsistency when a composite aggregation was used, where the aggregation would follow the expected hierarchy when aggregating to any level in the dimension unless the dimension was projected.

        The old behavior could also cause some confusion in the case that the application-defined some of its level maps to be partial. Partial level maps would lead to discrepancies in calculations when the measure service chose to optimize some aggregations with some combination of unwinding and lifting of filters. As the aggregation would now use the partial level maps, some values would no longer be considered part of the aggregation.

        With this language enhancement, it is now possible to specify a hierarchy along with the all grouping to ensure the expected behavior. CubiQL like total Sales by all Calendar.Seasonal would produce LogiQL like ... <- agg<<v=total(v0)>> Sales[sku,store,week]=v0, week2season[week]=season, season2year[season]=_.

      • Another significant change here is that in the case that a specific hierarchy is not defined, the all grouping will still use the default hierarchy. So CubiQL like total Sales by all Calendar will now produce LogiQL like ... <- agg<<v=total(v0)>> Sales[sku,store,week]=v0, week2month[week]=month, month2year[month]=_. This avoids the inconsistency that would result from unwinding. However, the results could change in some cases if your application has partial level maps.

      • You can force the measure service back to the old immediate projection behavior by using the newly introduced special projection hierarchy of _ (underscore). CubiQL like total Sales by all Calendar._ will produce LogiQL like ... <- agg<<v=total(v0)>> Sales[sku,store,_]=v0.

      • Finally, it is also possible to use the special all-paths hierarchy * with all groupings as well.

Corrected Issues

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

  • Modeler
    • The language selection will now always include English (en-US) even if this language wasn't configured in the availableLanguages setting of the Modeler application.

  • Modeler IDE
    • Fixed an issue which prevented building a Modeler IDE project with workbooks from the command line.

    • The "Translation Debug" setting in the "Internationalization" tab of the "Settings" view now works as expected. The translation debugging option will now be available in the language selector of the Modeler application when this setting has been enabled.

    • Modeler was not able to query out target locks containing grouping expressions such as cover and collect. This issue has been solved.

    • Fixed an issue related to the "+ More" option in the "Measures" tab of the "Workbook Template" view.

    • Fixed an issue in the "Dimensions" view of the Modeler IDE that caused a confirmation dialog to pop up when the user tried to add a new hierarchy.

  • Tools, Database, and Services
    • Fixed some problems with propagating tracing information through global protobuf handlers, making tracing more useful for applications that use the relax service.

    • Better handling of pragma:no_insideout in rule bodies. Rule rewriting incorrectly removed this pragma in some cases for previous releases.

    • Fixed an error encountered when using the lb command in interactive mode. This problem was introduced with the upgrade to support python 3.

    • Fixed the HTML content links that appear in some tracing spans in the LB tracing UI. These links used to open the content in a separate tab but that functionality has been broken for some time. It should now work properly.

      Also fixed a problem that caused some of the HTML content data to contain binary data that was not human readable. The content data should now contain pretty-printed text that will be useful to help understand and diagnose application performance problems.

  • Measure service
    • The global measure service has improved error reporting. These improvements also change the behavior of the global measure service so that it will no longer return a 400 HTTP status in the event of an error. Errors should be parsed out of the response message.

    • Improved the measure service's heuristic for choosing the physical key-order for predicates corresponding to CubiQL expressions. This should in many cases resolve the performance warnings introduced in 4.21 for a physical key-order mismatch when binding CubiQL to a LogiQL predicate.

    • Fixed a long-standing bug that prevented the measure service from caching the logic generated for aggregations.

    • Fixed an issue with detecting whether the intersection passed to a parameterized metric was vacuous in the sense that the result would still be at its base intersection. Because the measure service will only bind parameterized metrics to LogiQL predicates at their base intersection, the measure service query would yield the expected results but the LogiQL predicate would still appear to be empty as the binding never happened.

Known Issues

The issues listed below are known to exist in the 4.22.0 release.

  • Tools, Database, and Services
    • This release contains changes to some lb-workflow tasks related to workbook creation. These fixes have not been applied yet to lb.wb.CreateWorkbook, which means errors related to recent changes in the LB runtime that imposes restrictions on string lengths can still occur. Please note that this known issue does apply to lb.wb.util.CreateWorkbook.

Installation Information

Install LogicBlox 4.22.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 --no-save <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.22.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 3.5 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.