Search

Clear filter
Article
Muhammad Waseem · Mar 15, 2023

InterSystems Embedded Python in glance

Hi Community,In this article I will demonstrate the usage of InterSystems Embedded Python, We will cover below topics: 1-Embedded Python Overview 2-Usage of Embedded Python 2.1- Using a Python Library from ObjectScript 2.2- Calling the InterSystems APIs from Python 2.3- Using ObjectScript and Python together 3-Using python Built-in Functions 4-Python Modules/Libraries 5-Embedded Python Use Cases 5.1- Printing PDF by using python Reportlab Library 5.2- Generating QR code by using Python Qrcode Library 5.3- Get GEO location by using Python Folium Library 5.4- Generate and mark locations on an interactive Map by using Python Folium Library 5.5- Data analytics by using Python Pandas Library 6-Summary So let's start with an overview 1-Embedded Python Overview Embedded Python is a feature of InterSystems IRIS data platform that allows Python developers to gain full and direct access to the data and functionality in InterSystems IRIS. InterSystems IRIS comes with a powerful built-in programming language called ObjectScript that is interpreted, compiled, and run inside the data platform. Because ObjectScript executes within the context of InterSystems IRIS, it has direct access to the memory and procedure calls of the data platform. Embedded Python is an extension of the Python programming language that allows for the execution of Python code inside the InterSystems IRIS process context. Because both ObjectScript and Python operate on the same object memory, it can be said that Python objects do not just emulate ObjectScript objects, they are ObjectScript objects. This co-equality of these languages means you can choose the language most appropriate for the job, or the language you are most comfortable using to write applications. 2-Usage of Embedded Python When using Embedded Python, you can write your code in three different modalities. 2.1 - Using a Python Library from ObjectScript First, you can write an ordinary .py file and call it from the InterSystems IRIS context. In this case, the data platform will launch the Python process and allow you to import a module called IRIS, which automatically attaches the Python process to the IRIS kernel and provides you access to all the functionality of ObjectScript from the context of your Python code. 2.2 - Calling the InterSystems APIs from Python Second, you can write ordinary ObjectScript code and instantiate a Python object using the %SYS.Python package. This ObjectScript package allows you to import Python modules and libraries, then work with that code base using ObjectScript syntax.The %SYS.Python package enables ObjectScript developers without any knowledge of Python to use the rich ecosystem of Python libraries in their ObjectScript code. 2.3 - Using ObjectScript and Python together Third, you can create an InterSystems class definition and write methods in Python. Any call to that method will launch the Python interpreter. This method has the benefit of populating the self keyword of that block of Python code with a reference to the instance of the containing class. Additionally, by using Python to write class methods in InterSystems classes, you can easily implement methods that handle different data entry events in SQL such as a new row being added to a table.It also allows for the rapid development of custom stored procedures in Python. As you can see, Embedded Python allows you to choose the programming language best suited to the job without sacrificing performance. 3-Using Python Built-in Functions The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order. Built-in Functions A abs() aiter() all() any() anext() ascii() B bin() bool() breakpoint() bytearray() bytes() C callable() chr() classmethod() compile() complex() D delattr() dict() dir() divmod() E enumerate() eval() exec() F filter() float() format() frozenset() G getattr() globals() H hasattr() hash() help() hex() I id() input() int() isinstance() issubclass() iter() L len() list() locals() M map() max() memoryview() min() N next() O object() oct() open() ord() P pow() print() property() R range() repr() reversed() round() S set() setattr() slice() sorted() staticmethod() str() sum() super() T tuple() type() V vars() Z zip() _ __import__() Using python Built-in FunctionsIn order to use python built-in function we have to import "builtins" then we can invoke the function set builtins = ##class(%SYS.Python).Import("builtins") The Python print() function is actually a method of the built-in module, so you can now use this function from ObjectScript: USER>do builtins.print("hello world!") hello world! USER>set list = builtins.list() USER>zwrite list list=5@%SYS.Python ; [] ; <OREF> Likewise, you can use the help() method to get help on the list object. USER>do builtins.help(list) Help on list object: class list(object) | list(iterable=(), /) | | Built-in mutable sequence. | | If no argument is given, the constructor creates a new empty list. | The argument must be an iterable if specified. | | Methods defined here: | | __add__(self, value, /) | Return self+value. | | __contains__(self, key, /) | Return key in self. | | __delitem__(self, key, /) | Delete self[key]. 4-Python modules or libraries Some python modules or libraries are installed by default and already available to use. By using the help("module" function we can view these modules: Installing python module or library Apart from these modules python has hundreds of modules or libraries, which can be viewed at pypi.org (The Python Package Index (PyPI) is a repository of software for the Python programming language) If we need some other libraries, then we need to install the libraries using the intersystems irispip command For example, Pandas is python Data Analysis Library. The following command uses the package installer irispip to install pandas on a Windows system: C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python pandas Please note C:\InterSystems will be replaced by Intersystems installation directory 5-Embedded Python Use Cases 5.1-Printing PDF by using python Reportlab Library We need to install Reportlab library by using irispip command, then just create objectscript function. Given a file location, the following ObjectScript method, CreateSamplePDF(), creates a sample PDF file and saves it to that location. Class Demo.PDF { ClassMethod CreateSamplePDF(fileloc As %String) As %Status { set canvaslib = ##class(%SYS.Python).Import("reportlab.pdfgen.canvas") set canvas = canvaslib.Canvas(fileloc) do canvas.drawImage("C:\Sample\isc.png", 150, 600) do canvas.drawImage("C:\Sample\python.png", 150, 200) do canvas.setFont("Helvetica-Bold", 24) do canvas.drawString(25, 450, "InterSystems IRIS & Python. Perfect Together.") do canvas.save() } } The first line of the method imports the canvas.py file from the pdfgen subpackage of ReportLab. The second line of code instantiates a Canvas object and then proceeds to call its methods, much the way it would call the methods of any InterSystems IRIS object. You can then call the method in the usual way: do ##class(Demo.PDF).CreateSamplePDF("C:\Sample\hello.pdf") The following PDF is generated and saved at the specified location: 5.2-Generating QR code by using Python Qrcode Library In order to generate qrcode, we need to install Qrcode library by using irispip command, then by using the below code we can generate QR Code: 5.3-Get GEO location by using Python Folium library In order to get geographic data, we need to install Folium library by using irispip command, then create below object script function: Class dc.IrisGeoMap.Folium Extends %SwizzleObject { // Function to print Latitude, Longitude and address details ClassMethod GetGeoDetails(addr As %String) [ Language = python ] { from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="IrisGeoApp") try: location = geolocator.geocode(addr) print("Location:",location.point) print("Address:",location.address) point = location.point print("Latitude:", point.latitude) print("Longitude:", point.longitude) except: print("Not able to find location") } } Connect to IRIS Terminal and run below code do ##class(dc.IrisGeoMap.Folium).GetGeoDetails("Cambridge MA 02142") Below will be the output: 5.4-Generate and mark locations on an interactive Map by using Python Folium library We will use the same Python Folium library to generate and mark locations on an interactive Map, Below object script function will do the desired : ClassMethod MarkGeoDetails(addr As %String, filepath As %String) As %Status [ Language = python ] { import folium from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="IrisGeoMap") #split address in order to mark on the map locs = addr.split(",") if len(locs) == 0: print("Please enter address") elif len(locs) == 1: location = geolocator.geocode(locs[0]) point = location.point m = folium.Map(location=[point.latitude,point.longitude], tiles="OpenStreetMap", zoom_start=10) else: m = folium.Map(location=[20,0], tiles="OpenStreetMap", zoom_start=3) for loc in locs: try: location = geolocator.geocode(loc) point = location.point folium.Marker( location=[point.latitude,point.longitude], popup=addr, ).add_to(m) except: print("Not able to find location : ",loc) map_html = m._repr_html_() iframe = m.get_root()._repr_html_() fullHtml = """ <!DOCTYPE html> <html> <head></head> <body> """ fullHtml = fullHtml + iframe fullHtml = fullHtml + """ </body> </html> """ try: f = open(filepath, "w") f.write(fullHtml) f.close() except: print("Not able to write to a file") } Connect to IRIS Terminal and invoke MarkGeoDetails function We will invoke MarkGeoDetails() function of dc.IrisGeoMap.Folium class.The function requires two parameters: location/locations(We can pass multiple locations by adding "," in between) HTML file path Let us run the below command to mark Cambridge MA 02142, NY, London, UAE, Jeddah, Lahore, and Glasgow on the Map and save it as "irisgeomap_locations.html" file do ##class(dc.IrisGeoMap.Folium).MarkGeoDetails("Cambridge MA 02142,NY,London,UAE,Jeddah,Lahore,Glasgow","d:\irisgeomap_locations.html") The above code will generate below interactive HTML file: 5.5-Data analytics by using Python Pandas library We need to install Pandas library by using irispip command, then we can use the below code to view the data 6-Summary InterSystems Embedded Python (IEP) is a powerful feature that allows you to integrate Python code seamlessly with your InterSystems applications. With IEP, you can leverage the extensive libraries and frameworks available in Python to enhance the functionality of your InterSystems applications. In this article, we will explore the key features and benefits of IEP. IEP is implemented as a set of libraries that enable you to interact with Python objects and execute Python code from within InterSystems applications. This provides a simple and effective way to integrate Python code into your InterSystems applications, allowing you to perform data analysis, machine learning, natural language processing, and other tasks that may be challenging to implement in InterSystems ObjectScript. One of the primary advantages of using IEP is that it provides a way to bridge the gap between the worlds of Python and InterSystems. This makes it easy to use the strengths of both languages to create powerful applications that combine the best of both worlds. IEP also provides a way to extend the functionality of your InterSystems applications by leveraging the capabilities of Python. This means that you can take advantage of the vast number of libraries and frameworks available in Python to perform tasks that may be challenging to implement in InterSystems ObjectScript. InterSystems Embedded Python provides a powerful way to extend the functionality of your InterSystems applications by leveraging the capabilities of Python. By integrating Python code into your InterSystems applications, you can take advantage of the vast number of libraries and frameworks available in Python to perform complex tasks that may be challenging to implement in InterSystems ObjectScript.Thanks Nice Article. very informative .. thanks... Thanks @samseer.mannisseri3914 💡 This article is considered as InterSystems Data Platform Best Practice.
Announcement
Anastasia Dyubaylo · Mar 8, 2023

