Tengo una tabla volatilitysurface y una tabla de detalles volatilitysurface_smile como parte de la tabla de detalles. Defino una clave externa para la tabla maestra, es decir.

volatilitysurface::([date:`datetime$(); ccypair:`symbol$()] atm_convention:`symbol$(); ...);
volatilitysurface_smile::([...] volatilitysurface:`volatilitysurface$(); ...);

Cuando intento usar AquaQ's TorQ .loader.loadallfiles para cargar la tabla de detalles {{ X0}} Necesito como parte de la función "dataprocessfunc" para construir dinámicamente el campo de clave externa, es decir

rawdatadir:hsym `$("" sv (getenv[`KDBRAWDATA]; "volatilitysurface_smile"));
.loader.loadallfiles[`headers`types`separator`tablename`dbdir`partitioncol`partitiontype`dataprocessfunc!(`x`ccypair...;"ZS...";enlist ",";`volatilitysurface_smile;target;`date;`month;{[p;t] select date,ccypair,volatilitysurface,... from update date:x,volatilitysurface:`volatilitysurface$(x,'ccypair) from t}); rawdatadir];

Tenga en cuenta la parte:

update date:x,volatilitysurface:`volatilitysurface$(x,'ccypair) from t

El error de transmisión apunta a la construcción de la clave volatilitysurface. Sin embargo, esto funciona fuera de .loader.loadallfiles y las tablas están globalmente :: y completamente definidas antes de llamar a la función .loader.loadallfiles.

¿Alguna idea de cómo lidiar con este caso de uso? Si no se inicializa la clave externa de la tabla de detalles, la inserción fallará.

2
SkyWalker 20 nov. 2017 a las 18:21

2 respuestas

La mejor respuesta

El error puede deberse al alcance de la actualización. A medida que ejecuta el lanzamiento / actualización dentro del espacio de nombres .loader, el nombre de la tabla debería tener un alcance completo (`..volatilitysurface).

P.ej. update date:x,volatilitysurface:`..volatilitysurface$(x,'ccypair) from t

Saludos

Scott

1
Scott 21 nov. 2017 a las 09:43

¿Está seguro de que todas las combinaciones posibles x & ccypair están en la tabla de superficie de volatilidad? El error 'cast parecería sugerir que este no es el caso, p. Ej.

q)t:([a:1 2 3;b:`a`b`c] c:"ghi")
q)update t:`t$(a,'b) from ([] a:2 3 1;b:`b`c`a)
a b t
-----
2 b 1
3 c 2
1 a 0
q)update t:`t$(a,'b) from ([] a:2 3 1 5;b:`b`c`a`d)
'cast
  [0]  update t:`t$(a,'b) from ([] a:2 3 1 5;b:`b`c`a`d)
              ^

Tenga en cuenta que en el segundo caso tengo el par a-b de (5;`d), que no está presente en la tabla t, por lo que aparece el error 'cast

Puede determinar si faltan claves y cuáles son, así:

q)all (exec (a,'b) from ([] a:2 3 1;b:`b`c`a)) in key t                //check for presence, all present
1b
q)all (exec (a,'b) from ([] a:2 3 1 5;b:`b`c`a`d)) in key t            //check for presence, not all present
0b
q)k where not (k:exec (a,'b) from ([] a:2 3 1 5;b:`b`c`a`d)) in key t  //check which keys AREN'T present
5 `d

Si este es el caso, supongo que tienes dos opciones:

  • Asegúrese de que la tabla de superficie de volatilidad esté cargada correctamente; suponiendo que tenga una cobertura de datos completa en sus archivos, presumiblemente todas las claves posibles deberían estar presentes en esta tabla
  • Si existe la posibilidad de que posiblemente las claves no estén presentes en la tabla volatilitysurface, tal vez podría agregarle registros ficticios antes de hacer la clave externa (que podría reemplazarse si un registro real llega más tarde

La segunda opción quizás podría funcionar de esta manera:

q.test){if[count k:k where not (k:exec (a,'b) from x) in key `..t;@[`..t;;:;value[`..t](0N;`)]'[k]];update t:`t$(a,'b) from x}([] a:2 3 1;b:`b`c`a)
a b t
-----
2 b 1
3 c 2
1 a 0
q.test){if[count k:k where not (k:exec (a,'b) from x) in key `..t;@[`..t;;:;value[`..t](0N;`)]'[k]];update t:`t$(a,'b) from x}([] a:2 3 1 5 6;b:`b`c`a`d`e)
a b t
-----
2 b 1
3 c 2
1 a 0
5 d 3
6 e 4
q.test)value `..t //check table t, new dummy records added by previous call
a b| c
---| -
1 a| g
2 b| h
3 c| i
5 d|
6 e|

Hice estas pruebas dentro de un espacio de nombres, ya que así es como se ejecutará la función de proceso de datos en TorQ (es decir, en ciertos lugares debe usar `..t para acceder a t en el espacio de nombres raíz). La versión análoga de esta función para su configuración (con un formato más agradable que los de una línea anterior) sería algo como:

{
  if[count k:k where not (k:exec (x,'ccypair from volatilitysurface_smile) in key `..volatilitysurface;  //check for missing keys
  @[`..volatilitysurface;;:;value[`..volatilitysurface](0Nz;`)]'[k]];  //index into null key of table to get dummy record and upsert to global volatilitysurface table
  update volatilitysurface:`volatilitysurface$(x,'ccypair) from x  //create foreign key
 }
1
Jonathon McMurray 22 nov. 2017 a las 10:00