Artículo
· 16 ago, 2023 Lectura de 3 min

Creación de clases/tablas con más de 999 propiedades en InterSystems IRIS

InterSystems IRIS actualmente limita sus clases a 999 propiedades.

Pero, ¿qué hacer si necesita almacenar más datos por objeto?

Este artículo respondería a esta pregunta (con el apunte adicional de Community Python Gateway y cómo transferir conjuntos de datos amplios a Python).

En realidad, la respuesta es muy simple: InterSystems IRIS actualmente limita las clases a 999 propiedades, pero no a 999 primitivas. La propiedad en InterSystems IRIS puede ser un objeto con 999 propiedades y así sucesivamente; el límite se puede ignorar fácilmente.

Enfoque 1.

Almacene 100 propiedades por propiedad serial. Primero cree una clase almacenada que almacene cien propiedades.

Class Test.Serial Extends %SerialObject
{

Property col0;
...
Property col99;
}

Y en su clase principal agregue tantas propiedades como necesite:

Class Test.Record Extends %Persistent
{
Property col00 As Test.Serial;

Property col01 As Test.Serial;
...

Property col63 As Test.Serial;
}

Esto eleva inmediatamente su límite a 99900 propiedades.

Este enfoque ofrece acceso uniforme para todas las propiedades a través de SQL y Objetos (siempre conocemos la referencia de la propiedad por su número).

Enfoque 2.

Una propiedad $lb.

Class Test.Record Extends %Persistent
{
Property col As %List;
}

Este enfoque es más simple pero no proporciona nombres de columna explícitos.

Use las funciones SQL $LIST* para acceder a los elementos de la lista.

Enfoque 3.

Utilice la propiedad Collection (List Of/Array Of).

Class Test.Record Extends %Persistent
{
Property col As List Of %Integer;
}

Este enfoque tampoco proporciona nombres de columna explícitos para valores individuales (pero, ¿realmente lo necesita?). Utilice parámetros de propiedad para proyectar la propiedad como columna/tabla SQL

Documentación para las propiedades de colección.

Enfoque 4.

No cree propiedades en absoluto y expóngalas mediante el procedimiento almacenado SQL/%DispatchGetProperty.

Class Test.Record Extends %Persistent
{

Parameter GLVN = {..GLVN("Test.Record")};

/// SELECT Test_Record.col(ID, 123) 
/// FROM Test.Record
///
/// w ##class(Test.Record).col(1, )
ClassMethod col(id, num) As %Decimal [ SqlProc ]
{
    #define GLVN(%class) ##Expression(##class(Test.Record).GLVN(%class))
    quit $lg($$$GLVN("Test.Record")(id), num + 1)
}

/// Refer to properties as: obj.col123 
Method %DispatchGetProperty(Property As %String) [ CodeMode = expression ]
{
..col(..%Id(), $e(Property, 4, *))
}


/// Get data global
/// w ##class(Test.Record).GLVN("Test.Record")
ClassMethod GLVN(class As %Dictionary.CacheClassname = {$classname()}) As %String
{
    return:'$$$comClassDefined(class) ""
    set strategy = $$$comClassKeyGet(class, $$$cCLASSstoragestrategy)
    return $$$defMemberKeyGet(class, $$$cCLASSstorage, strategy, $$$cSDEFdatalocation)
}

El truco aquí es almacenar todo en el $lb principal y usar espacios de almacenamiento no asignados para almacenar sus datos. Aquí hay un artículo sobre el almacenamiento global.

Con este enfoque, también puede transferir fácilmente los datos al entorno de Python con Community Python Gateway a través del método ExecuteGlobal.

Esta es también la forma más rápida de importar archivos CSV debido a la similitud de las estructuras

Conclusión

El límite de propiedad de 999 se puede ampliar fácilmente en InterSystems IRIS.

¿Conoce otros enfoques para almacenar conjuntos de datos amplios? Si es así, ¡compártelos!

Comentarios (0)1
Inicie sesión o regístrese para continuar