[Video] InterSystems Deployment Options

Hi Developers, Enjoy watching the new video on InterSystems Developers YouTube: ⏯ InterSystems Deployment Options @ Global Summit 2022 Choosing the right deployment environment for your application built with InterSystems technologies means making informed decisions on a range of topics: Container, virtual machine, or bare metal? On-premise, hosted, private cloud, or public cloud? Linux or Windows Horizontal scaling, vertical scaling, or both? Platform high availability or synchronous mirroring? Disaster recovery required or not. In this this session, you'll hear real-world feedback about current best practices, the thinking behind it, and how InterSystems can help you make deployment decisions that mean your system will be effective, scalable, and resilient. 🗣 Presenter: @RayWright, Principal Technology Architect, InterSystems Enjoy it and stay tuned! 👍
Announcement
Anastasia Dyubaylo · May 29, 2023

[Video] Observability with InterSystems IRIS

Hey Developers, Watch this video to learn about observability of your InterSystems IRIS application with InterSystems System Alerting and Monitoring (SAM) and modern DevOps tooling: ⏯ Observability with InterSystems IRIS @ Global Summit 2022 🗣 Presenter: @Robert.Kuszewski, Product Manager, Developer Experience, InterSystems Subscribe to InterSystems Developers YouTube to stay tuned!
Announcement
Vadim Aniskin · May 10, 2023

InterSystems Ideas News #6

Hey Community! Welcome to the 6th edition of the InterSystems Ideas news bulletin! This time you can read about: ​​​​✓ Ideas implemented last month by Community members ✓ How to create a new idea on InterSystems Ideas ✓ New ideas created recently The Hall of Fame was updated with the names of Community Members who implemented Community Opportunity ideas: Add IRIS as a supported database for Apache Superset by @Herman.Slagman7521 was implemented by @Dmitry.Maslennikov Please add google oauth authorization to login to the management portal by @Aleksandr.Kolesov was implemented by @Yuri.Gomes 👏Thank you for implementing these ideas👏 The new article "How to create a new idea on InterSystems Ideas" describes the idea creation process step by step. Read it when adding new idea to the portal. And to round up this newsletter, here is the list of new ideas posted since the previous news bulletin 1. Dump SQL tables by @Evgeny.Shvarov 2. Java Hibernate support for IRIS by @Dmitry.Maslennikov 3. Add legitimate special symbol-separator for ObjectScript variable names by @Evgeny.Shvarov 4. allow cancel "Pending approval" by @Robert.Cemper1003 5. provide a switch to Hide/Unhide posts. or fix Re-Publish by @Robert.Cemper1003 6. Traceroutes to Java Gateway Display by @Scott.Roth 7. On Developer Community put animated GIFs behind a play/pause button by @John.Murray 8. Community in numbers on a GEO Dashboard by @Yuri.Gomes 9. Unit testing in VSCode by @Robert.Barbiaux 10. Saving Searched Criteria within Message Search by @Scott.Roth 11. Featured Article or Question by @Yuri.Gomes 👏Thank you for posting new ideas👏 Stay tuned for the next InterSystems Ideas news bulletin! In the meantime post new ideas for public discussion, vote for existing ideas, and comment on them on our InterSystems Ideas Portal! Hi Developers! 👋The idea "IRIS classes for OpenAI API" was implemented recently. @Francisco.López1549 thank you for implementing this idea and welcome to "Hall of Fame" page of Ideas Portal! 👏
Article
Ashok Kumar T · Jul 21

