给定一个现有的 table,生成用于定义具有相同模式的空 table 的代码

Given an existing table, generate code for defining an empty table with the same schema

我想获取从二进制文件反序列化或从远程进程获得的现有 table,并生成将创建 table 的空副本的代码,以便我可以具有人类可读的模式表示,我可以使用它轻松地重新创建 table.

例如,假设我在内存中有一个 trade table,并且我想生成的代码将 return 一个相同模式的空 table。

q)show meta trade
c    | t f a
-----| -----
time | n    
sym  | s   g
price| f    
size | i    
stop | b    
cond | c    
ex   | c    

我知道我可以通过 运行 0#trade 获得 trade 的空副本。但是,我想要一个通用函数(假设它称为 getSchema),它的行为类似于:

q) getSchema trade
"trade:([]time:`timespan$(); sym:`g#`symbol$(); price:`float$(); size:`int$(); stop:`boolean$(); cond:`char$(); ex:`char$())"  

我认为通过处理 meta trade 的结果来实现它会很简单,但我想知道是否有更直接或公开可用的此函数的实现。谢谢。

我还没有在 public 中看到这样的功能。下面是一个例子,但它并没有涵盖所有情况(留给练习)

getSchema: {
    typeMapping: "nsfibc"!("timespan";"symbol";"float";"int";"boolean";"char");
    c: exec c from meta x;
    t: exec t from meta x;
    statement: string[x],":([]";
    statement,: "; " sv string[c],'": `",/:(typeMapping@t),\:"$()";
    statement,: ")";
    statement
};

//Expects table's name as symbol
getSchema`trade

未涵盖的内容:

  • attributes:属性应该放在 "; " sv string[c],'": _code_for_attribute_ `",/:(typeMapping@t),\:"$()" 语句的中间
  • typestypeMapping 必须充实以涵盖 Q types
  • 的其余部分
  • keys。如果 table 是键控的,则键控列列在方括号 t: ([keyed_columns] other_columns)
  • foreign keys。公平地说,它们很少被使用,所以我会忽略它们

以下内容应该可以很好地工作,但是它只会呈现类型原子类型,这将符合表的通常定义方式。此方法仅利用您可以通过 -3!

实现的空模式的字符串表示形式

这应该处理键控表和属性,但不处理外键。

getSchema:{[x]
    / Render the types with -3!
    typs:ssr[-3!value flip 0!0#get x;"\"\"";"`char$()"];
    / Append the column names to the types 
    colNameType:(string[cols 0!get x],\:":"),'";" vs 1_-1_typs;
    / Ensure the correct keys are shown, add in ;
    colnametyp:@[colNameType;count[keys x] - 1;,;"]"],\:";";
    / Combine
    raze string[x],":([",(-1_raze colnametyp),")"
 }

q)trade:2!([]time:`timespan$(); sym:`g#`symbol$(); price:`float$(); size:`int$(); stop:`boolean$(); cond:`char$(); ex:`char$());
q)getSchema `trade
"trade:([time:`timespan$();sym:`g#`symbol$()];price:`float$();size:`int$();stop:`boolean$();cond:`char$();ex:`char$())"