查找

Article
· Jul 29 13m read

Taking up Collections in IRIS

Imagine you’re walking down the street on a nice summer’s day, and someone walks up to you and says “Hey, you work at InterSystems, right? I’ve been hearing more and more about InterSystems IRIS lately. I know IRIS has its own programing language called ObjectBook? or InstaScript? OK, I admit it, I know it’s called ObjectScript! I know IRIS also supports Python. I’m a Python developer, so that sounds great to me. But I’m also interested in ObjectScript. For example, Python and other languages support collections. Does ObjectScript support collections?”

You’d answer “Of course!”

And then your new friend might get excited and start firing off more questions:

  • How many kinds of collections does ObjectScript support?
  • Can ObjectScript use Python collections?
  • Can Python use ObjectScript collections?
  • Which collection is best?

How would you answer? Well, you don’t have to worry about answering. All you’d have to do is send your new friend the URL of this long page.

Let’s say you have 20, 500, or 10000 items that you want to manipulate programmatically. You may want to sort them, iterate through them, perform mathematical operations on them, or do something else with them. Using a collection is an obvious choice. Let's explore the IRIS collection collection.

There are 12 kinds of collections available in IRIS. Yes, 12. Why 12? Because new collection or collection-like features have been added over time. In the beginning, there were 2 kinds of collections. Then $lists were added. Then collection classes were added. Then dynamic objects and arrays were added for handling JSON. Then the ability to use Python collections was added. Finally vectors were added. In ObjectScript, it's possible to use all 12. In Python, as of v2024.3, you can use 9 (sparse arrays, $list, and $vector are not available).

I've divided the collections into 3 groups. There are simple code examples for each collection (Python on the left, ObjectScript on the right)

  • 7 collections that use integer keys.
  • 4 collections that allow any value to be the key; these are key-value collections.
  • The Python set collection only, which has no keys.

At the bottom, after the examples of the collections, there are a few more fun facts about collections as well as a poll. Plus, there might be a treat or joke down there at the end.

The one question this article does not answer is: "Which collection performs best, especially when the number of items in the collection is large?" I intend to write some code which will time things like computations across values ($vector should win that one!), creation, searching for values, accessing values, and anything else I come up with. And I'll add that code and the results to this posting,. Maybe one of you will finish writing that code and add it to this posting before I do.

Collections with Integer Keys

1. Delimited strings

You might not think of this as a collection, but it can easily be used as one. This is a collection of pieces. The keys are the 1-based (for ObjectScript) or 0-based (for Python) positions of the pieces in the string.

# NOTE: since access to pieces uses split(),
#       which returns a Python list,
#       you'd probably use a Python list instead
#
# create
>>> c = "10,20,30,20,10"
# iterate and access
>>> i = 0
>>> for val in c.split(","):
...    print(i, "–", val)
...    i += 1
010
120
230
320
410
# return the key for a particular value (30)
>>> print(c.split(",").index('30'))
2
// create
USER>set c = "10,20,30,20,10"
// iterate and access
USER>for i = 1:1:$length(c, ",") { write !, i, " – ", $piece(c, ",", i) }
110
220
330
420
510
// returning the key for a particular value (30)
// is awkward; use a different collection if this is required

 

2.    $list

This is a $list collection of values. The keys are the 1-based positions of the values in the $list. $list is not available in Python. However, you can convert a $list into a Python list.

# assuming "lb" is a $list returned by a call
# to an ObjectScript method
# $listbuild(10,20,30,20,10)
# convert it to a Python list
>>> c = iris._SYS.Python.ToList(lb)
>>> print(c)
[10, 20, 30, 20, 10]
// create
USER>set c = $listbuild(10,20,30,20,10)
// iterate and access
USER>for i = 1:1:$listlength(c) { write !, i, " – ", $list(c, i) }
110
220
330
420
510
// return the key for a particular value (30)
USER>write $listfind(c, 30)
3

 

3.    %DynamicArray object (JSON array)

This is a JSON array collection of values. The keys are the 0-based positions of the values. This is like a Python list. Searching for a value and returning its key requires iterating (not shown below). 

# create
>>> c = iris._Library.DynamicArray._New()
>>> _ = c.Set(0, 10)
>>> _ = c.Set(1, 20)
>>> _ = c.Set(2, 30)
>>> _ = c.Set(3, 20)
>>> _ = c.Set(4, 10)
# iterate and access
>>> for i in range(c._Size()):
...    print(i, "-", c._Get(i))
010
120
230
320
410
// create
USER>set c = [10,20,30,20,10]
// iterate and access
USER>for i = 0:1:(c.%Size() - 1) { write !, i, " – ", c.%Get(i) }
010
120
230
320
410

 

4.    %ListOfDataTypes object

This is a list collection of values. The keys are the 1-based positions of the values. Note: when using this collection as a property in a class (Property C as list of %String), the class definition is %Collection.ListOfDT instead (all functionality is the same).

# create
>>> c = iris._Library.ListOfDataTypes._New()
>>> _ = c.Insert(10)
>>> _ = c.Insert(20)
>>> _ = c.Insert(30)
>>> _ = c.Insert(20)
>>> _ = c.Insert(10)
# iterate and access
>>> for i in range(c.Size()):
...    print((i+1), "-", c.GetAt(i+1))
110
220
330
420
510
# return the key for a particular value (30)
>>> print(c.Find(30))
3
// create
USER>set c = ##class(%ListOfDataTypes).%New()
USER>do c.Insert(10), c.Insert(20), c.Insert(30)
USER>do c.Insert(20), c.Insert(10)
// iterate and access
USER>for i = 1:1:c.Size { write !, i, " – ", c.GetAt(i) }
110
220
330
420
510
// return the key for a particular value (30)
USER>write c.Find(30)
3

 

