Dmitrii Baranov · Jul 16, 2025 go to post

Hi Timo,

Yesterday I experimented a lot with both Python and workers (and failed).

Here is an example. In this code I want the workers to be started as background tasks, so the program should first print "This should be printed first", then each worker (each started with random delay interval) shoud print its own message. This obviously doesn't happen because of the queue.Sync() call but I don't want to wait for all the workers to complete.

Class DelayedTest Extends %RegisteredObject
{

ClassMethod Callback(interval As %String) As %Status
{
	Hang interval
	Write "Interval = ", interval, !
	Return $$$OK
}

Method RunWorkers()
{
	#Dim queue as %SYSTEM.WorkMgr
	Set queue = ##class(%SYSTEM.WorkMgr).%New()
	For i = 1:1:5
	{
		Set status = queue.Queue("..Callback", $RANDOM(5) + 1) // Minimal delay is 1 second
		$$$ThrowOnError(status)
	}
	
	Set status = queue.Sync()
	$$$ThrowOnError(status)
}

ClassMethod Main()
{
	#Dim d = ##class(DelayedTest).%New()
	Do d.RunWorkers() 
	Write "This should be printed first" 
}

}

Also, I'm not sure that Hang is appropriate here to emulate some delay. If it works like Sleep it should block the main thread.

Dmitrii Baranov · Mar 23, 2025 go to post

Anyone who has experience converting, say, HL7 v2 ORU into a complex FHIR Bundle will never ever use DTL

Dmitrii Baranov · Mar 11, 2025 go to post

The most popular OpenEHR GitHub repositories have 200-300 stars... No one uses it and no one needs it

Dmitrii Baranov · Feb 25, 2025 go to post

Here it is (implemented as Mixin):

Class MyNamespace.Pooled Extends Ens.Host [ Abstract ]
{

Property PoolIndex As %Integer [ Calculated ];

Method PoolIndexGet() As %Integer
{
    #Dim cn as %String
    Set cn = ..%ConfigName	
	
    #Dim statement as %SQL.Statement
    Set statement = ##class(%SQL.Statement).%New()
    Set status = statement.%PrepareClassQuery("Ens.Job","Enumerate")
    $$$ThrowOnError(status)
    
    #Dim rs as %SQL.StatementResult
    Set rs = statement.%Execute()
    #Dim i as %Integer = -1
    
    While (rs.%Next()) 
    {
		#Dim jobId as %String 
		Set jobId = rs.%Get("Job")
		If (rs.%Get("ConfigName") = cn)
		{
			Set i = i + 1
			If (jobId = $JOB) 
			{
				Kill rs
				Return i
			}
		}
    }
    Kill rs
    Return i
}

Property PoolSize As %Integer [Calculated];

Method PoolSizeGet() As %Integer
{
    #Dim cn as %String
    Set cn = ..%ConfigName
    #Dim statement as %SQL.Statement
    Set statement = ##class(%SQL.Statement).%New()
    Set status = statement.%PrepareClassQuery("Ens.Job","Enumerate")
    $$$ThrowOnError(status)
   
    #Dim rs as %SQL.StatementResult
    Set rs = statement.%Execute()
    #Dim i as %Integer = 0
    
    While (rs.%Next()) 
    {
		If (rs.%Get("ConfigName") = cn)
		{
			Set i = i + 1
		}
    }
    Kill rs
    Return i
}

}
Dmitrii Baranov · Jan 10, 2025 go to post

I faced similar issues with Postgres linked tables because of different SQL syntax and also poorly implemented translation from IRIS dialect to your linked server dialect. The workaround is to add an instance of EnsLib.SQL.Operation.GenericOperation to your production and to execute SQL queries via ODBC/JDBC bypassing IRIS, something like:

Set operation = ##class(EnsLib.SQL.Operation.GenericOperation).%New("NameOfYourProductionComponent")
#Dim rs as EnsLib.SQL.GatewayResultSet
Set status = operation.Adapter.ExecuteQuery(.rs, "select 1", .args)
While (rs.Next()) {
   ...
}
Do rs.Close()
Dmitrii Baranov · Dec 30, 2024 go to post

I believe Spotify exposes a standard OAuth2 endpoint so you can use built-in IRIS classes to deal with tokens (but to be honest the standard library looks overcomplicated so I personally often use the same approach)

Dmitrii Baranov · Dec 28, 2024 go to post

Found the answer. It is simply not allowed: "+ Rule: For collections of type document, message, searchset or collection, all entries must contain resources, and not have request or response elements"

Dmitrii Baranov · Dec 17, 2024 go to post

`..FindPoolIndex` doesn't exist, it's pseudocode (by the way, ChatGPT has very little and poor knowledge about IRIS)

Dmitrii Baranov · Dec 17, 2024 go to post

No, it is a Postgres linked table, but it is not really important, I just want to parallelize the process

Dmitrii Baranov · Dec 14, 2024 go to post

The error has gone after IRIS restart. Another indicator of the problem was that the SQL Gateway connection test was not working

