#InterSystems Ideas Portal

0 Followers · 92 Posts

InterSystems Ideas is a platform where InterSystems users can share their thoughts on adding new and improving existing functionality of the InterSystems products to better meet the needs of our customers. This tag encompasses all the posts concerning the portal, including the articles based on the ideas introduced on the Ideas Portal. This tag encompasses all the posts related to the portal, including the articles dedicated to the implementation of the ideas introduced on the Ideas Portal.

https://ideas.intersystems.com

InterSystems staff + admins Hide everywhere
Hidden post for admin
Announcement Anastasia Dyubaylo · Oct 16, 2025

Hi Community!

We’re excited to announce a brand-new sweepstakes. This time, the theme is: 

💡 Initial Developer Experience 💡

We want to hear your thoughts on how we can make the very first steps with InterSystems technologies smoother, clearer, and more inspiring. Whether it’s documentation, onboarding, setup, or tutorials, your ideas can make a real difference!

3
1 204
Article Evgeny Shvarov · Feb 13, 2022 2m read

Folks!

Recently I found several one-line long ObjectScript commands on DC and think that it'd be great not to lose it and to collect more!

So I decided to gather a few first cases, put in one OEX project, and share them with you!

And here is how you can use them.

1. Create client SSL configuration.

set $namespace="%SYS", name="DefaultSSL" do:'##class(Security.SSLConfigs).Exists(name) ##class(Security.SSLConfigs).Create(name)

Useful if you need to read content from an URL.

Don't forget to return to a previous namespace. Or add 

n $namespace
23
8 1252
Article Siddardha Reddy Sanagala · Jul 11, 2025 7m read

Hi InterSystems Community! I'm Sidd one of the interns at the Singapore office and I recently had the chance to develop to develop a driver to connect IRIS to Metabase to help some of the Sales Engineers here. I was encouraged to share it here so that if any others have a similar issue they can use the driver and as well as get some feedback on potential improvements. The full GitHub repo with the quick start step, brief overview and the driver building process can be found here. The main purpose of this post will be to go more into detail into the main driver code and talk about ideas on how the driver can be improved.

Brief Overview

The motivation behind this driver is pretty straightforward: Metabase doesn't offer native JDBC support for InterSystems IRIS, so we needed a custom driver to bridge the gap between Metabase's backend and IRIS databases. Without this bridge, there's simply no way to connect Metabase to IRIS instances, which is obviously a problem if you're trying to build dashboards and analytics on top of your IRIS data.

The good news is that since IRIS already comes with its own JDBC driver, and Metabase has a solid generic SQL JDBC driver implementation, I didn't have to reinvent the wheel. Most of the heavy lifting - like establishing database connections, handling basic queries, managing connection pools, and dealing with standard SQL operations - could be delegated to Metabase's existing generic driver framework. This saved a tremendous amount of development time and ensured compatibility with Metabase's core functionality.

Overriding multi-methods

The approach was essentially to start a minimal skeleton driver, test it against IRIS, identify the pain points where things broke or behaved unexpectedly, and then selectively override those methods with IRIS-specific implementations.

Driver skeleton

The driver skeleton forms the foundation by defining IRIS's SQL capabilities within Metabase's context and a robust type mapping system that translates between IRIS JDBC data types and Metabase's internal type system.

This is followed by some DateTime functions that lets Metabase know how to generate the necessary SQL required for time-series visualisations. This hasn't been rigorously tested yet but rather implemented by taking a look at similar implementations in other JDBC drivers.

Connecting to IRIS

One of the most important method to override would be the sql-jdbc.conn/connection-details->spec method which allows the driver to establish a connection with the IRIS JDBC.

(defn- jdbc-spec
	[{:keys [host port namespace user password additional-options]
		:or {host "localhost", port 1972, namespace "USER"}
		:as details}]

	(-> {:classname "com.intersystems.jdbc.IRISDriver"
	:subprotocol "IRIS"
	:subname (str "//" host ":" port "/" namespace)
	:user user
	:password password}
	(merge (dissoc details :host :port :namespace :user :password :additional-options))
	(sql-jdbc.common/handle-additional-options additional-options)))