5.    $vector

This is a vector of values of a specific declared type (integers in the example below). The keys are the 1-based positions of the values in the vector. $vector is not available in Python.

// create
USER>set $vector(c,1,"int") = 10
USER>set $vector(c,2,"int") = 20
USER>set $vector(c,3,"int") = 30
USER>set $vector(c,4,"int") = 20
USER>set $vector(c,5,"int") = 10
// iterate and access
USER>for i = 1:1:$vectorop("count",c) { write !, i, " – ", $vector(c, i) }
110
220
330
420
510
// return the key for a particular value (30)
// by creating a bitstring for matching values
// and finding the 1 bit
USER>set b = $vectorop("=", c, 30)
USER>write $bitfind(b, 1)
3

 

6.    Python list (Used in ObjectScript via Builtins())

 This is a Python list of values used within ObjectScript. The keys are the 0-based positions of the values. Since ObjectScript doesn't recognize the Python [ ] syntax, you must call the __getitem__() method.

# create
c = [10, 20, 30, 20, 10]
# iterate and access
>>> for i in range(len(c)):
...    print(i, "-", c[i])
010
120
230
320
410
# return the key for a particular value (30)
>>> print(c.index(30))
2
// create
USER>set b = $system.Python.Builtins()
USER>set c = b.list()
USER>do c.append(10), c.append(20), c.append(30)
USER>do c.append(20), c.append(10)
// display
USER>zwrite c
c=10@%SYS.Python  ; [10, 20, 30, 20, 10]  ; <OREF>
// iterate and access
USER>for i = 0:1:(b.len(c) - 1) { write !, i, " – ", c."__getitem__"(i) }
010
120
230
320
410
// return the key for a particular value (30)
write c.index(30)
2

 

7.    Python tuple (Used in ObjectScript via Builtins())

This is a Python tuple of values used within ObjectScript. The keys are the 0-based positions of the values. Since ObjectScript doesn't recognize the Python [ ] syntax, you must call the __getitem__() method. Once created, a tuple is immutable. 

# create
t = (10, 20, 30, 20, 10)
# iterate and access
>>> for i in range(len(t)):
...    print(i, "-", t[i])
010
120
230
320
410
# return the key for a particular value (30)
>>> print(t.index(30))
2
// first, create a list and add values
USER>set b = $system.Python.Builtins()
USER>set c = b.list()
USER>do c.append(10), c.append(20), c.append(30)
USER>do c.append(20), c.append(10)
// convert it to a tuple
USER>set t = b.tuple(c)
// display
USER>zwrite t
t=7@%SYS.Python  ; (10, 20, 30, 20, 10)  ; <OREF>
// iterate and access
USER>for i = 0:1:(b.len(t) - 1) { write !, i, " – ", t."__getitem__"(i) }
010
120
230
320
410
// return the key for a particular value (30)
write t.index(30)
2

 

Key-Value Collections

Note: The examples in this section all use a mixture of integer, floating point, and string keys. This mixture would typically not occur in real code; it's used to demonstrate how the keys are treated by each kind of collection.

1.    Sparse array

This is a subscripted variable. Any string or numeric value is allowed as a subscript except for the empty string (""). The keys are the subscripts. The array is automatically sorted by the subscripts (numerically and alphabetically). Searching for a value requires iterating (not shown below). Sparse arrays are not available in Python. However, you can convert a Python dict into a sparse array reference, in order to pass it as an argument to an ObjectScript method.

# create
>>> c = {-1: 10, 2: 20, 8.5: 30, 'george': 20, 'thomas': 10}
# convert it to a sparse array
>>> sa = iris.arrayref(c)
>>> print(sa.value)
{'-1': 10, '2': 20, '8.5': 30, 'george': 20, 'thomas': 10}
# "sa" could be passed to an ObjectScript method
# that accepts a sparse array as an argument
// create (adding with keys intentionally out of order to show auto sorting)
USER>set c(-1) = 10, c(8.5) = 30, c(2) = 20
USER>set c("thomas") = 10, c("george") = 20
// iterate and access
USER>set key = ""
USER>while 1 {set key = $order(c(key)) quit:(key = "")  write !, key, " – ", c(key) }
-110
220
8.530
george – 20
thomas – 10

 

2.    %DynamicObject object (JSON object)

This is a JSON object collection of keys and values. This is like a Python dict. Searching for a value requires iterating (not shown below).

# create
>>> c = iris._Library.DynamicObject._New()
>>> _ = c._Set(-1, 10)
>>> _ = c._Set(2, 20)
>>> _ = c._Set(8.5, 30)
>>> _ = c._Set("george", 20)
>>> _ = c._Set("thomas", 10)
# iterate and access
>>> key = iris.ref()
>>> val = iris.ref()
>>> i = c._GetIterator()
>>> while i._GetNext(key, val):
...    print(key.value, "-", val.value)
-110
220
8.530
george – 20
thomas – 10
// create
USER>set c = {"-1":10, "2":20, "8.5":30, "george":20, "thomas":10}
// iterate and access
USER>set i = c.%GetIterator()
// call %GetNext() passing key and val BY REFERENCE (preceded with period)
USER>while i.%GetNext(.key, .val) { write !, key, " – ", val }
-110
220
8.530
george – 20
thomas – 10

 

3.    %ArrayOfDataTypes object

This is an array collection of keys and values. Any string or numeric value is allowed as a key except for the empty string (""). The collection is automatically sorted on the keys (numerically and alphabetically). Note: when using this collection as a property in a class (Property C as array of %String), the class definition is %Collection.ArrayOfDT instead (all functionality is the same).