InterSystems IRIS JSON 2

This article is a continuation of the IRIS JSON project and features additional methods and insights. Let's continue with the instance methods %GetTypeOf(Key) This instance method is used to determine the JSON data type of the %DynamicObject or %DynamicArray. It returns one of the following strings: "null" - JSON null"boolean" - Either "true" or "false""number" - Any numeric value"oref" - An %ObjectHandle (an ObjectScript oref)"object" - A nested object"array" - A nested array"string" - Normal text string"unassigned" - The value is unassigned USER>Set array = [1,"test",true,12.3256,{"version":($ZVersion)},[1,2,3]] USER>Write array.%GetTypeOf(2) boolean USER>Write array.%GetTypeOf(4) object USER>Write array.%GetTypeOf(5) array %GetIterator() When working with a JSON object whose structure is unknown at runtime, you can utilize the %GetIterator method to iterate through each key-value pair dynamically. This method returns an instance of %Iterator.Object. To retrieve each key and its corresponding value, employ the %GetNext(.key, .value,.type) method in a loop. %GetNext(Key, Value, Type) This method has three output-type formal parameters: Key: It returns the key in a JSON object, or the index in a JSON array. Value: It is a value associated with a key or index. Type: It is an optional parameter that becomes particularly helpful when handling unknown or dynamic JSON structures. The Type parameter helps avoid <MAXSTRING> errors when a key’s value exceeds InterSystems IRIS’s maximum string length. In such cases, providing this parameter allows the method to automatically convert the value from a string to a stream, ensuring safe and efficient parsing. USER>Set json = {"username":"Test", "role":"Admin", "data": ("this data exceeded the maxlength of IRIS")} USER>Set jsonIter = json.%GetIterator() USER>While jsonIter.%GetNext(.key,.value,.type) { Write "key: ",key," value : ",value," and type is :",type,! } key: username value : Test and type is : string key: role value : Admin and type is : string key: data value : 7@%Stream.DynamicCharacter and type is : string This approach is especially beneficial when processing dynamic or unpredictable JSON content in InterSystems ObjectScript. Enhancements in %DynamicAbstractObject: New Methods in Version 2024.1 As of version 2024.1, several new methods have been introduced to the %DynamicAbstractObject (%DAO) class to enhance usability and support for language interoperability (e.g., Python-style access). Method Overview: toString() It is a convenience wrapper for the %ToJSON() method. It returns the JSON representation of the object as a string. get(key) It is a Python-style wrapper for the %Get() method. It accepts only one formal parameter (key), unlike %Get, which takes up to three (key, default, type). put(key, value, type) It is a Python-style wrapper for %Set. This method supports all three parameters and can be used to assign values to keys with optional type control. rename(currentkey,newkey) - replace the key of the element identified by currentKey with newKey putAll(object)It merges the contents of another %DynamicObject into the current object. This parameter must be a valid %DynamicObject instance. USER>set json = {} USER>set json1 = {"username":($USERNAME),"roles":($ROLES)} USER>zw json json={} ; <DYNAMIC OBJECT> USER>do json.putAll(json1) USER>zw json json={"username":"_SYSTEM","roles":"%All"} ; <DYNAMIC OBJECT> USER>set json={} USER>do json.put("name","test") USER>zw json json={"name":"test"} ; <DYNAMIC OBJECT> USER>write json.get("name") ; using python style wrapper method get() test LEARN Embedded Python Embedded Python Functions rename(currentkey,newkey) -replace the key of the element identified by currentKey with newKey toJson() / toString() - JSON serialization functions /// Embedded Python Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DynObjSet() { Set object = {} Do ..DynObjSetPY(object) Write object.%ToJSON() } ClassMethod DynObjSetPY(dynamicObject) [ Language = python ] { import iris do = iris.cls("%DynamicObject")._New() do.put("id",1212) do.put("int",12) dynamicObject.putAll(do) } } OutputUSER>do ##class(Sample.DAO.EmpeddedPY).DynObjSet()object={"id":1212,"int":12} addAll(array): This method is employed to iterate over a %DynamicArray and push its elements into the current object. The first parameter value must be a %DynamicArray. This method is chainable, allowing multiple addAll() calls in a single expression. USER>ZWrite [1,2,3].addAll([4,5,6]) [1,2,3,4,5,6] ; <DYNAMIC ARRAY> USER>ZWrite [1,2,3].addAll([4,5,6]).addAll([7,8,9]) [1,2,3,4,5,6,7,8,9] ; <DYNAMIC ARRAY> Class Sample.DAO.EmpeddedPY Extends %RegisteredObject { ClassMethod DynArraySet() { Set array = [] Do ..DynArraySetPY(array) zw array } ClassMethod DynArraySetPY(dynamicArray) [ Language = python ] { import iris da = iris.cls("%DynamicArray")._New() # used a new add method da.add(1) da.add(3) # use %Push method da._Push(2) dynamicArray.addAll(da) } } OutputUSER>do ##class(Sample.DAO.EmpeddedPY).DynArraySet()array=[1,3,2] ; <DYNAMIC ARRAY> Deserialization of JSON from Streams and Strings If an element of a JSON array or JSON object contains more characters than an ObjectScript string can support, the way to manipulate that element is to send it to a %File or a %Stream. %FromJSON(string) The ##class(%DynamicAbstractObject).%FromJSON(input) class method accepts an "input" arguments of the following types: A JSON string containing a JSON array or object. A %Stream object containing a JSON array or object. A %File object. If the above-mentioned input is successfully parsed, it returns an object reference to either a %DynamicArray or %DynamicObject class. If the parsing is unsuccessful, it will signal an error. Creating JSON from a File The %FromJSONFile(file) method does not take a %File object as an argument. It takes a string containing the file name instead. Consider the following replacement: ClassMethod CreateFromFile(FileName As %String) { Set newObject = ##Class(%DynamicAbstractObject).%FromJSONFile(FileName) Set newObject = {}.%FromJSON(file) } JSON Serialization This section will cover converting a %DynamicObject or %DynamicArray into a JSON-formatted string. %ToJSON(stream) The %ToJSON(output) method converts the contents of a %DynamicObject or %DynamicArray into a JSON-formatted string. The output can be directed to such various destinations as a device, a file, or a %Stream object. This parameter is optional. Without Arguments – Output to Current Device When %ToJSON() is called without any arguments, the resulting JSON is written directly to the current output device (e.g., the terminal): With a %Stream Object – Output to Stream When a stream object is passed as the argument, the JSON text is written to the stream instead of the output device.It is practical for storing or transmitting the JSON data programmatically. ClassMethod CreateStreamFromJSON() { Set json = {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]} Set stream =##class(%Stream.TmpCharacter).%New() Do json.%ToJSON(stream) ; set into stream object Write stream.Read() } OutputUSER> Do ##class(Sample.DAO.EmpeddedPY).CreateStreamFromJSON(){"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]} Abstract Set Query (ASQ) Abstract Set Query (ASQ) is a superset of the JSON Path Language (JPL), designed for iterating over and querying dynamic objects and arrays. It provides powerful capabilities for expressive and precise querying of hierarchical and structured data. In ObjectScript, ASQ queries can be executed with the help of the apply() method. ASQ extends the functionality of JSON Path by supporting the following: Richer and more flexible query expressions Support for data types and metadata Advanced navigation of structured objects Below you can see a sample JSON array that can be utilized to demonstrate ASQ (Abstract Set Query).Assign this to a dynamic object variable called JSON in ObjectScript: [{"id":"123","name":"John Doe","gender":"male","visits":[{"date":"2024-12-01","reason":"checkup"},{"date":"2025-02-15","reason":"flu"}]},{"id":"124","name":"Alice Smith","gender":"female","visits":[{"date":"2024-11-10","reason":"allergy"},{"date":"2025-01-20","reason":"annual physical"}]},{"id":"125","name":"Michael Johnson","gender":"male","visits":[{"date":"2025-03-12","reason":"sprained ankle"}]},{"id":"126","name":"Fatima Noor","gender":"female","visits":[{"date":"2024-09-18","reason":"checkup"},{"date":"2024-12-05","reason":"vaccination"},{"date":"2025-06-01","reason":"fever"}]},{"id":"127","name":"Carlos Martinez","gender":"male","visits":[]},{"id":"128","name":"Emily Chen","gender":"female","visits":[{"date":"2025-04-22","reason":"eye exam"},{"date":"2025-05-19","reason":"back pain"}]}] Example ASQ Queries in ObjectScript Member Access .fieldName: Accesses a property or member field. .*: Wildcard access to all fields at that level. .field[0]: Accesses an array element inside a named field. Retrieve all ID values: Write json.apply("$.id").%ToJSON() Output["123", "124", "125", "126", "127", "128"] Get names that start with "J": Write json.apply("$[*]?(@.name STARTS WITH 'J').name") //["John Doe"] Array Slicing [0 to 3]: Selects elements at indices 0, 1, 2, 3. [*]: Choose all elements in the array. [last]: Picks the last element in the array. [1, 3, 5]: Selects elements at specified indices. Retrieve the first visit’s entry for each person: Write json.apply("$.visits[0]").%ToJSON() Output[{"date":"2024-12-01","reason":"checkup"},{"date":"2024-11-10","reason":"allergy"},{"date":"2025-03-12","reason":"sprained ankle"},{"date":"2024-09-18","reason":"checkup"},{"date":"2025-04-22","reason":"eye exam"}] Get the last object in the array: Write json.apply("$[last]").%ToJSON() Get both the first and last objects in the array: Write json.apply("$[last]").%ToJSON() //[{"id":"128","name":"Emily Chen","gender":"female","visits":[{"date":"2025-04-22","reason":"eye exam"},{"date":"2025-05-19","reason":"back pain"}]}] Get both the first and last objects in the array: Write json.apply("$[last,0]").%ToJSON() //[{"id":"128","name":"Emily Chen","gender":"female","visits":[{"date":"2025-04-22","reason":"eye exam"},{"date":"2025-05-19","reason":"back pain"}]},{"id":"123","name":"John Doe","gender":"male","visits":[{"date":"2024-12-01","reason":"checkup"},{"date":"2025-02-15","reason":"flu"}]}] JSON SQL Functions InterSystems IRIS offers a simple and flexible way to create and manipulate JSON directly within SQL, without the need to write any ObjectScript code. Using built-in JSON functions, you can generate and work with JSON data effortlessly. JSON_OBJECT It is a conversion function that returns data as a JSON-formatted string. It accepts one or more key–value pairs, where the following conditions apply: Each key is a user-defined literal string enclosed in single quotes. Each value can be a column, expression, or literal. Multiple key–value pairs are separated by commas. The syntax follows standard JSON structure within parentheses. Example: JSON_OBJECT('key1' : "value1", 'key2' : "value2", 'key3' : "value3") You can convert the resulting JSON string into a dynamic object using the %FromJSON() method: Set json = ##class(%Library.DynamicAbstractObject).%FromJSON(jsonStr) Note: JSON_OBJECT does not support the asterisk (*) wildcard to include all fields from a table. SELECT JSON_OBJECT('name':Name,'Id':Id) FROM SAMPLE.PERSON WHERE ID=1 Add null into the JSON SELECT JSON_OBJECT('name': Name,'Id': Id,'CreateDate': (CASE WHEN CreateDate IS NOT NULL THEN CreateDate ELSE NULL END),'SSN':(SSN)) FROM Sample.Person WHERE Id = 1 Embedded JSON object inside a JSON object SELECT JSON_OBJECT('name': Name,'Id': Id,'CreateDate':CreateDate,'gender':JSON_OBJECT('code':gender,'description':'gender info')) FROM Sample.Person WHERE Id = 1 JSON_ARRAY It is a conversion function that returns data as a JSON array. JSON_ARRAY does not support the asterisk (*) syntax to specify all fields in a table. SELECT JSON_ARRAY(name,SSN, ,City ABSENT ON NULL) FROM Sample.Person WHERE Id = 1 JSON_ARRAYAGG It is an aggregate function utilized to aggregate values into a JSON array. You can aggregate strings, numbers, and even large objects. SELECT JSON_ARRAYAGG(State) FROM Sample.Person This SQL aggregates the JSON_OBJECT into a JSON array. SELECT JSON_ARRAYAGG(JSON_OBJECT('id':Id,'Name':Name,'Gender':Gender,'IsActive':IsActive,'default':'available')) FROM SAMPLE.PERSON JSON_TABLE The JSON_TABLE function is a Table-Valued Function (TVF) employed in SQL to map JSON data into a relational table format. It enables direct querying of JSON content (whether stored as a literal string, in a column, or returned from a function) by extracting values based on JSON Path Language (JPL) expressions. JSON_TABLE can process the following JSON sources: Literal JSON strings embedded directly in SQL. String properties (e.g., VARCHAR columns) that contain valid JSON. Functions that return JSON, e.g., %Net.GetJSON(<JSON-URL>, <SSL-config>). Parsing a Literal JSON String The following example extracts the number and status fields from a JSON array: SELECT number,status FROM JSON_TABLE( '[{"number":12,"status":false}, {"string":"test"}, {"status":true,"number":100.0}]', '$' COLUMNS ( number varchar(20) PATH '$.number', status BIT PATH '$.status' ) ) Parsing JSON from a Column Assume the class Sample.Users has a VARCHAR(String) property named AdditionalInfo, which stores JSON like: {"id":"123","name":"John Doe","gender":"male","visits":[{"date":"2024-12-01","reason":"checkup"},{"date":"2025-02-15","reason":"flu"}]} You can use JSON_TABLE to extract the visit and reason information from this “additionalInfo” column. This query flattens the visits array, so each visit becomes a row, showing its date and reason. select visitDate,reason FROM Sample.Users, JSON_TABLE(AdditionalInfo, '$.visits[*]' COLUMNS( visitDate DATE PATH '$.date', reason VARCHAR(100) PATH '$.reason' ) ) Cloning JSON Objects and Arrays Unlike other registered or persistent objects, %DynamicObject and %DynamicArray do not support direct cloning via a method like %ConstructClone because such a method is not available for dynamic entities. To clone a dynamic object or array, you must do the following: Serialize it to a JSON string or stream using %ToJSON(). Reconstruct the clone with %FromJSON(). Example (utilizing a string): ClassMethod ConstructJSONClone(JSON) { Set cloneJSON = ##class(%DynamicAbstractObject).%FromJSON(JSON.%ToJSON()) Return cloneJSON } USER>Set json = {"userName": ($UserName)}USER>Set cloneJson = ##class(%DynamicAbstractObject).%FromJSON(json.%ToJSON())USER>Write json.%ToJSON(){"userName":"_SYSTEM"}USER>Write json.%ToJSON(){"userName":"_SYSTEM"} Handling Large JSON (avoiding <MAXSTRING> error): If the JSON structure is large and exceeds IRIS’s maximum string length, serialization using a string will result in a <MAXSTRING> error. Solution: Employ a stream instead: ClassMethod ConstructCloneFromLargeJSON(JSON) { Set stream = ##class(%Stream.TmpCharacter).%New() Do JSON.%ToJSON(stream) Set cloneJSON = ##class(%DynamicAbstractObject).%FromJSON(stream) Return cloneJSON } This approach safely handles large JSON content and creates a deep copy of the original dynamic object or array. JSON Formatter The %JSON.Formatter class is utilized to format a %DynamicArray or %DynamicObject and display it in a more human-readable format. ClassMethod JSONFormatter() { Set json = {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]} Set formatter = ##class(%JSON.Formatter).%New() Set formatter.Indent = 51 Do formatter.Format(json) } Common JSON Parsing Errors in InterSystems IRIS Below you can find some frequent errors that may occur while parsing JSON with the help of the %DynamicObject or %DynamicArray: <MAXSTRING> It occurs when attempting to convert a string that exceeds the maximum string length allowed in IRIS (maximum length of 3,641,144 characters). To handle large strings safely, use the "stream" or "stream>base64" type when retrieving values. <STRINGSTACK> It is raised when the JSON expression is too long or deeply nested for the system to evaluate. <INVALID OREF> It indicates that the reference is not a valid instance of %DynamicObject or %DynamicArray. <THROW>%FromJSON+22^%Library.DynamicAbstractObject.1 *%Exception.General Parsing error 3 Line 1 Offset 1 This error appears when the input to %FromJSON is not a valid JSON object or array. Limitations of Dunder Methods with %DynamicObject in Embedded Python The %DAO class in InterSystems IRIS stores data as dynamic key-value pairs rather than predefined properties. Since DAO objects are not native Python objects—but proxy objects returned by the iris module to wrap IRIS objects. Python’s dunder methods like __setattr__() and __getattribute__() do not work for setting or retrieving these dynamic properties. Attempting to use these methods results in an AttributeError, as the keys are not recognized as actual Python attributes. Instead, %DynamicObject requires the use of its .set() and .get() methods to manipulate data. Therefore, attribute-style access via dunder methods is not supported due to the dynamic, non-attribute-based structure of %DynamicObject. Class Sample.EmbeddedPy.DunderMethod Extends %RegisteredObject { Property Key As %String; Property Value As %String; ClassMethod DunderMethodOnRegObj() [ Language = python ] { import iris obj = iris.cls(__name__)._New() obj.__setattr__("Key","date") obj.__setattr__("Value","01011991") # print(obj.__getattribute__("Key")) #ouput : date print(obj.__getattribute__("Value")) #ouput : 01011991 } ClassMethod DunderMethodOnDynamicObj() [ Language = python ] { import iris obj = iris.cls("%Library.DynamicObject")._New() obj.__setattr__("Key","date") obj.__setattr__("Value","01011991") print(obj.__getattribute__("Key")) """<THROW>DebugStub+40^%Debugger.System.1 *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'AttributeError'>: Property Key not found in object of type iris.%Library.DynamicObject""" return } } Your examples are very educational, thank you for taking the time!
Announcement
Irène Mykhailova · May 29