(defmethod sql-jdbc.conn/connection-details->spec :iris-jdbc
	[_ details-map]
	(jdbc-spec details-map))

The method calls the helper method jdbc-spec which first reads the input the user has given before building a connection string and passing it along to the appropriate sql-jdbc function that will handle the work of actually connecting to the IRIS instance.

Describing databases

When Metabase first connects to a database, it runs a series of SQL queries to figure out, among other things, the tables the user has access to as well as the metadata of these tables. This is done though a describe-database method call which then calls sql-jdbc.sync/have-select-privilege? and sql-jdbc.sync/fallback-metadata-query among other methods. Initial attempts to override the overarching describe-database method didn't really work as I would have to implement all of the logic of the method. Instead I focused on the method calls that were failing and just decided to override those.

(defmethod sql-jdbc.sync/fallback-metadata-query :iris-jdbc
	[_ _db-name schema table]

	[(format "SELECT * FROM %s.%s WHERE 1=0 LIMIT 0"
		schema
		table)])

(defmethod sql-jdbc.sync/have-select-privilege? :iris-jdbc
	[_ _db schema table]

	[(format "SELECT 1 AS _ FROM %s.%s WHERE 1=0"
		schema
		table)])

Looking at the Docker logs, the default way Metabase was querying metadata was through a "zero row probe" which queried the name and the type of the columns of a table. This was done with an SQL statement that looked something like this:

SELECT TRUE FROM "schema"."table" WHERE 1 <> 1 LIMIT 0

This call doesn't work on IRIS for two reasons: the use of the TRUE keyword and 1 <> 1. This was done in the describe-database method before calling the fallback-metadata-query method and failing. Overriding the fallback-metadata-query method was the only way I could find that helped with this issue and I changed the SQL query to something the IRIS JDBC could run on IRIS.

A similar call:

SELECT TRUE AS _ FROM "schema"."table" WHERE 1 <> 1

was being used by Metabase when checking if a user had select privileges for a given table, which failed for similar reasons

Whats interesting is that overriding the underlying fallback query seems to be the easiest way to get around this issue, at least for IRIS. However, all other drivers that are available in the Metabase repo have their own versions of describe-database instead which makes me believe that there is a cleaner and more efficient way to achieve the same result.

Holdability

IRIS also doesn't support holdability over CLOSE_CURSORS_ON_COMMIT whereas Metabase expects a database to support it by default. While IRIS does support holdability over HOLD_CURSORS_ON_COMMIT, I decided to take inspiration from other drivers that faced the same issue by disabling holdability all together until I could figure out how to implement holdability over HOLD_CURSORS_ON_COMMIT only.

(defmethod sql-jdbc.execute/statement :iris-jdbc
	[driver ^Connection conn]
	(.createStatement conn))

(defmethod sql-jdbc.execute/prepared-statement :iris-jdbc
	[driver ^Connection conn ^String sql]
	(.prepareStatement conn sql))

Preventing system schemas/tables

By design, IRIS comes preloaded with a bunch of system schemas and tables that provide some very useful functionality but are not needed when it comes to business analytics. The simplest way to prevent schemas from syncing with Metabase would be to override the sql-jdbc.sync/excluded-schemas method which consists of returning a set of strings that contain schema names you want to exclude.

