LogicBlox 4.4


LogicBlox 4.4.16

Release Date: June 19, 2018

What's New

LogicBlox 4.4.16 introduces the following enhancements:

  • MODELER

    • Modeler startup time has been improved significantly by loading resources such as the navigation tree, views, and the measure model in parallel.

    • Modeler now supports a new tile-based layout for canvases. It aims to maximize the available space by subdividing the canvas into resizable tiles. Unlike the current grid-based layout, the tile layout is designed to fit as much data on the screen as possible and to be easily resizable.

      Tiles can be altered through the user interface. To resize a tile, click on the border between panes and drag to increase or decrease its size:

      To enable and configure the new tile-based layout you should specify a tileLayout property within the canvas configuration JSON file. It has a tree-like structure. For example, the view above has the following tileLayout in its canvas configuration:

      Example 1. 

      "tileLayout": {
        "direction": "column",
        "panes": [
          {
            "id": "three-sheet-top-sheet"
            "minSize": "40px",
          },
          {
            "direction": "row",
            "panes" : [
              {
                "id": "three-sheet-bottomL-sheet",
                "minSize": "40px"
              },
              {
                "id": "three-sheet-bottomR-sheet"
                "minSize": "40px"
              }
            ]
          }
        ]
      }

      First of all, you should specify the direction property to set the orientation (column or row) for the panes and panes to define the children of the container. Tile-based layout supports multiple panes per container and each pane may be a container for others. You can specify the size of pane by pixels, percentage or ratio units as well as set min/max size (percent and pixel are supported). The id property points to the view (which described in views section of the canvas JSON) that should be rendered for that pane. If you don't specify the id the pane will be rendered without any content.

      The old grid-based layout will continue to exist but will be deprecated in future releases. For now, when both layout and tileLayout configs are specified the tileLayout will be used. In this case Modeler will print a warning message in the browser's Javascript console.

    • Because of potentially confusing results, the ability for the user to specify E, P, and D spread suffixes has been disabled when entering new data (e.g. 20000E) into cells that contain formula defined measures. The behavior of the R suffix has been changed. This suffix now replicates the value to the base intersection for formula defined measures.

    • Modeler will now ignore custom view components when validating canvases and view configurations provided that the module attribute begins with the word Custom (case-sensitive). This only applies to applications that contain custom views defined in Javascript.

    • Modeler's testing library ModelerTestUtil is now aware of the amount of data that can be displayed at once. The function $queryForSheet and all the functions that depend on it (such as queryCanvasById, $queryCSV, $queryExcel, etc.) in ModelerTestUtil will check level sizes before loading level members and cells.

      If any level is oversized it will throw an error of the following shape:

      {
          message: "Levels Foo, Bar are overised.",
          countData: { ... } // an object having all levels sizes.
      }

      The $queryForSheet function signature is:

      /**
       * Given a sheet configuration, it will issue all required
       * queries for that sheet. Similar to how the modeler works in the browser,
       * this will only query level members if they have not been queried previously.
       *
       * @param {Object} sheetConfig - a sheet's JSON configuration, as you would store in the workspace
       * @param {MultiAxisRange} [range] - an optional parameter that says what the range of the view is, defaults to {X: { start: 0, length: 50}, Y: { start: 0, length: 20 }}
       * @param {Boolean} [failOnError] - if this should fail on any query error. Defaults to true
       * @param {Boolean} [checkLevelsSize] an optional parameter that says whether the data should be loaded only if the levels sizes are not oversized, defaults to true.
       * @returns {Promise} - a promise that is resolved when the queries are complete
       */
      $queryForSheet(sheetConfig, range, failOnError, checkLevelsSize = true) {
          ...
      }

      Thus, in tests if you want to check whether any level is oversized you can do the following:

      modelerTestUtil.$queryForSheet(sheetConfig)
          .catch(err => {
              // Where the err argument is an object of aforementioned shape.
          });

  • TOOLS AND SERVICES

    • When importing protobuf descriptors into a workspace, the package of the descriptor can be mapped to an alternate namespace in the destination workspace. This allows developers to create multiple sets of predicates representing the protobuf in the same workspace without manually copying and renaming protocol packages, which is useful in some cases where some of the storage characteristics of the protobuf predicates need to be altered (a transaction lifetime version and a database lifetime version for example).

      The namespace mapping can be done when using the protoAddSpec dlbatch command or from within LogicBlox compiler project files. A dlbatch example is:

      protoAddSpec --name MyProtocolName --file my-protocol.descriptor --map "original:package->new:target:namespace"

      In a compiler project file, the equivalent example would be something like:

      my-protocol.proto, proto, descName=MyProtocolName legacyLogic=true namespace={original:package->new:target:namespace} lifetime=database

    • A new kind of model to evaluate SFAMA (Stratisfied FActorization MAchines) models has been added to the predict p2p. lwfm can train those models. See the lwfm documentation (version 1.9.13) for details.

  • MEASURE SERVICE

    • Added static conditionals to CubiQL. This can be used to execute different queries depending on the relationship of intersections.

Corrected Issues

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

  • MODELER

    • When editing dropdown cells for entity typed values with more than one key, Modeler will now display the actual Label instead of the ID.

    • When a user right-clicks on a header in the grid to lock a position, the context-menu used to display the ID of the position. Since the user might not recognize this value, Modeler now displays the Label instead, which will match the value the user clicked on.

    • Views in Modeler no longer become unusable when opening the conditional formatting panel with no measures on the grid.

  • TOOLS AND SERVICES

    • Improved performance of the runtime in cases where wide fixed-length values are used in predicates. The performance issue was most noticeable in use cases that follow an append-to-back and delete-from-front modification pattern.

    • Improved performance of rule maintenance for rules that use inverse constructors of one-to-one predicates. These rules are now qualified for prefix-join and no sensitivity indices are needed.

    • The script P2P will now always use flat iterators instead of directly operating on alpha-trees, resulting in potentially significant performance improvements.

    • Fixed an error in the runtime where intermittent crashes would happen with MacOS High Sierra involving 128-bit integers.

  • MEASURE SERVICE

    • Improved handling of recursive metric definitions in CubiQL.

    • Fixed an issue with the interaction between the ambig aggregation method and slides.

    • Fixed an issue with rewinding aggregations containing slides. This has also been backported to the 4.4.15 release.

    • Fixed an issue with the predicate binding for CubiQL feature, allowing the key order of the bound predicate to differ from what the measure service would itself choose. However, note that if it does differ there will be a performance penalty to create and maintain an index.

    • Improved CubiQL error reporting for cases when there is a mismatch in default values between metric definitions and what is expected by the rule execution engine. Also improved propagation of errors from the server back to the CubiQL REPL interface.

Upgrade Information

  • MODELER

    • Modeler no longer supports historical locks using the pivot config's pivot:config:lock:lock predicate. Any historical locks that were applied by populating the pivot:config:lock:lock predicate will no longer be valid and any logic using this predicate will fail to compile as the predicate no longer exists.

      Historical locks should be installed using the installed target lock functionality. To see how historical locks can now be configured, see this section in the LogicBlox 4.4.14 release notes.

    • Modeler now expects navigation trees, sheets, and canvases to be grouped by their respective applications (workbook templates). This allows Modeler to only query out the views needed for a specific application.

      Navigation trees, sheets and canvases will now be organized according to their application in the src/config/views directory where each application has its own subdirectory src/config/views/<application>. Each application directory should contain a navigation.json file that contains the navigation tree for the application. The nav tree id is expected to match the containing application folder name (see below). Any canvas referenced in the navigation file should be placed in the corresponding folder under src/config/views/<application>/canvas. Likewise, any sheets referenced in the navigation file or referenced by a canvas included in the navigation file should be placed in the corresponding folder under src/config/views/<application>/sheets.

      Example 2. 

      Old Structure:

      * src/config
          * navigation/
              * main.json
              * partition_by_class.json
          * canvas/
              * canvas1.json
              * canvas2.json
          * sheets/
              * sheet1.json
              * sheet2.json
              * sheet3.json
              * sheet4.json

      New Structure:

      * src/config/views/
          * main/
              * navigation.json
              * canvas/
                  * canvas1.json
                  * canvas2.json
              * sheets/
                  * sheet1.json
                  * sheet2.json
                  * sheet3.json
                  * sheet4.json
          * partition_by_class/
              * navigation.json
              * canvas/
                  * canvas2.json
              * sheets/
                  * sheet2.json
                  * sheet3.json

      All view and viewstate predicates (e.g. modeler_platform:views:model:user_viewstate) now include a new string primitive key that represents the application associated with the view or viewstate. Processes that import/export this data may need to be adjusted for this change. We have also updated the protobuf message for deleting viewstates to use the below schema:

      message ViewStateDeleteRequest {
        required string userName = 1;
        required string viewId = 2;
        required string application = 3;
      }

      As we now store views by application and only retrieve the views required for the current application, Applications and their test suites need to be updated in order identify the correct application for which the views should be queried.

      The Modeler migration tool contains a script to upgrade existing projects to the new sheet/canvas folder structure. The migration script will be run when upgrading to version 4.4.16 or by applying the storeViewsByApplication transform directly to your project.

      For ModelerTestUtil, this is accomplished by adding the appId parameter to ModelerAppConfig object that is passed into the ModelerTestUtil object when initialized. A sample configuration is provided below.

      const modelerAppConfig = {
          appId = "tree_id",
          urls:
              appPrefix: "/internal" + app_prefix,
              ...
              workbookUrl: "/internal" + app_prefix + "/workbooks"
          },
          ...
          levelMembersQuantityThreshold: 10000
      };
      
      new ModelerTestUtil(modelerAppConfig, "test-branch");

    • The library containing the Modeler migration tool is included in the distribution under 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 path/to/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.

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

Installation Information

Installation Instructions

Install LogicBlox 4.4.16 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.16/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Release Information

Server requirements
Operating System: 64 bit Linux; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
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.

LogicBlox 4.4.15

Release Date: May 18, 2018

What's New