InterSystems Ideas News #22

Hi Community! Welcome to Issue #22 of the InterSystems Ideas newsletter! This edition highlights the latest news from the Ideas Portal, such as: ✓ General Statistics✓ Recently implemented ideas✓ New features Here are some April numbers for you. During this month, we had: 11 new ideas 2 implemented idea 18 comments 29 votes 👏 Thanks to everyone who contributed in any way to the Ideas Portal last month. In recent months, several of your ideas have been implemented by both other Developer Community members and InterSystems. Here they are: Idea Implementor Warning/Confirmation for Delete popup for User when using VSCode extensions InterSystems add support for SQL Host Variables @Robert.Cemper1003 Need Help or Assistance menu or portal for Global Masters InterSystems New reward: tickets to global summit 2025 InterSystems Generate Fake data from table sample with GenAI @Yuri.Gomes Use of package management systems InterSystems LIMIT OFFSET support for IRIS SQL InterSystems Aha platform had a recent update, and now our Ideas Portal has some new cool features! It now supports user mentions in comments and allows you to like comments you find helpful or relevant. Look out for a standalone announcement on how it works very soon! ✨ Share your ideas, support your favorites with comments and votes, and bring the most interesting ones to life!
Announcement
Irène Mykhailova · Jul 29

InterSystems Ideas News #23

