%ObjectToJSON writes stream to current device. You need to write to stream:

set oMetadata = ... /// metadata is from ADT message which is dynamic object
set stream = ##class(%Stream.GlobalCharacter).%New()
set tSC = ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONStreamFromObject(stream, oMetadata)
quit:$$$ISERR(tSC) tSC
set request = ##class(Ens.StreamContainer).%New(stream)
set tSC = ..SendRequestAsync(..JSONOperation,stream,0,,..MetadataContext)  /// send the stream to operation 

And your JSONOperation should be able to accept messages of Ens.StreamContainer class.

I just checked Ens.BusinessService:SendRequestAsync signature and it's:

Method SendRequestAsync(pTargetDispatchName As %String, pRequest As %Library.Persistent, pDescription As %String = "") As %Status
So maybe the last line should be just:

 set tSC = ..SendRequestAsync(..JSONOperation, stream)

Finally, use %ZEN.Auxiliary.altJSONProvider instad of %ZEN.Auxiliary.jsonProvider. It's faster.

Submitted code is not public by default.

Players get different inputs for puzzles.

All timings are calculated from the moment the puzzle is published, not the moment you start working on it.

Assuming fastest coder would publish the code, finding it and rewriting it is going to take time.

Moreover fastest solutions usually use, let's say, advanced language-specific concepts, so starting from scratch could often go even faster.

%INLIST assumes a list structure and you're passing a string.

There are two ways so solve it:

1. Store list structure right from beginning. To do that define your property as:

Property mylist as %List(MAXLEN="") [InitialExpression = {$lb("route1", "route2", "route3"}];

and in your method you don't need $listbuild as you already have a list structure in your property, so replace:

set routeList = $LISTBUILD(mylist) 

with

set routeList = yourObj.mylist

2. If you already have a lot of comma-delimited strings, you can convert them to list. In this case property stays the same, but replace:

set routeList = $LISTBUILD(mylist) 

with

set routeList = $ListFromString(mylist)

I recommend first approach.

Also read the docs about $list functions. It is one of the core Cache concepts.

*** Do you see any drawback or issues with this? Can there be any other impact due to this?

This is absolutely not a recommended approach.

Here's how you can do it.

  1. Create your own class MyString that extends %String and specifies MAXLEN parameter (I recommend 5000 or 10000, but something specific in any case).
  2. Use %Dictionary package to iterate over all your persistent classes. In there:
    • open each class
    • iterate over its properties
    • change %String type if found to MyString
    • save class
  3. Recompile modified classes.

Check LIKE documentation:

ESCAPE Clause
ESCAPE permits the use of a wildcard character as a literal character within pattern. ESCAPE char, if provided and if it is a single character, indicates that any character directly following it in pattern is to be understood as a literal character, rather than a wildcard or formatting character. The following example shows the use of ESCAPE to return values that contain the string '_SYS':

SELECT * FROM MyTable
WHERE symbol_field LIKE '%\_SYS%' ESCAPE '\'

So in your case:

SELECT ID, CompanyName
FROM Table1
WHERE CompanyName LIKE '%\%%' ESCAPE '\'

Right you are!

I usually store files external from database and write a simple persistent class Document { GUID, DisplayName, FileStream }. User requests files by GUID, and it's served to him with Displayname in header.

Additionally files are never named on filesystem by Displayname,  or any kind of user input but rather by hash or a simple incremental counter.

Storing more than 1k (10k) files per directory is not recommended, if possible add more directories (by date, etc.)