# create (adding with keys intentionally out of order
# to show auto sorting)
>>> c = iris._Library.ArrayOfDataTypes._New()
>>> _ = c.SetAt(10, -1)
>>> _ = c.SetAt(30, 8.5)
>>> _ = c.SetAt(20, 2)
>>> _ = c.SetAt(10, "thomas")
>>> _ = c.SetAt(20, "george")
# iterate and access
>>> key = iris.ref("")
>>> while True:
...    val = c.GetNext(key)
...    if (key.value == ""):
...        break
...    print(key.value, "-", val)
-110
220
8.530
george – 20
thomas – 10
# return the key for a particular value (30)
>>> print(c.Find(30))
8.5
// create (adding with keys intentionally out of order to show auto sorting)
USER>set c = ##class(%ArrayOfDataTypes).%New()
USER>do c.SetAt(10, -1), c.SetAt(30, 8.5), c.SetAt(20, 2)
USER>do c.SetAt(10, "thomas"), c.SetAt(20, "george")
// iterate and access
USER>set key = ""
// call GetNext() passing key BY REFERENCE (preceded with period)
USER>while 1 { set val = c.GetNext(.key) quit:(key = "")  write !, key, " - ", val}
-110
220
8.530
george – 20
thomas – 10
// return the key for a particular value (30)
USER>write c.Find(30)
8.5

 

4.    Python dict (Used in ObjectScript via Builtins())

This is a Python dict of values used within ObjectScript. Any string or numeric value is allowed as a key. It's included here for completeness, as it is technically possible to use it within ObjectScript. But it might seem strange to do so, given the lack of the "for keys,values in…" syntax in ObjectScript. Searching for a value requires iterating (not shown below).

# create
>>> c = {"-1":10, "2":20, "8.5":30, "george":20, "thomas":10}
# iterate and access
>>> for key, val in c.items():
...    print(key, "-", val)
-110
220
8.530
george – 20
thomas – 10
// create
USER>set b = $system.Python.Builtins()
USER>set c = b.dict()
USER>do c.setdefault(-1, 10), c.setdefault(2, 20), c.setdefault(8.5, 30)
USER>do c.setdefault("george", 20), c.setdefault("thomas", 10)
// display
USER>zwrite c
c=15@%SYS.Python  ; {-1: 10, 2: 20, 8.5: 30, 'george': 20, 'thomas': 10}  ; <OREF>
// iterate (using try/catch) and access
USER>set iter = b.iter(c)
USER>try { while 1 { set key = b.next(iter) write !, key, " – ", c.get(key)} } catch ex {}
-110
220
8.530
george – 20
thomas – 10

 

Python Set Collection

1.    Python set (Used in ObjectScript via Builtins())

This is a Python set of values used within ObjectScript. A set is non-ordered, non-indexed, and doesn't allow duplicate values. Set operations such as union and intersection are supported. 

# create
>>> c1 = {10, 20, 30, 20, 10}
>>> c2 = {25, 30, 20, 75}
# display (no duplicate values allowed)
>>> print(c1)
{10, 20, 30}
>>> print(c2)
{25, 75, 20, 30}
# create union and intersection of the sets
>>> union = c1.union(c2)
>>> inter = c1.intersection(c2)
# display
>>> print(union)
{20, 25, 10, 75, 30}
>>> print(inter)
{20, 30}
// create
USER>set b = $system.Python.Builtins()
USER>set c1 = b.set(), c2 = b.set()
USER>do c1.add(10), c1.add(20), c1.add(30), c1.add(20), c1.add(10)
USER>do c2.add(25), c2.add(30), c2.add(20), c2.add(75)
// display (no duplicate values allowed)
USER>zwrite c1, c2
c1=4@%SYS.Python  ; {10, 20, 30}  ; <OREF>
c2=8@%SYS.Python  ; {25, 75, 20, 30}  ; <OREF>
// create the union and intersection of the sets
USER>set union = c1.union(c2)
USER>set inter = c1.intersection(c2)
// display
USER>zwrite union
union=11@%SYS.Python  ; {20, 25, 10, 75, 30}  ; <OREF>
USER>zwrite int
int=9@%SYS.Python  ; {20, 30}  ; <OREF>

 

Fun Facts

  • All 12 collections can be properties of IRIS objects. However, the 4 Python collections and sparse arrays cannot be saved as part of an IRIS persistent object.
  • The %Collection.ArrayOfDT collection is used for an array property of an object. If the object is persistent, when saving the object, the collection keys and values are automatically normalized into a child table.
  • The %Collection.ListOfDT collection is used for a list property of an object. If the object is persistent, when saving the object, the collection keys and values can optionally be automatically normalized into a child table.
  • 11 of the collections allow different types of values in the same collection, such as strings, integers, and doubles. The sole exception: the values of a $vector must all be the same declared type.
  • 7 of the collections allow object references as values. Delimited strings, $list, $vector, %ListOfDataTypes, and %ArrayOfDataTypes do not allow object references. For the latter two, %ListOfObjects and %ArrayOfObjects are alternatives that allow object references as values, along with the %Collection.ListOfObj and %Collection.ArrayOfObj classes for list or array properties of objects.
  • In IRIS, globals are sparse arrays on disk. Although sparse arrays are not available in Python, using iris.gref() it is possible to manipulate globals in Python.

I hope you found this posting useful. As a treat for reading this far, here's a photo from part of my childhood rock collection, purchased for $2.25 in the early 1970s. Item #11 is uranium! The helpful description states "It is a source of radio active material, used in construction of atomic bombs." Unfortunately, there are no safe handling warnings included. I'll put it back in the attic now.

 