Hi Community! Welcome to Issue #23 of the InterSystems Ideas newsletter! These have been very busy two months, so let's look at the latest news from the Ideas Portal, such as: ✓ General Statistics✓ Results of InterSystems Ideas Contest✓ Community Opportunity Ideas Here are some June numbers for you. During this month, we had: 33 new ideas 2 implemented ideas 10 comments 113 votes 👏 Thanks to everyone who contributed in any way to the Ideas Portal last month! We've just announced the winners of the InterSystems Ideas Contest! Twenty-six ideas were accepted into the contest, and four community members were crowned as winners. Our most sincere congratulations! Now it's the turn for the rest of the Community to vote and comment, so that these ideas have a higher chance of being implemented. Here's the list of ideas Author Idea @Yuri.Gomes Extending an open source LLM to support efficient code generation in intersystems technology @David.Hockenbroch Add Typescript Interface Projection @Enrico.Parisi Make DICOM iteroperability adapter usable in Mirror configuration/environment @Marykutty.George1462 Ability to abort a specific message from message viewer or visual trace page @Enrico.Parisi Do not include table statistics when exporting Production for deployment @Ashok.Kumar recursive search in Abstract Set Query @Ashok.Kumar TTL(Time To Live) Parameter in %Persistent Class @Ashok.Kumar Programmatic Conversion from SDA to HL7 v2 @Ashok.Kumar Streaming JSON Parsing Support @Ashok.Kumar Differentiating System-Defined vs. User-Defined Web Applications in IRIS @Ashok.Kumar Need for Application-Specific HTTP Tracing in Web Gateway @Ashok.Kumar Add Validation for Dispatch Class in Web Application Settings @Ashok.Kumar Encoding in SQL functions @Ashok.Kumar Compression in SQL Functions @Alexey.Maslov Universal Global Exchange Utility @Ashok.Kumar Automatically Expose Interactive API Documentation @Vishal.Pallerla Dark Mode for Management Portal @Ashok.Kumar IRIS Native JSON Schema Validator @Ashok.Kumar Enable Schema Validation for REST APIs Using Swagger Definitions @diba Auto-Scaling for Embedded Python Workloads in IRIS @Dmitry.Maslennikov Integrate InterSystems IRIS with SQLancer for Automated SQL Testing and Validation @Dmitry.Maslennikov Bring IRIS to the JavaScript ORM World @Ashok.Kumar HTML Report for UnitTest Results @Andre.LarsenBarbosa AI Suggestions for Deprecated Items @Mark.OReilly Add a field onto Oauth Client to allow alerting expiry dates alert @Mark.OReilly Expose "Reply To" as default on EnsLib.EMail.AlertOperation In recent months, several of your ideas have been marked as Community Opportunity, which means that any Developer Community member is welcome to implement them and enter the Hall of Fame of the Ideas Portal. To make it easier for you to choose, here are the ideas that changed the status in the last couple of months: Idea Author The Tool That Cares(T³C) Mohamed Shabeer Mohamed Ali Vector Database Web Gateway offload encoding inbound and generative inference outbound @Alex.Woodhead Business Operation Testing mode per namespace @Scott.Roth Bring IRIS to the JavaScript ORM World @Dmitry.Maslennikov Embedded Python methods : toggle line comment with # regardless of indentation level using Visual Studio Code @Sylvain.Guilbaud ✨ Share your ideas, support your favorites with comments and votes, and bring the most interesting ones to life!
Announcement
Irène Mykhailova · Aug 26

