go to post Eduard Lebedyuk · Jul 18, 2022 SAM gives you graphana/prometheus out-of-the-box and connected to IRIS, that would be the easiest solution to deploy.
go to post Eduard Lebedyuk · Jul 16, 2022 Yes. Cube builds don't modify source data. Cubes copy all source data into an entirely separate set of tables.
go to post Eduard Lebedyuk · Jul 15, 2022 Absolutely not. During SYNC or REBUILD events Data Quality Manager cubes would only read patient index linkage definition data. There's no way for cubes to modify patient index linkage definition data. That said, reads, cube data writes, and additional cpu load during SYNC or REBUILD events might impact the running system, since there's a limited amount of resources available. You might want to schedule SYNCs and especially REBUILDs for low-load times (at nights or weekends depending on your usage patterns). Using async reporting mirror for cubes would completely remove the impact on the patient index.
go to post Eduard Lebedyuk · Jul 15, 2022 I mean try executing something else using $zf(-1) to check if $zf(-1) fails entirely or only for this specific command. Do you nave xargs and zip installed?
go to post Eduard Lebedyuk · Jul 14, 2022 Replace hard delete with soft delete. You soft delete by creating a new property, usually a DeletedOn timestamp. If it's empty then the record is not deleted. Deletion now consists of setting DeletedOn property to a soft deletion timestamp. As an additional precaution you can add a BEFORE DELETE trigger which always errors out, forbidding hard deletions. It would save you from every delete except for global kill. Additionally, you can add versioning, check out this discussion.
go to post Eduard Lebedyuk · Jul 14, 2022 Create a unified DELETE trigger (foreach row/object). It would catch both SQL and Object access. That said I usually advise against hard delete. In virtually all cases soft delete is better. You soft delete by creating a new property, usually a DeletedOn timestamp. If it's empty then the record is not deleted. Deletion now consists of setting DeletedOn property to a soft deletion timestamp. As an additional precaution you can add a BEFORE DELETE trigger which always errors out, forbidding hard deletions. It would save you from every delete except for global kill.
go to post Eduard Lebedyuk · Jul 13, 2022 There seems to be different ways to approach declared IRIS state by codifying things, you can codify the exported objects and import them or like you mentioned, use the installer method that builds things as code.... Indeed, there is a declarative approach and imperative code approach. And there are several declarative ways to populate the data. %Installer is excellent for the initial population, but the user must remember to check for the existence of items he's trying to create. That adds challenges for CI/CD in non-containerized environments.
go to post Eduard Lebedyuk · Jul 12, 2022 Ended up with this implementation: Parameter NOSECTION = "DEFAULT"; /// do ##class().INIToLocal(,.ini) ClassMethod INIToLocal(file, Output ini) As %Status { #dim sc As %Status = $$$OK kill ini set stream = ##class(%Stream.FileCharacter).%New() do stream.LinkToFile(file) set section = ..#NOSECTION while 'stream.AtEnd { set line = stream.ReadLine() set line=$zstrip(line, "<>w") continue:($e(line)="#")||($l(line)<3) if $e(line)="[" { set section = $e(line, 2, *-1) } else { set key = $zstrip($p(line, "="), "<>w") set value = $zstrip($p(line, "=", 2, *), "<>w") set ini(section, key) = value } } kill stream quit sc } /// do ##class().LocalToINI(.ini) ClassMethod LocalToINI(ByRef ini, file) As %Status { merge iniTemp = ini #dim sc As %Status = $$$OK set stream = ##class(%Stream.FileCharacter).%New() do stream.LinkToFile(file) set section = ..#NOSECTION set key=$o(iniTemp(section, ""),1,value) while (key'="") { do stream.WriteLine(key _ "=" _ value) set key = $o(iniTemp(section, key),1,value) } do stream.WriteLine() kill iniTemp(section) set section=$o(iniTemp("")) while (section'="") { do stream.WriteLine("[" _ section _ "]") set key=$o(iniTemp(section, ""),1,value) while (key'="") { do stream.WriteLine(key _ "=" _ value) set key = $o(iniTemp(section, key),1,value) } set section = $o(iniTemp(section)) do stream.WriteLine() } set sc = stream.%Save() kill stream, iniTemp quit sc }
go to post Eduard Lebedyuk · Jul 10, 2022 Open /restapi/sql/ web application and confirm that Password Auth is enabled. Might be only UnAuthenticated access is enabled, resulting in this error.
go to post Eduard Lebedyuk · Jul 6, 2022 While local access is not possible from Native API, you can work with production items directly: prod = iris_native.classMethodObject("Ens.Config.Production", "%OpenId", "ProductionClassName") items = prod.getObject("Items") count = items.invokeInteger("Count") for i in range(1,count+1): item = items.invokeObject("GetAt", i) // do something with item here Alternatively, you can either use SQL access (check Ens_Config.Item table) or write a proxy method in objectscript to marshall locals (to dicts probably).
go to post Eduard Lebedyuk · Jul 2, 2022 What about defining a super parent, which is the only node with a NULL parent? In that case every other root node has this node as a parent and filtering is easy (WHERE parent IS NULL filters only the super parent). And there's no need for an additional calculated property in that case.