It's is not good idea, not all time and not everywhere I have an access to google, but I have an access to my installation, and I have to search on my local machine. And such search should be support browser's search engines. And then I could do something like this.

with settings

But Ensemble documentation, should provide their own search engine to install in my browser without any manual operations. As it possible to do with AddSearchProvider

Many times I need to get some link from documentation, to show particular part to someone. And some time it is quite difficult to get such link, and the worst place in Class References, where I can't get good link for a particular part of class.

So, what I need is, an active icon with link, which then I can use, and for Class reference too.

As an example github.

As for me, when I have to investigate some strange behavior in my application, I prefer to read all journal files or limited by time, and then all records, and then I have some some to find exactly what I need, like only kill records or only sets, and only for some concrete global references. So, my usual code looks like this:

     set exit=0
    set docId="14105401"
    set jrnFile=##class(%SYS.Journal.System).GetCurrentFileName()
    do {
        !!,jrnFile,!
        set jrn=##class(%SYS.Journal.File).%OpenId(jrnFile)
        quit:'$isobject(jrn)
        
        #dim rec As %SYS.Journal.Record = jrn.FirstRecord
        set last=jrn.End
        set pr=0,opr=0
        do {
            set pr=$j(rec.Address/last*100,0,2)
            if pr'=opr write $c(13),pr_"%" set opr=pr
            
            if rec.%IsA("%SYS.Journal.SetKillRecord") {
                set glb=rec.GlobalNode
                if $qs(glb, 0),"^My.Global",$qs(glb, 1)=docId {
                    !!,rec.Address,!,glb
                    !
                }
            }
            
            set rec=rec.Next
            read q:0 set exit=q="q"
            quit:exit
        while $isobject(rec)
        quit:exit
        
        set sc=jrn.GetPrev(jrnFile, .jrnFile)
    while $$$ISOK(sc)
    quit

This code looks all journal files, file by file from latest to oldest, and show progress for current journal file, and shows offset if it found something interesting

You could just pass this arguments in Execute method, something like this

    new $namespace
    set $namespace="%sys"

    Set tRS = ##class(%ResultSet).%New("%SYS.Journal.File:Search")
    Set tSC = tRS.Execute("test", "/opt/cache/mgr/journal/20160507.001")
    if $$$ISERR(tSC) {
        do $system.OBJ.DisplayError(tSC)
    }
    
    do tRS.%Display()

this code will return all offset's which contains text - 'test'

You must remember that this query should be executed only in %SYS namespace.

Usually we could use some another modern ways, which allow us to call queries.  

    set statement=##class(%SQL.Statement).%New()
    set tSC=statement.%PrepareClassQuery("%SYS.Journal.File","Search")
    if $$$ISERR(tSC) {
        do $system.OBJ.DisplayError(tSC)
    }
    Set tRS = statement.%Execute("test", "/opt/cache/mgr/journal/20160507.001")

or even much shorter

    set tRS=##class(%SYS.Journal.File).SearchFunc("test", "/opt/cache/mgr/journal/20160507.001")
    
    do tRS.%Display()

But unfortunately such code snippets does not work in case when Query does not contain any parameters in his original declaration.

Well, you can't write conditions in this way, and compile error which you see, it is actually parsing error for such condition
How you can change it, You should define some function which may do all this check or partially, just return some value for check.

To define such function, you should have your child for Ens.Rule.FunctionSet class, something like this

Class Test.Utils Extends Ens.Rule.FunctionSet
{

ClassMethod GetAt(value As %String = "", index As %String) As %String
{
    if $isobject(value) {
        quit value.GetAt(index)
    }
    quit ""
}

}

and then, you can use it in this way, where GetAt your just created function.

<rule name="">
<constraint name="msgClass" value="Test.TestMessage"></constraint>
<when condition="GetAt(Document.myList,1)=&quot;AA&quot;">
<send transform="" target="DummyOperation"></send>
<return></return>
</when>
</rule>

But your function should return final value for checking, and you can't use write so,

GetAt(Document.myList,1).property1=&quot;AA&quot;

First of all you should know that namespace it is not final destination for any data in Caché. Namespace just defines easy access to set of data, but all data stores in databases. And any security settings uses on Databases not for Namespaces. Data

There some reasons why you can't just use any %-classes; 

  • By default all %-classes, appeared in CACHELIB database, which read-only by default after installation.
  • CACHELIB database after any installation process, will be overwritten with all you custom content.

Actually first point is not so truly, because InterSystems gives us one chance to create %-class, without loosing it after next upgrade. You should use %Z* or %z* name for classes and routines (some names have already reserved for InterSystems use), and in this case that classes will be stored at CACHESYS database, which available to write, and any upgrade will not rewrite such classes. 

So, you should read this page in documentation, to know more about names, which names you can't use, and how to name recommend.

That's why I use this code in my projects
    set stream=##class(%Stream.TmpCharacter).%New()
    do Result.$toJSON(stream)
    
    while 'stream.AtEnd {
        write stream.Read()
    }

and such write, instead of simple
do stream.OutputToDevice()

because, sometime I got unreadable response in this case, don't know why, may be because of gzip

There are some ways to retrieve this value

set tSC=##class(EnsPortal.Utils).ItemSettings("Production.Name||Item.Name",.settings,.colNames)

in this case you can find something like here 

$lb("Core","PoolSize",1,1,"",3,"Number of jobs to start for this config item. <br>Default value: <br>0 for Business Processes (i.e. use shared Actor Pool) <br>1 for FIFO message router Business Processes (i.e. use a dedicated job) <br>1 for Business Operations <br>0 for adapterless Business Services <br>1 for others <br>For TCP based Services with JobPerConnection=1, this value is used to limit the number of connection jobs if its value is greater than 1. A value of 0 or 1 places no limit on the number of connection jobs.","%Library.Integer","","0","","","",0,"Pool Size","Additional","Additional Settings","")

Or just  open this item, and get this property directly

if ##class(Ens.Config.Item).NameExists("UT.Client.GPK.Production","RS.Transformation",.id) {
  set item=##class(Ens.Config.Item).%OpenId(id)
  write item.PoolSize
}

Caché has very useful feature names as Mapping, in your case you can look at Global Mappings

How it can help now. With a mapping you can split your globals which stores your tables.
For example You have table Sample.Person, with globals ^Sample.PersonD for Data and ^Sample.PersonI for indices.
then you may create new databases like PERSONDATA1, PERSONDATA2 and PERSONINDEX

And create mappings likes on picture

In this case we send first 10000 rows to database PERSONDATA1, and all next data to PERSONDATA2. When you decide to split it again, just create new database, and edit mappings.

And you can place every database in any place as you want.

But in future releases we expect to see new feature: Distributed SQL