LogicBlox 4.4.15 introduces the following enhancements:

  • MODELER

    • Users can now easily lock one or more positions in a grid. This will automatically lock every cell at that position, which means the user does not have to lock each cell at the position individually. Watch the video here.

      To apply a position lock, right-click on a row or column header and choose the "Lock <position>" option.

      Position locks on the grid can be inspected and removed via the existing Locks menu in Modeler's menu pane.

      Locks can also be removed by right-clicking on a header and choosing the "Unlock <position>" or "Clear All Position Locks" option.

    • In Deferred Calc mode, the user can now quickly discard multiple edits by selecting a group of cells, right-clicking on the selection and choosing the "Discard Selected" option.

      The previous behavior of discarding all edits now appears in the right-click menu as "Discard All".

    • Modeler now limits the number of options that can be displayed at once for entity valued dropdowns. If the entity contains more than 10k members (or some other threshold set in Modeler's application configuration property modelerConfig.levelMembersQuantityThreshold), the user will be required to search for the desired level via autocomplete. Once the list of search results is less than the threshold, then the dropdown will show the results of the search.

    • The scrolling experience on grids that contain lots of levels and/or measures has become much smoother. Header labels are now always visible during scrolling, making it easier to find the position of interest.

  • TOOLS AND SERVICES

    • Added a --diskcommit option to the commit command in dlbatch. This forces the command to wait until the transaction changes have been written to disk. The default behavior of the commit command is soft commit, which allows the command to finish immediately without waiting for changes to be written to disk.

    • A signal handler can be conditionally compiled into lb-server to generate tcmalloc heap dumps. Sending a USR1 signal to the lb-server process will toggle tcmalloc heap profiling on and off. A USR2 signal will dump a tcmalloc heap profile. By default, the profiles will be written to files prefixed with "lb_server." and ending with ".heap" in the lb-server working directory. Set the LB_TCMALLOC_PROFILE_PREFIX environment variable before starting lb-server to change the file location and prefix.

      To compile lb-server with this handler enabled, add the following to your local lb-database/Makefile.config file before building:

      TCMALLOC = 1
      PROFILE_TCMALLOC = 1

      Usage examples:

      # turn on heap profiling for a running lb-server process
      /bin/kill --signal USR1 $(pidof lb-server)
      
      # dump a tcmalloc heap profile to a lb_server.*.heap file in the lb-server
      # working directory
      /bin/kill --signal USR2 $(pidof lb-server)
      
      # turn off heap profiling for a running lb-server process
      /bin/kill --signal USR1 $(pidof lb-server)

  • MEASURE SERVICE

    • To avoid some ill-defined behavior, the Primitive aggregations HISTOGRAM and SORT have been changed to be Complex aggregations in the AggExpr.Method message. One consequence of this is that they can no longer be used as part of composite aggregations.

    • The measure service will now better validate aggregations specified using intersections rather than groupings. This should catch some errors that were previously dropped silently.

    • A new CubiQL REPL command, :desugar, can be used to show just the desugaring of a CubiQL expression, whereas the previously available :optimize would also optimize the expression.

    • Added a :limit command to the CubiQL REPL, which will no longer default to displaying all results returned for a query.

Corrected Issues

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

  • MODELER

    • Modeler now correctly renders action button panels placed at any position in canvases containing 5 or more rows.

    • The user will no longer get an error when dragging an All level to an axis containing two non-base levels of the same hierarchy.

    • Modeler now correctly renders dropdowns in the Data Import specification table.

    • Export to Excel will no longer omit values for sheets that have both measures as attributes on the axes and filters applied.

    • It's now easier to identify whether a checkbox in Modeler's grid passes a by-value filter.

    • Percent parent measures now work correctly across all dimensions.

    • Modeler now correctly renders the sort icon on headers at any scroll position.

  • TOOLS AND SERVICES

    • Improved performance of inside-out query optimization for some boundary cases where the inside-out optimization could perform significantly worse than the unoptimized query.

    • Fixed problems with incremental evaluation in the machine learning P2P function that caused either incorrect results or assertion failures when executing.

    • Improved performance of min and max aggregation rules. In some cases, a 5x to 10x improvement was observed.

Upgrade Information

  • MODELER

    • IE11 support has been dropped. Modeler supports major browsers not older than 1 year. Google Chrome provides the best performance.

    • Removed the obsolete .dev property of the ModelerTestUtil as planned. It was part of private API, and same functions are provided by the ModelerTestUtil itself prefixed with $.

    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

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

  • MEASURE SERVICE

    • The previously deprecated fields target_level, target_dimension, and target_label have been removed from the Slide message

Installation Information

Installation Instructions

Install LogicBlox 4.4.15 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.15/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Release Information

Server requirements
Operating System: 64 bit Linux; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
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.

LogicBlox 4.4.14

Release Date: April 12, 2018

What's New

LogicBlox 4.4.14 introduces the following enhancements:

  • MODELER

    • Users can now collapse and expand headers in Modeler's grid view. This functionality can be found in the header's context menu. For instance, right-click on a header and select 'Collapse All' to collapse all headers in the grid. Then, use the + icon on a header to expand it.

      This behavior can also be pre-defined in the view configuration JSON:

      Example 3. 

      For instance, when the levels Class, Subclass, Sku are on an axis and you want all Subclasses to be collapsed. You then have to set the expandOnly option to an empty array for the Subclass level.

      {
            "id": "my-view",
            "pivotConfig": {
                "axis": {
                    "x": [
                        { "qualifiedName": "Product:class" },
                        { "qualifiedName": "Product:subclass", "expandOnly": [] },
                        { "qualifiedName": "Product:sku" }
                    ],
                    "y": [
                        { "qualifiedName": "-:Measures" }
                    ],
                    "z": [
                        { "qualifiedName": "Sales" }
                    ]
                }
            }
        }

      Example 4. 

      The following configuration displays all Skus for the Subclass with id subclass-2, the rest of the Subclasses are collapsed.

      {
            "id": "my-view",
            "pivotConfig": {
                "axis": {
                    "x": [
                        { "qualifiedName": "Product:class" },
                        { "qualifiedName": "Product:subclass", "expandOnly": ["subclass-2"] },
                        { "qualifiedName": "Product:sku" }
                    ],
                    "y": [
                        { "qualifiedName": "-:Measures" }
                    ],
                    "z": [
                        { "qualifiedName": "Sales" }
                    ]
                }
            }
        }
        

      NOTE: This feature is not available on a grid containing dimension splits on the same axis or if there's an inlined field (displayMode = "NONE") in the dimension.

    • Modeler now provides the ability to install locks in the application workspace and have these locks displayed in Modeler's grid view. Installed locks will be displayed in the same way as the existing user locks. User locks now have a blue lock icon.

      Installed lock targets can be applied using the pivot:config:lock:installed_target_locks predicate.

      Example 5. 

      Let's say we want to lock Sales and Returns for all sku/store/day tuples where the day is prior to the current day. With previous LogicBlox versions, the following (or similar) steps were taken:

      1. Create a boolean metric with day as the intersection. We'll use HistLock as the metric name for this example.

      2. Install logic that populates HistLock for days that are locked per the specified calculation.

      3. For each metric that is locked by HistLock, populate the pivot:config:lock:lock predicate mapping the target metric to the lock metric.

      4. When an edit is made to Sales or Returns, Modeler would spread the historical lock to the correct base intersection for each measure and send the lock with the edit request.

      With this new version of LogicBlox, HistLock should be applied to Sales and Returns in the following manner:

      1. Apply the same steps 1 and 2 as above

      2. Create a CubiQL expression that spreads HistLock to the appropriate base intersection:

        (#HistLock) @ {sku,store,day}

      3. Populate the metric pivot:config:lock:installed_target_locks to associate the lock expression with each target metric.

        +pivot:config:lock:installed_target_locks(target_name, expr_string, convertible) <-
           (
               target_name = "Sales",
               expr_string = "(#HistLock) @ {sku,store,day}",
               convertible = false
               ;
               target_name = "Returns",
               expr_string = "{(\"store-1\")} : {store} @ {sku, store}",
               convertible = false
           ).

        In previous LogicBlox versions, all installed locks were sent as non-convertible locks but this can now be specified per target lock.

      4. Restart the measure service.

        The measure service only needs to be restarted when the installed locks have been changed. If the lockable tuples specified by HistLock change, they will be reflected automatically in the grid without the need to restart the measure service.

      NOTE: Modeler will continue to support locks in the view configuration JSONs until 4.4.16, but these type of locks will not be shown in the grid.

    • Modeler will now limit the amount of data that can be displayed at once in Modeler's grid view. This limitation has been also been applied to panels such as the filters panel, the slice filters panel, and the level filters panel.

      The default limit is set to 10k members. This means data will be displayed only if every level on the grid contains less than 10k members. If a level contains more than 10k members, the user will be required to apply a filter for that level first.

      This default limit can be changed. You can set a value for the option in your Modeler's application configuration in modelerConfig.levelMembersQuantityThreshold. We highly recommend not to increase this limit.

      Example 6. 

      {
            ...,
            modelingFeatures: { ... },
            events: { ... },
            jsonSheetViewEnabled: true,
            levelMembersQuantityThreshold: 9000
        };

  • TOOLS AND SERVICES

    • Added a recomputeGraph command to dlbatch. This can be used in emergency situations to try to recompute a rule execution graph in a workspace. In the past, we've seen rare rule execution errors due to bad rule priority numbers. The recomputeGraph command will attempt to regenerate these numbers and can be used to try to patch an existing workspace.

    • Tracing support has been added to lb-workflow. Tracing can be enabled globally by setting the trace = true flag in the lb-workflow-driver.config file. Once the flag is set, the driver will log the traces in the console. These logs can then be processed exactly like the lb-web-server logs to display the time split of the task run.

      There is also an option to enable the tracing for individual runs if tracing is not desired for all the driver runs. To do so, simply add --trace in the command line arguments for the driver CLI call.

      NOTE: Not all the tasks support deep tracing (in which the server side calls are also traced). Here are some of the tasks that don't support deep tracing yet:

      • BackupWorkspace
      • CommitWorkbooks
      • CreateWorkbooks
      • DeleteWorkbooks
      • ExecuteLogiQL
      • JsonService
      • RefreshWorkbooks

    • The server code includes some smart pointer improvements which could potentially have a small performance benefit.

  • MEASURE SERVICE

    • This release contains a new measure service query optimizer. There should be no observable difference other than improved performance of the optimizer.

Corrected Issues

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

  • MODELER

    • Users will experience much smoother and more reliable drag and drop behavior when dragging and reordering fields.

    • Minor fixes in the JSON Schema validation to prevent rejection of valid view configurations.

    • Modeler now correctly displays views with multiple sheets when using logicblox.min.js.

  • TOOLS AND SERVICES

    • Fixed an error in the ordering of rule execution units that could generate invalid sequence numbers in some uncommon situations. The error could cause odd calculation problems or errors like "Duplicate key in hashtree" in the LB server logs.

    • User sessions are now invalidated when a user is made inactive through the credentials service. Before when a user was inactivated through the credentials service, the user could still continue accessing resources previously accessible until the session expires. Now the credentials service will invalidate the user session when the user is made inactive. Note that the user session will only be invalidated in the compute node where the credentials service is running, not for other nodes used by the application. This should be good enough for most scenarios, where an authenticated proxy acts as the front end for insecure resources.

    • Fixed an "illegal cast" error reported when exporting default valued predicates where the raw_string column format was used in a key column for the export service configuration.

    • Fixed a performance problem where a TDX import operation would not utilize available CPU resources at times when the import was executed after many export operations.

  • MEASURE SERVICE

    • Composite aggregation now supports grouping along a dimension that is not mentioned in the composite, as long as the grouping is vacuous, meaning that the grouping is to the same level as the data. Previously, queries using these types of aggregations would produce an error.

Upgrade Information

  • MODELER

    • Please use logicblox.min.js in your projects. The file logicblox.js is intended to use only by Modeler's developers and has no supplied source maps. Moreover, it is heavier and slower than its minified version. Please update your references to the logicblox.min.js. The non-minified file will be removed in future releases. This relates to logicbloxtestutils.js as well.

    • View layout modification has been disabled due to instability. This means it's no longer possible to resize or reposition a sheet inside a canvas with your mouse.

      If you have a modified layout saved in the view state, use the "Reset Canvas Layout" option from pivot cell's context menu. Modeler's canvas layout functionality is currently being improved and layout modification will be re-enabled once this work is completed.

    • The generated file percent_parent_rules.rules has been removed as it is no longer needed. You'll likely need to update the config.py in your project to remove it from the list of .rules files to install.

    • Modeler has been upgraded to React 16, that means global exports comming with logicblox.min.js such as React and ReactDOM are upgraded too. Please review the React migration guide.

      Some of the notable changes include:

      • React.createClass helper is obsolete and was moved to the separate create-react-class package.

      • React.DOM helpers are obsolete and were moved to a separate package. Our suggestion is to replace them with React.createElement.

      • React.PropTypes were moved to the separate prop-types package.

      • React Add-Ons were discontinued. react-addons-test-utils were replaced by react-dom/test-utils and createRenderer was moved to react-test-renderer/shallow.

      • Please stop using componentWillMount life-cycle hook and replace it with componentDidMount instead.

    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

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

  • MEASURE SERVICE

    • The "dialogue" metric type has been removed after a deprecation period. The same features (activating inactive blocks and parameters) have been available to all metrics for several releases now.

Installation Information

Installation Instructions

Install LogicBlox 4.4.14 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.14/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Release Information

Server requirements
Operating System: 64 bit Linux; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.13

Release Date: March 3, 2018

What's New

LogicBlox 4.4.13 introduces the following enhancements:

  • Modeler

    • Modeler's axis panels have been redesigned to improve the overall user experience of configuring views.

      • Visible measures are now visible as fields in the new measures axis panel. This means they are no longer hidden away in the dimension browser. The new axis panel allows easy configuration and reordering of visible measures without the need to open and use the configuration mode of the view.

      • The new axis panel design prevents accidentally adding a measure as an attribute. Placing a measure as a field on the rows, columns, or slices axis panel make it appear as an attribute. When measures are placed as a field on the new measures axis panel, they are automatically treated as visible measures.

      • There is now only one way to add levels and measures to the view. Instead of either using the '+' buttons on the visible axis (which are no longer available) or the configuration mode of the view, the user can now simply open configuration mode with the new configuration mode icon. In configuration mode, all axis panels will become visible and the user can simply search for either levels or measures in the dimension browser without the need to choose the appropriate tab first. Fields can be added to the axes with a simple drag and drop.

      • The axis panels can now be expanded manually using the expand icons to show all fields, even when space is limited, allowing users to reorder fields easily. Additionally, any time a field is dragged over the axis panel, if it is collapsed it will auto-expand to allow dropping fields at any position.

    • The Excel Import functionality has been updated with the following functionality:

      • Ability to load levels, level attributes, and level maps.

      • Ability to use columns in both the keyspace and value space of a measure.

      • Ability to import measures at intersections above the base.

      • Synchronous validation checks via configured constraints prior to importing data. Additionally, replacing data import via TDX with imports via the measure service will give you the ability to apply asynchronous validation checks and historical and position locks during import.

      • Ability to export validation failures to a CSV file.

      The following figure shows a sample configuration for importing levels, level labels, and level maps using the latest Excel import functionality.

      If schema editing is enabled in Modeler (editSchema is set to true), the import functionality now provides the ability to import levels, level attributes, and level maps. To create or delete levels members, simply bind a column in the level binding dropdown and set the creation policy to 'Accumulate' or 'Remove'. To populate level attributes, bind a column to the attribute in the measure binding dropdown. To populate a level map, look for the <dimension>:<from_level>:<to_level> mapping in the measure binding dropdown. By default, the level mappings will not create new levels. If you want to create new entities in the <to_level>, you need to set the accumulation policy to "Accumulate"

      The flag "Should Fail On Error" indicates whether all updates generated from the file should fail if any entity key is missing in the file. By default, we prevent edits from being sent if missing a key or value.

      We currently do not allow the intersection to be specified for a given measure but instead, take the following approach:

      1. Identify the dimensions in the keyspace.

      2. Identify the columns bound to levels in the dimensions in the keyspace.

      3. Pick the lowest level for each dimension.

      4. Assign the lowest level to the intersection and assume the unbound keys in the keyspace are set to all.

      The intersection column identifies which keys are bound for a specific measure. We do not currently allow binding more than a single column to a level to prevent ambiguous binding. We prevent entity columns that have a "Remove" accumulation policy from being bound to the keyspace of a measure. Entities do not need to be bound to the value-space of a measure in order to be added or removed. We do not allow the import to proceed if entity columns are not bound in a measure's key space, set with an accumulation policy, or ignored.

      Please note that the new functionality will typically have slower performance than the TDX equivalent but should not be noticeable unless importing large amounts of data.

    • Modeler now validates sheet and canvas JSON configurations against a defined JSON schema. Information about invalid configurations will be presented as warnings in the browser console.

    • The level creation form, both standard and custom, no longer allows the user to update existing levels when specifying an existing level ID. When the user specifies the ID of an existing level, a message is presented to the user and the user can then review/dismiss the data entered in the form.

    • The list of measures to format in the conditional formatting panel is now limited to the measures visible on the view. The panel still allows the user to use the value of both visible and invisible measures in the formatting conditions.

    • By popular request, we have reverted to the previous default of having all navigation tree items be open by default.

      If you want a node to be collapsed by default, you can add the "collapsed" property to the tree node:

      {
          "id": "urls",
          "properties": [{
              "key": "caption",
              "value" : "URLs"
          }, {
              "key": "collapsed",
              "value": true
          }],
          "children": [ ... ]
      }

    • Routes (URLs) leading to the sheets have changed. Now if you navigate from the canvas to the sheet, the route will look like /canvas/:canvasId/sheet/:sheetId. If you open the sheet which doesn't have parent canvas, the route will remain /sheet/:sheetId. Thus we can solve 2 issues: passing down required configuration from canvas to sheet and resolving the case when the user got logged out when in configuration mode. So now instead of doing history.goBack() in configuration mode, we push the actual route of the canvas we came from. This is more robust.

      In case when the user navigates to the sheet which doesn't have a canvas (like "Custom Sheet 1" under "My views") it will be considered that this sheet is opened in config mode, so the config mode control icon will become disabled, since we don't have any canvas to go to.

  • Tools and Services

    • Improved efficiency of script rules that use write-optimized predicates.

  • Measure Service

    • In the measure service, the semantics of composite aggregations has changed, without changing the syntax of CompositeComponent message in the protocol. While previously the dimension and label fields of the message were precisely matched to these fields in aggregation groupings in order to find the grouping corresponding to the composite component, now a CompositeComponent with a dimension and no label is treated like a wildcard that matches any grouping at the dimension regardless of its label – provided there is no other CompositeComponent for this label exactly. With this, several groupings can now be matched to the same CompositeComponent, making composite aggregations friendlier to use with dimension splitting.

      This semantics change is backward-compatible, in the sense that composite aggregations that used to be acceptable are still acceptable and have the same outcome. However, there are newly-acceptable aggregations.

    • Using the measure language is now deprecated. The measure service will report a deprecation warning when installing measure language rules.

    • The measure service now allows binding a CubiQL expression to a specific predicate defined in the model.

Corrected Issues

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

  • Modeler

    • The dimension browser now shows dimensions and measures in lexicographical order.

    • Modeler now correctly handles the input of negative numbers and subtraction calculations.

      For instance, when the user enters '-10' in a cell, its value will now be updated correctly to minus 10. Please note, when the user wants to subtract 10 from a cell that currently contains a value, the user can enter '+-10'. The result of this calculation for a cell containing value 210 will be 200.

    • Dimension splitting now also works properly for measures with composite aggregations.

  • Tools and Services

    • Fixed a small issue in lb-workflow logs that incorrectly printed the name of the file containing errors when a TDX import/export operation failed.

    • Fixed a problem where simple upsert rules with a condition on a value could produce incorrect results for default-valued predicates.

    • Corrected a problem that caused an infinite loop in a boundary case of some rule evaluations involving alpha-tree predicates.

    • Reverted a performance regression introduced in 4.4.12 regarding the monitoring of script rules for abort detection and performance logging.

  • Measure Service

    • Online help for the lb measure-service admin command incorrectly referred to a restart option. The correct option is refresh and the help text has been updated to reflect that.

    • Fixed an issue that could cause non-deterministic failures with updates to metrics defined in the measure language with inverses.

Installation Information

Installation Instructions

Install LogicBlox 4.4.13 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.13/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Modeler

    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

      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; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.12

Release Date: February 6, 2018

What's New

LogicBlox 4.4.12 introduces the following enhancements:

  • Modeler

    • Modeler already supported dimension splitting on different axes. We now also added support for dimension splitting on a single axis! Watch the video here.

    • The handling of pending and invalid edits in form mode now matches the behavior in grid mode.

    • Modelertestutils now contains methods for creating and removing user-defined sheets.

  • Tools and Services

    • Support for 128-bit integer literals has been added to LogiQL. These literals are written with a suffix of 'q'. For example, 5 is treated as an int type and 5q has a type of int128.

    • A new global service configuration flag 'enable_authorization_without_authentication' was added to enable service authorization without authentication. This is intended for use in the backend nodes that are behind a proxy which cannot authenticate requests. In such scenarios, setting this flag to true will enable authorization check on requests with operations associated with them and thus preventing unauthorized access to the services on the backend nodes. Setting the global flag affects all services hosted on the node.

      There is an additional service level option to enable/disable this behavior. It can be achieved by setting the "authorization_only" predicate to true/false in the service configuration. The value set in the predicate will override the global configuration.

      NOTE: If you want to start using authorization on the backend, make sure the proxy targets port 8080 instead of 55183 for workbook services, and the flag 'enable_authorization_without_authentication' is set to true (on the backend nodes ONLY!).

  • Measure Service

    • Extended slides to allow more than a single target level.

    • It is now possible use an AdminRequest to query the state of some of the measure service configuration flags (such as the log level, etc.).

    • The REPL will now print results of optimization in CubiQL text format rather than in JSON.

    • Considerable memory usage improvements, especially for scenarios where there are many branches all with their own measure service instances.

    • The measure service model can now make use of what we are calling tuple types in many places. Previously all types referenced by the measure service have been atomic and have a straightforward mapping to LogiQL types. Tuple types allow defining various things in terms of a n-ary tuple of other types. For example, instead of a particular level being defined in terms of a single entity, it could be defined by a pair of two entity values. When generating the underlying LogiQL these tuples will be flattened down to multiple predicate arguments. There are a few places they are not supported, but we'll improve this over time.

Corrected Issues

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

  • Modeler

    • When using the mouse to drag a level or measure pill to/from the axes, the dragged pill looks much better.

    • For IE11 users, the performance of level creation forms containing large dropdowns has been improved significantly.

    • Modeler no longer has troubles keeping up with user input in String typed input fields on custom level creation forms.

    • Modeler’s performance while processing user input on a grid containing a large number of position locks has been improved significantly.

  • Tools and Services

    • Fixed an issue in TDX Services where lookup of sub-entities would not work.

    • Improved diagnostic messages for incorrect uses of linear recursion P2P and also fixed some problems with the use of constants in the body of linear recursion rules.

    • Fixed various issues with default valued predicates.
      • Fixed bug that caused exception to be thrown when min or max aggregation was used with a default valued predicate in an inactive exec block.

      • Applied an optimization that improves the performance and prevents leaking default values into the head of the rule. It clearly defines the semantics of a default val min/max aggregate and rewrites it into the set of rules that produce an equivalent result as the original rule, but runs over materialized layers only. As the rewrite is semantically equivalent to the original rule, it solves an issue of incorrect calculations and also prevents leaking of default values into the head predicates.

      • Fix for leaking default values into head predicates for default value rules with total aggregation and non-aggregate IDB rules. Fix is applied to default value rules that do not contain any non-default predicates in the head and no upserts.

      • Added an optimization that handles division in the default value rule body. Such rules are now efficiently evaluated over the materialized layer only. The optimization supports `int` and `decimal` types. The `float` type is not supported as the semantics of float type division is different.

  • Measure Service

    • Fixed incorrect rewrite and fusing aggregations in queries over default valued expressions.

    • Fixed issues with commuting splits and relabeling expressions with aggregations using slides.

    • Fixed issue where we did not check properly that labels match when using a slide.

    • Fixed incorrect query generation for measure expressions using both min and max aggregations with measures that had a default value.

Installation Information

Installation Instructions

Install LogicBlox 4.4.12 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.12/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Modeler

    • The libs.js and libs.min.js files were removed from the build as announced. Please remove references to these files from your HTML pages.

    • Modelertestutils now uses ES6 classes. By the ES6 specification, its methods are no longer enumerable via forEach loops. So, if you have code which tries to enumerate modelertestutils methods, you should do it in a way compatible with ES6. For example:

      Example 7. 

      function getAllMethods(obj) {
          let methods = [];
      
          do {
              const currentProtoMethods = Object.getOwnPropertyNames(obj)
                  .filter((p, i, arr) =>
                      typeof obj[p] === 'function' &&    // only the methods
                      p !== 'constructor' &&             // not the constructor
                      (i == 0 || p !== arr[i - 1]) &&    // not overriding in this prototype
                      methods.indexOf(p) === -1          // not overridden in a child
                  );
      
              methods = methods.concat(currentProtoMethods);
          }
          while (
              (obj = Object.getPrototypeOf(obj)) &&     // walk-up the prototype chain
              Object.getPrototypeOf(obj)                // not the the Object prototype methods (hasOwnProperty, etc...)
          )
      
          return methods;
      }
      
    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

      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; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.11

Release Date: January 16, 2018

Executive Summary

LogicBlox 4.4.11 contains the following changes:

  • Modeler

    • Users are now able to create and configure their own sheets in Modeler. These user-defined sheets are listed under 'My Views' in the navigation panel. Watch the video here.

    • For validation constraints, it has become a lot easier to configure which special characters are allowed.

  • Tools and Services

    • lb-web-client has been changed to abort the async protocol after a configurable number of consecutive recoverable failures during polling.

    • TDX services now support "ignore" as entity creation policy, in addition to "accumulate" and "none".

  • Measure Service

    • Measure service is now split between several jar files to make it easier to use it as a library in other projects.

    • Some minor memory usage improvements.

    • Fixed issue where spread-by-query expressions were not fully desugared before compilation.

    • Metric locks have finally been removed from the protocol.

    • The default_values and binary_decimal_column flags have finally been removed from the protocol.

    • Introduced a better error message when the measure service has trouble choosing a path between two intersections.

    • Arguments to abstraction expression in the protocol can now take an optional signature.

    • Dialogue metrics are now deprecated and will be removed in 4.4.14.

    • All metrics now can be defined to activate inactive blocks on querying.

    • All metrics can now be declared as depending on parameters.

What's New

  • Modeler

    • Users are now able to create and configure their own sheets in Modeler. Watch the video here.

      In this version, the user will be able to create a view that contains one sheet. The sheets can be created by clicking on the + icon next to the 'My Views' title. This brings up a modal form in which the user can specify a name for the new sheet. Once created, it is added to the list of sheets in the 'My Views' panel.

      The user will be able to delete his/her own sheets by clicking on the delete icon that shows up when mousing over the sheet's name in the navigation panel.

      The 'My Views' node in the navigation panel can be completely hidden by setting allowUserDefinedSheets flag to false in the Modeler configuration object like this:

      Example 8. 

          ...
          {
              ...
              appPrefix: ...
              loginUrl: ...,
              modelingFeatures: {
                  ...
              },
              allowUserDefinedSheets: false
              ...
          },
          ...

    • For validation constraints, it has become easier to configure which special characters are allowed. All characters are now allowed by default and the developer can now simply specify what is not allowed (including which special characters) rather than having to set them all to true when he/she only wants to limit the allowed set of special characters.

  • Tools and Services

    • When the target server for a given transaction goes down, lb-web-client will keep polling that service until the overall transaction timeout is achieved. This timeout may be configured to be very long, i.e. an entire day. lb-web-client now supports the configuration of the consecutive recoverable failures during polling before the operation is aborted.

    • TDX services now support "ignore" as entity creation policy, in addition to "accumulate" and "none". TDX services with this policy will not create new entities, and simply ignore the input line, instead of failing it.

  • Measure Service

    • Measure service is now split between several jar files to make it easier to use it as a library in other projects.

    • Metric locks have finally been removed from the protocol.

    • The default_values and binary_decimal_column flags have finally been removed from the protocol.

    • Introduced a better error message when the measure service has trouble choosing a path between two intersections.

    • Arguments to abstraction expression in the protocol can now take an optional signature.

    • Dialogue metrics are now deprecated and will be removed in 4.4.14.

    • All metrics now can be defined to activate inactive blocks on querying.

    • All metrics can now be declared as depending on parameters.

Corrected Issues

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

  • Modeler

    • The level member creation form will no longer lock up when the user (1) enters a value in an Integer field, then (2) clears that value, and (3) hits the 'Create' button.

    • Modeler now greys out the option to export data in form mode. Export is not supported in form mode.

    • Conditional Formatting for entity type metric using externally declared level as type now works as expected.

    • The 'All Panels' option in the 'Layout' toolbar menu is now only checked when all panels (rows, columns, and slices) are visible.

  • Measure Service

    • Some minor memory usage improvements.

    • Fixed issue where spread-by-query expressions were not fully desugared before compilation.

Installation Information

Installation Instructions

Install LogicBlox 4.4.11 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.11/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Modeler

    • The following new services have been added to set and get view's metadata.

      # Get metadata for all views of a user
      GET /viewmetadata?user=user1
      
      # Get metadata for a single view
      GET /viewmetadata?id=abc
      

      The following service has been added to backup and restore metadata for all the views.

      /viewmetadata_tdx
      

      NOTE: When an application allows users to define their own sheets, this new service must be added to the project upgrade script along with the current backup and restore of the view states. Failing to do so will result in the loss of user defined views in the upgraded project.

    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

      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; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.10

Release Date: December 12, 2017

Executive Summary

LogicBlox 4.4.10 contains the following changes:

  • Modeler-js

    • Modeler can now display position-only metrics on the grid.

    • Action messages can now contain HTML tags to format the message displayed to the user.

    • The Export to Excel function can now also export reference data.

    • The usability of the title bar for sheets has been improved to make it accessible even on small sheets.

    • Modeler now accepts unformatted decimal input values as percentages for percent formatted measures (e.g. 1.5 is interpreted as 1.5%) on the grid, the conditional formatting panel, and the filters panel.

    • Modeler now has a more consistent workflow for uncommitted (deferred or invalid) edits.

  • Tools and Services

    • Corrected logging problems with LB systemd services.

    • Fixed a race condition in the LB workflow driver.

    • Generic JSON services now support custom HTTP Status code.

    • Fixed a bug that caused rows to be excluded from TDX exports when an optional column has a "false" value.

    • Implemented support for lb-web queues that allow applications to better control when requests are processed by lb-web services.

    • TDX services now support constructors for both import and export operations, including multi-keyed, and recursive constructors.

    • Fix for null pointer dereference in the LB runtime involving parallel rule execution.

    • Fixed bug in LogiQL datetime:parse function that prevented time zones like "+05:30" from being parsed correctly.

    • Improved behavior of signal handling in the lb-server process.

  • Measure Service

    • Fix for querying attributes within a prev expression.

What's New

  • Modeler-js

    • Modeler can now display position-only metrics on the grid. They will be presented on the grid and behave like checkbox cells.

      These are highly recommended over boolean valued metrics, especially when used as mask filters or historical locks. The reason for this recommendation is that the Modeler actually ignores the value when applying mask filters. In other words, a value of 'false' would still be included as part of the filter since we only join on the keyspace. To avoid these oddities, we recommend changing all boolean valued metrics to position only metrics unless you absolutely need all three states (true, false, empty).

    • Action messages can now contain HTML tags to format the message.

      To enable this feature use the allowHTMLMessage property in the action configuration JSON. It is set disabled by default.

      Example 9. 

      {
          "id": "action_id",
          "is_enabled": true,
          "links": {
              "execute": "/path-to-action"
          },
          "allowHTMLMessage": true
      }

    • The Export to Excel function can now also export reference data. The Include Reference Data option was added to the Excel Export window. By checking this option you will get an additional sheet per entity-typed measure in exported configuration. Such a sheet will contain all existing entities in two columns: Entity ID and Entity Label.

    • The usability of the title bar for sheets has been improved to make it accessible even on small sheets. Each sheet now has a sheet header and a toolbar. Opening and closing sheet headers and toolbars is controlled by the ... button at the upper right corner.

      You can configure the initial opened/closed state in the view configuration:

      Example 10. 

      {
        "module": "SheetView",
        "layout": {
            "showSheetHeader" : true,
            "showSheetToolbar" : true
        },
        ..
      }

    • Modeler now accepts unformatted decimal input values as percentages for percent formatted measures (e.g. 1.5 is interpreted as 1.5%) on the grid, the conditional formatting panel, and the filters panel. Before this fix, unformatted input was processed differently in the conditional formatting panel (e.g. to get 1.5% you had to type 0.015).

    • Modeler now has a more consistent workflow for uncommitted (deferred or invalid) edits.

  • Tools and Services

    • Generic JSON services now support custom HTTP Status code.

    • TDX services now support constructors for both import and export operations, including multi-keyed, and recursive constructors.

    • Implemented support for lb-web queues that allow applications to better control when requests are processed by lb-web services. The workflow is as follows:

      • The application declares a queue service to be hosted at some prefix (e.g. “/queue/*”).

      • The application declares that certain service “/s" should have its requests managed by this queue (e.g. queue_prefix[] = “/queue/*”).

      • Every request to “/s” is sent to the queue and a Location header is returned, which allows the client to poll for the termination of the request (the exact same protocol as async handlers is used, so the same client code can be reused).

      • Queues keep a cache of waiting/executing/terminated requests, which can be queried from the queue service.

      • There are currently 2 queue implementations:

        • “immediate” simply executes every request immediately

        • “fifo” executes requests in first-in-first-out order, and can be configured with max_executing (number of requests allowed to execute concurrently) and max_waiting (number of requests accepted in a waiting queue until they can be executed; requests are rejected with 503 if this limit is exceeded). These configs can be changed dynamically.

Corrected Issues

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

  • Modeler-js

    • Sorting via the context menu and via the sort icon no longer resets column widths and row heights.

    • The level creation forms now properly handles asynchronous validation errors. Values updated by the user to fix these validation errors are now stored correctly instead of being reverted to their old (invalid) values.

    • Entering more than one decimal point in a decimal typed cell no longer makes Modeler unresponsive. These inputs are now correctly handled with a validation error.

    • Open address forms are now properly closed when a session time-out occurs.

  • Tools and Services

    • Prior to the 4.4.8 release which constained some changes to LB systemd services, setting a "systemd" property to false in the lb-server.config or lb-web-server.config files would have caused service log messages to go to files in $LB_DEPLOYMENT_HOME/logs/current/ instead of to systemd logs managed by journalctl. The 4.4.8 changes broke this behavior for lb-web-server logging. The problem has been corrected in the 4.4.10 release.

    • Fixed a race condition between the LB workflow driver polling transactions and workflow abort request that could cause tasks of the aborted workflow to remain in INIT state and eventually get executed.

    • TDX exports were ignoring rows for predicate bindings with multiple optional columns, when at least one of the columns has a default value which is not set. Even when other optional columns had values, the rows would not be exported because one optional column has the default value.

    • Fix for null pointer dereference in the LB runtime involving parallel rule execution. The problem was caused by requesting domain decomposition for a predicate that is exempt from sampling and for which no index has ever been requested.

    • Fixed bug in LogiQL datetime:parse function that prevented time zones like "+05:30" from being parsed correctly.

    • Improved behavior of signal handling in the lb-server process. In the past, the first SIGTERM or SIGINT sent to the process would start aborting all in-flight transactions and then exit the process. If a second SIGTERM or SIGINT was sent to the process while trying to abort, the process would immediately exit. This could result in undesirable database state (partial data written, corrupted pages, etc). The new behavior will start aborting in-flight transactions upon the first SIGTERM or SIGINT as before. But now subsequent SIGTERM or SIGINT signals will be ignored. If you need to immediately stop an lb-server process without giving it a chance to cleanly exit, you can send a SIGKILL signal to the process.

  • Measure Service

    • Fix for querying attributes within a prev expression.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.10 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.10/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Modeler-js

    • In this release we've removed the formula editor. It has been removed from the cogwheel menu (in the menubar) and if you specify it in the sheet configuration JSON file it won't be shown in the application. The modelingFeatures.editRules configuration option is not available anymore. Feel free to remove it from the `modelerConfig` passed as props to the Modeler component when you instantiate the Modeler application.

      The /rules service was also removed as part of this change.

    • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

      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; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.9

Release Date: November 7th 2017

Executive Summary

LogicBlox 4.4.9 introduces the following enhancements:

  • Modeler-js

    • Modeler has a brand new filters panel which contains filters for all levels and metrics which are on the grid including Boolean and Text typed measures. Watch the video here.

    • The workflow for reviewing and resolving edits with server errors (asynchronous errors) has been improved.

    • The headers of the currently selected row/column within the pivot grid are now highlighted for the user to easily see what cell is selected.

    • Modeler will now present a warning to the user when pasting/copying a big set of data to prevent issues within the user's browser.

    • It's now easier to lock an entire row or column in the pivot grid by right-clicking on the row or column header and selecting 'Lock'.

  • Tools and Services

    • A preliminary version of a generic workspace archive/restore feature is included in the release.

    • Support for on-demand predicates has been added as an experimental feature.

    • Several string operations in the measure service are now Unicode (UTF8) aware, as is the match comparison operator.

    • Protobuf services now support a "log_messages" parameter.

    • The proto2datalog utility now defaults to giving all protobuf predicates an "Extensional" derivation type.

What's New

Modeler-js

  • A new filters panel is introduced in the release. It contains filters for all levels and metrics which are on the grid. The user is now also to create filters for Boolean and Text typed measures. It still supports associative filtering as axis filters do. Watch the video here.

    Level and entity/string measure filters have a search input. In order to see some data in the filter, you need to use the search input to narrow the data. What you're typing is applied automatically once you've reached 3 characters or more. In order to apply search with less than 3 characters, you can hit Enter. Be careful with hitting Enter especially when one character is entered because it's going to load a huge amount of data. Use the search thoughtful.

    The search in the menubar is not available anymore. The new filters panel has filters that replace that search functionality. Make sure to migrate existing search configurations to filters. This new filter configuration supports filtering on empty values.

    The following filter configuration gives all SKUs where measure Active has an undefined value.

    Example 11. 

    {
        "id": "my-view",
        "pivotConfig": {
            "axis": {
                "x": [{ "qualifiedName": "Product:sku" }],
                "y": [{ "qualifiedName": "-:Measures" }],
                "z": [
                    { "qualifiedName": "Active" }
                ]
            },
            "filter": {
                "Active": {
                    "type": "empty",
                    "empty": true
                }
            }
        }
    }

    The filter below gives all SKUs where measure Active has a value, true or false.

    Example 12. 

    {
        "Active": {
            "type": "empty",
            "empty": false
        }
    }

  • The workflow for reviewing and resolving edits with server errors (asynchronous errors) has been improved.

    • An action bar will now appear when an edit has server errors. This action bar provides two actions: review edits and resubmit.

    • Resubmitting will immediately commit all edits which have server errors (regardless of when the server errors appeared).

    • Only edits which are erroneous now need to be addressed, not each individual edit, before resubmitting.

    • The "review invalid edits" dialog is now accessible only from the error action bar.

    • The "review invalid edits" dialog now shows ALL invalid edits, not just those from a single edit commit "batch".

    • The "mark edits valid" behavior (clicking the green checkmark in a cell) has been removed.

    • The red exclamation point which opens the "review invalid edits" dialog has been removed.

  • The headers of the currently selected row/column within the pivot grid are now highlighted for the user to easily see what cell is selected.

  • Modeler will now present a warning to the user when pasting/copying a big set of data to prevent issues within the user's browser. For pasting, the threshold is 10k cells, for copying is 50k.

  • It's now easier to lock an entire row or column in the pivot grid by right-clicking on the header and selecting 'Lock'.

Tools and Services

  • A preliminary version of generic workspace archive/restore functionality has been included in this release. This is intended to support migration of rules and data from one workspace to another, using text and CSV files to allow migration across workspace versions that are not binary compatible. Documentation of this feature will be added to the LogicBlox Administration Guide once more testing is done. To start experimenting with this, see the archive and restore commands within dlbatch. For example

    Example 13. 

    $ dlbatch
    <blox> help archive
    <blox> help restore
    <blox> create test_ws
    <blox> archive --dirname test_archive
    <blox> restore --dirname test_archive test_ws2

  • A new experimental type of predicates supporting on-demand value calculation has been introduced. To create an on-demand predicate, set its derivation type to "OnDemand" when declaring the predicate. In some ways, on-demand predicates are like derived-only predicates or views. On-demand predicates allow abstracting over computations that we cannot or do not want to fully materialize. For on-demand predicates, we compute only those tuples that are needed in all the places the predicate is used.

    One of the most significant differences between on-demand and derived-only predicats is that on-demand predicates can be recursively defined. For example, it is possible to define the Fibonacci function:

    Example 14. 

    fib[i]=f -> int(i), int(f).
    lang:derivationType[`fib]="OnDemand".
    fib[0]=0.
    fib[1]=1.
    fib[i]=(f1 + f2) <- i >= 2, fib[i-1]=f1, fib[i-2]=f2.

    On-demand predicates also make it much easier to work with more interesting data-structures defined via constructors in LogQL (lists, trees, etc.). However, performance of on-demand predicates for these uses has not been evaluated yet.

    Unlike derived-only predicates, one significant limitation for on-demand predicates is that they may only be referenced from the evaluation stage in which they are defined. For example, an on-demand predicate declared in database lifetime logic will be evaluated at stage final. This means that it is not possible to reference the predicate from transaction lifetime logic running at stage initial or query. This is because for any demanded tuples computed in one stage, it will not be possible to compute the result until evaluation reaches the declaring stage, or it will be too late for the demand to be considered.

    You do not necessarily always want to use on-demand predicates in place of derived-only predicats. They are not inlined into their use site like derived-only predicates, which in some cases may yield better performance.

  • Several string operations in the measure service are now Unicode (UTF8) aware, as is the match comparison operator.

  • Protobuf services now support a "log_messages" parameter. Set service_parameter["log_messages"] = "true" in a service config to enable protobuf message logging for that service.

  • The proto2datalog now defaults to giving all protobuf predicates the derivation type “Extensional”. Previously, all protobuf predicates were created initially as "NotDerived" (effectively "unknown") and then potentially migrated to "DerivedAndStored" (IDB) if a rule to compute a predicate was added to the workspace. Default the derivation type to "Extensional" for these predicates removes some ambiguity that complicates functions like workspace archive/restore. If you want protobuf predicates to be IDBs, you now need to pass "-derivationType idb" to proto2datalog or use "derivationType=idb" in LogiQL project files.

Corrected Issues

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

  • Measure Service

    • The row_limit_exceeded=true flag is now properly propagated from local measure service responses to the response of the global service. All local response rows are still combined into the global response. Consequently, the number of rows in the global response can be well higher than the row_limit specified in the request.

  • Modeler-js

    • Modeler now correctly shows new values in cells when processing pasted data.

    • Values pasted in a dropdown cell are now validated against available labels.

    • Resizing columns/rows (with or without holding the Ctrl-key) now behaves the same for both attributes (measures directly on axis) and measures (in Visible Measures).

    • The 'Clear Sort' option in the context menu now correctly clears all sort configs within a sheet.

  • Tools and Services

    • Fixed a performance issue for maintenance of rules requiring sensitivity indexes

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.9 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.9/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

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; macOS 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.8

Release Date: October 3rd 2017

Executive Summary

LogicBlox 4.4.8 introduces the following enhancements:

  • Measure Service

    • The measure service will now provide more info when reporting parse errors.

    • The lb measure-service install command now provides error messages with respect to the source files.

  • Modeler-js

    • Modeler-js is now able to import data from Excel files with the new 'Data Import' menu option in the navigation tree. Users can now also export an Excel template containing just the headers of the grid using the existing 'Export to Excel' functionality.

    • Modeler-js has a new internal service to delete user-specific view state.

    • Modeler-js will now render a view even when it contains non-existent measures in the view configuration.

    • Users can now quickly apply value filters in Modeler-js by pressing ENTER in input fields of the filter panel.

  • Tools and Services

    • The LogicBlox systemd services have all been updated to use systemd socket activation.

    • The cloud-store utility now allows multiple encryption keys to be associated with a file.

    • lb config now supports generating ScalaDoc from Scala sources.

    • Makefiles generated by lb config now explicitly set bash as the shell.

    • Exception messages from lb web-client now include the URL that caused the exception.

    • The GetPredicateInfoBulk command has been removed from the ConnectBlox interface.

What's New

Measure Service

  • The measure service will now provide a context line from the source file when reporting CubiQL and Measure Language parse errors.

  • The lb measure-service install command now parses rule files individually before sending them to the server to provide errors with respect to the source files.

Modeler-js

  • The new navigation menu item Data Import will appear in all applications. It allows users to import Excel files into the workspace by binding columns in the file to Levels and Measures in the application.

    Importing only level member labels

    It is possible to import just the labels of a level instead of the "id". However, there is additional configuration need to allow this as well as some limitations. First, you'll need to define a predicate that maps all labels to an id. If you have duplicate labels, be sure to apply some kind of aggregation to prevent functional dependency violations. The predicate must have one string key and a string value.

    Example 15. 

    lookup[label] = id -> string(label), string(id).
    lookup[label] = firstId <-
        agg<<firstId=min(id)>>
        Product:sku:id[sku] = id,
        Product:sku:label[sku] = label.

    You must then tell the modeler that a lookup predicate exists. You do that by writing to the level_label_to_id_mapping predicate:

    Example 16. 

    +pivot:config:format:level_label_to_id_mapping[l] = "model:hierarchy:product:lookup" <-
        lb:web:measure:Dimension_name[d] = "Product",
        lb:web:measure:Dimension_level(d,l),
        lb:web:measure:Dimension:Level_name[l] = "sku".

    Once this is done, the Is Label checkbox on the data import screen will be available for the Level.

    A limitation of importing only a level's label without its id is that level creation is not allowed, nor is updating the label. The reason for this is that since the id is not present in the file, we must look it up by the label. It is therefore impossible to know if an unknown label is a new level member or an update to an existing level member.

    Limitations

    • byMetric validations are not supported

    • Import works only at base intersection

    • Every row must have a unique key

    • Level member creation by labels is not supported

    • Nested column headers or slices are not supported for Excel files

  • A new internal service has been added to allow for deleting a user-specific view state. The service is supported on the existing /viewstate URI with DELETE as the HTTP method.

    The username and view ID should be passed in as data in the HTTP request.

    Example 17. 

    Here is the data layout for deleting the view state of 'product-analysis-subclass-bottom' for 'user1':

    {
        "userName": "user1",
        "viewId": "product-analysis-subclass-bottom"
    }
  • Modeler-js now renders a view that contains non-existent measures in the view configuration. Any measures that don't exist will be removed automatically from the view during render. Modeler-js will write a warning message to the console to alert the user.

  • The Export To Excel function now allows the users to only export the headers of the grid. This file can serve as a template for importing new data into the same grid.

  • Users can now quickly apply value filters in Modeler-js by pressing ENTER in input fields of the filter panel.

Tools and Services

  • The LogicBlox systemd services (lb-server, lb-web-server, and lb-compiler) have all been updated to use systemd socket activation, dynamically starting the services the first time a request is made. The main advantage of this is robustness with respect to service start up sequence. The socket activation changes allow systemd to manage the service dependencies and start them in the correct order as needed. Details on how LogicBlox services work with the systemd framework have been added as a new chapter in the LogicBlox Administrative Guide.

  • The cloud-store utility now allows multiple encryption keys to be associated with a file. Use the add-encryption-key command to add a new encryption key to a file and use the remove-encryption-key command to remove an existing encryption key from a file. Encryption keys cannot be added to a file that was not uploaded initially with a key. Likewise, the last encryption key for a file cannot be removed. A file is marked as either encrypted or not encrypted when it is uploaded and it cannot change after that without deleting and uploading the file again. Example command usage:

    Example 18. 

    cloud-store upload -i local_file.txt --key first-key s3://my-bucket/remote_file.txt

    cloud-store add-encryption-key --key second-key s3://my-bucket/remote_file.txt

    cloud-store remove-encryption-key --key first-key s3://my-bucket/remote_file.txt

  • lb config now supports generating ScalaDoc from Scala sources.

  • Makefiles generated by lb config now explicitly set bash as the shell.

  • Exception messages from lb web-client now include the URL that caused the exception.

  • The GetPredicateInfoBulk command has been removed from the ConnectBlox interface.

Corrected Issues

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

  • Validation of decimal values in TDX services is now more robust. If the service definition uses ">=", ">", "<=" or "<" in the format and the value is not a floating point, the system will return HTTP 500.

  • Fixed the lb web-client command-line to allow a request body on HTTP DELETE requests issued to Json services.

  • All lb commands were reviewed to make sure read-only requests are made to a workspace whenever possible. The list-blocks, print-block, and print-rules commands were corrected to use read-only access.

  • Fixed the string:decimal:convert function, used by TDX decimal format, to support E notation. For example, string:decimal:convert["1E-05"] will now return a decimal value instead of evaluating to nothing.

  • Resolved an issue in the measure service with parsing negative scalars in CubiQL literal expressions.

  • Resolved an issue in the measure service involving desugaring some expressions in CubiQL inverses.

  • Fixed long level labels from overlapping the list of level members from the child level in the "Assign" popup in Modeler-js.

  • Fixed issue in Modeler-js that prevented the user from editing headers (labels) with multiple levels on the axis.

  • Fixed caching issues with Export to Excel in Modeler-js.

  • Resolved behavior in Modeler-js where on violation of a cell's type (e.g. entering letters into a number field) synchronous validation would empty the value entered by the user.

  • Copy/paste in Modeler-js now respects the display format (LABEL, ID, LABEL_ID, and ID_LABEL) under "Pivot settings".

  • Fixed unexpected resizing of all columns in Modeler-js when an entire data row was selected.

  • Fixed some situations where Modeler-js would not render views correctly for IE11.

  • Fixed an issue in Chart Mode where Modeler-js would unexpectedly move the 'Measure Values' pill to another axis when the slice value was changed via a synchronized slice on another sheet.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.8 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.8/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

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; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.7

Release Date: September 7th 2017

Executive Summary

LogicBlox 4.4.7 introduces the following enhancements:

  • The database includes a number of fixes around memory usage as well as an important correctness fix for linear recursion.

  • New commands for cloud-store to delete and rename objects.

  • The lb measure-service now uses JSON format by default, and has been extended with the new model subcommand for querying and installing models.

  • Measure model refresh requests are handled much faster now.

  • The specification of the branch containing the master workbook can now be postponed until an installed workbook template is instantiated to create a workbook.

  • The release also comes with some exciting features for Modeler-js based applications, such as:

    • A complete revamp of the UI to improve the usability. See the LogicBlox 4.4.7 release video for an overview of the changes.

    • Ability to configure data validations to help the user with the data entry.

    • Ability to add a confirmation dialog to action buttons.

    • Improvements to the address editor, such as the ability to sort the list of regions and countries as well as support for adding validations to postal codes.

What's New

Measure Service

  • All the lb measure-service subcommands now use JSON as their default input and output format. Previously, some subcommands used the protobuf text format by default.

  • A new lb measure-service model subcommand has been added for querying and installing models.

    Example 19. 

    Querying the model can be done with for example:

    lb measure-service model query --uri <your uri> --out-format <json, proto, etc.>

    Example of installing a model:

    lb measure-service model install --workspace <wsname> --in-format <json, proto, etc.> <file>

  • Model refresh has been optimized heavily. The sending of an admin refresh request has now much lower latency.

Workbook Framework

  • It is now possible to delay the specification of the branch containing the master workbook when installing a workbook template. If the master is not specified at installation time, it must be specified when the template is instantiated to create a workbook.

Modeler-js

  • New Look and Feel: The Modeler has received a complete revamp. To improve the usability, all panels, such as "slices", "rows" and columns" were moved to the top of the sheet. The layout of sheets is not configurable anymore, but it is possible to hide individual panels. Users can also hide / reveal individual panels via the settings cogwheel. Take a look at the LogicBlox 4.4.7 release video for an overview of all the changes.

  • Measure Validations: The Modeler now supports asynchronous as well as synchronous validations. In the UI, the validations are applied for each cell, async validations are applied at the base intersection. The table below gives an overview of all the validation types that are currently supported.

    Validation Async Sync (UI) Metric Attribute
    Min Value x x x x
    Max Value x x x x
    Min Length x x x x
    Max Length x x x x
    Value Regex x x x x
    Allowable Characters x x x x
    Precision   x x x
    Required x x x x
    By Metrics x   x x
    Custom Expression x   x x

    Current Limitations

    • UI validations are applied at the cell being edited regardless of the intersection.

    • Async validations always apply to the base intersection.

    • Synchronous validations have not been implemented yet for the level creation forms.

    • The validation messages of asynchronous validation failures can't be customized yet.

    • Min/Max Value: Numeric type cells cannot be edited to contain a value less than or greater than the specified min/max values. Aggregate values that are spread to the base intersection will be validated asynchronously.

      Example 20. 

      In the example below we have specified that the value of Sales must be within the range of 0 and 1,000,000.

       
      +pivot:config:constraints:metric_min_value[m] = 0.0f,
      +pivot:config:constraints:metric_max_value[m] = 1000000.0f
          <-
          lb:web:measure:Metric_name[m]="Sales".

    • Min/Max Length: String type cells cannot be edited to contain a string whose length is less than or greater than the specified min/max length values. Aggregate values that are spread to the base intersection will be validated asynchronously.

      Example 21. 

      In the example below we have specified that the metric SkuDescription needs to have at least 10 characters and at most 100 characters. Note that it is note mandatory to have both constraints specified.

      +pivot:config:constraints:metric_min_length[m] = 10,
      +pivot:config:constraints:metric_max_length[m] = 100
          <-
          lb:web:measure:Metric_name[m]="SkuDescription".
      

    • Value Regex: Confirms that the entered value adheres to a specified regex pattern. Values will also be validated asynchronously to validate that data at the base intersection also matches the supplied pattern.

      Example 22. 

      The example below shows a regex validation for the metric Str. In this example, the values for Str can only be lowercase letters, 3 to 5 characters long and can have a number in the end:

      +pivot:config:constraints:metric_value_regex[m] = "^[a-z]{3,5}[0-9]?$"
          <-
          lb:web:measure:Metric_name[m]="Str". 

    • Allowable Characters: This constraint is applied to String type cells and is composed of four properties. This constraint is not applied unless one of the four following properties are specified:

      • allowUppercase: value can contain uppercase characters.

      • allowLowercase: value can contain lowercase characters.

      • allowNumerals: value can contain numerals.

      • specialCharacters: user-defined list of allowed special characters.

      If a property is not set, it is assumed to be not allowed. A regex pattern will be created from these flags and will be applied in the UI and asynchronously.

      Example 23. 

      The validation below states that for metric AllowableUpperNumbers only uppercase and numerals are allowed:

      +pivot:config:constraints:metric_allow_numerals[m] = true,
      +pivot:config:constraints:metric_allow_uppercase[m] = true
          <-
          lb:web:measure:Metric_name[m]="AllowableUpperNumbers".

      The validation below states that for the metric AllowableLowerNumSpecial lowercase, numerals as well as the specified special characters []{} are allowed:

      +pivot:config:constraints:metric_allow_numerals[m] = true,
      +pivot:config:constraints:metric_allow_lowercase[m] = true,
      +pivot:config:constraints:metric_special_characters[m] = "{}[]"
          <-
          lb:web:measure:Metric_name[m]="AllowableLowerNumSpecial".

      The validation below states that for the level attribute Location:store:label, only lower characters are allowed:

      +pivot:config:constraints:level_attribute[l, a] = 0,
      +pivot:config:constraints:level_attribute_allow_lowercase[l, a] = true
          <-
          lb:web:measure:Dimension:Level_name[l] = "store",
          lb:web:measure:Dimension:Level_attribute(l, a),
          lb:web:measure:Attribute_name[a] = "label". 

    • Precision: This is a UI-only constraint that applies to numeric cell types. Users will be prevented from entering decimal values at a precision greater than the specified amount.

      Example 24. 

      Below we specify the prevision for the metric SalesEuros to be 3:

      +pivot:config:constraints:metric_value_precision[m] = 3
          <-
          lb:web:measure:Metric_name[m]="SalesEuros".

    • Required: This is also a UI-only constraint that can be applied to Number, String, Boolean, or Entity typed measures. A measure with this constraint will not allow users to delete values from it without specifying a new value. This validation also ignore empty values. However, when users edit an empty value position (cell) they will be required to set a valid value for it.

      Example 25. 

      In the example below, we have marked the metric SkuColor as required:

      +pivot:config:constraints:metric_is_required(m)
          <-
          lb:web:measure:Metric_name[m]="SkuColor".

    • By Metrics: This is an asynchronously-only constraint that allows clients to specify a set of metrics to use for a validation constraints. If the provided metrics are populated with any values, validation errors will be returned. One constraint is generated for each provided metric.

      Example 26. 

      The edits to Location:store:label are restrained in the example below by the metrics ConstraintRestrictSalesBySize and ConstraintDuplicateLabels. Both of these metrics have installed rules that are populated when invalid edits are made:

      +pivot:config:constraints:level_attribute_by_metrics(l, a, m),
          <-
          lb:web:measure:Dimension:Level_name[l] = "store",
          lb:web:measure:Dimension:Level_attribute(l, a),
          lb:web:measure:Attribute_name[a] = "label",
          (
            lb:web:measure:Metric_name[m]="ConstraintRestrictSalesBySize"
          ;
            lb:web:measure:Metric_name[m]="ConstraintDuplicateLabels"
          ).

    • Custom Expression: This is an asynchronously-only constraint that functions similar to the By Metrics constraint but only takes a single metric value.

      Example 27. 

      In the example below we added a constraint on the metric StoreSize based on the metric ConstrintRestrictSalesBySize.

      +pivot:config:constraints:metric_value_custom_expr[m] = "ConstraintRestrictSalesBySize"
          <-
          lb:web:measure:Metric_name[m]="StoreSize".

  • Confirmation dialog for action buttons: It is now possible to add a confirmation dialog to action buttons. When an action gets triggered that is configured to have a confirmation dialog, the user first has to confirm in a separate pop-up window the actual execution of the action.

    Example 28. 

    The example below shows the json configuration for such an action button. Both the title as well as the text that gets displayed on the window are configurable:

    {
        "id": "action_id",
        "is_enabled": true,
        "links": {
            "execute": "/path-to-action"
        },
        "confirmation": true,
        "confirmationTitle": "Please Confirm",
        "confirmationText": "Do you want to continue with the action?"
    }

  • Improvements to address editor: We have added the following improvements to the address editor:

    • We added the ability to sort the list of regions and countries within their respective dropdowns in the address editor. This allows users to place the more commonly used countries at the top of the dropdown list.

      To use this functionality, the region_order and country_order predicates need to be populated. Countries and regions with an order value always take precedent over non-ordered countries and regions. If no order is provided or the orders match, the sorting is based on label. We have also updated the search functionality to search by ID as well as label and we now search using the token prefix instead of matching any set of characters within the token.

    • We now provide two predicates, postal_validation_regex and postal_validation_message that can be configured on a per country basis to allow for validation of address postal codes. If populated, postal codes will be marked as invalid if they do not match the configured regex. The message predicate is used to display the proper format as help text when an invalid code is entered.

  • External dependencies to modules generated out of the CSV specs: Many projects reuse LogiQL libraries and do not want to auto-generate their schema entirely out of CSV files. Instead they want to use predicates defined in external libraries for part of their schema. The Modeler now allows you to define your own level predicates instead of generating them.

    Note

    Note that for now, you can only do this for levels that are at the bottom of their corresponding hierarchies.

    Example 29. 

    This can be done as follows. In Levels.csv:

    Level,Label,Dimension,ElementType,IsOrdered,OrderAttribute,OrderTransform,TransformedType,UseExisting,UseExistingId,UseExistingLabel
    store,store,Location,string,,,,,,,
    sku,sku,Product,string,true,model:external_dependency:addon:sku_index,model:external_dependency:addon:sku_transform,int,model:external_dependency:addon:sku,
    model:external_dependency:addon:sku_id,model:external_dependency:addon:sku_label

    We have extended the file with 3 optional columns. The example above shows two levels:

    • store: Which will be treated as usual, meaning that we will auto-generated a corresponding schema and logic for it.

    • sku: For which we don't want to auto-generate a corresponding schema and instead use the schema defined in the model:external_dependency:addon module.

    In config.py:

    # Compiling the external_dependency library here. But typically this library would be external to the project.
    lb_library(
        name = 'external_dependency',
        srcdir = 'src')
    
    # All we need to do is to declare the external_dependency library/module as a dependency to the generated_schema module.
    modeler.modeler_library(name='generated_schema',
        libraries=['external_dependency'],
        config_dir='src/config')

    Make sure to declare the external library that contains the model that you want to include instead of generating it from CSV files as a dependency to your "generated schema" module.

Developer Tools

  • The new cloud-store delete command supports removing objects and folders from a store. A --force option can be used to allow the delete command to succeed even if the specified object does not exist. If the specified object URL ends in a slash, the command will find and delete all top-level files with the URL as their prefix. Sub-folders will remain unless the --recursive flag is specified. If the specified object URL does not end in a slash, the command will delete at most one object whose key exactly matches the URL.

    Example 30. 

    The command below will report an error if abc.txt does not exist:

    cloud-store delete gs://my-bucket/abc.txt

    The command below will succeed if abc.txt does not exist:

    cloud-store delete gs://my-bucket/abc.txt --force

    The command below will report an error if no files are found with test_folder/ prefix. It will also delete all "top-level" files that match test_folder/ prefix, not recursing:

    cloud-store delete s3://my-bucket/test_folder/

    The command below will succeed if no files are found with the test_folder/ prefix. It will also delete all files that match the test_folder/ prefix, recursing through all sub-folders:

    cloud-store delete s3://my-bucket/test_folder/ --force --recursive

  • A new rename command has been added to cloud-store. The command supports renaming a single object as well as folders (optionally recursively). When renaming a single existing object, the command will act like a move into a folder if the destination looks like a folder (ends in a slash), keeping the original file name. Recursive folder rename operations have the same semantics as the copy command. Without the --recursive flag, all top-level objects in the directory are moved into another directory. With the --recursive flag, all objects that match the source directory prefix will be moved into the destination. The renamed objects should retain the same access control as the original objects. Object renames can cross S3 buckets, but cannot cross different store services (cannot copy from AWS to GCS, for example).

    Example 31. 

    In the example below the file abc.txt is renamed to def.txt in the same bucket:

    cloud-store rename gs://my-bucket/abc.txt gs://my-bucket/def.txt

    In the next example we rename abc.txt to def.txt in subdir/:

    cloud-store rename gs://my-bucket/abc.txt gs://my-bucket/subdir/def.txt

    Here we "move" abc.txt into subdir/ in a different bucket:

    cloud-store rename gs://my-bucket/abc.txt gs://my-other-bucket/subdir/

    In the example below we rename all top-level objects found in test_folder/ to be in some_other_folder/. No sub-folders of test_folder/ will be renamed

    cloud-store rename s3://my-bucket/test_folder/ s3://my-bucket/some_other_folder/

    In the final example we recursively find all objects that match the /test_folder/ prefix in my-bucket and rename them to have the /some_other_folder/ prefix:

    cloud-store rename --recursive s3://my-bucket/test_folder/ s3://my-bucket/some_other_folder/

  • The --overwrite option to the cloud-store download command has been improved to consistently check for local files regardless of whether you are downloading a single file or recursively downloading into directory structures. Previous releases would overwrite without warning in some situations. The download command will also do a better job of cleaning up if a failure happens during the download, deleting any newly created directories or files.

  • A --dry-run option has been added to all potentially destructive cloud-store commands. These include upload, download, copy, rename, and delete.

Corrected Issues

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

  • Resolved a number of issues that were causing a high memory consumption.

  • The linear_recursion P2P now maintains its output correctly when the time dimensions changes.

    Note

    Please note that the LB_LINEAR_REC_MAINTENANCE environment variable that was previously introduced as a workaround has been removed and will no longer have any effect.

  • Resolved an issue that was causing an Attempt to modify the successor-set of immutable page exception.

  • Resolved an issue where IDB predicate contents were not cleared after the last defining rule was removed.

  • Resolved an issue where derivation types were not updated properly when resolved via script<<>> rules.

  • Resolved an issue that was causing an Internal error: Assertion failure: begin+len <= _len exception.

  • Resolved an issue with the string formatting of UUIDs.

  • Resolved an issue that was causing an Illegal index in BoxTupleVectorLookup exception.

  • The cloud-store ls command will no longer fail if the store contains objects with space characters in their key.

  • Model messages with caption fields (Metric, Level, etc.) will now use the name field for the caption if the caption field is not set or is the empty string.

  • Modeler-js:
    • Resolved an issue where under certain circumstances the grid became unresponsive when adding additional levels.

    • Resolved an issue where the scroll position in the viewstate was no longer respected.

    • Resolved an issue where hitting Enter directly after selecting a measure in the Measure Browser was placing the measure onto the Visible Measures panel, even if the Measures pill was not on the grid.

    • Recalc and percent parent measures are now editable when the view configuration is using dimension splitting.

    • Resolved an issue that would cause an exception when double clicking on a cell that is formatted as link or mouse-over.

    • The search field in the Model Browser does not get cleared anymore after selection.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.7 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.7/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

    Note

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

    Example 32. 

    To upgrade a Modeler-js based application from LogicBlox 4.4.3 to 4.4.7, you can run the following command:

    ./node_modules/.bin/migrate-modeler --fromVersion 4.4.3 --toVersion 4.4.7 /path/to/my/modelerapp

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.6

Release Date: August 3rd 2017

Executive Summary

LogicBlox 4.4.6 introduces the following enhancements:

  • The database includes parsing and formatting patterns for fractional seconds, support for generating UUID, improvements to the lb popcount and lb list commands as well as various stability improvements.

  • lb web-server includes a number of enhancements to TDX: improved expressivity in validation criteria for column data, the ability to integrate with the user permissions model and whitelisting predicates. Improvements to lb-web-client include full SSL support as well as support for Websockets.

  • The Measure Service is now more tightly integrated with lb-web's authentication and offers a number of locking related enhancements as well as some performance optimizations.

  • For lb-workflow we are introducing support for JSON structured values as input to tasks, as well as support for automatic retries for failed tasks.

  • The release also comes with some exciting features for users of Modeler-js based applications, such as:
    • Support for freezing rows and/or columns.

    • Support for CubiQL formula-defined measures.

    • Dimension splitting for recalc measures.

    • Conditional formatting based on expressions.

    • Level member creation directly from dropdowns.

    • Ability to remove a level member from its hierarchy parent.

What's New

Database

  • There are 3 new specifiers available for parsing fractional seconds:

    • %s - Matches seconds as two digits (0-59), followed by '.' (dot), and fractional seconds as 1 to 6 digits.

    • %F - Matches '.' (dot) followed by fractional seconds as 1 to 6 digits, or empty (if no leading '.').

    • %f - Matches fractional seconds as 1 to 6 digits.

    The format used by string:datetime:convert is now %Y-%m-%d %H:%M:%S%F %Q (added %F).

    For a complete overview of all the built-ins supported in LogicBlox, please visit the Reference Manual.

  • Redundant entity atoms in rule bodies are now optimized away before rule evaluation.

Language

  • UUID can now be derived in logic using the uuid series: uid<<n = uuid()>>. The value of a uuid number has the type int128, that can be converted to the string representation of UUID using predicate int128:to_uuid_string; the string representation can be converted back to an int128 value using int128:from_uuid_string.

  • It is now possible to write functional predicates with more than one value, p(x,y;z,w), relationally, p(x,y,z,w). Previously this only applied to functional predicates with a single value.

  • Writing type constraints over predicates with deltas or stage annotations do not declare them anymore.

  • The compiler reports a better error message when attempting to query the retracted key of refmode predicates in rule bodies.

Services Framework

  • TDX enhancements:
    • TDX services now support enhanced validations in the FileDefinition's format, including regular expressions, greater/lesser than, and precision.

      Example 33. 

      In the example below we show the file definition for SkuPrice. The pipe delimited file is expected to have two columns, SKU and PRICE. The values for SKU are expected to be strings, where we indicate via a regular expression that we expect the values in this column to only contain alphanumeric characters. Furthermore, PRICE is expected to be a decimal, with the following three validations specified:

      • >=0: indicating the the value must be non-negative.
      • <=20: indicating the the value must not be greater than 2000.
      • precision 2: indicating that this decimal must not have more than 2 digits after the decimal point.

        file_definition_by_name["SkuPrice"] = fd,
        file_definition(fd) {
          file_delimiter[] = "|",
          column_headers[] = "SKU,PRICE",
          column_formats[] = "string([a-zA-Z0-9]*),decimal(>=0; <=2000; precision 2)"
        }.

      Note

      Please refer to the chapter on Data Exchange Services in the Reference Manual for an overview of this feature.

    • Dynamic TDX services now support role based authorization and predicate whitelisting.

  • lb web-client improvements:
    • The lb-web client now accepts configuration for the connection timeout and the maximum number of connections to maintain to a given address.

    • lb web-client now supports full SSL, with certificate validation, using standard JDK keystore.

    • lb web-client now supports WebSockets.

  • lb-web's global configuration can now be dynamically changed via the command-line, including tracing parameters.

    Example 34. 

    Below you can find the output of the lb web-server set command, which shows the list of parameters that can be changed with their current values.

      $ lb web-server set
      ------------------------- -------
                 Key             Value
      ------------------------- -------
       log_http                  false
       log_max_message_length    -1
       debug                     false
       tracing_impl              none
       log_connectblox           false
       log_messages              false
       tcp_abort_on_disconnect   true
       profile                   false
       log_tdx_generated_rules   false
       db_log_level
       tracing_detail
       log_exception_details     false
       keep_tdx_files            false 

    A single parameter can be queried as follows:

      $ lb web-server set debug
      false

    A parameter can be set as follows:

    $ lb web-server set debug true

    A parameter can be cleared using the --unset option:

    lb web-server set debug --unset

  • Added support to return custom HTTP status code in Protobuf services without aborting the transaction.

Measure Service

  • The measure service is now more tightly integrated with lb-web’s authentication. This is mostly in preparation for data access permissions that will be available in a future release, but it is already possible to write locks that depend on the authenticated user sending the UpdateRequests.

    The measure service REPL now supports authentication with the :login, :logout, and :whoami commands. The URI of the authentication service (it defaults to /login) can be specified via the --login-uri command line parameter.

  • The new {{ install = false }} expression annotation gives finer grain control over whether an expression will be cached by installation.

  • The measure service now allows locks to be defined on all targets an UpdateRequest can modify.

  • The lb measure-service convert command now accepts an --expand option to expand any measure expressions defined using the MeasureExpr str field into their structured form.

  • The measure service now performs a one-to-one analysis so that it can mark the predicates it generates as being one-to-one. This should expose more opportunities for optimization in the runtime.

  • It is now possible to configure the size of the thread pools the measure service uses with the handler_thread_pool_size and env_thread_pool_size config file options.

  • If the log level is increased to debug, the measure service generates detailed reports explaining how the response for a given EditabilityRequest was derived.

  • The measure service now caches some of its internal context types, which should improve performance especially in the desugaring and optimization phases.

  • The measure service model now maintains a version number. Changes to model predicates will increment the version. As part of measure service requests the version will be checked and the measure service will automatically refresh its internal model if the version number differs.

    Currently this feature is disabled by default to avoid any unexpected interactions with existing projects. To enable it set autorefresh_model = true in the measure service configuration file.

    The Response message now also includes the version number of the model that the measure service is currently using. However, this number will not change unless auto-refresh is enabled, as we will not install the logic to do so otherwise.

  • In the measure language protocol, VarExpr has been renamed to VariableExpr to avoid overlap with the CubiQL VarExpr message.

  • The measure service will now use read-only transactions to retrieve the set of installed blocks.

  • Locks in the model are now desugared at load type, so it is possible to use various sugared forms when writing locks that would have caused failures before.

  • We now better cache some internal structures to make rewriting and some other tasks more efficient.

  • Some initial optimizations have been made to reduce model refresh latency.

Workflow

  • Lb-workflow now supports JSON structured values as input to tasks.

  • The lb-workflow driver will now poll multiple workspaces in parallel, so that slow transactions from one workspace will not hold other workspaces' tasks to run.

  • Support for automatic retries for failed lb-workflow tasks.

    Example 35. 

    The example below shows the specification of a json task, that is configured to get retried up to 5 times if it fails, with an interval of 1000ms:

    workflow json()[json_output] {
      ($json_output = output) <~  lb.JsonService(
        uri="/my_service",
        method="GET",
        driver_meta={"retry": 5, "retry_interval": "1000ms"},
        transport="http://localhost:8080")
    }

  • The lb.ExecuteLogiQL task now supports a file parameter, to indicate the file in which the logic can be found that needs to be executed. In earlier releases, the logic had to be included in the task definition.

Modeler-js

  • Freeze Pane: It is now possible freeze columns and/or rows to make sure that they stay visible while you are scrolling. The options to freeze rows, columns or both, as well as to unfreeze them, are available as a right-mouse click option in the grid.

  • CubiQL formula-defined measures: Developers of Modeler-js based applications can now also write CubiQL formulas instead of only Measure Language rules to define how a measure's value needs to be calculated.

  • Dimension splitting for recalc measures: Support for dimension splitting, where users can view a measure's values by aggregating a key along two different hierarchies of the same dimension, has been around for a while already, except for measures that aggregate via a custom formula (also called recalc measures, as their value gets recalculated at each aggregate level). This restriction has been removed now, thereby supporting dimension splitting for all measures, independent of their aggregation method. Note that the recalc formula has to be specified via CubiQL and not via the measure language.

  • Support for position-only filters: Filter predicates, for instance mask filters, can now also be position-only predicates and do not need to be declared as booleans anymore. To define a position-only predicate via the Measures.csv file, the DataType column for that predicate needs to be left empty.

    Example 36. 

    Below we show two examples. The first rule is for a position-only filter while the second one illustrates the definition of boolean filter that was required in earlier releases.

    //position-only filter predicate
    RedSkus(sku) <-
      SkuColor[sku] = "red".
    
    //boolean typed filter predicate
    RedSku[sku] = true <-
      SkuColor[sku] = "red". 

  • Conditional formatting based on expressions: Conditional formatting has been extended to include the possibility of formatting a measure based on the value of another measure. The measure that is used in the expression does not need to be visible on the sheet, as long as it is a displayableMeasure.

    Example 37. 

    In the example below, we specify the background color of the SkuComplete measure, if the value is false. Conditional formatting for the measures SkuDescription and Product:Sku:color is specified such that they are displayed with a background color, if the value of SkuComplete is equal to false.

    ...
    ,"gridOptions": {
      "conditionalFormatting": {
        "SkuComplete": [
            {
                "condition": "=",
                "value": false,
                "style": {
                    "background": "#ffffe0"
                }
            }
        ],
        "SkuDescription": [
            {
                "conditionalMeasure": "SkuComplete",
                "condition": "=",
                "value": false,
                "style": {
                    "background": "#ffffe0"
                }
            }
        ],
        "Product:Sku:color": [
            {
                "conditionalMeasure": "SkuComplete",
                "condition": "=",
                "value": false,
                "style": {
                    "background": "#ffffe0"
                }
            }
        ]
      }
    },
    ....

    The figure bellow illustrates how the formatting of of these measures changes, based on changes to SkuComplete. In this example, a SKU is deemed as "complete", once it has both a description and a color assigned.

  • Ability to remove a level member from its hierarchy parent: In an earlier release we have introduced a feature that allows users to assign a level member to a hierarchy parent directly from the grid. In this release, we have added support for allowing users to remove a level member from its hierarchy parent.

  • Level member creation directly from dropdowns: Dropdowns are used to display measure values that are entities. Now users can directly create a new level member when entering a value for the measure, that does not yet exist. If a user chooses to create a new level member, the creation form for creating level members for the level is displayed.

    Note

    To enable this feature in a modeler-based application the editSchema property needs to be set to true in the modelingFeatures section which is a part of the configuration passed to AuthenticatedModelerController.

  • Navigation tree enhancements: A navigation item can now contain a URI to a page inside the Modeler as well as to an external resource.

    Example 38. 

    To define a URI to some page, an object of the following shape can be added to the navigation JSON:

    {
        "id": "navigation-item-with-url",
        "properties": [{
            "key": "type",
            "value": "url"
        }, {
            "key": "url",
            "value": "/my/navigation/url"
        }, {
            "key": "caption",
            "value": "Navigation Item With URL"
        }]
    }

    As a result the link will navigate the user to: "/:workbookId?/app/:appId" + "/my/navigation/url".

    It is also possible to add a link to an external resource:

    {
        "id": "navigation-item-with-external-url",
        "properties": [{
            "key": "type",
            "value": "url"
        }, {
            "key": "url",
            "value": "http://logicblox.com/"
        }, {
            "key": "caption",
            "value": "LogicBlox"
        }]
    }

    In this example, we have added a direct link to the LogicBlox website from the navigation tree.

  • JSON Sheet View: It is now possible for users to see and edit the JSON of their sheet configurations, which can be in particular useful during development. This feature can be enabled if desired via the jsonSheetViewEnabled property in the modelerConfig object. This will add another button on the sheet menu bar that switches the sheet to JSON view.

  • Reorganization of Modeler libraries: The Modeler project has re-organized it's LogiQL libraries in order to better support partitioned deployments.

    Note

    Please follow the upgrade steps listed in the the Upgrade Information section.

  • Partitioned Deployments: In order to support partitioned deployments, the services in the modeler_platform library are designed to run in a separate workspace and therefore do not need to be partitioned. To do so:

    • Create a library that includes the modeler_platform library that is intended to be hosted in a non-partitioned workspace.

    • Configure the authentication realm for these services by writing to modeler_init:authentication:app_realm.

    • Configure the URL prefix realm for these services by writing to modeler_init:prefix:prefix.

  • Custom application inside Modeler: We've added an experimental feature allowing the development of a custom application inside Modeler.

    Note

    This feature is still under development and the API we introduce is likely to be changed.

    You can connect your custom application to Modeler by passing your CustomApp view to the modelerConfig.views.

    {
        ...
        views: {
            customApp: CustomApp
        }
    }

    The CustomApp can be accessed then by the following route: /:workbookId?/app/:appId/custom. The list of props that will be passed to your custom application is the following:

    CustomApp.propTypes = {
        /* The top position of the container. */
        top: PropTypes.number.isRequired,
        /* The bottom position of the container. */
        bottom: PropTypes.number.isRequired,
        /* The left position of the container. */
        left: PropTypes.number.isRequired,
        /* The right position of the container. */
        right: PropTypes.number.isRequired,
    
        /* The height of the container. */
        height: PropTypes.number.isRequired,
        /* The width of the container. */
        width: PropTypes.number.isRequired,
    
        /*
         * The term "history" and "history object" in this documentation refers to the history package,
         * which is one of only 2 major dependencies of React Router (besides React itself),
         * and which provides several different implementations for managing session history in JavaScript in various environments.
         **/
        history: PropTypes.object.isRequired,
        /* Locations represent where the app is now, where you want it to go, or even where it was. */
        location: PropTypes.object.isRequired,
        /* A match object contains information about how a <Route path> matched the URL. See react-router docs. */
        match: PropTypes.object.isRequired,
        /* A params object contains all route params collected from all parent routes. */
        params: PropTypes.object.isRequired,
        /* A routeHelper object allows you to navigate between different routes. See CHANGELOG for the list of all available modeler routes. */
        routeHelper: PropTypes.object.isRequired,
    
        /* A modelerApp object has access to dispatcher, urlDriver, all stores and actions of the modeler application. */
        modelerApp: PropTypes.object.isRequired,
        /* The initial configuration of the modeler application. */
        modelerConfig: PropTypes.object.isRequired,
    };

    While developing the custom application you're likely to need several libraries such as React, ReactRouter, ReactRouterDOM, Immutable. You don't need to include them into your bundle for the CustomApp because we export it globally.

Developer Tools

  • The lb list and lb popcount commands now both support an additional option --kind to limit the kind of predicates to be listed (for instance only EDBs or IDBs). The commands do not list predicates anymore that are generated internally by the runtime.

Corrected Issues

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

  • Resolved a data structure (alpha-tree) related bug that caused Unexpected missing versions and no tree has been added for key errors. A related warning for Discrepancy in changes is now an error. Please contact us for support if you receive this error on 4.4.6 or later.

  • Fixed performance issues in a component called the refgraph that caused excessive memory usage for some workloads.s

  • Fixed a bug in the evaluation of rules involving default values that caused Unknown variable errors.

  • Fixed a bug in retractions on scalar predicates that caused Atom … does not match predicate signature errors.

  • Fixed a correctness issue in the maintenance of rules involving negated formulas.

  • Using lang:oneToOne on functional predicates with more than one value now works as expected instead of reporting an error.

  • Using lb compiler --serialize now generates the correct LB0 envelope message.

  • Fixed an issue in lb-web client that could cause threads to accumulate if the scheduler created to monitor transaction timeouts was not properly shutdown.

  • Fixed an issue that prevented lb web-server from logging HTTP requests for services that disabled pulsing the HTTP control messages.

  • Various checks relating to delta logic and stages were not being properly performed, and are now correctly checked. As such it is possible, though unlikely, that developers may have written constraints that were in the past allowed that will now cause a compiler error.

  • Fix for type dependencies and some predicate dependencies that were not being checked for before removing blocks.

  • Fixed invalid HTTP status code for unauthorized WebSocket access.

  • The measure service may now return an HTTP 400 status code instead of HTTP 500 in various situations.

  • Modeler-js:
    • By-value filters now get cleared when the intersection of the table changes.

    • Resolved an issue where a measure could not be removed from the Visible Measures panel when it had a filter applied and the filter panel was open.

    • Resolved an issue with the creation forms, where the Create button could be enabled under certain circumstances, without having populated all the required fields.

    • Resolved an issue where the order attribute of an entity was not respected when sorting the grid on a column with an entity-based measure.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.6 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.6/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.

    Note

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

    Example 39. 

    To upgrade a Modeler-js based application from LogicBlox 4.4.3 to 4.4.6, you can run the following command:

    ./node_modules/.bin/migrate-modeler --fromVersion 4.4.3 --toVersion 4.4.6 /path/to/my/modelerapp

  • Library Changes: Due to the Modeler library reorganization, the modeler_platform project needs to be added to every Modeler-js based LogiQL project.

    Example 40. 

    Before:

    my_project,projectname
    
    lb_web,library
    lb_measure_service, library
    pivot, library
    modeler_config, library
    generated_schema, library

    After:

    my_project,projectname
    
    lb_web,library
    lb_measure_service, library
    pivot, library
    modeler_config, library
    modeler_platform, library
    generated_schema, library

  • Deprecations: The predicates in the 1st column have been deprecated. Their replacements are listed in the second column. For now, all the deprecated predicates either derive into the new versions or are no-ops if no longer used. The old predicates will be removed in the next major version change.

    Deprecated Predicate New Predicate
    modeler_config:services:connectblox:enable_internal modeler_init:connectblox:enable_internal
    modeler_config:services:connectblox:enable_public modeler_init:connectblox:enable_public
    modeler_config:services:authentication:modeler_app_realm modeler_init:authentication:app_realm
    modeler_config:services:authentication:use_sso modeler_init:authentication:use_sso
    modeler_config:services:measure_service:allowed_origin No longer used
    modeler_config:services:prefix:master modeler_init:prefix:prefix
    modeler_config:services:prefix:global modeler_init:prefix:workbook_prefix
    modeler_config:services:prefix:service modeler_init:prefix:service
    pivot:config:service_config:enabled No longer used
    pivot:config:service_config:modeler_prefix modeler_init:prefix:workbook_prefix
    pivot:config:service_config:modeler_realm modeler_init:authentication:app_realm
    pivot:views:* modeler_platform:views:*

    You can remove any call to the modeler_config:services:workbook block in your config.py. The block is now active and no longer needs to be called as part of the build process. An empty block has been left for backwards compatibility but will be removed at the next major version change.

  • Address Mapping: For projects using the Address cell type released in LB 4.4.4, the block that needs to be executed during build time has changed.

    Note

    Projects that do not use the Address cell type do not need to perform these changes.

    1. The following change will need to be made in config.py:

      'lb execblock ' + WS + ' pivot:config:addressmodel:address_mapping'

      needs to be changed to:

      'lb execblock ' + WS + ' modeler_config:metamodel:address_mapping'

    2. Workflows/batches that call the address services will need to be updated, too. They changed from:

      /addressmodel/address_def
      /addressmodel/country_config

      To:

      $prefix/addressmodel/address_def
      $prefix/addressmodel/country_config

      Where $prefix is the same modeler_prefix used for every other service in the application.

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.5

Release Date: June 4th 2017

Executive Summary

LogicBlox 4.4.5 introduces the following enhancements:

  • The database now offers improvements to the datetime and string primitive types, such as support for microsecond precision and a set of operations for string values that are Unicode-encoding and locale aware.

  • Improvements to the Services Framework include custom-header support for the lb web-client API, support for multi-valued headers in HttpClientResponse, as well as login-based authentication for lb web-client.

  • The Measure Service now supports the int128 type, offers an exciting experimental feature for disabling the caching of logic by installation and some other improvements to help developers with debugging.

  • Developers of modeler-js based applications can now take full control over the forms that are presented to users when creating new level members. Additional measures can be added to the forms by writing logic; for more extensive customizations, a custom React component can be used.

What's New

Database

  • The datetime type now uses microsecond precision and datetime:now results in a datetime value with microsecond precision. At the protocol level, an additional field has been added for the microsecond value, so clients that use the existing field for seconds and ignore the field for microseconds will continue to use a precision of a second.

    Note

    This should be a backwards compatible change for typical applications, but the change is observable, for example applications could be relying on microseconds being formatted to 0.

  • The string type now supports various Unicode-aware operations. String values are treated as sequences of bytes, and LogicBlox supports Unicode by assuming a Unicode-encoding in UTF-8. String operations like string:length and comparisons simply use the byte sequences, which may or may not be the intention. LogicBlox now provides a second set of operations for string values that are Unicode-encoding and locale aware.

    Example 41. 

    For example, ustring:length returns the number of Unicode codepoints. The value of string:length["\u20AC"] is 3 (euro symbol as a UTF-8 byte sequence), while ustring:length["\u20AC"] is 1, which is the expected result if the number of Unicode codepoints is desired.

    Comparison operations now take a locale argument to perform the comparison, for example ustring:lt_3("sv", "mot", "måt") will perform the comparison in the Swedish locale. The new ustring operations are documented in the reference manual.

    Note

    Take a look at the reference manual for more detailed usage information and examples.

Language

  • The lang:oneToOne pragma may now be used with any functional predicate, and if necessary the appropriate constraint will be generated.

Services Framework

  • Added support for multi-valued headers in HttpClientResponse.

    Note

    A slight change in HttpClientResponse.getHeaders return type, from Map<String, String> to Map<String, List<String>> might break some users who use this method to read the response headers. In which case, one can simply get the first item in the list, if the header is known to have a single value, or use one of the new methods to get the header value directly. (see HttpClientResponse.getHeader(String name) and HttpClientResponse.getHeaders(String name).

  • The lb web-client Service API now supports custom headers.

  • LB web-client now supports login-based authentication.

Measure Service

  • The measure:config logic has been moved to its own library, as not all measure service projects need it.

    Note

    If your project is using this library, add the following line to your project file:

    lb_measure_service_config, library

  • The int128 type may now be used in definitions and int128 values can be queried.

    • The corresponding primitive Int128 dimension has been added.

    • int128 values are not currently supported in measure service literals, as there are no corresponding int128 literals in LogiQL.

  • QueryRequest messages now have a repeated field of MeasureExprs called constraint.

    • MeasureExprs added to this field will be checked at the after fixpoint stage to see if they are empty. If not, the transaction will be aborted. However, their contents will be returned as part of the Request message so that it is possible to report which values violated the constraints.

    • As a consequence, the Update.Target message's unique field has been deprecated (to be removed in release 4.4.7) as the same effect can be achieved using constraints, which will also report which levels already exist.

  • Experimental support for disabling the caching of logic by installation has been added. By setting the Request message’s install_logic field to false, the measure service will attempt satisfy the request without installing any logic. If this cannot be done, the request will fail with an error indicating the reason.

    Note

    Note that this feature is still experimental. If you encounter any problems let us know so we can move this feature closer to being viable for use in production.

  • The measure service will now pretty-print CubiQL expressions in a much more legible fashion and in syntax that can be parsed.

  • There is a new measure service lb command for converting expressions and requests between different formats.

    Example 42. 

    For example,

    lb convert --type expr --in-format json --out-format cubiql file.txt
    
    cat file.txt | lb convert --type request --in-format proto-text --out-format json 

  • The new configuration option called abbrev_code can be used to disable abbreviation of long names or constants in the logs.

  • The measure service will now return a 400 HTTP code unless the error is actually a server problem, in which case a 500 HTTP code will be returned.

  • The measure service will now add default value fields to Predicate messages for those predicates that have default values.

  • Optimizations to eliminate more empty literals from CubiQL expressions.

Modeler-js

  • Custom Level Member Creation Forms: The level member creation form is now fully customizable, reducing the development effort of teams for creating custom forms. Basic customization, such as adding additional measures or making measures required during creation, can be done using LogiQL. Additionally, we now provide a custom React component that gives developers full control over the data that is displayed to the end-users on the form as well as additional data that needs to get populated when the level member is created.

    Example 43. Level Member Creation with Measures

    The level member creation functionality has been updated to support measure value inputs for the new level members. When creating level members, users can specify values for the configured measures along with the level member creation. The measure values will be stored at the new level member position in the database.

    To configure the measures that should appear in the level member creation form, you will have to populate the following predicates in the database:

    • pivot:config:level_creation:metric: a string which is the name of an existing metric that has to be displayed on the form.

    • pivot:config:level_creation:is_required: to indicate that the metric is required for each new level member.

    • pivot:config:level_creation:is_hidden: to indicate that the metric should be hidden from the form.

    • pivot:config:level_creation:initial_value: initial value for the metric.

    • pivot:config:level_creation:is_read_only: to indicate that the metric should be displayed as read-only on the creation form.

    • pivot:config:level_creation:filterMeasure: can be used to filter dropdowns (entity-typed metrics).

    In the example below the measure SkuColor is added as a required measure with a default value of Black to the member creation form of the level Product:Sku:

    +pivot:config:level_creation:metric[l, 0] = m,
      +pivot:config:level_creation:is_required(l,m),
      +pivot:config:level_creation:initial_value[l,m] = "Black",
      +pivot:config:level_creation:filterMeasure[l,m] = "ColorMask"
          <-
          lb:web:measure:Metric_name[m] = "SkuColor",
          lb:web:measure:Dimension_name[d] = "Product",
          lb:web:measure:Dimension_level(d,l),
          lb:web:measure:Dimension:Level_name[l] = "Sku".

    Example 44. Advanced Level Member Creation Form Customization

    A custom React component can be used to customize the contents of the level member creation. The existing level member creation form is in logicblox.js as Views.CreateLevelMemberView which this custom component can use to render the level member creation form.

    The following props are available for the custom component:

    modelerApp: React.PropTypes.object,
            location: React.PropTypes.object, // Contains the context about where the component was invoked from.
                                              //  - location.state.prevPathname has the route from which the creation form was invoked
            params: React.PropTypes.object  // contains the level and dimension ids
                                            //  - params.dimensionName
                                            //  - params.levelName

    The measures that appear in the level member creation form can be customized as necessary. The customizations specified here will override the measures and the measures properties configured in the database.

    To do this, add the method transformJSON to the custom component. The method should accept the level creation config as its input argument and returns an updated level creation config. The level creation configuration is the configuration associated with the level for which a member is being created here. The metrics listed in the configuration will be displayed in the creation form. The configuration object is an array of objects where each object defines a metric and its properties. These metrics will be updated with the user entered values along with the level member creation after user clicks one of the two create buttons on the form.

    The following are the properties of the metric objects that will be in the array,

    • name: A string which is the name of an existing metric / ID / Label that should appear in the creation form

    • required: A boolean flag that indicates if a value has to be specified for this metric in the creation form. ID and Label are always expected to have a value.

    • readOnly: A boolean flag that indicates if this metric / ID / Label is a read-only or not.

    • initialValue: A string that contains the default value for the metric / ID / Label.

    • hidden: A boolean flag that indicates if the metric / ID / Label should be hidden in the form. This will be populated with value in value / initialValue property.

    • filterMeasure: A string that contains the measure name to be used for filtering the dropdown values of this measure. This is ignored for ID / Label.

    • value: A string that contains the current value for the metric / ID / Label.

    In addition to the metrics, the ID and/or Label can also be a part of this array. They can be customized in the same way as other metrics but the name property of these should always be ID for ID and Label for label.

  • Support for filtering on boolean values (via json config): It is now possible to add a filter on a measure of type boolean via the json configuration of a view. Support for this type of filter via the UI will be added in a subsequent release.

    Example 45. 

    In the example below a filter is configured such that only those levels are displayed where Active is true:

    {
        "id": "my-view",
        "pivotConfig": {
            "axis": {
              ...
            },
            "filter": {
                "Active": {
                    "type": "equal",
                    "value": true
                }
            }
        }
    }

    Note

    This new feature required us to introduce a new required property type in the metric filter JSON configuration. The following types are supported: range and equal.

    All existing sheets can be automatically migrated using the modeler migration tool. Please follow the upgrade steps listed in the the Upgrade Information section.

Corrected Issues

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

  • Fixed an OutOfMemoryError exception for command line TDX imports with large amount of erroneous data, when no output was specified.

  • Fixed issue in the lb-web-server code that keeps a session with the runtime. Some errors in the session handling were not being properly logged and handled, which could result in lb-web being permanently unable to connect with the runtime.

  • The lb web-server now properly decodes service URLs before pulsing the http control protocol in workspaces during service execution.

  • Adjusted the computation of a transitive closure in lb-workflow's internal data structures to avoid undeterministic behavior that sometimes would lead to very long running rules.

  • Modeler-js:
    • Warming up a canvas containing a sheet without any levels on an axis does not cause an exception anymore.

    • The performance of opening the axis configuration menu has been improved for applications with a very large number of measures/dimensions.

    • The navigationbar as well as an empty workbook table is now presented to users that do not have access to any workbooks.

    • Form mode is now also available in views where there is no level on any axis.

    • Resolved an issue where under certain circumstances calculating values that were entered in deferred calc mode caused an exception.

    • Resolved an issue where the country and region dropdowns are were not marked as required fields in the address form editor.

    • Filtered dropdowns now show a "no matching items" message if the filter metric is empty.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.5 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.5/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Application projects that are using the measure service config library need to add the library to their project file by adding the following line:

    lb_measure_service_config, library

  • The library containing the modeler migration tool is included in the distribution under 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 path/to/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-js based 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.4.5 or 4.4.1).

    Note

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

    Example 46. 

    To upgrade a Modeler-js based application from LogicBlox 4.4.1 to 4.4.5, you can run the following command:

    ./node_modules/.bin/migrate-modeler --fromVersion 4.4.1 --toVersion 4.4.5 /path/to/my/modelerapp

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.4

Release Date: May 9th 2017

Executive Summary

LogicBlox 4.4.4 introduces the following enhancements:

  • The database includes stability improvements to replication.

  • The Measure Service includes improvements to help developers with debugging, as well as some performance optimizations.

  • Modeler-js is extending its support for self-service by allowing end-users to resize as well as rearrange sheets on the canvas. Support has also been added for an address cell type together with a new entry form for addresses, that is configurable per country. Finally, improvements are included to reduce development effort, such as native support for a workbook list page and a UI for Single-Sign-On.

Note that this release contains a number of backwards incompatible changes for Modeler-js based applications. The upgrade steps are described in detail in the the Upgrade Information section.

What's New

Database

  • Replication now uses a send timeout: if the remote side stops processing data, eventually the primary will give up and the replicator will go into a failed state. In synchronous replication mode, this causes any waiting transactions to fail. Note that this does not mean that replication of a transaction has to take less than 5 minutes, just that it has to keep making progress by reading some data every 5 minutes. The default timeout can be overridden via the replication_send_timeout workspace option.

  • Replication now uses TCP keepalive: This allows detecting the case where a primary or mirror has become unreachable. It also prevents NAT routers and stateful firewalls from killing the connection when there are no transactions for a while. The keepalive idle time is 300 seconds. That is, the kernel will start to send keepalive messages after 300 seconds of idleness.

Language

  • Module name associated with protobuf now must conform to valid LogiQL identifier rules.

    Note

    Note that this is a backward incompatible change.

Services Framework

  • SAML realms can now be configured with a credentials service to create new users in the credentials database when they log for the first time. Additionally, a list of authorization roles can be declared to be given to such new users.

Measure Service

  • Improved debug reporting on inverse selection for updates. This should make it easier to understand why an edit was not allowed or why a different update was performed than expected.

  • Added support for binding intersection and expressions variables in the model (via the var_binding field of the MeasureModel message) and in requests (via the var_binding field of the Request message). This makes it easier to generate smaller queries via avoiding repetition, as well as allows for controlling whether the bound expressions are optimized once or at every use site.

  • Other protocol changes:

    • The multi_dim_level_map field has been removed from the MeasureModel message.

    • The binary_decimal_column and default_values fields of the QueryRequest message now default to true rather than false.

    • The measure_str field has been removed from the QueryRequest message.

    • The expr_str and pred fields have been removed from the ExprSubst message.

    • The MultiDimensionalMap message has been removed.

    • The meausre_str field has been removed from the ExprMetric message.

    • The signature and metric fields have been removed from the UpdateExpr message.

    • The expr_str field has been removed from the UpdateExpr.Query message.

    • The Inverse message is now a child of the InverseGroup message, and its expr_str field has been removed.

    • The expr_str field has been removed from the MetricLock message.

    • The expr_str field has been removed from the DimensionLock message.

    • The multi_dim_map has been removed from the AggExpr.Grouping message.

    • The MULT_MAP kind of AggExpr.Grouping.Kind has been removed.

    • The missing MIN operator kind was added to Op.Kind.

Modeler-js

  • Resizable and Draggable Sheets on a Canvas: The self-service capabilities of Modeler-js have been further extended by allowing users to resize as well as move sheets on a canvas via drag and drop. To resize a sheet, simply click on the lower right hand corner of the sheet and drag to increase or decrease its size. To move a sheet, click on the sheet's title area (next to the link to the sheet-only page) and drag the sheet into its new position.

    Layout changes are saved per user. Therefore, any alterations will still be present upon leaving and returning to the canvas. To reset the canvas to its original layout, users can use the right-click menu of any sheet on the canvas. Select the Reset Canvas Layout option from the menu after right-clicking on the pivot grid's cells or headers. This will return the canvas to it's original layout, regardless of which sheet was right-clicked.

  • Address measure abstraction and cell type: The new cell type address allows users to view addresses in a single cell in the grid and enter the data in the new address editor that is configurable per country. The predicates that support the address abstraction are a part of the pivot library.

    The following components are provided:

    • pivot:config:addressmodel:address_def:

      • This block contains the definition of the address predicate and the component predicates (address lines, city, region).

      • It also contains some validations that are enforced on the address data type, for instance: each address must have a valid region/country; text fields cannot contain special characters.

      • You can also find here predicates that are used to parse the address refmode which is a JSON string representation or the address.

    • pivot:config:addressmodel:country_config: Contains address requirements that are configurable on a per-country basis, such as the number of lines available/required and the labels to use for the address editor (for instance to display the header Province instead of State). The validations on address values are based on the provided country configurations.

    • pivot:config:addressmodel:address_service: Service definitions for importing regions, countries, and the country configurations.

    Below you can find an extensive example on how to configure this feature.

    Example 47. 

    To be able to use the new address measure abstraction, you will first need to extend your build configuration with the execution of the block pivot:config:addressmodel:address_mapping, which will generate the additional data model that you need, such as the Address dimension, and the address level and the required measures, such as the address lines, city and region.

    lb execblock my_ws pivot:config:addressmodel:address_mapping

    To populate the country as well as the region dropdowns, you will need a comma delimited file similar to the example below:

    region,country,country_label
    CA-AB,CAN,Canada
    ..
    US-GA,USA,United States of America
    US-NY,USA,United States of America
    ...
    GB-ABC,GBR,United Kingdom
    GB-LND,GBR,United Kingdom
    ... 

    You can import (and export) this data using the service /addressmodel/address_def. This service populates the predicates defined in the block pivot:config:addressmodel:address_def.

    Next you can configure per country which fields to display on the address editor as well as which of those should be required. The configuration needs to be added to a comma delimited file similar to the example below, that can be imported using the service /addressmodel/country_config.

    country_code,numlines,numlines_required,subregion_required,postal_required,country_label,region_label,subregion_label,postal_label,address_label
    GBR,3,2,true,false,true,Province,Municipality,,
    USA,3,1,true,true,true,,,,

    The images below illustrate how the various address forms per country look like based on the country configuration from above.

    For Canada, a country that has been imported using the /addressmodel/address_def service, but for which no country configuration has been provided, the default address form is being presented to the user, including the default settings with regard to required fields:

    The configuration for the United Kingdom states that 3 address lines should be presented, where the first two lines are required. Additionally, the subregion_label is set to Municipality and the region_label to Province. Municipality and the Postal are required, due to the default setting.

    For the United States of America, we configured 3 address lines to be displayed, from which only 1 is required.

    Once the basic address configuration is in place, it is possible to define measures of type pivot:config:addressmodel:address_def:address. The example below shows the measure configuration in the Measures.csv file for the measure StoreAddress. Notice that we use address as the Format of this measure:

    Measure,Label,Intersection,DataType,DefaultValue,DefaultAgg,DefaultSpread,RecalcRuleName,PercentBase,PercentParentDimension,Format,
    HAlignment,Readonly,SpreadByMetric,DerivationType
    StoreAddress,Store Address,Store,pivot:config:addressmodel:address_def:address,,none,none,,,,address,,,,

    Once the measure has been defined, it can be used on any view, just as any other measure. You can write your own services to import/export data to and from this predicate.

  • Changed URLs and native workbook list page support: The URL suffixes used for accessing the various pages of the modeler application have changed. As a result of this change the workbooks list page is now natively supported for Modeler-js based applications and application teams no longer have to create a separate page for it. The new displayWorkbookList property on the list of props controls whether to show the workbook list as the default index page.

    If your application does not use workbooks, you can continue to use the navigationTreeId property to configure which navigation tree to show by default.

    The new URLs are as follows:

    Suffix Description
    /modeler/signin Sign-in page
    /modeler/sso Single-sign-on page
    /modeler/workbooks Workbooks list page
    /modeler/workbook/'workbook-id'/app/'wb-nav-tree-id' Main page of the workbook
    /modeler/workbook/'workbook-id'/app/'wb-nav-tree-id'/canvas/'canvas-id' Page for the specified canvas
    /modeler/workbook/'workbook-id'/app/'wb-nav-tree-id'/sheet/'sheet-id' Sheet's own page
    /modeler/app/'nav-tree-id' Master workspace's main page
    /modeler/app/'nav-tree-id'/canvas/'canvas-id' Page for the specified canvas in the master
    /modeler/app/'nav-tree-id'/sheet/'sheet-id' Sheet's own page in the master

    Note

    Please follow the upgrade steps listed in the the Upgrade Information section.

  • Built-in UI for Single-Sign-On: Modeler-js now has a built-in UI for Single-Sign-On. The various aspects of the page and the UI can be configured via a property in the Modeler config object.

    The following new properties are available:

    • requestUrl: the full URL that will handle the SSO request and response from the application.

    • appLogo: - relative path to the location of the application logo provided by the client. It will be displayed at the top of the SSO login UI.

    • appName: name of the application to be displayed in the SSO login UI.

    • serviceProviderLogo: relative path to the location of the logo of the service provider. This will be displayed below the text 'Powered by' in the SSO login UI.

    Example 48. 

    Here is an example,

      ...
      {
          ...
          appPrefix: ...,
          workspace: ...,
          singleSignOn: {
              requestUrl: "http://localhost:8080/sso/request",
              appLogo: "/images/client_logo.png",
              appName: "My LogicBlox Application",
              serviceProviderLogo: "/images/my_sp_logo.png"
          },
          ...
      },
      ...

  • The Modeler authorization has been simplified: Previously, applications were responsible for loading a list of Permissions, Operations and Roles specific to the Modeler and then associating users with said Roles. This resulted in applications copying and pasting these CSV files from project to project despite having no control over what's in them. Now, we have built-in the Permissions, Operations and Roles that the Modeler uses. The only thing an application needs to do is load the User/Role mapping which is actually application specific. Currently, there is only one user Role, Modeler User, though we plan on adding more in the future.

    Note

    Please follow the upgrade steps listed in the the Upgrade Information section.

Developer Tools

  • The lb predinfo command now supports an option --transitive. This explicit option replaces the previous confusing behavior, where ‘lb predinfo with one parameter would only return that predicate, and with more parameters would return those predicates plus additionally the entities used in the predicates.

Corrected Issues

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

  • Fixed an issue with type inference of constructors in the head without a corresponding head entity reference.

  • Incorrectly terminated clauses will not report strange errors when adding/executing logic through the runtime.

  • Derived-only nullary predicates are now inlined correctly.

  • Fixed an issue with using named branches in separately compiled inactive logic.

  • Resolved a rare issue in the meta-engine that could correct reference counts.

  • GlobalProtobuf services now use the same method used on the request (GET, POST, etc) to call the target services.

  • Fixed an issue with lb-web's Proxy handler, that would not abort the connection with the target service once the client request is aborted.

  • Resolved an issue where the Measure Service would fail to report a 500 HTTP status code.

  • Resolved an issue where non-convertible locks were not being correctly reported by the Measure Service in model requests.

  • Modeler-js:
    • Resolved an issue where it was not possible to configure measures to be read-only per user was not possible when using workbooks.

    • Resolved an issue that caused the UI to hang when typing into a dropdown cell (Internet Explorer 11 only).

    • It is now possible to set a default column width to a grid when there are no levels or measures on an axis. The following configuration can be used for this in the sheet configuration:

      ..
      "gridOptions": {
        "display": {
          "_PLACEHOLDER_": {
            "width": 150
          }
        }
      },
      ..

    • Resolved an issue where the formatting was not respected for measures using # or #0 as formatting option.

    • Visual hints are now displayed on updates to visible cells both for the active user as well as other users viewing the cell that was updated.

    • Resolved an issue where under certain circumstances a spreading error could occur for users in deferred calc mode.

    • Search terms separated by spaces are now interpreted as disjunction for Exactly Matches, Starts with, Ends with, as well as Contains.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.4 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.4/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Upgrade Information

  • Modeler-js based applications can use the migration tool that is shipped together with the distribution to upgrade to 4.4.4. Additionally, a number of manual steps will need to be performed, mostly in the custom html and JavaScript files. Due to the nature of these custom files, we were not able to include these in the migration scripts. However, the goal of this upgrade is to reduce project-custom code so that we can automate more upgrades in the future.

    1. Run the migration tool: To run the migration tool, you first need to install the npm module by running npm install path/to/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.

      Run the following command 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.4.4 or 4.4.3).

      Note

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

      Example 49. 

      To upgrade a Modeler-js based application from LogicBlox 4.4.3 to 4.4.4, you can run the following command:

      ./node_modules/.bin/migrate-modeler --fromVersion 4.4.3 --toVersion 4.4.4 /path/to/my/modelerapp

    2. Perform changes with regard to Modeler Authorization: Remove the Modeler specific data from the operations.csv, permissions.csv, permission-operations.csv, role-permissions.csv and roles.csv, and any references to these files in workflows / batch scripts.

      Change the user-roles.csv to user the new Modeler User role.

      Example 50. 

      The csv files can typically be found under src/config/authorization. The user-roles.csv would need to be updated from:

      USER|ROLE
      user1|general access role
      user2|general access role

      to:

      USER|ROLE
      user1|Modeler User
      user2|Modeler User

    3. Update navigation trees and workbook template configurations: Starting this release, each workbook template is now expected to have its own navigation tree configuration file. The id used in the navtree configuration file should match the workbook template name.

    4. Perform changes to html files:

      By having defined routes for workbooks and for different navigation trees, applications should only need to have a single HTML file.

      We changed the name of the topmost React component we export from AuthenticatedModelerController to Modeler. The configuration options remain largely unchanged unless specifically noted.

      The onStart prop was removed along with the AuthenticatedModelerController. We are not aware of anyone that was using it and it should therefore not impact you, but if you were, please reach out to us for assistance.

    5. Update sheets and canvases with regard to deprecated features: ModelBrowser is replaced by SheetConfigurationPanel and has been moved from the canvas to the sheet. The ModelBrowser view module in canvases (usually named as browser-tabs-view) is not supported anymore. From now on, the model browser (which is now called SheetConfigurationPanel) should be a part of the sheet view. Any existing canvas with a ModelBrowser view will for now continue to be rendered correctly along with a warning message in the console.

      The sheet configuration no longer needs the Measures view module (usually named as visibleMeasures). It should be deleted from the sheet configuration files. Any existing sheet with a Measures view will for now continue to be rendered correctly along with a warning message in the console.

      Example 51. 

      Below you can find an example use case for the new SheetConfigurationPanel view in the sheet config:
      {
          ...
          "views": {
              "SheetConfigurationPanel": {
                  "module": "SheetConfigurationPanel"
              },
              "rows": {
                  "module": "Rows"
              },
              ...
          },
          "layout": {
              "shape": {
                  "columns": "200px,1,110px",
                  "rows": "39px,1,39px"
              },
              "viewPositions": {
                  "SheetConfigurationPanel": {
                      "col": 0,
                      "row": 0,
                      "colspan": 1,
                      "rowspan": "fill"
                  },
                  "rows": {
                      "col": 1,
                      "row": 2,
                      "colspan": 1,
                      "rowspan": 1
                  },
                  ...
              }
          }
      }
    6. Update the nginx configuration file: The config should direct any non-matching URL request to the main html page of the application. That is the page which instantiates the Modeler component.

      Example 52. 

      Here is an example of how it can be done:

      location = / {
          index "index.html";
          root /static/;
      }
      
      location = /modeler {
          try_files $uri /index.html;
      }
      
      location /modeler/ {
          try_files $uri /index.html;
      }
      
      location / {
          try_files $uri @bloxweb;
          root /static/;
      }

      In the example above, all requests to the root will be served by index.html. Similarly, all requests to /modeler/* will also serve the index.html. All other requests will fall back to bloxweb.

      Note

      No changes should be necessary to the deployed nginx.conf unless you change the rootPrefix to be something other than /modeler.

    7. Step only needed for applications upgrading from 4.3.12 or earlier:

      The /canvas and /sheet services are now only available on the internal ports. These services were deprecated as of release 4.3.13 in favor of the /view and /viewstate services. We have left them available for backwards compatibility so that applications can do a one time migration between the two services. As another step in the deprecation of these services, they are now only available on the internal port. This will not affect anyone that has already upgraded to the new services.

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.3

Release Date: April 6th 2017

Executive Summary

LogicBlox 4.4.3 introduces the following enhancements:

  • The database includes a rewrite of the 'refgraph' (comparable to a garbage collector), causing significant performance as well as stability improvements.

  • The Measure Service includes improvements to help developers with debugging.

  • The release also comes with some exciting features for users of Modeler-js based applications, such as support for searching over text and entity-typed measure values directly from the grid, support for directly assigning level members to parent levels via the right-mouse click menu as well as the ability to configure measures to be read-only at the user level.

    • For video highlights of the new Modeler-js search feature, please see the LogicBlox 4.4.3 release video.

What's New

Database

  • This release introduces a rewrite of the ‘refgraph’, which is comparable to a garbage collector. In our testing, this rewrite improves performance by about 25% on non-trivial benchmarks. The rewrite also addresses a long-standing bug (missing pageinfo) that we’ve observed in our most rigorous testsuites, but rarely occurs in applications.

  • Mirrors can now be disconnected also on the primary lb-server instance to support situations where the secondary lb-server instance may not be usable. A list of active mirrors can be obtained using lb info and the disconnect command is lb disconnect-mirror.

    Example 53. 

    lb disconnect-mirror foo 192.168.1.3:57078 

Services Framework

  • Asynchronous lb-web services now have a configurable timeout.

Workflow

  • The lb.CreateBranch workflow task now has an optional override parameter, allowing the creation of a branch even if there exists one with the same name. The default is false, as per the previous behavior.

Measure Service

  • Improved formatting of generated logic in debug(2) level logs.

  • CubiQL inverses:

    • CubiQL inverses are now properly reported for ModelRequests.

    • CubiQL inverses now use Input as a distinguished variable for the changed tuples, rather than the name of the edited metric plus intersection, etc.

Modeler-js

  • Text Based Search: Users can now search over text and entity-type measure values using the new magnifier icon that is available via the menubar on every sheet. After specifying on which measure the search should run on (which can also be a measure that is not visible on the sheet), the user needs to indicate whether to look for an exact (Exactly Matches) or non-exact match (Contains, Starts with or Ends with).

    Tips for optimal search results

    • To search for multiple search terms, simply separate them with a space. For instance, to search for SKUs that have either the color yellow or green, enter the following into the search field: yellow green.

    • To search for a specific word that has quotes around it, use double quotes. For instance, to search for ""colored, enter """colored"" into the search field. As a result, measures containing only colored will not appear in the search results.

    • It is possible to run a search on a measure that is not visible on the view. The user will then receive a notification about the results appearing in fields that are not available on the view and get the option to add the measure to the view.

    • The list of measures from which the user can select from depends on the displayableMeasures entry that is configured for the sheet/canvas. The list is restricted to strings and entity-type measures.

    Additionally, it is also possible to pre-populate the search bar via the view configuration.

    Example 54. 

    In the example below, we add a configuration to the pivotConfig of the sheet so that when the view is initially opened, the data is filtered based on the search criteria. The search is configured to run on the measure Description, where all results have to exactly match the search term Banana.

     id: "some view",
     pivotConfig: {
         axis: {
             ...
         },
         search: [{
            qualifiedNames: ["Description"],
            query: "Banana",
            exactMatch: true,
            startsWith: false,
            endsWith: false
        }]
     }

  • Directly Assigning Level Members to Parent Levels: To map a level to a parent level or to change an existing mapping, users can now right-click on the level header of the parent level and select the new option Assign <level_label>. This will open up a form that allows the mapping of one or multiple children to the selected parent.

  • Performance optimization of dropdowns: We have optimized the performance of dropdowns with large datasets. Users will notice significant performance improvements when scrolling or searching through them.

  • Configure metrics read-only by user: A new predicate allows developers to configure if a metric should be read-only for a user:

    pivot:config:format:metric_readonly_by_user(m, u) -> lb:web:measure:Metric(m), system:app:User(u).

    In previous releases this was only possible at the metric level using the pivot:config:format:metric_readonly predicate. A metric is now considered read-only if either pivot:config:format:metric_readonly(m) or pivot:config:format:metric_readonly_by_user(m, u) is set for a user.

    Example 55. 

    In the example below the measure Sales is configured to be read-only for user user1. The measure will only be rendered read-only for this specific user.

     +pivot:config:format:metric_readonly_by_user(m,u) <-
        lb:web:measure:Metric_name[m] = measure_name,
        system:app:User:name[u] = user_name,
        measure_name = "Sales",
        user_name = "user1",
        +system:app:User(u). 

  • New configuration option for handling links: It is now possible to configure whether a link should be opened in a new tab (default behavior) or in the active tab, using the openInNewTab link configuration setting.

    Example 56. 

    In the example below the openInNewTab setting is set to false. When the user clicks on the link, the LogicBlox website will open up in the active browser tab.

    { "caption": "LogicBlox", "url": "http://www.logicblox.com", "openInNewTab": false } 

  • Entity labels in export to CSV/Excel: We now support the entity label toggle when exporting to CSV or MS Excel. Column headers, levels, and entity-typed measures will now be exported based on the selected display option.

    Note

    Please note that this can cause a change in the default exports from the grid as column names will now show the label instead of the qualified name unless the ID display option is selected.

Corrected Issues

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

  • We identified a bug that in the following sequence would allow an IDB predicate to be treated as an EDB:

    1. Add a predicate p (without any rules)

    2. Add an inactive block that updates p as an EDB (e.g. using ^p )

    3. Add an IDB rule for p

    4. Execute the inactive block

    This sequence would result in internal errors and incorrect results. The two options to fix this bug were to either (a) change p into an EDB predicate as part of step (2), or (b) produce a runtime error at step (4). We decided to implement option (b).

    Note

    This is a backwards incompatible change, and for internal applications we have seen new errors reported during the build. Typically an error is reported in step (3) when attempting to install an IDB rule for p. While we try to avoid backwards incompatible changes, these errors almost always do indicate a real problem in the application logic that should be fixed. The only case where the new error is a false positive is if the inactive block would never be executed.

  • Fixed a race condition in datetime:format that in rare cases resulted in an incorrectly formatted datetime.

  • Fixed a memory leak that under heavier loads can be serious enough to cause problems.

  • Resolved an issue where changing or resetting passwords was not possible when using local credentials service.

  • Fixed an issue on lb-workflow backups, which were not compressing the backups.

  • Fixed an issue in lb workflow where lb.wb.BackupMasterWorkbook tasks were ignoring export errors and reporting success.

  • Resolved an issue where lb-workflow was receiving error files in memory when no error file was specified. This could lead to an exception when receiving a large error response with no file specified.

  • The workbook framework delta merge operation is now resilient to crashes. Previously, a crash during a delta merge (commit or refresh) could leave the workspace in an inconsistent state which would not be recoverable without manual intervention. Now, a subsequent merge request that detects an inconsistent state is capable of recovering from it before executing the operation.

  • Sending parameters with empty LiteralExprs will no longer cause a runtime exception.

  • Modeler-js:
    • Resolved an issue where under certain circumstances all dimensions were available via the dimension browser instead of only the ones configured in the dimensionsConfig entry of a sheet.

    • Resolved an issue where navigation using the right and left arrow keys was not supported on the axis configuration panel.

    • If a cell is displayed hashed, the tooltip now contains an explanation on why this is the case.

    • The modeler no longer sends duplicate relations in its measure service requests.

Installation and Upgrade information

Installation Instructions

Install LogicBlox by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.3/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.2

Release Date: March 3rd 2017

Executive Summary

LogicBlox 4.4.2 introduces the following enhancements:

  • The database includes performance enhancements that is particularly noticeable when evaluating predicates that are defined by a large number of disjuncts or multiple rules.

  • New lb web-client API offers better performance as well as improvements in ease of use. Developers will also benefit from more expressive TDX transformation functions, as well as helper predicates that simplify the specification of TDX configurations.

  • The Measure Service includes a number of performance enhancements.

  • Modeler-js expands its support for self-service of both charting, as well as level members: Users are offered control over the color and size of charts, as well as the axis along which the measure values are charted; Users can also directly edit the label of level members in the grid. Modeler-js has also added Internet Explorer 11+ to its list of supported browsers.

What's New

Database

  • Merge rules are now evaluated much more efficiently. Merge rules are used for predicates that have disjuncts or are defined by multiple rules. For predicates with a very large number of disjuncts, the performance gain can be very large (e.g. 7x overall speed-up was measured in an application by one of our partners). For typical applications we have measured about 15% overall performance gain.

  • Performance improvements for task parallelism.

Services Framework

  • New lb web-client API: the new API for lb web-client implementation uses Netty (instead of Jetty, as is the case with the API prior to 4.2.2). This change results in better performance as well as a more user-friendly API.

    Note

    The old API is still available for compatibility but will be deprecated in a future release. The lb web-client command line now uses the new API, but for compatibility purpose, one can send the parameter --version1 to use the old API.

  • TDX now supports transformations using more built-in predicates, such as string:split and string:at. The requirement is that the built-in predicate is functionally determined by one input value from the CSV file

    Example 57. 

    For example, the following expressions can be used to define transformation functions, where s is unbound in the body of the transformation function: string:split[s, "|", 1], string:matches[s, "(a*)(b).", 1], and string:at[s, 2].

  • TDX Helpers: LogicBlox now comes with a new library called lb:web:delim:tdx_helpers, to simplify the specification of TDX configuration.

    Note

    Please refer to the Reference Manual for a detailed overview of this feature and its usage.

  • Improvements to lb web-server's Proxies integration with the target services. With this release, if the target service returns a Location header with a URL targeted by that proxy, the URL is converted to point to the proxy before being sent back to the client.

ConnectBlox

  • QueryPredicate now has a field called row_limit that can be used to abort the transaction if more tuples are returned than the specified limit. The response will include a message indicating which uses of QueryPredicate exceed the limit. It is now possible to still query data out of the workspace even in the event of a transaction failure using QueryPredicate. Depending on which stage of evaluation the failure occurred within, some data may not yet have been computed, but this is feature can be used for extracting information about data that may be causing an integrity constraint failure.

Measure Service

  • The Measure Service now supports the row_limit field in QueryRequest.

  • A number of optimizations have been introduced in both the Measure Service and the LogiQL it generates:

    • Certain aggregations that are implicit in CubiQL queries may be materialized explicitly, so that it can lift dices and filters out of them.

    • Simplifidications are applied to CubiQL expressions that can be detected to be "total" in that they compute the complete set of positions for a given intersection.

    • The CubiQL optimizer can now rewrite child expressions in parallel for better CPU utilization when a large request is received.

    • The Measure Service will choose the key-order for reporting predicates by the most frequently used key-order of the predicates in the report.

    • The generated logic for some collect aggregations will now be fused together into a single LogiQL rule.

    • The Measure Service now attempts to generate IDB logic when it can in transaction lifetime requests, rather than always using delta logic.

    • If a queried CubiQL expression is chosen to be inlined, when generating reports it may be materialized to avoid repeated recomputation.

Modeler-js

  • Charting Improvements:

    • End-users now have the ability to control whether measure values should be charted along the X or Y axis, using the new Measure Values pill that is available in chart mode.

      Example 58. 

      In the example below, the Measures pill is on the rows, while the new Measure Values pill is on the Y-axis. As a result, a chart is displayed along the X-axis for each of the 2 measures, while the measure values are charted along the Y-axis:

      By moving the Measures pill to the Y-axis, the two charts are displayed below each other, while their values are still charted along the Y-axis. In previous versions, the measure values would have been charged along the X-axis automatically.

    • Ability to control the size and colors used for charts, using the new Size and Color panels. Additionally, level pills as well as the Measures pill can be placed on the Color panel, so that the data gets combined in one chart, but differentiated by color.

      Example 59. 

      In the chart configuration below the Region level is placed onto the Color panel, creating a stacked color bar chart, where each Region on the bar has a distinct color.

  • IE 11+ Support: Internet Explorer 11+ is now also officially supported for modeler-js based applications. In previous releases, only Chrome was officially supported.

  • Editing of Level Member Labels: Level member labels can now be edited directly in the grid by double-clicking on the header cell for a member. To enable this feature in a modeler-based application the editSchema property needs to be set to true in the modelingFeatures section which is a part of the configuration passed to AuthenticatedModelerController.

  • Suppressed ID field in Create Form: The ID field is now by default suppressed in the create form. To see / edit the ID when creating a new level member, users can click on "+ More Options" in the form.

Developer Tools

  • Cloud-store (S3 library) has improved the computation of the default chunk size so that files bigger than 50G can be uploaded and downloaded without manually having to configure the chunk size. The previous default chunk size would result in more than 10000 parts for big files, which is not supported by AWS S3.

  • The lb extract-example utility that was introduced in 4.4.0 now supports constructors (earlier it only supported entities with refmodes). We have also implemented support for predicates with default values.

  • Long-running rule reports now include information on the default value and the number of stored facts for predicates.

  • The predInfo command of lb batch-script now again reports statistics for alpha tree (write-optimized) predicates. Before 4.4.0, it already reported statistics but this was not implemented for alpha tree predicates.

Corrected Issues

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

  • Resolved an issue in lb-web where sessions were created based on the username sent by the client instead of the canonical username. This issue affected the value pulsed in lb:web:auth:username, causing some services to not work correctly if the user was logged in with a different case (e.g. "User" instead of "user").

  • Fix to lb workflow's TDX Import task, when using an S3 location, it would implicitly consider a wildcard in the end of the URL.

    Example 60. 

    An import of s3://my_bucket/sales was equivalent to s3://my_bucket/sales*. Now the implicit wildcard has been fixed, but users can still use a wildcard if wanted.

  • Resolved an issue with analyzing recursively defined measure language rules.
  • Modeler-js:
    • The selected label display options are now also respected when in form or chart mode, as well as in entity dropdowns.

    • Resovled an issue where an empty filter popup was displayed when the Measures pill was the only field on the slice.

    • Resolved sorting related issues of level members in level dropdowns on the slice.

    • Resolved an issue that caused an error in the browser's console when trying to resize the browser window after idle logout.

Installation and Upgrade information

Installation Instructions

Install LogicBlox 4.4.2 by following the steps outlined below:

  1. Download the installation package.
  2. Extract the tarball in <YourPreferredInstallDirectory>
  3. Run the following command:
    source <YourPreferredInstallDirectory>/logicblox-4.4.2/etc/profile.d/logicblox.sh
    NOTE: this script will set all the necessary environment variables. You might want to add this command to your .bashrc.

Release Information

Server requirements
Operating System: 64 bit Linux; OSX 10.10+ is supported for local development.
Java Runtime Environment 8
Python 2.7 or higher
Client requirements
Applications using modeler-js User Interface Components: Google Chrome or Internet Explorer 11+
Requirements for applications using non-modeler-js components may vary per application.

LogicBlox 4.4.1

Release Date: February 1st 2017

Executive Summary

LogicBlox 4.4.1 introduces the following enhancements:

  • Database includes various performance enhancements, in particular with regard to min and max aggregations for decimal types, as well as optimizations that eliminates redundant atoms in logic.

  • The measure service includes a number of bug fixes, performance improvements, and new annotation syntax to the CubiQL surface language.

  • The workbookutils API has been improved to support the creation of unpartitioned workbooks.

  • The modeler-js framework has been enhanced with the ability to restrict visible levels and dimensions from end users, the support for configuring the display labels of levels, and usability improvements to axis configuration.

  • Workflow framework includes support for simple lb-workflow notifiers.

Please refer to LogicBlox 4.4.1 - New Features Playlist for video highlights of the new Modeler-js features.

What's New

Database

  • Further performance improvements of min/max aggregations for decimals.

  • The dlbatch command language now supports default-valued predicates when using addIndex sub-command.

  • The new lang:oneToOne pragma generates a constraint to ensure that the property holds. The guarantee that these constraints would hold allows the runtime to infer more functional dependencies, which are in turn used to more aggressively determine whether a P2P needs to be materialized, whether InsideOut can be applied, or logic simplifications.

Services Framework

  • The LoginHandler now returns a friendly message when user authentication fails. It's possible to tell if authentication failed due to invalid credentials, the user being inactive, or a generic error. The inactive user message is only displayed if the credentials are correct.

    Example 61. 

    The example below shows the info message that is now being logged when authentication failed due to invalid credentials:

    INFO BloxWebAuth-BCrypt - The user does not exist
    INFO BloxWebAuth-StatefulRealm - Error while attempting login (status 401): Invalid user/password.
    INFO Login              - Error while attempting login (status 401): Invalid user/password.

    For inactive users trying to log in, the info message below is being logged:

    INFO BloxWebAuth-BCrypt - login attempt for inactive user 'user1'
    INFO BloxWebAuth-StatefulRealm - Error while attempting login (status 401): User is inactive.
    INFO Login              - Error while attempting login (status 401): User is inactive.

Workbook Services

  • Improved workbookutil services and workflows to support the creation of unpartitioned workbooks.

Measure Service

  • CubiQL now supports a syntax for annotations.

    Example 62. 

    In the example below we set the functional property of an expression:

            total ({{ functional=true }} collect Sales by slide ThisWeek_NextYear)
            @ { year } 

  • The measure service optimizer will now take advantage of the lang:oneToOne property when making optimization decisions. This can for example allow for more CubiQL expressions to be inferred to have functional dependencies or have default values.

  • The measure service will always set emit_comments to true if the log level is set to debug or debug2.

  • The new measure service configuration option fatal_deprecations allows making deprecation warning messages errors independent of other warnings.

  • The Target message for UpdateRequests now includes a field unique to indicate whether a constraint violation should be reported if the client attempts to create a level that already exists.

  • Improved error reporting when literal expressions are not functional as declared.

Modeler-js

  • Restricting displayable levels and dimensions: It is now possible to restrict which levels or dimensions can be added by users manually to an axis. The configuration can be done either at the sheet or at the canvas level, where the sheet configuration precedes the canvas configuration.

    Example 63. 

    The configuration below states the following:

    • From the Product dimension, only the levels Brand and Sku should be available.

    • The complete Calendar dimension should be hidden from the user.

    • All levels except the level State should be hidden from the Location dimension.

    "id": "example-canvas",
    "dimensionsConfig": [
        {
          "dimension": "Product",
          "include": true,
          "levels": ["Brand", "Sku"]
        },
        {
          "dimension": "Calendar",
          "exclude": true
        },
        {
          "dimension": "Location",
          "include": false,
          "levels": ["State"]
        }
      ]

  • Label Display Options: A new option is now available in the Pivot Settings pop-up window that is available via the cogwheel, that allows users to change the display label of level members as well as measures. Users can choose to display either the label, ID, or a combination of them.

    It is also possible to configure this via the sheet configuration files. The possible options for the labelDisplayOption are:

    • LABEL: default behavior, the label of all entities as well as measures is displayed.

    • ID: the id of all entities and the measures is displayed.

    • ID_LABEL: a combination of id and label is displayed, where the id is displayed first, followed by the label between brackets.

    • LABEL_ID: a combination of id and label is displayed, where the label is displayed first, followed by the id between