New post

Find

InterSystems Official
· Jan 25

InterSystems任命Don Woodlock为总裁

2026 年 1 月 6 日,马萨诸塞州 波士顿——创新数据技术公司InterSystems今日宣布,即日起,Don Woodlock被任命为总裁,全面负责领导公司的日常运营工作。在领导公司长达47年之后,创始人、所有者兼首席执行官Phillip “Terry” Ragon将卸下日常管理职责,转而专注于指导公司的业务和技术战略。Ragon将继续担任首席执行官一职,并与领导团队紧密合作,确保公司平稳过渡,继续秉持对卓越品质和客户成功的承诺。
“在2023年全球峰会上发言时,我谈到了强大而稳定的文化如何具有韧性,以及文化为何是预测未来成功最有力的指标。”Ragon表示,"我相信,我们在InterSystems所建立的文化真正实现了自我延续,现在是时候让下一代来接棒,成为我们所有人共同努力成果的管理者了。"
Woodlock已在InterSystems担任医疗业务副总裁长达八年。他拥有深厚的行业专业知识和敏锐的技术洞察力,并与公司“以客户为先”的文化理念高度契合。

"自2017年加入InterSystems以来,Terry一直是我的榜样和导师。"Woodlock表示,"早在几十年前,我就开始接触和使用InterSystems的产品,起初是担任技术职务,后来则领导一个为医疗健康领域提供解决方案的业务部门。这些来自一线的真实客户经验,再结合InterSystems在技术、财务和组织方面的优势,激发了我帮助公司迈向下一个成功时代的激情。”

点击这里,认识我们的领导团队

Discussion (0)1
Log in or sign up to continue
Digest
· Jan 25

InterSystems 开发者社区中文版:每周摘要(1月19日-25日)

一月 19 - 25, 2026Week at a GlanceInterSystems Developer Community
Article
· Jan 25 4m read

Ways to store and query lists and arrays in IRIS

As mentioned in the previous article, it is possible to configure the way you wish your collections to be stored and queried in SQL.

To set this up, you will need to use the following field parameters and settings:

The STORAGEDEFAULT parameter tells the IRIS compiler which physical data structure to use when writing a collection to a Global.

For a list of properties, the default value is "list", meaning that the data is serialized into a single string using $LISTBUILD (an internal binary format). It is stored as part of the main object’s data node in the global.

For an array of properties, the default value is "array", meaning that each element is stored in a separate global subnode. This essentially creates a "child" structure on the disk. It is best for large collections where you need to update or delete single items without rewriting the entire record.

But, at the same time, you can toggle these settings, and you can force a List to act like an Array (and vice versa) for performance reasons. For example,

Property Notes As list of %String (STORAGEDEFAULT = "array");

This will store the list in subnodes, making individual item updates much faster.

To go further, you can tell the system how you wish your data to be mapped in SQL. For this, use the field parameter SQLPROJECTION. It is the most powerful tool for making collections "visible" to SQL.

