go to post Dmitry Maslennikov · Jul 28, 2023 Python ClassMethod IsValid(w As %String) As %Boolean [ Language = python ] { import re;p=r'\([^()]*\)' while re.search(p,w):w=re.sub(p,'',w) return len(w)==0 }
go to post Dmitry Maslennikov · Jul 27, 2023 It's quite tricky to find this page. And I tried, to go through a help page from Management Portal, to find any details, about which version is supported. Anyway, the error seems useless, while it could mention the supported versions too.
go to post Dmitry Maslennikov · Jul 26, 2023 While my global is quite simple, and it's size is about 1.1 GB, or around 18 bytes per record USER>do ##class(%GlobalEdit).GetGlobalSize("/usr/irissys/mgr/user","YYY",.all,.used) USER>zw all all=1109 USER>w all*1024*1024/65000000 17.89031975384615385 After restarting, with a cold cache, I got 17 seconds USER>s sub="", count = 0, ts = $zh for { set sub = $Order(^YYY(sub)) quit:sub="" set count = count + 1 } write !,"elapsed: ", $zh-ts elapsed: 16.994676 So, my disk can read around 65MB per sec
go to post Dmitry Maslennikov · Jul 26, 2023 If your enterprise still uses mechanical disks, that's still a factor that has to be considered All the blocks required to be read to get through the list can be placed all around the disk/s. And it takes time. On a live system, with many changes, and when a lot of different data is stored, the next block can be far from the previous one. So, on mechanical discs, defragmentation is matter, and may slow the speed. I don't know the character of your data, but if you have a lot of data, stored in the globals, it will require to read much more blocks, to even just count the items. And most probably the easiest way to solve it, is just to use bitmap index.
go to post Dmitry Maslennikov · Jul 26, 2023 If you wish to have a conditional filter, then you can use it this way SELECT * FROM SomeTable WHERE (:FilterName = '' OR Name LIKE :FilterName) AND (:FilterValue1 = '' OR Value1 LIKE :FilterValue1) AND (:FilterValue2 = '' OR Value2 LIKE :FilterValue2)
go to post Dmitry Maslennikov · Jul 26, 2023 As I mentioned above, it's a complicated question, and to be sure what's really happening, and why the speed is so slow, it requires a look deeply into the database file and into hardware.
go to post Dmitry Maslennikov · Jul 26, 2023 110 minutes, it seems impossible, or, it's something way too wrong USER>set ts = $zh f i=1:1:65000000 { set ^YYY(i)="somedata" } write !,"elapsed: ", $zh-ts elapsed: 11.126631 USER>s sub="", count = 0, ts = $zh for { set sub = $Order(^YYY(sub)) quit:sub="" set count = count + 1 } write !,"elapsed: ", $zh-ts elapsed: 9.549079 Here result in seconds Yes, for sure, my example is too simple, and too far from any real situation. And there are multiple issues that may happen with your data, it can be how it is stored, where it is stored, how much data in values. And it's difficult to suggest how to check it Have a look at my series of articles about globals in the database, just for information, it may help understand something, what may go wrong In any case, there is a right way to count objects, without counting all of them this way. Is using bitmap index, which you can use even if you have own storage, and do not use objects yet. You still able to build own bitmap index, and count items by this index will be at least 64000 times faster, whereas 64000 is just chunk size for bitmap, and speed will vary depends if you don't have much empty spaces between id's, which needs to be numeric
go to post Dmitry Maslennikov · Jul 19, 2023 There is an interactive course about using IRIS REST and Angular, which you can try here, right from the browser, git it a try
go to post Dmitry Maslennikov · Jul 18, 2023 What is the actual concern, then? From my experience on different systems with highload, I did not see effects, that could point to think about it.
go to post Dmitry Maslennikov · Jul 18, 2023 Python may help Class dc.Demo { ClassMethod ValidateJSON(data As %String = "") As %Status [ Language = python ] { import iris import json from json import JSONDecodeError try: json.loads(data) return iris.system.Status.OK() except JSONDecodeError as ex: return iris.system.Status.Error(5001, f"{ex.msg}: line {ex.lineno} column {ex.colno} (char {ex.pos})") except Exception as ex: return iris.system.Status.Error(5001, repr(ex)) } } And result USER>set status = ##class(dc.Demo).ValidateJSON("{""aa"":123 ""name"": ""value""}") do:'status $system.OBJ.DisplayError(status) ERROR #5001: Expecting ',' delimiter: line 1 column 11 (char 10) USER>set status = ##class(dc.Demo).ValidateJSON("{""aa"": true, ") do:'status $system.OBJ.DisplayError(status) ERROR #5001: Expecting property name enclosed in double quotes: line 1 column 14 (char 13) USER>set status = ##class(dc.Demo).ValidateJSON("{""aa"": wrong ") do:'status $system.OBJ.DisplayError(status) ERROR #5001: Expecting value: line 1 column 8 (char 7) USER>set status = ##class(dc.Demo).ValidateJSON("{""aa"": true}") do:'status $system.OBJ.DisplayError(status)
go to post Dmitry Maslennikov · Jul 17, 2023 try this set objectContext = ##class(Some.Class).%OpenId(123) write ##class(Ens.Rule.Definition).EvaluateRules("Rule.ClassName",,objectContext)
go to post Dmitry Maslennikov · Jul 14, 2023 The error on screen shot saying Access Denied, why do you think it's Timeout? Check the amount of connection available for you, and how much connection you do
go to post Dmitry Maslennikov · Jul 13, 2023 Not so much magic in it, if you already know how to read it, the content of XData is just a Stream, which can be used both ways. Just Write to it, and %Save it. And you will probably need to compile the class Class Demo.Test { XData OpenAPI [ MimeType = application/json ] { } ClassMethod Update() { set xdata = ##class(%Dictionary.XDataDefinition).IDKEYOpen($ClassName(), "OpenAPI") do xdata.Data.Write("{}") do xdata.%Save() } } In VSCode, the content of XData will not appear after that, because it happened on the server, and VSCode will not see the changes, you'll need to export it manually
go to post Dmitry Maslennikov · Jul 12, 2023 @John Bradshaw Converted from comment to a separate question, please update the zversion which you using
go to post Dmitry Maslennikov · Jul 11, 2023 my tool irissqlci supports CTE (except recursive). As well as SQLAlchemy with SQLAlchemy-IRIS
go to post Dmitry Maslennikov · Jul 10, 2023 You can read journal files from any instance, but using Journals API, not using management portal
go to post Dmitry Maslennikov · Jul 5, 2023 I've published online demo, where you could play with two executions of FHIR Load for two different patients. This uncovers some interesting discoveries, like, about 40% of the time is spent on IndexResource And about 20% to ValidateResource Of course, this can't be very accurate, but can help to understand what actually happens during the process, and at what moment. Including finding places, where it's not just reads of globals, but sets or even kills. Something like, 17% of GloKills are happening during CommitTransactionBundle