Ben Langhinrichs

Photograph of Ben Langhinrichs

E-mail address - Ben Langhinrichs

February, 2019
     01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28

Search the weblog

Genii Weblog

Civility in critiquing the ideas of others is no vice. Rudeness in defending your own ideas is no virtue.

Wed 13 Feb 2019, 04:05 PM
Mix together my last two posts, Formula language in a JavaScript world: JSON db lookups and Choices in your on-the-fly data retrieval, and you get an odd but powerful concoction I have nicknamed @MQRY (Midas Query formulas). All this took to implement was current working code in the Midas C++ API exposed in formula language calls. Consider this the art of the possible. 

Since formula language calls can be made from LotusScript, Java, and Javascript using calls to evaluate, and can also be used in computed text, computed fields, etc, this makes a versatile general query tool. Selection of documents and values can be as broad as across multiple databases and as narrow as retrieving elements from inside rich text, or both at once. In this case, the two calls would return exactly the same data as in my  Choices post.

Would you like to see something like this in Notes/Domino 11? How about in Domino 8.5/9/10/11?

REM {Example of handlng query and retrieval in one call, returning JSON};
json := @DbCommand("MQRY":"NoCache"; 
  @DbName:"SELECT MaintVerNum=\"9.0.1 FP10\""; 
  "IncludeUNID='Yes' Sort='Yes' Title='SPRNumber' Format='json' JSONFormat='Mongodb' ");

REM {Example of handlng query and retrieval in one call, returning XML};
xml := @DbCommand("MQRY":"NoCache"; 
  @DbName:"SELECT MaintVerNum=\"9.0.1 FP10\""; 
  "IncludeUNID='Yes' Sort='Yes' Title='SPRNumber' Format='xml' ");

Copyright 2019 Genii Software Ltd.


Wed 13 Feb 2019, 11:08 AM
While it is fun to write about proof-of-concept features, let's talk for a moment about what you can do with the Midas LSX right now, because that is pretty awesome as well. To be clear, the XML option here will be Version 5.60 which is due out any day now, while the JSON and CSV are there now.

Scenario: Collect custom-specified data on-the-fly and return it in various formats

We may want the data returned as a file or as a stream. If we wanted to import the data into some other application, we might use CSV. If we wanted to stream it in a REST API for some other processing, we might return it as JSON. If we want to use it with a webpage generated using XSLT, we might return it as XML.

For this example, let's say we want a few selected fields from every SPR in the FixList db, but only the fixes in Version 9.0.1 FP10. We pass that information in, and in about five lines of LotusScript code, we return the following. I told Midas to sort by SPR to make it easier to read, but usually order doesn't matter in actual applications. Of course, you can try this yourself by requesting a Midas LSX evaluation and using the data-driven sample dbs to avoid coding altogether..

JSON for apps that retrieve and process in JavaScript (e.g., roll-your-own REST API)

Inline JPEG image

XML for apps that use XML for processing (e.g.,with XSLT transformations)

Inline JPEG image

CSV for apps that load data in for processing (e.g., business intelligence visualizations)

Inline JPEG image

Try this and other data retrieval by requesting a Midas LSX evaluation and letting us know what you would like to accomplish.

Copyright 2019 Genii Software Ltd.


Mon 11 Feb 2019, 11:11 AM
As my last post showed, I am working on a bunch of issues surrounding REST APIs in an evolving Notes/Domino world where JavaScript and DERN./NERD stacks and REST apis are a primary focus. There are some JSON parsing classes in LotusScript in 10.0.1. But there are still numerous places where it might be easier to use formula language, such as in computed text or computed field formula. In this case, I am assuming the url returns a JSON array of Notes rendered to JSON in the same basic format as Domino Access Services. With that in mind, is there a place in such a future for something like this proof-of-concept?

It may well be that HCL will add in such functionality, or something like it. In fact, I hope they do. Given that possibility, is there any reason for me to play with this? Well, two reasons. 

One is that HCL may not build it, and I'd like it in Notes 9 and beyond as well as Notes 11 or 12. 

Two is that it is only a small extension conceptually to replace "URL":"url" with alternate different parameters that use our Midas data mining and rendering technology to pull from multiple databases or from rich text fields with strong rendering. That might be exceedingly powerful even if HCL adds formula language counterparts to NotesJsonNavigator, NotesJsonElement, NotesJsonArray, and NotesJsonObject.

Copyright 2019 Genii Software Ltd.


Thu 7 Feb 2019, 02:51 PM
I thought it might be fun to see how the Midas LSX programming model might work as a REST API interface. No particular customer request, but definitely consistent with some of HCL's vision for Domino 11 and even low code development.. Here are a few results of my playing. I want to be clear, this isn't in a released product, and may not be. If anything, it is a demonstration about how flexible Midas programming can be. This required very little work other than adding a JSON parser and making Midas C++ API calls.

Results of GET with /testit.nsf/api/genii/8108D92AE62C4C9485257BCF006F2FEC/Body/Table.1/Row.2

Inline JPEG image

What that initial rich text field looks like

Inline JPEG image

JSON to use in PATCH with /testit.nsf/api/genii/8108D92AE62C4C9485257BCF006F2FEC/Body/Table.1/Row.2

Inline JPEG image

Results of subsequent GET with /testit.nsf/api/genii/8108D92AE62C4C9485257BCF006F2FEC/Body/Table.1/Row.2

Inline JPEG image

Modified rich text field after this patch

Inline JPEG image

Doing the same basic logic in LotusScript (for comparison for those who know Midas LSX)

' *** Code below is untested

Call rtitem.Connect("", "testit.nsf", "8108D92AE62C4C9485257BCF006F2FEC", "Body")
Set rttable = rtitem.DefineChunk("Table 1; Row 2)

' *** Get column one data
Set rtcell = rttable.DefineSubChunk("Inside Column 1)
col1text = rtcell.UnformattedText
col1html = rtcell.GenerateHTML(...)

' *** Get column two data
Call rtcell.GetNextTarget()
col2text = rtcell.UnformattedText
col2html = rtcell.GenerateHTML(...)

' *** Get column three data
Call rtcell.GetNextTarget()
col3text = rtcell.UnformattedText
col3html = rtcell.GenerateHTML(...)

' *** Change column one data
Set rtcell = rttable.DefineSubChunk("Inside Column 1)
Call rtcell.ChangeFont("+Italic")

' *** No change to column two data
Call rtcell.GetNextTarget()

' *** Change column Three data
Call rtcell.GetNextTarget()
Call rtcell.Text = "A terrific debut"


Copyright 2019 Genii Software Ltd.