Value SQL Representation Description
"column" Single Column The entire collection appears as one field. Lists show up as a delimited string or $LIST.
"table" Child Table IRIS automatically generates a secondary table linked by a Foreign Key (the parent's ID).
"table/column" Dual Projection The property appears both as a field in the main table and as a separate child table.

You can set both column and table setting to both list and array.

Beyond the big two, several parameters influence the nuances of how these collections behave in SQL.

SqlListType  (for list properties only), as mentioned in the previous article, defines the format of the data when it is projected as a single column, and can get one of the following values:

  • LIST (default) returns the internal IRIS $LIST format. Best for IRIS-to-IRIS integrations.
  • DELIMITED returns a string separated by a character (defined by SqlListDelimiter ). Best for legacy CSV exports or simple reporting.
  • SUBNODE - the data is physically stored in subnodes (like an array) but seen in SQL as a single field.

When SQLPROJECTION =  "table" is used, these determine the naming convention:

  • SQLTABLENAME - name of the generated child table (e.g., Employee_Phones)
  • SQLFIELDNAME - name of the value column within that child table

Now let's look at the example. Let's say we have the following class:

Class CRM.Contact Extends (%Persistent, %Populate) [ SqlRowIdName = Contact_PK ]
{

/// 1. Standard Property: Custom SQL field name
Property FullName As %String(MAXLEN = 100) [ SqlFieldName = Contact_Name ];

/// 2. Simple List: Projected as a single column
/// Reason: Use this for small sets of data where you just need to see them in one cell.
/// Goal: Compatibility with legacy tools using comma-delimited strings.
Property Tags As list Of %String [ SqlFieldName = Category_Tags, SqlListType = DELIMITED ];

/// 3. Performance-Optimized List: Projected as a Child Table
/// Reason: 'STORAGEDEFAULT = array' ensures that adding a 10th phone number 
///         doesn't require rewriting the whole contact record (O(1) vs O(N)).
/// Goal: Allow BI tools to JOIN on phone numbers without complex parsing.
Property PhoneNumbers As list Of %String(SQLPROJECTION = "table", SQLTABLENAME = "Contact_Phones", STORAGEDEFAULT = "array");

/// 4. Key-Value Array: Projected as a Table
/// Reason: Arrays are naturally stored as subnodes. Projecting as a table 
///         allows SQL users to query specific keys easily.
Property Metadata As array Of %String(SQLPROJECTION = "table", SQLTABLENAME = "Contact_Metadata");
}

If we now create 10 instances of this class, we can execute the following queries and see the results:

SELECT *
  FROM CRM.Contact

So we can see that the FullName field is called Contact_Name, the primary field is called Contact_PK and the only other field we have is Category_Tags that is a delimited list.

At the same time, we have 2 additional tables: CRM.Contact_Metadata and CRM.Contact_Phones

If we execute the query

SELECT *
  FROM CRM.Contact_Phones

we will see that our list of PhoneNumbers actually looks like it's an array with the primary key from the main table (CRM.Contact), primary key of this table which is a composition of the Contact PK and position of the data in the list, list data and the position of the data in the list:

If we execute the query

SELECT *
  FROM CRM.Contact_Metadata

we will see a usual table with the primary key from the main table (CRM.Contact), primary key of this table, which is a composition of the Contact PK and array key, array key, and array data:

So basically, the difference between the last two results is that for the list represented as a table, the element_key is the position of the element in the list, and for the array - it's the actual key.

Hopefully, this will help you to make an informed decision on how you would like to store and represent your collections!

Discussion (0)0
Log in or sign up to continue
Article
· Jan 25 2m read

Reviews on Open Exchange - #63

If one of your packages on OEX receives a review, you get notified by OEX only of YOUR own package.   
The rating reflects the experience of the reviewer with the status found at the time of review.   
It is kind of a snapshot and might have changed meanwhile.   
Reviews by other members of the community are marked by * in the last column.

I also placed a bunch of Pull Requests on GitHub when I found a problem I could fix.    
Some were accepted and merged, and some were just ignored.     
So if you made a major change and expect a changed review, just let me know.
 

# Package Review Stars IPM Docker *
1 IRIS OpenTelemetry Demo impressive 7 containers concert 5.5   y  
2 DBdashboard impressive catch 5.0   y *
3 DBfree super multi instance monitoring 5.0   y *
4 IRIS-EchoServer-WebSockets echo inside IRIS 5.0   y *
5 iris-health-fhir-agentic-demo not just big but great 5.0   y *
6 ML Made Easy : IntegratedML an excellent training for beginners 5.0   y  
7 restoreUI a pleasure to work with 5.0 y y  
8 WebSocketsSample hidden treasure detected 5.0      
9 CSV-to-MS-OFX rare subjects 4.8   y *
10 GeoDatas works partially 3.5   y  
11 CommunityEns requires some adjustments 3.3   y  
12 ALPHA LOGISTICS partner posting *      
13 ERP Plenum partner posting *      

 

NOTE:
If some review is not readable for you, it might still wait for approval by OEX admins.

Discussion (0)1
Log in or sign up to continue
Discussion
· Jan 25

Global Masters - Random Coffee Chat - Asia & Pacific

Hi Community! 👋

You’ve asked for easier ways to connect with other Global Masters and we heard you!
Random Coffee Chat is an easy way for Global Masters to connect and have an informal 1:1 conversation. ☕

🗓 When: January 26 – February 9

This thread is for participants based in Asia, Australia and New Zealand who’d like to connect and schedule a short coffee chat directly with each other.

 
☕ How it works

  • Leave a comment in this thread to join
  • Reply to someone’s comment if you’d like to connect
  • Continue the conversation in Direct Messages and schedule a 30-minute quick call

You choose who to connect with and when.

Participants connect directly with each other via Direct Messages on the Developer Community and choose a time that works best for both sides.

☕ After your coffee chat, share a quick screenshot from your call in the Random Coffee Chat ASK on Global Masters, and earn 100 Global Masters points as a thank-you for participating.

💬 Example comment (copy & paste)

Hi! I’m in for a random coffee chat ☕
Location: Australia
Availability: Wed–Fri, 10:00–13:00
Happy to chat about: getting to know each other, AI & automation, READY 2026 plans

🧠 Suggested topics & ice breakers

  • Just getting to know each other and what you enjoy outside of work 
  • AI, automation, and agent-based solutions
  • Developer tools, productivity, and workflows
  • Community contributions and favorite DC topics
  • InterSystems READY plans and past event experiences

⏱ Format

  • 30-minute informal video or audio call
  • Any tool that works for both of you

Looking forward to seeing new connections happen here 🚀

Discussion (0)1
Log in or sign up to continue