Discussion (0)1
Log in or sign up to continue
Announcement
· Jul 29

[Vídeo Demo] Care Compass – Assistente de IA RAG com tecnologia InterSystems IRIS para gerentes de cuidados

#InterSystems Demo Games entry


⏯️ Care Compass – Assistente de IA RAG com tecnologia InterSystems IRIS para gerentes de cuidados

O Care Compass é um protótipo de assistente de IA que auxilia assistentes sociais a priorizar clientes por meio da análise de dados clínicos e sociais. Utilizando a Geração Aumentada de Recuperação (RAG) e modelos de linguagem de grande porte, ele gera resumos narrativos de risco, calcula pontuações de risco dinâmicas e recomenda os próximos passos. O objetivo é reduzir as visitas evitáveis ao pronto-socorro e apoiar intervenções precoces e informadas.

Apresentadores:
🗣 @Brad Nissenbaum, Sales Engineer, InterSystems
🗣 @Andrew Wardly, Sales Engineer, InterSystems
🗣 @Fan Ji, Solution Developer, InterSystems
🗣 @Lynn Wu, Sales Engineer, InterSystems

🔗  Recursos Relacionados:

👉 Gostou deste Demo? Apoie a equipe votando nela nos Jogos de Demonstração

Discussion (0)1
Log in or sign up to continue
Question
· Jul 29

WHat is the difference between tsql method and querry

Hi, I'm wondering what are the diferences between a method or classmethod with the language set at tsql and a querry writen in sql.
If anyone know if there is some difference and what they are, I would be glad to learn. 😊

3 Comments
Discussion (3)3
Log in or sign up to continue
Article
· Jul 29 11m read

Professional Boiler Repair Woking: Your Trusted Local Heating Experts Available 24/7

When your boiler breaks down unexpectedly, finding reliable boiler repair Woking services becomes an urgent priority. Whether you're searching for "boiler repair near me" at 6 AM on a freezing Surrey morning or planning preventive maintenance for your heating system, professional boiler engineers in Woking provide essential expertise to keep your home warm and comfortable year-round.

Surrey's unpredictable weather patterns make dependable heating systems crucial for every household. From Victorian terraces with aging boiler systems to modern homes featuring advanced HP heating technology, Woking properties require specialized knowledge and rapid response times when heating failures occur.

Understanding Boiler Repair Services in Woking

Boiler repair Woking specialists handle a comprehensive range of heating system issues affecting residential and commercial properties throughout Surrey. Professional boiler engineers combine technical expertise with local knowledge, understanding the unique challenges faced by different property types in the Woking area.

Common Boiler Problems Requiring Professional Repair

Boiler Not Heating Water or Radiators

Complete heating failure represents one of the most urgent boiler repair near me searches, especially during winter months. Common causes include:

  • Faulty Thermostats: Malfunctioning room or cylinder thermostats preventing proper temperature regulation
  • Pump Failures: Circulation pump breakdowns stopping hot water flow to radiators
  • Valve Issues: Motorized valve problems affecting heating and hot water distribution
  • Low Water Pressure: System pressure drops requiring professional diagnosis and restoration
  • Pilot Light Problems: Gas boiler pilot light failures preventing ignition

Strange Noises and Unusual Sounds

Unusual boiler noises often indicate developing problems requiring immediate professional attention:

  • Kettling Sounds: Limescale buildup in heat exchangers causing whistling or banging noises
  • Gurgling Noises: Air trapped in the system or water flow restrictions
  • Clicking Sounds: Ignition problems or faulty gas valves
  • Vibrating Noises: Loose components or mounting bracket issues
  • Whooshing Sounds: Fan problems or combustion air supply issues

Water Leaks and Pressure Issues

Boiler leaks require immediate professional intervention to prevent property damage:

  • Internal Component Leaks: Damaged heat exchangers, pipes, or seals
  • Pressure Relief Valve Leaks: Safety valve activations indicating system overpressure
  • Pump Seal Failures: Circulation pump leaks requiring component replacement
  • Expansion Vessel Problems: Faulty vessels causing pressure fluctuations
  • Pipe Joint Failures: Corroded or loose connections requiring expert repair

Emergency Boiler Repair Services: When Every Hour Counts

When you're desperately searching "boiler repair near me" during a heating crisis, emergency repair services provide crucial rapid response capabilities. Professional emergency boiler engineers in Woking understand that heating failures can't wait for convenient appointment times.

24/7 Emergency Response Protocol

Professional boiler repair Woking companies maintain comprehensive emergency response systems:

Immediate Phone Assessment: Qualified operators evaluate your situation's urgency and provide initial troubleshooting guidance to potentially restore temporary heating.

Rapid Dispatch System: Emergency engineers equipped with common spare parts and diagnostic tools are dispatched to your location within 60-90 minutes.

Safety-First Approach: Emergency technicians prioritize safety, immediately identifying and addressing any potential gas leaks, carbon monoxide risks, or electrical hazards.

Temporary Solutions: Where possible, emergency repairs restore basic heating functionality while planning comprehensive permanent solutions.

Clear Communication: Regular updates on arrival times, repair progress, and expected completion schedules keep homeowners informed throughout the emergency response process.

Identifying True Boiler Emergencies

Not every boiler problem constitutes a genuine emergency, but certain situations demand immediate professional attention:

