dolphindb 2.0.600 → 2.0.603

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -123,6 +123,15 @@ export interface DdbChartValue {
123
123
  /** original: chartType */
124
124
  type: DdbChartType;
125
125
  stacking: boolean;
126
+ /** 直方图 (Histogram), plotHist 函数返回的 chart 可能具有该属性
127
+ 原属性 binStart
128
+ 数值类型的 DdbObj 都有可能?
129
+ */
130
+ bin_start?: DdbObj;
131
+ /** 原属性 binEnd */
132
+ bin_end?: DdbObj;
133
+ /** 原属性 binCount */
134
+ bin_count?: DdbObj;
126
135
  titles: {
127
136
  chart: string;
128
137
  x_axis: string;
@@ -229,7 +238,10 @@ export declare class DdbObj<T extends DdbValue = DdbValue> {
229
238
  deep?: boolean;
230
239
  }): T;
231
240
  }
241
+ /** Formats a single element (value) as a string according to DdbType, null returns a 'null' string */
232
242
  export declare function format(type: DdbType, value: DdbValue, le: boolean, options: InspectOptions): string;
243
+ /** formatted vector, the index-th item in the collection is a string, a null value returns a 'null' string */
244
+ export declare function formati(obj: DdbObj<DdbVectorValue>, index: number, options: InspectOptions): string;
233
245
  export declare class DdbVoid extends DdbObj<undefined> {
234
246
  constructor();
235
247
  }