Dmitrii Baranov · Dec 10, 2024 go to post

To be honest... no :) Actually I think I badly need a standalone terminal (but Studio is discontinued) or a Python/Java/C#/whatever library which is able to invoke arbitrary commands on a remote server and I'm just wondering if such libraries exist.

PS leveraging WebTerminal API looks attractive but it seems to me it doesn't expose Swagger/OpenAPI definitions

Dmitrii Baranov · Dec 1, 2024 go to post

That's probably the point. You are right, it is a containerized instance. Thanks again 

Dmitrii Baranov · Dec 1, 2024 go to post

Great, thanks a lot, it works.

The real error messages are "ERROR #6162: Unable to create HTTP Authorization header for NTLM scheme." and "ERROR #6162: Unable to create HTTP Authorization header for Negotiate scheme." for both NTLM and Negotiate schemes respectively.

Does it mean that IRIS is unable to deal with these authentication schemes? The documentation says that NTLM is supported.

Dmitrii Baranov · Nov 18, 2024 go to post

Hi Timo,and thanks a lot, I've disabled the FastDistinct so now everything works as expected. Your link took me to a page that describes the Group By operator and it happened so this "feature" is documented and that another option is to use the %Exact function, e.g. select distinct %Exact(value) ...

Dmitrii Baranov · Nov 17, 2024 go to post

Hi Tani, in most cases the stream contains JSON. The container definition looks like:

Class MyRequest Extends (Ens.StreamContainer, %JSON.Adaptor) { }

I just want the stream content to be rendered always

Dmitrii Baranov · Nov 2, 2024 go to post

I'm sorry for the false alarm. I've increased the FHIR server "Max Search Results" option value so now everything works fine.

Dmitrii Baranov · Oct 21, 2024 go to post

The option with $LIST(...) works, thanks again (not so elegant though but OK as a workaround). I'm thinking about registering a feature request.

Dmitrii Baranov · Oct 20, 2024 go to post

Thanks Robert, I've read this article, but the syntax isn't entirely clear to me:

Select ID,Company from rcc_IC.ItemList
Where FOR SOME %ELEMENT(rcc_IC.ItemList.Items) ($list(%Value,3) in ('blue','yellow'))

Here the integer is used, but I need to search using a named property

Dmitrii Baranov · Feb 26, 2024 go to post

Thanks a lot! 

In short, I failed.

1. This requires installing pip3 on Unix and you'll need to be su

2. If you want to reference npm libraries, you'll need to be su (although technically it's possible to place JS library/libraries code in the XData section(s))

3. The most annoying thing is that most JS libraries are asynchronous and that's a dead end

Dmitrii Baranov · Nov 23, 2023 go to post

You have to cast your %CharacterStream to a specific implementation, say, to %GlobalCharacterStream. The latter one implements %GlobalStreamAdaptor, which inherits from %AbstractStream and %Stream.Object. Finally, the %Stream.Object class exposes the CopyFrom method which allows you to copy data from your %Stream.GlobalBinary instance (and vice versa)

Dmitrii Baranov · Nov 21, 2023 go to post

Thanks, got it. Then perhaps this setting can somehow be changed programmatically, in the installer code?

Dmitrii Baranov · Oct 3, 2023 go to post

Thanks so much! It was not obvious for me that the DebugMode property value is of type integer (looks like boolean)

Dmitrii Baranov · Sep 25, 2023 go to post

Interesting... I'm actively using the Write method, but for emitting console messages using constant strings. Anyway, thanks

Dmitrii Baranov · Sep 11, 2023 go to post

It seems to me that I found the answer (was googling for two hours and found nothing, then used forum search and voila):

  1. Declare a class which inherits Ens.Production:
Class My.Production Extends Ens.Production
{

XData ProductionDefinition
{
<Production Name="My.Production" TestingEnabled="true" LogGeneralTraceEvents="true">
  <Description></Description>
  <ActorPoolSize>1</ActorPoolSize>
</Production>
}
}
  1. And launch:
Set isProductionRunning = ##class(Ens.Director).IsProductionRunning("My.Production")
If isProductionRunning = 0 {
            Set sc = ##class(Ens.Director).StartProduction("My.Production")
}
Dmitrii Baranov · Jul 31, 2023 go to post

Ended up with a compromise 😊 Just replaced <transform> with a <call> and delegated that transform to BO 

Dmitrii Baranov · Jul 25, 2023 go to post

I'm a very beginner :) but personally I would not recommend such an approach. That "syntax sugar"  will only discourage people who come from the world of Java and C#. 

Dmitrii Baranov · Jul 19, 2023 go to post

> What parameter are you trying to change?

My subclassed Transform calls some external web service and I want to  allow a user configure that web service settings (url-port-ssl-etc) by clicking on the business process <transform> element. Also, it is crucial that such a transformation cannot be delegated to BO. So anyway, thank you, it is fine if I move settings to BP, but it is not that elegant :(