Critical Emergency Situations

  • Gas Leak Detection: Any suspected gas leaks require immediate evacuation and emergency engineer response
  • Carbon Monoxide Alarms: CO detector activations demand instant boiler shutdown and professional inspection
  • Major Water Leaks: Significant boiler leaks threatening property damage need urgent intervention
  • Complete Winter Heating Failure: Total heating loss during freezing weather, especially with vulnerable household members
  • Electrical Safety Concerns: Visible damage to electrical connections or repeated circuit breaker trips

Non-Emergency Situations

  • Intermittent Hot Water: Reduced hot water flow that doesn't affect heating
  • Minor Efficiency Issues: Slightly increased energy bills or longer heating times
  • Cosmetic Problems: Discoloration or minor exterior damage not affecting operation
  • Scheduled Maintenance: Annual servicing and routine inspections

Comprehensive Boiler Repair and Maintenance Services

Diagnostic and Repair Expertise

Modern boiler repair Woking services employ advanced diagnostic techniques ensuring accurate problem identification and effective repairs:

Advanced Diagnostic Equipment

Professional boiler engineers utilize sophisticated testing equipment:

  • Gas Pressure Analyzers: Precise measurement of gas supply pressures and flow rates
  • Flue Gas Analyzers: Combustion efficiency testing and emissions monitoring
  • Digital Multimeters: Electrical circuit testing and component verification
  • Pressure Testing Equipment: System pressure testing and leak detection
  • Thermal Imaging Cameras: Heat distribution analysis and component temperature monitoring

Repair Specializations

Qualified engineers handle comprehensive repair requirements:

Combi Boiler Repairs: Specialized knowledge of combination boiler systems popular in Woking properties, including compact units suitable for smaller homes and apartments.

System Boiler Maintenance: Expertise in pressurized system boilers with separate hot water cylinders, common in larger Woking properties.

Regular Boiler Servicing: Traditional boiler systems with separate tanks and cylinders requiring specialized maintenance approaches.

HP Heating Integration: Modern heat pump systems requiring specialized diagnostic and repair knowledge as Woking homeowners increasingly adopt sustainable heating solutions.

Preventive Maintenance Programs

Regular maintenance prevents many emergency boiler repair near me situations while extending equipment lifespan and maintaining efficiency:

Annual Boiler Servicing Benefits

Professional annual servicing provides multiple advantages:

  • Safety Assurance: Gas safety checks ensuring proper combustion and flue operation
  • Efficiency Optimization: Cleaning and adjustment procedures maintaining peak performance
  • Early Problem Detection: Identifying developing issues before they cause breakdowns
  • Warranty Compliance: Meeting manufacturer servicing requirements for warranty protection
  • Cost Savings: Preventing expensive emergency repairs through proactive maintenance

Maintenance Schedule Recommendations

Pre-Winter Servicing: September/October servicing ensures reliable heating during peak demand periods.

Post-Winter Inspection: Spring checks identify any winter-related wear or damage requiring attention.

Mid-Year Efficiency Review: Summer servicing allows thorough cleaning and optimization without heating disruption.

Component Replacement Planning: Proactive replacement of aging components before failure occurs.

HP Heating Systems: Modern Solutions for Woking Properties

As environmental consciousness grows, many Woking homeowners consider HP heating systems as sustainable alternatives to traditional gas boilers. Professional boiler repair Woking specialists increasingly provide HP heating installation, maintenance, and repair services.

Understanding HP Heating Technology

Heat pump systems offer environmental benefits and long-term cost savings, but require specialized knowledge for effective maintenance and repair:

Air Source Heat Pump Systems

Air source HP heating extracts ambient heat from external air, even during cold Surrey winters:

Efficiency Advantages: Modern air source systems achieve 300-400% efficiency ratings, significantly exceeding traditional boiler performance.

Installation Flexibility: Suitable for most Woking property types without extensive groundwork requirements.

Integration Capability: Compatible with existing radiator systems and underfloor heating installations.

Government Incentives: Renewable Heat Incentive payments and grants available for qualifying installations.

Ground Source Heat Pump Solutions

Ground source systems utilize stable underground temperatures for consistent heating performance:

Superior Efficiency: Ground source systems typically achieve higher efficiency ratings than air source alternatives.

Long-term Reliability: Underground loop systems provide decades of reliable operation with minimal maintenance.

Space Requirements: Suitable for properties with adequate garden space for ground loop installation.

Enhanced Comfort: Consistent temperature delivery and quiet operation compared to traditional boilers.

HP Heating Maintenance and Repair

Professional HP heating systems require specialized maintenance approaches:

Refrigerant System Checks: Regular inspection of refrigerant levels and system pressures ensuring optimal performance.

Heat Exchanger Maintenance: Cleaning and inspection of heat exchange components preventing efficiency degradation.

Control System Calibration: Electronic control system optimization ensuring accurate temperature regulation.

Defrost Cycle Verification: Air source system defrost cycle testing ensuring reliable winter operation.

Choosing Professional Boiler Repair Services in Woking

Essential Qualifications and Certifications

Reputable boiler repair Woking professionals maintain current qualifications ensuring safe, effective service:

Gas Safe Registration

All gas boiler work requires Gas Safe registered engineers:

  • Legal Requirement: Gas work by unregistered engineers is illegal and dangerous
  • Insurance Compliance: Home insurance policies typically require Gas Safe certified work
  • Safety Assurance: Registered engineers undergo rigorous training and regular assessment
  • Warranty Protection: Manufacturer warranties often require Gas Safe certified installation and maintenance

Professional Insurance Coverage

Comprehensive insurance protection covers both customers and contractors:

  • Public Liability Insurance: Protection against accidental property damage during repair work
  • Professional Indemnity Coverage: Financial protection for workmanship issues
  • Equipment Insurance: Coverage for expensive diagnostic and repair equipment
  • Employee Protection: Comprehensive coverage for all engineering staff