InterSystems Ideas News #24

Hi Community! Welcome to Issue #24 of the InterSystems Ideas newsletter! Let's look at the latest news from the Ideas Portal, such as: ✓ General Statistics✓ Recently implemented ideas by InterSystems✓ Recently implemented ideas by Developer Community members Here are some July numbers for you. During this month, we had: 23 new ideas 2 implemented ideas 15 comments 91 votes 👏 Thanks to everyone who contributed in any way to the Ideas Portal last month! Since Ideas News bulletin #22, where I listed the recently implemented ideas, and thanks to the recent release 2025.2 of IRIS, we have quite a few ideas implemented by InterSystems. Here's the full list Nodejs with IRIS a dynamic platform by @Sharafat.Hussain Publish the InterSystems IRIS Native SDK for Node.js on npm by @John.Murray Create DTL on the fly from within a Business Process by @Scott.Roth Store table tuning statistics with globals, not routines by @David.Hockenbroch Developer Community members also actively participated in implementing ideas from the Ideas Portal to get bonus points during the latest programming contest. So, now there are also quite a few new implemented ideas by Community members: Here's the full list Idea Author Implementer Data Analyzer @Stella.Tickler @Landon.Minor Programmatic reports @Yuri.Gomes @Yuri.Gomes Surface test coverage information in VS Code @John.Murray @John.Murray Google Forms Interoperability adapter @Yuri.Gomes @Yuri.Gomes Bring IRIS to the JavaScript ORM World @Dmitry.Maslennikov @Dmitry.Maslennikov HTML Report for UnitTest Results @Ashok.Kumar @Ashok.Kumar ObjectScript API to create MS Word files based on templates @Yuri.Gomes @Yuri.Gomes ✨ Share your ideas, support your favorites with comments and votes, and bring the most interesting ones to life!
Announcement
Anastasia Dyubaylo · Nov 28, 2024