@@ -379,9 +391,11 @@ export declare class DDB {
379
391
  print_object_buffer: boolean;
380
392
  print_message: boolean;
381
393
  parse_object: boolean;
394
+ pnode_run_defined: boolean;
382
395
  /** DdbMessage listeners */
383
396
  listeners: DdbMessageListener[];
384
397
  pconnect: Promise<void>;
398
+ ppnoderun: Promise<void>;
385
399
  presult: Promise<any>;
386
400
  get connected(): boolean;
387
401
  /**
package/index.js CHANGED
@@ -267,7 +267,7 @@ export class DdbObj {
267
267
  if (form === DdbForm.dict)
268
268
  return dict;
269
269
  else {
270
- const { chartType: type, stacking, title: titles, extras, data, ...others } = dict.to_dict();
270
+ const { chartType: type, stacking, binStart: bin_start, binEnd: bin_end, binCount: bin_count, title: titles, extras, data, ...others } = dict.to_dict();
271
271
  const [chart, x_axis, y_axis] = titles.value;
272
272
  dict.form = DdbForm.chart;
273
273
  dict.value = {
@@ -278,6 +278,8 @@ export class DdbObj {
278
278
  x_axis,
279
279
  y_axis,
280
280
  },
281
+ ...bin_start ? { bin_start, bin_end, } : {},
282
+ ...bin_count ? { bin_count } : {},
281
283
  ...extras ? (() => {
282
284
  const { multiYAxes: multi_y_axes = false, ...extras_others } = extras.to_dict({ strip: true });
283
285
  return {
@@ -865,10 +867,17 @@ export class DdbObj {
865
867
  value[1].pack(),
866
868
  ];
867
869
  case DdbForm.chart: {
868
- const { type, stacking, titles: { chart, x_axis, y_axis, }, extras, data } = this.value;
870
+ const { type, stacking, bin_start, bin_end, bin_count, titles: { chart, x_axis, y_axis, }, extras, data } = this.value;
869
871
  const { value: [keys, values] } = new DdbDict({
870
872
  chartType: new DdbInt(type),
871
873
  stacking,
874
+ ...bin_start ? {
875
+ binStart: bin_start,
876
+ binEnd: bin_end
877
+ } : {},
878
+ ...bin_count ? {
879
+ binCount: bin_count
880
+ } : {},
872
881
  title: new DdbVectorString([chart, x_axis, y_axis]),
873
882
  ...extras ? (() => {
874
883
  const { multi_y_axes, ...extras_other } = extras;
@@ -1100,7 +1109,7 @@ export class DdbObj {
1100
1109
  case DdbForm.table:
1101
1110
  return `table[${this.rows}r][${this.cols}c]`;
1102
1111
  case DdbForm.dict:
1103
- return `dict<${DdbType[this.value[0].type]}, ${DdbType[this.value[1].type]}>`;
1112
+ return `dict<${DdbType[this.value[0].type]}, ${DdbType[this.value[1].type]}>[${this.rows}]`;
1104
1113
  case DdbForm.chart:
1105
1114
  return `chart<${DdbChartType[this.value.type]}>`;
1106
1115
  case DdbForm.matrix:
@@ -1179,6 +1188,7 @@ export class DdbObj {
1179
1188
  return obj;
1180
1189
  }
1181
1190
  }
1191
+ /** Formats a single element (value) as a string according to DdbType, null returns a 'null' string */
1182
1192
  export function format(type, value, le, options) {
1183
1193
  switch (type) {
1184
1194
  case DdbType.bool:
@@ -1364,6 +1374,66 @@ export function format(type, value, le, options) {
1364
1374
  return inspect(value, options);
1365
1375
  }
1366
1376
  }
1377
+ /** formatted vector, the index-th item in the collection is a string, a null value returns a 'null' string */
1378
+ export function formati(obj, index, options) {
1379
+ if (64 <= obj.type && obj.type < 128) { // array vector
1380
+ // 因为 array vector 目前只支持:Logical, Integral(不包括 INT128, COMPRESS 类型), Floating, Temporal
1381
+ // 都对应 TypedArray 中的一格,所以 lengths.length 等于 block 中的 row 的个数
1382
+ // av = array(INT[], 0, 5)
1383
+ // append!(av, [1..1])
1384
+ // append!(av, [1..70000])
1385
+ // append!(av, [1..1])
1386
+ // append!(av, [1..500])
1387
+ // ...
1388
+ // av
1389
+ const _type = obj.type - 64;
1390
+ let offset = 0;
1391
+ for (const { lengths, data, rows } of obj.value) {
1392
+ let acc_len = 0;
1393
+ if (offset + rows <= index) {
1394
+ offset += rows;
1395
+ continue; // 跳过这个 block
1396
+ }
1397
+ for (const length of lengths) {
1398
+ if (offset < index) {
1399
+ offset++;
1400
+ acc_len += length;
1401
+ continue;
1402
+ }
1403
+ const limit = 10;
1404
+ let items = new Array(Math.min(limit, length));
1405
+ for (let i = 0; i < items.length; i++)
1406
+ items[i] = format(_type, data[acc_len + i], obj.le, options);
1407
+ return (items.join(', ') + (length > limit ? ', ...' : '')).bracket('square');
1408
+ }
1409
+ }
1410
+ }
1411
+ switch (obj.type) {
1412
+ case DdbType.string:
1413
+ case DdbType.symbol:
1414
+ return obj.value[index];
1415
+ case DdbType.symbol_extended: {
1416
+ const { base, data } = obj.value;
1417
+ return base[data[index]];
1418
+ }
1419
+ case DdbType.uuid:
1420
+ case DdbType.int128:
1421
+ case DdbType.ipaddr:
1422
+ return format(obj.type, obj.value.subarray(16 * index, 16 * (index + 1)), obj.le, options);
1423
+ case DdbType.blob: {
1424
+ const value = obj.value[index];
1425
+ return value.length > 100 ?
1426
+ DdbObj.dec.decode(value.subarray(0, 98)) + '…'
1427
+ :
1428
+ DdbObj.dec.decode(value);
1429
+ }
1430
+ case DdbType.complex:
1431
+ case DdbType.point:
1432
+ return format(obj.type, obj.value.subarray(2 * index, 2 * (index + 1)), obj.le, options);
1433
+ default:
1434
+ return format(obj.type, obj.value[index], obj.le, options);
1435
+ }
1436
+ }
1367
1437
  export class DdbVoid extends DdbObj {
1368
1438
  constructor() {
1369
1439
  super({
@@ -1907,13 +1977,16 @@ export class DDB {
1907
1977
  password = '123456';
1908
1978
  /** python session flag (2048) */
1909
1979
  python = false;
1980
+ // --- 内部选项, 状态
1910
1981
  print_message_buffer = false;
1911
1982
  print_object_buffer = false;
1912
1983
  print_message = true;
1913
1984
  parse_object = true;
1985
+ pnode_run_defined = false;
1914
1986
  /** DdbMessage listeners */
1915
1987
  listeners = [];
1916
1988
  pconnect = Promise.resolve();
1989
+ ppnoderun = Promise.resolve();
1917
1990
  presult = Promise.resolve(null);
1918
1991
  get connected() {
1919
1992
  return this.websocket?.readyState === WebSocket.OPEN;
@@ -1981,41 +2054,6 @@ export class DDB {
1981
2054
  this.on_message(event);
1982
2055
  }
1983
2056
  });
1984
- await this.eval(this.python ?
1985
- 'def pnode_run (nodes, func_name, args, add_node_alias):\n' +
1986
- ' nargs = size(args)\n' +
1987
- ' func = funcByName(func_name)\n' +
1988
- ' \n' +
1989
- ' if not nargs:\n' +
1990
- ' return pnodeRun(func, nodes, add_node_alias)\n' +
1991
- ' \n' +
1992
- ' args_partial = [ ]\n' +
1993
- ' args_partial.append(func)\n' +
1994
- ' for a in args:\n' +
1995
- ' args_partial.append(a)\n' +
1996
- ' \n' +
1997
- ' return pnodeRun(\n' +
1998
- ' unifiedCall(partial, args_partial),\n' +
1999
- ' nodes,\n' +
2000
- ' add_node_alias\n' +
2001
- ' )\n'
2002
- :
2003
- 'def pnode_run (nodes, func_name, args, add_node_alias = true) {\n' +
2004
- ' nargs = size(args)\n' +
2005
- ' func = funcByName(func_name)\n' +
2006
- ' \n' +
2007
- ' if (!nargs)\n' +
2008
- ' return pnodeRun(func, nodes, add_node_alias)\n' +
2009
- ' \n' +
2010
- ' args_partial = array(any, 1 + nargs, 1 + nargs)\n' +
2011
- ' args_partial[0] = func\n' +
2012
- ' args_partial[1:] = args\n' +
2013
- ' return pnodeRun(\n' +
2014
- ' unifiedCall(partial, args_partial),\n' +
2015
- ' nodes,\n' +
2016
- ' add_node_alias\n' +
2017
- ' )\n' +
2018
- '}\n', { urgent: true });
2019
2057
  if (this.autologin)
2020
2058
  if (this.python)
2021
2059
  await this.eval(`login(${this.username.quote('double')}, ${this.password.quote('double')})`, { urgent: true });
@@ -2087,6 +2125,55 @@ export class DDB {
2087
2125
  }
2088
2126
  if (!this.connected)
2089
2127
  throw new Error(`${this.url} is already disconnected`);
2128
+ if (func === 'pnode_run' && !this.pnode_run_defined) {
2129
+ const ptail = this.ppnoderun;
2130
+ let resolve;
2131
+ this.ppnoderun = new Promise((_resolve, _reject) => {
2132
+ resolve = _resolve;
2133
+ });
2134
+ await ptail;
2135
+ try {
2136
+ if (!this.pnode_run_defined)
2137
+ await this.eval(this.python ?
2138
+ 'def pnode_run (nodes, func_name, args, add_node_alias):\n' +
2139
+ ' nargs = size(args)\n' +
2140
+ ' func = funcByName(func_name)\n' +
2141
+ ' \n' +
2142
+ ' if not nargs:\n' +
2143
+ ' return pnodeRun(func, nodes, add_node_alias)\n' +
2144
+ ' \n' +
2145
+ ' args_partial = [ ]\n' +
2146
+ ' args_partial.append(func)\n' +
2147
+ ' for a in args:\n' +
2148
+ ' args_partial.append(a)\n' +
2149
+ ' \n' +
2150
+ ' return pnodeRun(\n' +
2151
+ ' unifiedCall(partial, args_partial),\n' +
2152
+ ' nodes,\n' +
2153
+ ' add_node_alias\n' +
2154
+ ' )\n'
2155
+ :
2156
+ 'def pnode_run (nodes, func_name, args, add_node_alias = true) {\n' +
2157
+ ' nargs = size(args)\n' +
2158
+ ' func = funcByName(func_name)\n' +
2159
+ ' \n' +
2160
+ ' if (!nargs)\n' +
2161
+ ' return pnodeRun(func, nodes, add_node_alias)\n' +
2162
+ ' \n' +
2163
+ ' args_partial = array(any, 1 + nargs, 1 + nargs)\n' +
2164
+ ' args_partial[0] = func\n' +
2165
+ ' args_partial[1:] = args\n' +
2166
+ ' return pnodeRun(\n' +
2167
+ ' unifiedCall(partial, args_partial),\n' +
2168
+ ' nodes,\n' +
2169
+ ' add_node_alias\n' +
2170
+ ' )\n' +
2171
+ '}\n', { urgent: true });
2172
+ }
2173
+ finally {
2174
+ resolve();
2175
+ }
2176
+ }
2090
2177
  // this 上的当前配置需要在 message 到达后使用,先保存起来
2091
2178
  const _handlers = [...this.listeners].reverse();
2092
2179
  // 临界区:保证多个 rpc 并发时形成 promise 链