(defmethod sql-jdbc.sync/excluded-schemas :iris-jdbc [_]
   #{"Ens"})

While this is useful, IRIS simply has too many system schemas for this to practically work. Instead I chose to override the sql-jdbc.sync/filtered-syncable-schemas method instead.

(def ^:private sql-jdbc-default
	(get-method sync.interface/filtered-syncable-schemas :sql-jdbc))

(defmethod sync.interface/filtered-syncable-schemas :iris-jdbc
	[driver ^java.sql.Connection conn ^java.sql.DatabaseMetaData meta
	^String incl-pat ^String excl-pat]

	(let [filtered-schemas
		(into []
			(remove (fn [schema]
				(or
				(str/starts-with? schema "%")
				(str/starts-with? schema "EnsLib_")
				(str/starts-with? schema "Ens_")
				(str/starts-with? schema "EnsPortal")
				(= schema "INFORMATION_SCHEMA")
				(= schema "Ens"))))
			(sql-jdbc-default driver conn meta incl-pat excl-pat))]


	(doseq [schema filtered-schemas]
		(log/infof "[IRIS-DRIVER] Remaining schema → %s" schema))
	
	filtered-schemas))

The default implementation of this method is to fetch all available schemas and remove schemas that are included in the set returned by the sql-jdbc.sync/excluded-schemas method. Simply overriding the method would mean that I would need to write the code for fetching all the available schemas again. To prevent this I defined a private method sql-jdbc-default that saved the default implementation of the method first before overriding it. This way, I could call the default implementation in my overridden method allowing me to dynamically filter schemas.

Future plans

My eventual goal is to get this driver officially integrated into the main Metabase repository, which would make it available to the broader community without requiring manual installation. To make that happen, I'll need to develop a comprehensive test suite that covers all the edge cases and ensures the driver works reliably across different IRIS versions and configurations. This means writing unit tests for the type mappings, integration tests for various SQL operations, and probably some performance benchmarks to make sure we're not introducing any regressions.

Beyond just getting it merged, there are definitely some areas where the current implementation could be improved. The type mapping system, while functional, could be more nuanced, especially around how we handle IRIS's more specialised data types. To do this I would need to take a look at the IRIS JDBC implementation to figure out the exact IRIS to Java type mappings.

Finally the DateTime and date arithmetic function implementations are something I believe can be improved starting with some testing to figure out if the current implementation even works.

Conclusion

I'll definitely be chipping away at these improvements whenever I get free time. The community seems pretty interested in having better IRIS support in Metabase, so it feels like a worthwhile investment. Please feel free to comment ideas or submit pull requests :)

Special thanks to @Martyn Lee and @Bryan Hoon from the Singapore office for giving me the opportunity to work on this as well as help me iron out some kinks along the way.

4
4 135
Announcement Anastasia Dyubaylo · Jun 5, 2025

Hello Community,

We're thrilled to invite all our Developer Community members (both InterSystems employees and not) to participate in our next contest!

💡 The 4th InterSystems Ideas Contest 💡

We're looking for your innovative ideas to enhance InterSystems IRIS and related products and services. We encourage suggestions based on real-life use cases, highlighting the tangible benefits your idea will bring to other users and how it will enhance developers' experiences with InterSystems technology.

📅 Duration: June 9 - July 20, 2025

🏆 Prizes for the best ideas and a random draw!

🎁 Gifts for everyone: A special gift will be given to each author whose idea is accepted in the contest.

>> SUBMIT AN IDEA <<

12
1 435
Discussion Vadim Aniskin · Aug 15, 2023

Hi Developers!

There is a free ObjectScriptQuality tool for ObjectScript developers who upload solutions on GitHub. This tool helps developers validate ObjectScript code using a variety of rules, based on common code errors.

There are currently 16 rules in this tool, but there are definitely many more rules to consider when testing ObjectScript code.

Could you suggest any other rules to add to this tool?

13
0 503
Article Lorenzo Scalese · Feb 1, 2023 17m read

Hi Community,

I would like to present my last package OpenAPI-Suite, this is a set of tools to generate ObjectScript code from an OpenAPI specification version 3.0.  In short, these packages allow to: 

  • Generate server-side class.  It’s pretty similar to the generated code by ^%REST but the added value is the version 3.0 support.
  • Generate HTTP client classes.
  • Generate client production (business services, business operation, business process, Ens.Request, Ens.Response) classes.
  • A web interface to generate and download the code or generate and compile directly on the server.
  • Convert specification from version 1.x, 2.x to version 3.0.
23
6 1361
Discussion Enrico Parisi · Mar 20, 2025

Once upon a time in Ensemble Management Portal the pool size of each component (Business Host) within the production was displayed in the Production Configuration page.

This information was very useful, especially when a production have tens or hundreds of components.

Now days the pool size is no longer displayed in the Production Configuration page and to get the pool size you need to click in each and every host in your production.
What if you have hundreds of business hosts and you need to check the pool size of each? It's a nightmare!

0
0 92
Question Mavri Sthandier · Mar 20, 2025

Hello there 🙋‍♂️,

I'm looking towards a functionality alike Python's difflib, but made with Intersystems products. I already know could embed Python code within IRIS but thought maybe there was a development already done for handling deltas, with a different approach or extra utils.

Even if I find such a library after comparing both might still go with difflib or any other more suitable. Intend to use it for a cross-environment checklist/check tool.

Please find below a sample of HTML rendering computed and made with difflib, with a few lines of code:

thanks ! best regards,  

0
0 75
Article Vadim Aniskin · Nov 6, 2024 1m read

Hi Community!

We hope you know that when you have an interesting idea about InterSystems products or services, you should publish it on the Ideas Portal. And those Developer Community members who implement the proposed ideas are added to the "Hall of Fame". Want to get accepted to the InterSystems Ideas Hall of Fame? Read on to learn how you can get on the list.

 

1
0 385
Article Vadim Aniskin · Dec 18, 2024 2m read

This article is part of a series showcasing the implementation of ideas from the Ideas Portal, where innovative concepts come to life!

Many InterSystems IRIS developers frequently need to create unit tests for ObjectScript classes — a process often done manually. The iris-tripleslash application revolutionizes this by automatically generating unit test classes with test methods for all the class methods of the original class. Developed by the talented Musketeers team @José Pereira, @Henrique Dias, @Henry Pereira — this tool was inspired by an idea shared by @Evgeny Shvarov on the Ideas Portal: "Add a project that helps to generate unittests for an ObjectScript class".

 

0
0 233
Article Muhammad Waseem · Dec 16, 2024 5m read

image
Hi Community,
In this article, I will introduce my application iris-HL7v2Gen .

IRIS-HL7v2Gen is a CSP application that facilitates the dynamic generation of HL7 test messages. This process is essential for testing, debugging, and integrating healthcare data systems. The application allows users to generate a wide variety of HL7 message types, validate their structure against HL7 specifications, explore the message hierarchy, and transmit messages over TCP/IP to production systems. These features are particularly useful in settings where compliance with HL7 standards is mandatory for interoperability between different healthcare organizations or systems.


Application Features

  • Dynamic HL7 Message Generation: Instantly create HL7 messages for a range of message types, facilitating comprehensive testing.
  • Message Structure Exploration: Visualize the structure of generated messages based on HL7 specifications.
  • Value Set Visualization View predefined sets of allowable coded values for specific fields.
  • Message Validation: Validate messages against HL7 standards to ensure compliance.
  • TCP/IP Communication: Easily transmit messages to production using TCP/IP settings.
  • Broad Message Type Support: Supports 184 different HL7 message types, ensuring versatility for various healthcare integration needs.
  • ClassMethod: Generate a Test Message by Invoking a Class Method
  • Version Support: Currently Supports HL7 Version 2.5
0
4 365
Discussion Enrico Parisi · Oct 25, 2024

The IRIS Management Portal is localized (translated) for some (many?) languages and the language used by the Management Portal interface is determined by the browser settings, often derived from the OS settings (can be changed).

This means that if a user, like me, want to use ONLY the English version of the Management Portal, each and every time you login you need to change the language. VERY annoying.

I know I can change the language configured in Browser, BUT, I want to use English for the IRIS management portal non for all my internet activity!

9
1 263
Announcement Anastasia Dyubaylo · Oct 24, 2024

Mullins School - PUT ON YOUR THINKING CAP! Help us... | Facebook

Do you have an idea that could make a real impact on InterSystems technology and be realised by Community members? Now’s the perfect time to share your thoughts!  

We’re preparing something exciting and would love to see the ideas you think could take InterSystems to the next level. To achieve this, we need you to come up with new ideas for our Ideas Portal that could be considered as "Community Opportunity" ideas*.

Thus, put on your thinking cap and submit your ideas on the Ideas Portal by mid-November, and stay tuned for more updates. 

2
0 116
Article Robert Cemper · Sep 7, 2024 1m read

You might know that you can search posts in DC by Tags
starting in left upper  corner   and  

that's fine to start. But - based on some local feedback - some improvements
might make is more useful. actual the SELECT works .. IF TAGS CONTAIN %tag 
This spams you with a lot of results but often much more than useful
so the suggestions for extensions:

0
0 101