Results of the InterSystems Walking Challenge are in!

Hey Community! We're excited to share the results of the InterSystems Walking Challenge and would like to thank all the members of the Developer Community who joined it and finished the challenge! And now, let's look at the leaderboard 🎊 1 Catarina Meister 18 @Francisco.López1549 2 @Roberta.Scurria 19 @Luciano.Brustia 3 Gabriel Thiébaud 20 @Ina.Haldenmayr 4 Moritz Neunerdt 21 Nicole Sonnek 5 @Benjamin.Spead 22 @Evan.Gabhart 6 Epameinontas Dafnomilis 23 Alesandra Marinova 7 Dimitris Kirikakis 24 @Megumi.Kakechi 8 @Timothy.Leavitt 25 Zhorzheta Palazova 9 @Serval.Cat 26 @LuisAngel.PérezRamos 10 Eduard Gunda 27 @Thembelani.Mlalazi 11 @John.Steiner 28 @Mihoko.Iijima 12 @Iryna.Mykhailova 29 @Oliver.Wilms 13 Kevin Chromik 30 Giorgos Dafnomilis 14 Mykhailo Liubnytskyi 31 Kate Kennedy 15 @Andrii.Mishchenko 32 Oksana Popovichenko 16 @Jason.Neate 33 @jennifer.ames 17 @Daniel.Metcalfe 34 @Hannah.Sullivan 🏅 Every participant who crossed the finish line will receive a medal in recognition of their effort. 🎁 Additionally, the top 30 performers will receive special prizes for their exceptional achievements! NB. Please note that InterSystems employees and contractors are not eligible for these prizes. Congratulations to all finishers! Your medals and prizes will be sent out soon. For that, please provide your preferred shipping address via the app or email marketing.de@intersystems.com. 🎉 Thank you for your participation. We hope you enjoyed the Challenge! Awesome! I'm 12th 🎉 👏 congrats to all involved!! that was a fun challenge :) Congrats Winners!! Looking at the profile flags I was the fastest UK finisher, so I'll take that as a win :)
Announcement
Anastasia Dyubaylo · Nov 19, 2020

InterSystems Analytics Contest 2020

Hey Developers! We're pleased to invite you all to the next competition of creating open-source solutions using InterSystems IRIS! Please join: 🏆 InterSystems Analytics Contest 🏆 Duration: December 7 - 27, 2020 Prizes 1. Experts Nomination - winners will be determined by a specially selected jury: 🥇 1st place - $2,000 🥈 2nd place - $1,000 🥉 3rd place - $500 2. Community Nomination - an application that will receive the most votes in total: 🥇 1st place - $1,000 🥈 2nd place - $500 🥉 3rd place - $250 If several participants score the same amount of votes they all are considered as winners and the money prize is shared among the winners. Who can participate? Any Developer Community member, except for InterSystems employees. Create an account! Contest Period Dec 7 - 20: Two weeks to upload your applications to Open Exchange (also during this period, you can edit your projects). Dec 21 - 27: One week to vote. Dec 28: Winners announcement. The topic 💡 Analytics solutions using InterSystems IRIS 💡 Use one or more InterSystems IRIS analytics capabilities (IRIS BI, IRIS NLP, IntegratedML, InterSystems Reports) to create a simple compelling, and clear visualization and/or story. The application should work either on IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition. The application should be Open Source and published on GitHub. If the application satisfies some additional requirements listed in this post, it gets additional technology votes. Helpful resources 1. Example applications: IRIS Analytics Template Samples BI Covid19 analytics Analyze This Game of Throne Analytics Pivot Subscriptions Samples Aviation Set Analysis Error Globals Analytics 2. How to submit your app to the contest: How to publish an application on Open Exchange How to submit an application for the contest 3. Online courses and materials: DeepSee Overview DeepSee Analyzer Basics InterSystems Reports Resource guide iKnow First Look 4. Videos: Creating InterSystems IRIS Analytics Solutions Using Docker & VSCode The Freedom of Visualization Choice: InterSystems BI A look at InterSystems Reports The Freedom of Visualization Choice: InterSystems BI 5. Sample data: Adventure Works Synthea 6. Tools to import data: S3 External Table CSVGEN and CSVGENUI Judgment Please find the Judgment and Voting Rules for the Contest here. So! Ready. Set. Code. Please join our exciting coding marathon! ❗️ Please check out the Official Contest Terms here.❗️ Will be the multi-model contest skipped? Do we still need it? We can make it if the concept is resonating with a lot of developers. The multi-model approach expects that we use Object, or SQL, or direct global usage. Or IRIS document model usage. Or even your personal custom structure (e.g. graph, columnar, etc). Can be a bonus to the analytics contest, have multimodel usage I don't think so. I asked because the multi-model contest was part of the initial contest calendar. Video for creating IRIS BI solution is introduced This is exciting! Can't wait to see what our developer community comes up with!! The proposed topic for the analytics contest: introduce a utility that can go through all the pivots used in dashboards, run it, and create a report with errors. This is very useful to understand if changes to cubes and data structures brake pivots and dashboards. Check @Anton.Umnikov's article if you want to use AWS S3 resources as datasets for your IRIS Analytics solution. Also added into resources list. Added CSVGEN and CSVGENUI by @Guillaume.Rongier7183 in the list of tools that simplify data import and classes generation from CSV for your IRIS Analytics solution. And here is an example of csvgen usage and IRIS BI implementation with Game Of Throne episodes data. Developers! We are starting our 8th competition! Are you ready to win? Then join us! 🚀 Hey Developers! Please enjoy watching the video: ⏯ InterSystems Analytics Contest Kick-off Webinar Developers! We are waiting for your solutions! Don't forget to participate! Hey Developers! Only one week last for registration! We are waiting for your applications! And for now, please enjoy the video: ⏯ The Freedom of Visualization Choice: InterSystems BI Developers! The last week of registration has begun. ⌛ Hurry up! 🔥We’re waiting for your apps. Participants! Participants! Whose application will be the first? 👀 Developers! A few hours left before the deadline for uploading applications for the Analytics contest! Registration ends today at 11:59:59 PM EST. Join us to win! 🚀
Question
Kishan Ravindran · Jun 1, 2017

Can I use InterSystems iKnow without InterSystems DeepSee?