Service Quality Indicators

Quality boiler repair near me services demonstrate professionalism through multiple indicators:

Transparent Pricing Structure

Professional services provide clear, honest pricing:

  • Fixed-Rate Diagnostics: Predetermined fees for initial assessment and fault diagnosis
  • Parts and Labor Breakdown: Detailed quotations separating material and labor costs
  • No Hidden Charges: Transparent pricing without unexpected additional fees
  • Written Estimates: Formal quotations for all significant repair work

Comprehensive Warranties

Quality repairs include meaningful warranty protection:

  • Workmanship Guarantees: Warranties on installation and repair work
  • Parts Warranties: Manufacturer warranties on replacement components
  • System Performance Guarantees: Assurance of proper operation following repairs
  • Call-back Protection: Free return visits for warranty-related issues

Boiler Replacement vs. Repair: Making Informed Decisions

When Repair Makes Financial Sense

Boiler repair Woking specialists help homeowners make informed decisions about repair versus replacement:

Cost-Effective Repair Scenarios

  • Minor Component Failures: Single component replacement in otherwise reliable systems
  • Regular Maintenance Issues: Problems resulting from deferred maintenance rather than equipment failure
  • Warranty Coverage: Repairs covered under manufacturer or extended warranties
  • Recent Installation: Boilers less than 5-7 years old with isolated problems
  • High-Quality Systems: Premium boiler brands with good long-term reliability records

Replacement Recommendations

Certain situations favor boiler replacement over continued repairs:

Replacement Indicators

  • Frequent Breakdowns: Multiple repairs within short time periods indicating systemic problems
  • Efficiency Degradation: Significant increases in energy costs despite regular maintenance
  • Parts Availability: Obsolete models with limited spare parts availability
  • Safety Concerns: Older systems with potential safety risks or compliance issues
  • Technology Upgrades: Opportunities to install modern efficient systems or HP heating solutions

Cost Considerations and Budgeting

Typical Repair Costs in Woking

Boiler repair near me costs vary depending on problem complexity and component requirements:

Common Repair Price Ranges

  • Basic Diagnostic Fees: £75-£120 for initial assessment and fault identification
  • Minor Component Replacement: £150-£300 for simple parts like thermostats or sensors
  • Major Component Repairs: £300-£800 for heat exchanger, pump, or valve replacement
  • Emergency Call-out Charges: Additional £50-£100 for out-of-hours emergency response
  • Annual Servicing: £80-£150 for comprehensive maintenance and safety checks

Long-term Value Considerations

Professional repair services provide excellent long-term value through:

  • Extended Equipment Life: Quality repairs extending boiler operational lifespan
  • Improved Efficiency: Proper maintenance optimizing fuel consumption and reducing bills
  • Reduced Emergency Costs: Preventive maintenance avoiding expensive emergency repairs
  • Enhanced Safety: Professional servicing ensuring safe, compliant operation
  • Property Value Protection: Well-maintained heating systems supporting property values

Future-Proofing Your Heating System

Smart Heating Technology Integration

Modern heating systems increasingly feature smart technology capabilities:

Smart Thermostat Benefits

  • Remote Temperature Control: Smartphone apps enabling heating control from anywhere
  • Learning Algorithms: Automatic schedule optimization based on household patterns
  • Energy Usage Monitoring: Detailed consumption tracking for cost management
  • Integration Capability: Compatibility with smart home systems and voice control
  • Geofencing Features: Automatic heating adjustment based on occupancy detection

Environmental Considerations

Sustainable heating solutions become increasingly important for Woking homeowners:

Green Technology Options

  • HP Heating Systems: Renewable energy heating reducing carbon footprints
  • Hybrid Systems: Combination gas boiler and heat pump installations
  • Solar Integration: Solar thermal systems supporting hot water heating
  • High-Efficiency Boilers: Modern condensing boilers achieving 90%+ efficiency ratings
  • Smart Controls: Advanced control systems optimizing energy consumption

Conclusion

Professional boiler repair Woking services provide essential expertise ensuring reliable, safe, and efficient heating for Surrey homes. Whether you need emergency repairs, routine maintenance, or guidance on modern HP heating systems, choosing qualified local engineers delivers quality results and long-term peace of mind.

Remember that regular maintenance prevents most emergency situations while extending equipment life and maintaining efficiency. When searching "boiler repair near me" during heating emergencies, professional local services provide rapid response and expert solutions you can trust.

For all your heating needs in Woking and surrounding areas, from emergency boiler repairs to HP heating installations, professional expertise ensures your home remains warm, comfortable, and energy-efficient throughout every season.

Discussion (0)1
Log in or sign up to continue
InterSystems Official
· Jul 29

官方公告:InterSystems IRIS 2025.2 引入 IRISSECURITY

InterSystems IRIS 2025.2 引入了 IRISSECURITY 数据库,用于存储安全数据。 与之前用于存储安全数据的数据库 IRISSYS 不同,IRISSECURITY 支持加密,可以保护静态敏感数据。 在今后的版本中,IRISSECURITY 将可实现镜像。

此版本还引入了可以执行常规安全管理任务的 %SecurityAdministrator 角色。

本文中介绍的更改将影响持续交付 (CD) 和扩展维护 (EM) 版本通道。 也就是说,从版本 2025.2(CD,于 2025 年 7 月 23 日发布)和 2026.1 (EM) 开始,InterSystems IRIS 将包含 IRISSECURITY 数据库,并且在升级时,所有安全数据会自动从 IRISSYS 迁移到 IRISSECURITY。

