给定一个现有的 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),\:"$()"
语句的中间
types
:typeMapping
必须充实以涵盖 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$())"
我想获取从二进制文件反序列化或从远程进程获得的现有 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),\:"$()"
语句的中间types
:typeMapping
必须充实以涵盖 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$())"