Can we use iknow in the Cache tool means if i don't have deepsee tool to work on like for doing some sample programs. Because i don't have deepsee tool with me?And is there any open source for downloading deepsee? DeepSee has a Developer Tutorial in the Documentation. This Is very good . Some example available for this Document .For Ex."HoleFoods" and "Patients" cubes in the SAMPLES namespace . Hi, Kishan!Yes, you don't need DeepSee to develop solutions with iKnow.And also you can make solutions which combine iKnow and DeepSee.
Announcement
Nermin Kibrislioglu Uysal · Sep 14, 2022

50% discount on InterSystems Certification exams at InterSystems UK&I Summit 2022

InterSystems is proud to offer 50% discount on InterSystems Certification exams to all registered attendees of UK&I summit. Vouchers will be available at the registration desk. Available Exams HealthShare Health Connect HL7 Interface Specialist InterSystems IRIS Core Solutions Developer HealthShare Unified Care Record Technical Specialist HealthShare Patient Index Technical Specialist InterSystems CCR Technical Implementation Specialist New! InterSystems IRIS System Administration Specialist (link will be available soon) Don't miss your chance to upgrade your skills!! Register for UK&I Summit today!
Announcement
Anastasia Dyubaylo · Jul 15, 2020

New Videos: "What is InterSystems IRIS for Health?" and "FHIR in InterSystems IRIS for Health"

Hey Developers, Check out the latest video on InterSystems IRIS for Health Data Platform: ⏯ What is InterSystems IRIS for Health? ⏯ FHIR in InterSystems IRIS for Health InterSystems IRIS for Health is the world's first and only data platform specifically engineering to extract value from health care data. At the core of the platform, InterSystems IRIS for Health provides advanced scalablity tools that enable both horizontal and vertical scaling. ➡️ Want more? Explore this InterSystems Learning course. InterSystems IRIS for Health provides developers with the benefits of FHIR combined with scalability, a high-speed database, and an analytics platform which makes it easy to create modern health care applications. ➡️ Try it at InterSystems Learning. Enjoy watching these videos and stay tuned!
Announcement
Stefan Wittmann · Oct 5, 2020

InterSystems IRIS and InterSystems IRIS for Health 2020.3 are GA (Generally Available)

GA releases are now published for the 2020.3 version of InterSystems IRIS, InterSystems IRIS for Health, and InterSystems IRIS Studio! A full set of containers for these products is available from the WRC Software Distribution site, including community editions of InterSystems IRIS and InterSystems IRIS for Health. In addition, all containers are also available from the new InterSystems Container Registry. This article explains how to use the registry. The build number for these releases is 2020.3.0.221.0. Community Edition containers can also be pulled from the Docker store using the following commands: docker pull store/intersystems/iris-community:2020.3.0.221.0 docker pull store/intersystems/iris-community-arm64:2020.3.0.221.0 docker pull store/intersystems/irishealth-community:2020.3.0.221.0 docker pull store/intersystems/irishealth-community-arm64:2020.3.0.221.0 InterSystems IRIS Data Platform 2020.3 makes it even easier to develop and deploy real-time, machine learning-enabled applications that bridge data and application silos. It has many new capabilities including: Enhancements to the deployment and operations experience, both in the cloud and on-prem: IKO - configuring a Kubernetes cluster just got way easier with the new InterSystems Kubernetes Operator (IKO) ICM adds support for IAM deployments Asynchronous mirroring support for sharded clusters Work Queues are now manageable from the System Management Portal Enhancements to the developer experience, including new facilities, higher performance, and compatibility with recent versions of key technology stacks: Python Gateway - invoke Python code snippets for your analytics and machine-learning related tasks Support for JDBC and Java Gateway reentrancy .NET Core 2.1 support for the .NET Gateway XEP adds support for deferred indexing Support for Spark 2.4.4 InterSystems IRIS for Health 2020.3 includes all of the enhancements of InterSystems IRIS. In addition, this release includes APIs for sending and receiving FHIR request/response messages, for performing client-side FHIR operations. eGate support in the HL7 Migration Tooling Documentation can be found here: InterSystems IRIS 2020.3 documentation and release notes InterSystems IRIS for Health 2020.3 documentation and release notes InterSystems IRIS Studio 2020.3 is a standalone development image supported on Microsoft Windows. It works with InterSystems IRIS and InterSystems IRIS for Health version 2020.3 and below, as well as with Caché and Ensemble. As this is a CD release, it is only available in OCI (Open Container Initiative) a.k.a. Docker container format. Container images are available for OCI compliant run-time engines for Linux x86-64 and Linux ARM64, as detailed in the Supported Platforms document. Best Regards, Stefan Here is the set of updated ZPM images with ZPM 0.2.7: intersystemsdc/iris-community:2020.3.0.221.0-zpm intersystemsdc/iris-community:2020.2.0.204.0-zpm intersystemsdc/irishealth-community:2020.3.0.221.0-zpm intersystemsdc/irishealth-community:2020.2.0.204.0-zpm And to launch IRIS do: docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2020.3.0.221.0-zpm docker run --rm --name my-iris -d --publish 9091:51773 --publish 9092:52773 intersystemsdc/iris-community:2020.2.0.204.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2020.3.0.221.0-zpm docker run --rm --name my-iris -d --publish 9091:51773 --publish 9092:52773 intersystemsdc/irishealth-community:2020.2.0.204.0-zpm And for terminal do: docker exec -it my-iris iris session IRIS and to start the control panel: http://localhost:9092/csp/sys/UtilHome.csp To stop and destroy container do: docker stop my-iris Thank you Evgeny and Stefan, very helpful. A minor note: There is a typo at the end of the control panel url (cspv->csp). Don't forget that SuperServer port changed from 51773 to **1972** cf : https://irisdocs.intersystems.com/iris20203/csp/docbook/Doc.View.cls?KEY=GCRN_upgrade20203#GCRN_install_port docker run --rm --name my-iris -d --publish 9091:**1972** --publish 9092:52773 intersystemsdc/iris-community:2020.3.0.221.0-zpm docker run --rm --name my-iris -d --publish 9091:51773 --publish 9092:52773 intersystemsdc/iris-community:2020.2.0.204.0-zpm docker run --rm --name my-iris -d --publish 9091:**1972** --publish 9092:52773 intersystemsdc/irishealth-community:2020.3.0.221.0-zpm docker run --rm --name my-iris -d --publish 9091:51773 --publish 9092:52773 intersystemsdc/irishealth-community:2020.2.0.204.0-zpm Thanks, Jean! Fixed Indeed, @Guillaume.Rongier7183 ! Thanks for the heads up! This is fixed in the comment.