虽然 InterSystems IRIS 2025.2 预计于 2025 年 7 月 23 日发布,但我们暂缓了 InterSystems IRIS for Health 和 HealthShare Health Connect 2025.2 的公开发布,原因是我们正在着手完成针对已知镜像问题的修复计划,该问题会影响 OAuth 配置数据。

升级须知

IRISSECURITY 对用户与安全数据的交互方式做出了多处可能导致功能中断的更改:

  • 用户无法再直接访问安全global,而必须使用各种安全类提供的 API。
  • OAuth2  Global无法再映射到其他数据库。
  • 用户无法再随意查询安全表,即使在 SQL 安全已禁用的情况下也是如此。
  • 系统数据库现在使用的预定义资源无法更改。 在 Unix 上,如果为之前版本的系统数据库创建并指定了新资源,在升级时,该新资源将被预定义资源替代(但如果有任何角色引用了非默认资源,则必须手动将其更改为使用默认资源,以保持数据库访问权限)。 在 Windows 上,必须将资源更改回默认资源。 如果您尝试在 Windows 上升级,而数据库具有非默认资源,升级将停止(实例不会修改),并会显示错误消息“Database must have a resource label of…”

以下各部分将详细介绍这些更改,以及在您依赖原始行为的情况下应采取的替代措施,但总体而言,在您进行升级之前,应当验证并测试您的应用程序和宏:

  • 使用提供的安全 API 管理安全功能(而非直接访问global)。
  • 拥有使用这些 API 所必需的权限(%DB_IRISSYS:RAdmin_Secure:U)。

Global 访问

之前,当安全global存储在 IRISSYS 数据库中时,用户可以通过以下权限访问安全数据:

  • %DB_IRISSYS:R:直接读取和通过安全 API 读取安全global。
  • %DB_IRISSYS:RW:读取和写入安全global。
  • %DB_IRISSYS:RWAdmin_Secure:U:通过安全 API 管理安全功能。

在 InterSystems IRIS 2025.2 中:

  • 用户无法再直接访问安全global。
  • %DB_IRISSYS:R%Admin_Secure:U 这两个权限是访问安全数据(通过提供的安全 API)以及通过各种安全类管理安全功能所需的最低权限。
  • 对于常规安全管理,您可以使用新的 %SecurityAdministrator 角色。
  • 已移除对安全数据的只读访问权限(之前可以通过 %DB_IRISSYS:R 实现)。

Global 存储位置

在 InterSystems IRIS 2025.2 中,以下安全global已从 IRISSYS 迁移到 IRISSECURITY 中的 ^SECURITY

  • ^SYS("SECURITY")
  • ^OAuth2.*
  • ^PKI.*
  • ^SYS.TokenAuthD

下表列出了已迁移的最关键的global及其安全类、原存储位置和新存储位置:

安全类 原存储位置 (IRISSYS) 新存储位置 (IRISSECURITY)
不适用 ^SYS("Security","Version") ^SECURITY("Version")
Security.Applications ^SYS("Security","ApplicationsD") ^SECURITY("ApplicationsD")
Security.DocDBs ^SYS("Security","DocDBsD") ^SECURITY("DocDBsD")
Security.Events ^SYS("Security","EventsD") ^SECURITY("EventsD")
Security.LDAPConfigs ^SYS("Security","LDAPConfigsD") ^SECURITY("LDAPConfigsD")
Security.KMIPServers ^SYS("Security","KMIPServerD") ^SECURITY("KMIPServerD")
Security.Resources ^SYS("Security","ResourcesD") ^SECURITY("ResourcesD")
Security.Roles ^SYS("Security","RolesD") ^SECURITY("RolesD")
Security.Services ^SYS("Security","ServicesD") ^SECURITY("ServicesD")
Security.SSLConfigs ^SYS("Security","SSLConfigsD") ^SECURITY("SSLConfigsD")
Security.System ^SYS("Security","SystemD") ^SECURITY("SystemD")
Security.Users ^SYS("Security","UsersD") ^SECURITY("UsersD")
%SYS.PhoneProviders ^SYS("Security","PhoneProvidersD") ^SECURITY("PhoneProvidersD ")
%SYS.X509Credentials ^SYS("Security","X509CredentialsD") ^SECURITY("X509CredentialsD ")
%SYS.OpenAIM.IdentityServices ^SYS("Security","OpenAIMIdentityServersD") ^SECURITY("OpenAIMIdentityServersD")
OAuth2.AccessToken ^OAuth2. AccessTokenD ^SECURITY("OAuth2.AccessToken ")
OAuth2.Client ^OAuth2.ClientD ^SECURITY("OAuth2.Client")
OAuth2.ServerDefinition ^OAuth2.ServerDefinitionD ^SECURITY("OAuth2.ServerDefinitionD")
OAuth2.Client.MetaData ^OAuth2.Client.MetaDataD ^SECURITY("OAuth2.Client.MetaDataD")
OAuth2.Server.AccessToken ^OAuth2.Server.AccessTokenD ^SECURITY("OAuth2.Server.AccessTokenD")
OAuth2.Server.Client ^OAuth2.Server.ClientD ^SECURITY("OAuth2.Server.ClientD")
OAuth2.Server.Configuration ^OAuth2.Server.ConfigurationD ^SECURITY("OAuth2.Server.ConfigurationD")
OAuth2.Server.JWTid ^OAuth2.Server.JWTidD ^SECURITY("OAuth2.Server.JWTidD")
OAuth2.Server.Metadata ^OAuth2.Server.MetadataD ^SECURITY("OAuth2.Server.MetadataD")
PKI.CAClient ^PKI.CAClientD ^SECURITY("PKI.CAClient")
PKI.CAServer ^PKI.CAServerD ^SECURITY("PKI.CAServer")
PKI.Certificate ^PKI.CertificateD ^SECURITY("PKI.Certificate")
%SYS.TokenAuth ^SYS.TokenAuthD ^SECURITY("TokenAuthD")

