Escrito por

Sales Engineer at InterSystems Iberia
Artículo Luis Angel Pérez Ramos · mayo 29, 2024 3m read

Uso de VECTORES en ObjectScript

La mayoría de los ejemplos que he visto hasta ahora en OEX o DC dejan la impresión de que los VECTORES son sólo algo disponible con SQL con las 3 Funciones especialmente alrededor de VECTOR_Search.
* TO_VECTOR()
* VECTOR_DOT_PRODUCT ()
* VECTOR_COSINE ()

Hay un resumen muy útil escondido en el paquete de demostración iris-vector-search.
Desde allí encontraréis todo lo que necesitáis en varios enlaces y rincones.

Me faltaban más métodos VECTOR y añadí una solicitud al respecto en el Portal de Ideas.
 
Luego recordé que cada método o procedimiento SQL se basa en un montón de código ObjectScript.
Así que fui a buscarlo y este es el resumen de la investigación.
%Library.Vector es la descripción básica del nuevo DataType (tipo de datos).
Es una estructura compleja como Objects o %DynamicObjects o $Bit Expressions que requieren métodos de acceso específicos.
También vemos 2 parámetros requeridos: 

* DATATTYPE  - una vez configurado no se puede cambiar.
 Tipos aceptados:  "integer" (o "int"), "double", "decimal", "string" y "timestamp".
* LEN >0 , puede crecer pero nunca reducirse.
$vector() / &ve() es el método básico para el acceso al Vector.
Asignar Datos Vectoriales  >>>  SET $VE(. . .) = val
Devolver Datos Vectoriales  >>>  WRITE $VE(. . .) ,  SET var=$VE(. . .) 
  ¡SUGERENCIA: una sola posición devuelve el valor, pero la posición from::to devuelve otro Vector!
Eliminar Datos Vectoriales >>>  KILL $VE(. . .) 

Los 3 requieren al menos 1 parámetro de Posición. Podéis entender esto como dimensiones.

$isvector() la verificación obvia del formato correcto antes de comenzar las operaciones.

$vectorop() / $vop() cubre todas las demás funciones relacionadas con los vectores.
Los parámetros de llamada suelen ser (operación, vector)
Algunas operaciones ofrecen opcionalmente un bitexpr. Marca posiciones/dimensiones a excluir/incluir.
Ejemplo:
- Pensad en un vector 3D. Solo se desea operar en los ejes x e y, no en z.

Operaciones de un solo vector

Operaciones Agregadas
 * "count"
 * "max"
 * "min"
 * "sum"
Operaciones de filtrado
 * "defined"
 * "undefined"
 * "<"
 * "<="
 * ">"
 * ">="
 * "="
 * "!="
 * "between"
Operaciones Numéricas
 * "+"
 * "-"
 * "/"
 * "*"
 * "**"
 * "#"
 * "e-"
 * "e/"
 * "ceiling"
 * "floor"
Operaciones de String
 * "_"
 * "e_"
 * "lower"
 * "upper"
 * "substring"
 * "trim"
 * "triml"
 * "trimr"
Operaciones de Agrupación
 * "group"
 * "countgb"
Operaciones Diversas
 * "convert"
 * "length"
 * "mask"
 * "positions"
 * "set"
Operaciones Informativas
 * "bytesize"
 * "type"

Operaciones multivectoriales (normalmente 2 vectores)

Operaciones de Filtrado Vectorial
 * "v<"
 * "v<="
 * "v>"
 * "v>="
 * "v="
 * "v!="
Operaciones Aritméticas Vectoriales
 * "v+"
 * "v-"
 * "v/"
 * "v*"
 * "v**"
 * "v#"
Concatenación de vectores
 * "v_"
Agrupación de Vectores
 * "countg"
 * "maxg"
 * "ming"
 * "sumg"
Fusión de Vectores
 * "vset"

Ya veis que hay un rico conjunto de herramientas disponibles. Si se estudian los documentos en detalle, el propósito o la ventaja de los resultados puede que no sean evidentes de inmediato. No obstante, espero que os hayáis hecho una idea general de lo que hay disponible ahora.