One of my customers told me that the new Wrap block wasn't what they really needed. The main point of complaint was that there was an implicit power block at the beginning of the innards of the wrap block. It wasn't intuitive enough.

I looked at my implementation, and realized that, in order to fix the problem, I had to essentially rewrite large parts of the implementation of the topographic part of MQL.

So that's what I did. I struck gold when I came up with a very simple solution:

  1. Remove the wrap block completely. If I ever reinstate it, it will most likely be done right :-).
  2. Move the part that drives the computation forward in the monad stream from the block_string to the blocks construct.
  3. Implement the concept of "StartMonadIterator", which iterates over the possible start monads. There are three kinds of StartMonadIterator: One iterating over an Inst, one iterating over a set of monads, and one iterating over the gaps in a set of monads.
  4. Do what Doedens prescribed w.r.t. block_strings: Split them up into a number of levels, such that: a) blocks are handled at the bottom level, at which level we also handle [grouping]. b) At the next level up, handle the first level, plus Kleene Star on the first level. c) At the third level, handle the second level, and let the third level also be the level at which concatenation is handled. d) At the fourth level, handle the third level, and also OR between strings of blocks.
  5. Handle power blocks at the same level as all other blocks, but with the usual checks: A power block ... a) Cannot appear at the beginning or end of a context, b) Two power blocks cannot stand next to each other.
  6. Allow any kind of block after a power block (except a power block).

The bottom line is that MQL is much more powerful now, as a result of the following: a) We now have "real grouping" of strings of blocks; b) Kleene star can now apply to groups as well as to individual blocks. c) We can now have any kind of block after a power block, not just object blocks.
These three points may not seem to be "big". But let me assure you that this is indeed one -- nay two -- quantum leaps upward for MQL in expressive power. That is, MQL is now much closer to what Doedens had envisaged, and what he described in his PhD thesis as the language "QL".

I have added many regression tests to the regression test suite in order to test the new functionality, and the old regression tests all run without a hiccup. I have also run valgrind's memory checker on the regression test program, and it comes up with 0 memory leaks. Finally, all of the test queries in my corpus of test queries against a "real" database come up with the same answers as before, except for the order in which straws from OR-separated block_strings appear.

So things are looking good.

Again, I still have no schedule for when these changes become public. If you want to try it out, please drop me a line.

Until then,

Enjoy!

Ulrik