OAuth2 Global 映射

之前,可以将 OAuth2 Global映射到其他数据库,从而可以镜像 OAuth2 配置。

在 InterSystems IRIS 2025.2 中,无法再映射 OAuth2 global,且不能镜像 IRISSECURITY。 如果您过去依赖此行为进行镜像,可以使用以下任何替代方法:

  • 手动对主节点和故障转移节点进行更改。
  • 从主节点导出设置,然后将其导入到故障转移节点(需要 % ALL 权限)。

导出 OAuth2 配置数据:

set items = $name(^|"^^:ds:IRISSECURITY"|SECURITY("OAuth2"))_".gbl"
set filename = "/home/oauth2data.gbl"
do $SYSTEM.OBJ.Export(items,filename)

导入 OAuth2 配置数据:

do $SYSTEM.OBJ.Import(filename)

SQL 安全

之前,SQL 安全由 CPF 参数 DBMSSecurity 控制。 当 DBMSSecurity 禁用时,拥有 SQL 权限的用户可以随意查询数据库中的所有表。

在 InterSystems IRIS 2025.2 中:

  • DBMSSecurity CPF 参数已被替换为系统范围的 SQL 安全属性。 可以通过多种方式对此进行设置:
    • 管理门户:System Administration > Security > System Security > System-wide Security Parameters > Enable SQL security(系统管理 > 安全 > 系统安全 > 系统范围的安全参数 > 启用 SQL 安全)
    • SetOption##class(%SYSTEM.SQL.Util).SetOption("SQLSecurity", "1")
    • Security.System.Modify: ##Class(Security.System).Modify(,.properties),其中,properties 为 properties("SQLSecurity")=1
  • 安全表(security table)现只能通过 Detail 和 List API 进行查询,即使在 SQL 安全处于禁用状态的情况下,也需要同时具有 %DB_IRISSYS:R%Admin_Secure:U 权限才能进行查询。

例如,要获取角色列表,无法再直接查询 Security.Roles 表, 而应使用 Security.Roles_List() 查询:

SELECT Name, Description FROM Security.Roles_List()

加密 IRISSECURITY

要加密 IRISSECURITY,请按以下步骤操作:

  1. 创建新的加密密钥。 转到 System Administration > Encryption > Create New Encryption Key File(系统管理 > 加密 > 创建新的加密密钥文件),并指定以下设置:
    • Key File(密钥文件)– 加密密钥的名称。
    • Administrator Name(管理员名称)– 管理员的名称。
    • Password(密码)– 密钥文件的密码。
  2. 激活加密密钥。 转到 System Administration > Encryption > Database Encryption(系统管理 > 加密 > 数据库加密),并选择 Activate Key(激活密钥),指定第 1 步中的 Key File(密钥文件)、Administrator Name(管理员名称)和 Password(密码)。
  3. 转到 System Administration > Encryption > Database Encryption(系统管理 > 加密 > 数据库加密),并选择 Configure Startup Settings(配置启动设置)。
  4. Key Activation at Startup(启动时的密钥激活)下拉菜单中选择一种密钥激活方法。 InterSystems 强烈建议选择 Interactive(交互式)密钥激活。
  5. Encrypt IRISSECURITY Database(加密 IRISSECURITY 数据库)下拉列表中,选择 Yes(是)。
  6. 重新启动系统,以加密 IRISSECURITY。

百分比类(那些类名以%开头的类,可以在任何命名空间访问)访问规则

之前版本的 InterSystems IRIS 中,管理 Web 应用程序对附加百分比类的访问权限的过程涉及到对安全global进行写入操作。 在 InterSystems IRIS 2025.2 中,可以通过管理门户或 ^SECURITY 例程完成此过程。

管理门户(Management Portal)

通过管理门户创建百分比类访问规则:

  1. 转到 System Administration > Security > Web Applications(系统管理 > 安全 > Web 应用程序)。
  2. 选择您的 Web 应用程序。
  3. Percent Class Access(百分比类访问)选项卡中设置以下选项:
    • Type(类型):控制该规则是仅适用于应用程序对指定百分比类的访问 (AllowClass),还是适用于包含指定前缀的所有类 (AllowPrefix)。
    • Class name(类名称):允许应用程序访问的百分比类或前缀。
    • Allow access(允许访问):是否允许应用程序访问指定的百分比类或软件包。
    • Add this same access to ALL applications(为所有应用程序添加相同的访问权限):是否为所有应用程序应用此规则。

^SECURITY

通过 ^SECURITY 例程创建类访问规则:

  1. 在 %SYS 命名空间中,运行 ^SECURITY 例程:
    DO ^SECURITY
  2. 选择选项 5, 1, 8, 和 1,以输入类访问规则提示。
  3. 按照提示指定以下内容:
    • Application?(应用程序?)– 应用程序名称。
    • Allow type?(允许类型?)– 该规则是适用于应用程序访问特定类 (AllowClass) 还是访问包含指定前缀的所有类 (AllowPrefix)。
    • Class or package name?(类或软件包名称?)– 允许应用程序访问的类或前缀。
    • Allow access?(允许访问?)– 是否允许应用程序访问指定类或软件包。
Discussion (0)0
Log in or sign up to continue