dolphindb 2.0.975 → 2.0.977

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/docs.zh.json CHANGED
@@ -11502,7 +11502,7 @@
11502
11502
  "",
11503
11503
  "对于上述蓝框部分的数据,触发 *trueValue* 计算逻辑,因此 Factor 的值等于 Factor0 的计算结果;红框部分的数据触发 *falseIterFunc* 计算逻辑,每条记录的 Factor 是输出表中该记录前三条 Factor 的平均值。",
11504
11504
  "",
11505
- "相关函数::doc:`../s/stateIterate`, :doc:`../s/stateMavg`"
11505
+ "相关函数::doc:`../s/stateIterate`"
11506
11506
  ]
11507
11507
  }
11508
11508
  ]
@@ -15205,7 +15205,7 @@
15205
15205
  "* topN相关函数::doc:`../m/msumTopN`, :doc:`../m/mavgTopN`, :doc:`../m/mstdpTopN`, :doc:`../m/mstdTopN`, :doc:`../m/mvarpTopN`, :doc:`../m/mvarTopN`, :doc:`../m/mcorrTopN`, :doc:`../m/mbetaTopN`, :doc:`../m/mcovarTopN`, :doc:`../m/mwsumTopN`",
15206
15206
  "* 高阶函数::doc:`/Functionalprogramming/TemplateFunctions/segmentby` (参数 *func* 暂支持 cumsum, cummax, cummin, cumcount, cumavg, cumstd, cumvar, cumstdp, cumvarp), :doc:`/Functionalprogramming/TemplateFunctions/moving`, :doc:`/Functionalprogramming/TemplateFunctions/byColumn`, :doc:`/Functionalprogramming/TemplateFunctions/accumulate`, :doc:`/Functionalprogramming/TemplateFunctions/window`",
15207
15207
  "* 其他函数::doc:`../t/talibNull`, :doc:`../d/dynamicGroupCumsum`, :doc:`../d/dynamicGroupCumcount`, :doc:`../t/topRange`, :doc:`../l/lowRange`, :doc:`../t/trueRange`",
15208
- "* 特殊函数(仅支持在引擎内使用)::doc:`../s/stateIterate`, :doc:`../c/conditionalIterate`, :doc:`../s/stateMavg`, :doc:`../g/genericStateIterate`, :doc:`../g/genericTStateIterate`",
15208
+ "* 特殊函数(仅支持在引擎内使用)::doc:`../s/stateIterate`, :doc:`../c/conditionalIterate`, :doc:`../g/genericStateIterate`, :doc:`../g/genericTStateIterate`",
15209
15209
  "",
15210
15210
  "注意,:doc:`/Functionalprogramming/TemplateFunctions/talib` 作为状态函数时,第一个参数 `func` 只能是响应式状态引擎支持的状态函数。",
15211
15211
  "",
@@ -67520,88 +67520,6 @@
67520
67520
  }
67521
67521
  ]
67522
67522
  },
67523
- "publishTable": {
67524
- "title": "publishTable",
67525
- "type": "function",
67526
- "children": [
67527
- {
67528
- "title": "语法",
67529
- "type": "grammer",
67530
- "children": [
67531
- {
67532
- "type": "text",
67533
- "value": [
67534
- "publishTable(host, port, tableName, [actionName], [offset=-1], [filter], [allowExists=false], [resetOffset=false])"
67535
- ]
67536
- }
67537
- ]
67538
- },
67539
- {
67540
- "title": "详情",
67541
- "type": "detail",
67542
- "children": [
67543
- {
67544
- "type": "text",
67545
- "value": [
67546
- "该函数在流数据表所在的服务器上执行,使流数据表发布数据到客户端,客户端可能是 DolphinDB 数据节点或 API。与之对比,使用 :doc:`../s/subscribeTable` 函数时,客户端必须是 DolphinDB 数据节点。",
67547
- "",
67548
- "该函数返回一个字符串向量,包含流数据表的列名。如果指定的表不存在或者不是流数据表,将会抛出异常。如果客户端已经执行订阅操作,且 *allowExists* =false,也会抛出异常。",
67549
- "",
67550
- "使用 :doc:`/FunctionsandCommands/CommandsReferences/s/stopPublishTable` 停止流数据表发布数据。"
67551
- ]
67552
- }
67553
- ]
67554
- },
67555
- {
67556
- "title": "参数",
67557
- "type": "parameters",
67558
- "children": [
67559
- {
67560
- "type": "text",
67561
- "value": [
67562
- "`host` 是客户端节点的主机名。",
67563
- "",
67564
- "`port` 是客户端的订阅端口号。若客户端是 DolphinDB 的数据节点,*port* 由配置参数 subPort 指定;若客户端是 API,*port* 是客户端启用的订阅端口号",
67565
- "",
67566
- "`tableName` 是一个字符串,表示本地服务器上的共享流数据表的名称。",
67567
- "",
67568
- "`actionName` 是一个字符串,表示订阅任务的名称。它可以包含字母、数字和下划线。",
67569
- "",
67570
- "`offset` 是第一条订阅信息的位置。一条信息是流数据表中的一行。如果没有指定 *offset*,或它为 - 1,或超过了流数据表的记录行数,订阅将会从即将进入流表的第一行开始。*offset* 与流数据表创建时的第一行对应。如果某些行因为内存限制被删除,在决定订阅开始的位置时,这些行仍然考虑在内。",
67571
- "",
67572
- "`filter` 是一个向量。该参数需要配合 :doc:`/FunctionsandCommands/CommandsReferences/s/setStreamTableFilterColumn` 函数一起使用。使用 *setStreamTableFilterColumn* 指定流数据表的过滤列,流数据表过滤列在 filter 中的数据才会发布到订阅端,不在 *filter* 中的数据不会发布。*filter* 不支持过滤 BOOL 类型数据。",
67573
- "",
67574
- "`allowExists` 是一个布尔值。当 *allowExists* =true 时,若执行该函数前,订阅已经存在,不会抛出异常。默认值为 false。",
67575
- "",
67576
- ".. versionadded:: 2.00.5",
67577
- " 参数 *resetOffset*",
67578
- "",
67579
- "`resetOffset` 是一个布尔值,表示是否重置 *offset* 为 - 1,默认值为 false。当 resetOffset =true 时,若流数据表中原 *offset* 指定的行没有数据,系统会重置 *offset*,并从即将进入流数据表的第一行开始订阅。"
67580
- ]
67581
- }
67582
- ]
67583
- },
67584
- {
67585
- "title": "例子",
67586
- "type": "example",
67587
- "children": [
67588
- {
67589
- "type": "code",
67590
- "language": "console",
67591
- "value": [
67592
- "",
67593
- " $ n=100000",
67594
- " $ t=streamTable(rand(100,n) as id, rand(100.0,n) as val)",
67595
- " $ share t as st;",
67596
- "",
67597
- " $ publishTable(\"localhost\",8848,\"st\");",
67598
- " [\"id\",\"val\"]"
67599
- ]
67600
- }
67601
- ]
67602
- }
67603
- ]
67604
- },
67605
67523
  "purgeCacheEngine": {
67606
67524
  "title": "purgeCacheEngine",
67607
67525
  "type": "command",
@@ -84018,7 +83936,10 @@
84018
83936
  {
84019
83937
  "type": "text",
84020
83938
  "value": [
84021
- "`obj` 可以是矩阵或表。",
83939
+ ".. versionadded:: 2.00.9.7",
83940
+ " obj 参数支持数组向量",
83941
+ "",
83942
+ "`obj` 可以是数组向量、矩阵或表。",
84022
83943
  "",
84023
83944
  "`index`, `rowIndex` 和 `colIndex` 可以是标量、向量或数据对,表示行或列的下标。如果 *index*, *rowIndex* 或 *colIndex* 为数据对,那么它表示下标的范围,上边界不包含在内。"
84024
83945
  ]
@@ -84034,38 +83955,46 @@
84034
83955
  "value": [
84035
83956
  "对于第一种用法:",
84036
83957
  "",
83958
+ "* 如果obj是一个数组向量,",
84037
83959
  "",
84038
- " * 如果obj是一个矩阵,",
84039
- "",
84040
- " * index是标量,返回指定的列,用向量表示。",
83960
+ " * index是标量,返回指定的列,用向量表示。",
83961
+ " * index是向量,返回指定行组成的数组向量。",
83962
+ " * index是数据对,返回指定列组成的数组向量。",
84041
83963
  "",
84042
- " * index是向量或数据对,返回指定列组成的子矩阵。",
83964
+ "* 如果obj是一个矩阵,",
84043
83965
  "",
83966
+ " * index是标量,返回指定的列,用向量表示。",
83967
+ " * index是向量或数据对,返回指定列组成的子矩阵。",
84044
83968
  "",
84045
- " * 如果obj是一个表,",
83969
+ "* 如果obj是一个表,",
84046
83970
  "",
84047
- " * index是标量,返回指定的行,用字典表示。",
84048
83971
  "",
84049
- " * index是向量或数据对,返回指定行组成的子表。",
83972
+ " * index是标量,返回指定的行,用字典表示。",
83973
+ " * index是向量或数据对,返回指定行组成的子表。",
84050
83974
  "",
84051
83975
  "",
84052
83976
  "对于第二种用法:",
84053
83977
  "",
83978
+ "* 如果obj是一个数组向量,",
84054
83979
  "",
84055
- " * 如果obj是一个矩阵,",
83980
+ " * rowIndex和colIndex都是标量,返回指向行列的值,用向量表示。",
83981
+ " * rowIndex是标量,colIndex是数据对,返回由指定行列组成的数组向量。",
83982
+ " * rowIndex是数据对,colIndex是标量,返回由指定行列组成的向量。",
83983
+ " * rowIndex和colIndex都是数据对,返回由指定行列组成的数组向量。",
84056
83984
  "",
84057
- " * rowIndex和colIndex都是标量,返回指定行列的值,用标量表示。",
83985
+ "* 如果obj是一个矩阵,",
84058
83986
  "",
84059
- " * rowIndex和colIndex都是向量或数据对,返回指定行列组成的子矩阵。",
83987
+ " * rowIndex和colIndex都是标量,返回指定行列的值,用标量表示。",
83988
+ " * rowIndex和colIndex中一个是标量,另一个是数据对,返回由指定行列组成的子矩阵。",
83989
+ " * rowIndex和colIndex都是向量或数据对,返回指定行列组成的子矩阵。",
84060
83990
  "",
83991
+ "* 如果obj是一个表,",
84061
83992
  "",
84062
- " * 如果obj是一个表,",
83993
+ " * rowIndex和colIndex都是标量,返回指定行列的值,用标量表示。",
83994
+ " * rowIndex和colIndex中一个是标量,另一个是数据对,返回指定行列组成的子表。",
83995
+ " * rowIndex和colIndex都是向量或数据对,返回指定行列组成的子表。",
84063
83996
  "",
84064
- " * rowIndex和colIndex都是标量,返回指定行列的值,用标量表示。",
84065
- "",
84066
- " * rowIndex和colIndex都是向量或数据对,返回指定行列组成的字表。",
84067
- "",
84068
- "请注意,index, rowIndex,collIndex 作为索引值或索引范围时,若其值不在 [0, size(X)-1] 内,则超出 [0, size(X)-1] 的值所对应的位置返回空值。"
83997
+ "请注意,index, rowIndex,collIndex 作为数组向量或矩阵的索引值或索引范围时,若其值不在 [0, size(X)-1] 内,则超出 [0, size(X)-1] 的值所对应的位置返回空值。"
84069
83998
  ]
84070
83999
  }
84071
84000
  ]
@@ -84074,6 +84003,13 @@
84074
84003
  "title": "例子",
84075
84004
  "type": "example",
84076
84005
  "children": [
84006
+ {
84007
+ "type": "text",
84008
+ "value": [
84009
+ "例1. 矩阵",
84010
+ ""
84011
+ ]
84012
+ },
84077
84013
  {
84078
84014
  "type": "code",
84079
84015
  "language": "console",
@@ -84189,7 +84125,6 @@
84189
84125
  "|5 | ",
84190
84126
  "+---+",
84191
84127
  "",
84192
- "",
84193
84128
  "例2. 表",
84194
84129
  ""
84195
84130
  ]
@@ -84304,10 +84239,23 @@
84304
84239
  "|2018.01.02|",
84305
84240
  "+----------+",
84306
84241
  "",
84307
- "",
84308
- "",
84242
+ "例3. 数组向量",
84309
84243
  ""
84310
84244
  ]
84245
+ },
84246
+ {
84247
+ "type": "code",
84248
+ "language": "console",
84249
+ "value": [
84250
+ "",
84251
+ " $ av =array(DOUBLE[], 0, 10).append!([1.0, 2.1 4.1 6.8, 0.5 2.2 2]);",
84252
+ " $ av[1] ",
84253
+ " [,4.1,2.2]",
84254
+ " $ av[1,1]",
84255
+ " [4.1]",
84256
+ " $ av[1:3,1:3] ",
84257
+ " [[4.1,6.8],[2.2,2]]"
84258
+ ]
84311
84259
  }
84312
84260
  ]
84313
84261
  }
@@ -85881,7 +85829,7 @@
85881
85829
  "",
85882
85830
  "`table` 可以是内存表,亦可为分布式表。",
85883
85831
  "",
85884
- "`updates` 是元代码,表示更新的操作。",
85832
+ "`updates` 是元代码或元代码组成的元组,表示更新的操作。",
85885
85833
  "",
85886
85834
  "`from` 是元代码,表示表连接操作。",
85887
85835
  "",
@@ -85950,7 +85898,7 @@
85950
85898
  "language": "console",
85951
85899
  "value": [
85952
85900
  "",
85953
- " $ sqlUpdate(table=t1, updates=<price*10 as updatedPrice>, where=<symbol=`A>).eval()",
85901
+ " $ sqlUpdate(table=t1, updates=[<price*10 as updatedPrice>,<price*20 as updatedPrice2>]).eval()",
85954
85902
  " $ t1;",
85955
85903
  ""
85956
85904
  ]
@@ -85958,17 +85906,14 @@
85958
85906
  {
85959
85907
  "type": "text",
85960
85908
  "value": [
85961
- "====== ========== ===== =============",
85962
- "symbol date price updatedPrice",
85963
- "====== ========== ===== =============",
85964
- "A 2021.04.15 12 120",
85965
- "",
85966
- "A 2021.04.16 13 130",
85967
- "",
85968
- "B 2021.04.15 21 42",
85969
- "",
85970
- "B 2021.04.16 22 44",
85971
- "====== ========== ===== =============",
85909
+ "====== ========== ===== ============= =============",
85910
+ "symbol date price updatedPrice updatedPrice2",
85911
+ "====== ========== ===== ============= =============",
85912
+ "A 2021.04.15 12 120 240",
85913
+ "A 2021.04.16 13 130 260",
85914
+ "B 2021.04.15 21 210 420",
85915
+ "B 2021.04.16 22 220 440",
85916
+ "====== ========== ===== ============= =============",
85972
85917
  ""
85973
85918
  ]
85974
85919
  },
@@ -86570,119 +86515,7 @@
86570
86515
  "+-----+--------+",
86571
86516
  "",
86572
86517
  "",
86573
- "相关函数::doc:`../c/conditionalIterate`, :doc:`../s/stateMavg`"
86574
- ]
86575
- }
86576
- ]
86577
- }
86578
- ]
86579
- },
86580
- "stateMavg": {
86581
- "title": "stateMavg",
86582
- "type": "function",
86583
- "children": [
86584
- {
86585
- "title": "语法",
86586
- "type": "grammer",
86587
- "children": [
86588
- {
86589
- "type": "text",
86590
- "value": [
86591
- "stateMavg(X, window)",
86592
- "",
86593
- "该函数只能用作响应式状态引擎 :ref:`metrics <metrics_rs>` 中的函数。"
86594
- ]
86595
- }
86596
- ]
86597
- },
86598
- {
86599
- "title": "参数",
86600
- "type": "parameters",
86601
- "children": [
86602
- {
86603
- "type": "text",
86604
- "value": [
86605
- "`X` 输入表的字段,仅支持数值类型。",
86606
- "",
86607
- "`window` 正整数,表示窗口长度。"
86608
- ]
86609
- }
86610
- ]
86611
- },
86612
- {
86613
- "title": "详情",
86614
- "type": "detail",
86615
- "children": [
86616
- {
86617
- "type": "text",
86618
- "value": [
86619
- "计算基于历史结果的移动平均。",
86620
- "",
86621
- "计算逻辑为:若窗口中 X 的元素个数小于 *window*,则直接输出 *X*;否则取输出字段前 *window* - 1 个值与当前 *X* 值求平均。"
86622
- ]
86623
- }
86624
- ]
86625
- },
86626
- {
86627
- "title": "例子",
86628
- "type": "example",
86629
- "children": [
86630
- {
86631
- "type": "text",
86632
- "value": [
86633
- "定义一个响应式状态引擎,按照 sym 分组。",
86634
- "",
86635
- "对于 A 组数据,窗口大小为 3,当 09:00:02 和 09:00:06 这两条数据到来时,窗口未满,因此直接输出 val 的值 2 和 6 到 total 列。下一条到来的 A 组数据的时间戳为 09:00:08,val=8,此时 A 组的第一个窗口触发计算,计算结果为 `(2+6+8)\\\\3=5.333333`;接下来一条 A 组数据的时间戳为 09:00:10,val=10,计算结果为 `(6+5.333333...+10)\\\\3=7.11111`,以此类推。",
86636
- ""
86637
- ]
86638
- },
86639
- {
86640
- "type": "code",
86641
- "language": "console",
86642
- "value": [
86643
- "",
86644
- " $ n=10",
86645
- " $ trade = table(09:00:00 + 1..n as time, rand(`A`B, n) as sym, 1..n as val)",
86646
- "",
86647
- " $ outputTable = table(100:0, `sym`time`total, [STRING, SECOND, DOUBLE])",
86648
- "",
86649
- " $ engine = createReactiveStateEngine(name=\"test\", metrics=[<time>, <stateMavg(val, 3)>], dummyTable=trade, outputTable=outputTable, keyColumn=`sym, keepOrder=true)",
86650
- "",
86651
- " $ engine.append!(trade)",
86652
- " $ select * from outputTable",
86653
- ""
86654
- ]
86655
- },
86656
- {
86657
- "type": "text",
86658
- "value": [
86659
- "+-----+----------+--------+",
86660
- "| sym | time | total |",
86661
- "+=====+==========+========+",
86662
- "| B | 09:00:01 | 1 |",
86663
- "+-----+----------+--------+",
86664
- "| A | 09:00:02 | 2 |",
86665
- "+-----+----------+--------+",
86666
- "| B | 09:00:03 | 3 |",
86667
- "+-----+----------+--------+",
86668
- "| B | 09:00:04 | 2.6667 |",
86669
- "+-----+----------+--------+",
86670
- "| B | 09:00:05 | 3.5556 |",
86671
- "+-----+----------+--------+",
86672
- "| A | 09:00:06 | 6 |",
86673
- "+-----+----------+--------+",
86674
- "| B | 09:00:07 | 4.4074 |",
86675
- "+-----+----------+--------+",
86676
- "| A | 09:00:08 | 5.3333 |",
86677
- "+-----+----------+--------+",
86678
- "| B | 09:00:09 | 5.6543 |",
86679
- "+-----+----------+--------+",
86680
- "| A | 09:00:10 | 7.1111 |",
86681
- "+-----+----------+--------+",
86682
- "",
86683
- "",
86684
- "",
86685
- "相关函数::doc:`../c/conditionalIterate`, :doc:`../s/stateIterate`"
86518
+ "相关函数::doc:`../c/conditionalIterate`"
86686
86519
  ]
86687
86520
  }
86688
86521
  ]
@@ -87070,58 +86903,6 @@
87070
86903
  }
87071
86904
  ]
87072
86905
  },
87073
- "stopPublishTable": {
87074
- "title": "stopPublishTable",
87075
- "type": "command",
87076
- "children": [
87077
- {
87078
- "title": "语法",
87079
- "type": "grammer",
87080
- "children": [
87081
- {
87082
- "type": "text",
87083
- "value": [
87084
- "stopPublishTable(host, port, tableName, [actionName])"
87085
- ]
87086
- }
87087
- ]
87088
- },
87089
- {
87090
- "title": "参数",
87091
- "type": "parameters",
87092
- "children": [
87093
- {
87094
- "type": "text",
87095
- "value": [
87096
- "`host` 是客户端节点的主机名。",
87097
- "",
87098
- "`port` 是客户端节点的订阅端口号,它是由配置参数 *subPort* 指定的。",
87099
- "",
87100
- "`tableName` 是一个字符串,表示本地服务器上的共享流数据表的名称。",
87101
- "",
87102
- "`actionName` 是一个字符串,表示订阅任务的名称。它可以包含字母、数字和下划线。"
87103
- ]
87104
- }
87105
- ]
87106
- },
87107
- {
87108
- "title": "详情",
87109
- "type": "detail",
87110
- "children": [
87111
- {
87112
- "type": "text",
87113
- "value": [
87114
- "这个命令需要在流数据表所在的服务器上执行,使服务器停止从流数据表发布数据到客户端。",
87115
- "",
87116
- "如果指定的表不存在或者它不是一个流数据表,将会抛出异常。如果客户端已经停止订阅再执行该命令,也会抛出异常。",
87117
- "",
87118
- "相关函数::doc:`../../FunctionReferences/p/publishTable`"
87119
- ]
87120
- }
87121
- ]
87122
- }
87123
- ]
87124
- },
87125
86906
  "strReplace": {
87126
86907
  "title": "strReplace",
87127
86908
  "type": "function",
@@ -94771,7 +94552,7 @@
94771
94552
  {
94772
94553
  "type": "text",
94773
94554
  "value": [
94774
- "tmskew(T, X, window)",
94555
+ "tmskew(T, X, window, [biased=true])",
94775
94556
  "",
94776
94557
  "部分通用参数说明和窗口计算规则请参考: :doc:`/FunctionsandCommands/SeriesOfFunctions/tmFunctions`"
94777
94558
  ]
@@ -98627,9 +98408,7 @@
98627
98408
  {
98628
98409
  "type": "text",
98629
98410
  "value": [
98630
- "在信息订阅端的节点执行,以停止向信息发布者订阅数据。首先会在指定的服务器上调用 :doc:`../s/stopPublishTable` 命令来停止信息发布,然后删除客户端节点上与订阅有关的数据结构。",
98631
- "",
98632
- "在调用该命令时,会删除流计算执行线程的队列中未处理的消息。"
98411
+ "在信息订阅端的节点执行,以停止向信息发布者订阅数据。在调用该命令时,会删除流计算执行线程的队列中未处理的消息。"
98633
98412
  ]
98634
98413
  }
98635
98414
  ]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dolphindb",
3
3
  "description": "DolphinDB JavaScript API",
4
- "version": "2.0.975",
4
+ "version": "2.0.977",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "browser": "./browser.js",
package/test.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { DDB } from './index.js';
2
- export declare const url: "ws://192.168.0.37:20023";
2
+ export declare const url: "ws://192.168.0.200:20023";
3
3
  export declare function test_types(ddb: DDB): Promise<void>;
package/test.js CHANGED
@@ -4,7 +4,7 @@ import { DDB, DdbConnectionError, DdbDatabaseError, DdbForm, DdbInt, DdbLong, Dd
4
4
  set_inspect_options();
5
5
  // linux
6
6
  // export const url = 'ws://115.239.209.123:8892' as const
7
- export const url = 'ws://192.168.0.37:20023';
7
+ export const url = 'ws://192.168.0.200:20023';
8
8
  (async function test() {
9
9
  console.log('--- 测试开始 ---'.green);
10
10
  let ddb = new DDB(url);
package/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, inspect, set_inspect_options, WebSocketConnectionError } from 'xshell'\n\nimport { keywords } from './language.js'\nimport { DDB, DdbConnectionError, DdbDatabaseError, DdbForm, DdbInt, DdbLong, DdbObj, DdbType, DdbVectorAny, DdbVectorDouble, DdbVectorSymbol, month2ms, type DdbStringObj, type DdbVectorAnyObj, type DdbDurationVectorValue, DdbDurationUnit, type DdbVectorObj, type DdbTableObj } from './index.js'\n\n\nset_inspect_options()\n\n\n// linux\n// export const url = 'ws://115.239.209.123:8892' as const\nexport const url = 'ws://192.168.0.37:20023' as const\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// windows\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// local 8848\n// export const url = 'ws://127.0.0.1:8848' as const\n\n\n;(async function test () {\n console.log('--- 测试开始 ---'.green)\n \n let ddb = new DDB(url)\n \n const tests = [\n test_repl,\n \n test_keywords,\n test_types,\n test_reconnection,\n test_print,\n test_time,\n test_streaming,\n test_error,\n ]\n \n for (const fn_test of tests)\n await fn_test(ddb)\n \n ddb.disconnect()\n \n console.log('--- 测试通过 ---'.green)\n})()\n\n\n\nfunction test_keywords () {\n assert(new Set(keywords).size === keywords.length, 'keywords 中不能有重复的项')\n}\n\n\nasync function get_printed (ddb: DDB, code: string) {\n return new Promise<string>(async (resolve, reject) => {\n try {\n let resolved = false\n await ddb.eval(\n `print(${code})`,\n {\n listener ({ type, data }) {\n if (type === 'print' && !resolved) {\n resolved = true\n resolve(data)\n }\n }\n }\n )\n if (!resolved)\n reject(new Error('未输出 print 消息'))\n } catch (error) {\n reject(error)\n }\n })\n}\n\n\nasync function test_repl (ddb: DDB) {\n \n}\n\n\nasync function test_reconnection (ddb: DDB) {\n let _ddb = new DDB(url)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.connect()\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_error (ddb: DDB) {\n console.log('测试 DdbDatabaseError 和 DdbConnectionError')\n \n const error_message = '错误消息'\n const error_script = `throw ${error_message.quote()}`\n \n let database_error: DdbDatabaseError\n \n try {\n await ddb.eval(error_script)\n } catch (error) {\n database_error = error\n }\n \n assert(database_error)\n assert(database_error instanceof DdbDatabaseError)\n assert(database_error.message === `throw ${error_message.quote('double')} => ${error_message}`)\n assert(database_error.name === 'DdbDatabaseError')\n assert(database_error.ddb === ddb)\n assert(database_error.type === 'script')\n assert(database_error.options.script === error_script)\n assert(database_error.stack.includes('test_error'))\n \n \n let ddbtest = new DDB(url)\n let connection_error: DdbConnectionError\n try {\n await ddbtest.connect()\n ddbtest.disconnect()\n await ddbtest.eval('1')\n } catch (error) {\n connection_error = error\n }\n \n assert(connection_error)\n assert(connection_error instanceof DdbConnectionError)\n assert(connection_error.ddb === ddbtest)\n \n \n // --- 首次连接失败也会抛出 DdbConnectionError\n let ddbtest2 = new DDB('ws://dolphindb.com/')\n let connection_error2: DdbConnectionError\n try {\n await ddbtest2.connect()\n } catch (error) {\n connection_error2 = error\n }\n \n assert(connection_error2)\n assert(connection_error2 instanceof DdbConnectionError)\n assert(connection_error2.cause && connection_error2.cause instanceof WebSocketConnectionError)\n}\n\n\nasync function test_print (ddb: DDB) {\n console.log('测试 print message')\n \n const str = 'test print message\\n中文'\n \n assert(await get_printed(ddb, str.quote()) === str)\n \n console.log('测试 verbose 输出')\n \n let vddb = new DDB(url, { verbose: true })\n \n await vddb.call('typestr', [\n new DdbVectorAny([\n new DdbVectorSymbol(['a', 'b', 'a', 'b', 'a', 'b']),\n new DdbLong(3n)\n ])\n ])\n \n vddb.disconnect()\n}\n\n\nasync function test_streaming (ddb: DDB) {\n console.log('测试流数据')\n \n await ddb.eval(\n 'try {\\n' +\n \" if (!defined('prices', SHARED)) {\\n\" +\n ' share(\\n' +\n ' streamTable(\\n' +\n ' 10000:0,\\n' +\n \" ['time', 'stock', 'price'],\\n\" +\n ' [TIMESTAMP, SYMBOL, DOUBLE]\\n' +\n ' ),\\n' +\n \" 'prices'\\n\" +\n ' )\\n' +\n \" print('prices 流表创建成功')\\n\" +\n ' } else\\n' +\n \" print('prices 流表已存在')\\n\" +\n '} catch (error) {\\n' +\n \" print('prices 流表创建失败')\\n\" +\n ' print(error)\\n' +\n '}\\n'\n )\n \n let rows = 0\n let resolve: Function\n let promise = new Promise(_resolve => resolve = _resolve)\n \n let sddb = new DDB(url, {\n streaming: {\n table: 'prices',\n handler (message) {\n // console.log(message)\n rows += message.rows\n if (rows === 50)\n resolve()\n },\n }\n })\n \n await sddb.connect()\n \n await ddb.eval(\n 'n = 5\\n' +\n '\\n' +\n 'for (i in 0..9)\\n' +\n ' append!(\\n' +\n ' prices,\\n' +\n ' table([\\n' +\n ' (now() + 0..(n-1)) as time,\\n' +\n \" take(['MSFT', 'FUTU'], n) as stock,\\n\" +\n ' (0..(n-1) \\\\ 10) as price\\n' +\n ' ])\\n' +\n ' )\\n'\n )\n \n await promise\n console.log('流数据已全部收齐')\n \n sddb.disconnect()\n}\n\n\nasync function test_time (ddb: DDB) {\n console.log('测试时间显示')\n \n await time2str_equal(ddb, '2022-09-01T14:30:01.095')\n await time2str_equal(ddb, '2022-07-01T00:00:00.000')\n await time2str_equal(ddb, '2022-07-02T00:00:00.000')\n await time2str_equal(ddb, '2022-06-30T00:00:00.000')\n await time2str_equal(ddb, '2022-12-22T16:57:30.248')\n \n \n console.log('测试 month2ms')\n assert(\n month2ms(\n (\n await ddb.eval<DdbObj<number>>('2022.12M')\n ).value\n ) === new Date('2022.12.01').valueOf()\n )\n}\n\n\nasync function time2str_equal (ddb: DDB, timestr: string) {\n const code = `temporalParse('${timestr}', 'yyyy-MM-ddTHH:mm:sss.SSS')`\n \n assert(\n inspect(\n await ddb.eval(code),\n { colors: false }\n ).slice('timestamp('.length, -1) === \n (\n await get_printed(ddb, code)\n ).replace('T', ' ')\n )\n}\n\n\nexport async function test_types (ddb: DDB) {\n console.log('测试通过 ddb.call 调用 getNodeAlias 函数')\n console.log(await ddb.call('getNodeAlias'))\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result0 = await ddb.call('typestr', [new DdbInt(1)])\n console.log(result0)\n assert(result0.form === DdbForm.scalar)\n assert(result0.type === DdbType.string)\n assert(result0.value === 'INT')\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result1 = await ddb.call('typestr', [new DdbVectorDouble([0.1, 0.2, 0.3])])\n console.log(result1)\n assert(result1.form === DdbForm.scalar)\n assert(result1.type === DdbType.string)\n assert(result1.value === 'FAST DOUBLE VECTOR')\n \n console.log('测试 array vector')\n const av = await ddb.eval(\n 'av = array(INT[], 0, 3)\\n' +\n 'append!(av, [1..4])\\n' +\n 'append!(av, [1..70000])\\n' +\n 'av\\n'\n )\n \n console.log(av)\n assert(av.form === DdbForm.vector)\n assert(av.type === DdbType.int + 64) // array vector 的 type 比较特殊,需要偏移 64\n assert(av.rows === 2)\n \n \n console.log('测试大数据')\n let bigarr = new Float64Array(10)\n bigarr.fill(0.5)\n \n await ddb.call<DdbStringObj>('typestr', [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n await ddb.upload(['a'], [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n assert((\n await ddb.eval<DdbVectorDouble>('a')\n ).rows === bigarr.length)\n \n \n console.log('测试 datasource')\n \n const ds = (await ddb.eval<DdbVectorAnyObj>(\n 'db_path = \"dfs://test-datasource\"\\n' + \n 'tb_name = \"db\"\\n' + \n 'if (!existsTable(db_path, tb_name))\\n' + \n ' createTable(\\n' + \n ' database(db_path, VALUE , [1]),\\n' +\n ' table(1:0,`id`name, [INT, STRING]),\\n' +\n ' tb_name\\n' +\n ' ).append!(table(1 2 as id, `str1`str2 as name))\\n' +\n '\\n' +\n 'tb = loadTable(db_path, tb_name)\\n' +\n 'sqlDS(<select * from tb where id = 1>)\\n'\n )).value[0] as DdbStringObj\n \n const { type, form, value } = ds\n \n assert(type === DdbType.datasource && form === DdbForm.scalar, '返回的 DdbObj 具有正确的 type 和 form')\n \n assert(value === 'DataSource< select [7] * from tb where id == 1 >')\n \n // 如果直接构造 DdbObj Datasource,将其送入 ddb.call, ddb将仍然认为送入的是一个 STRING \n assert(\n (await ddb.call<DdbStringObj>('typestr', [ds])).value === 'STRING', \n '从 js 构建的 Datasource DdbObj 会被识别为 STRING'\n )\n \n console.log('测试 pair<duration>')\n const dp = await ddb.eval<DdbVectorObj<DdbDurationVectorValue>>(\n 'pair(duration(\"20d\"), duration(\"2H\"))'\n ) \n \n console.log(dp)\n assert(dp.type === DdbType.duration, 'dp 的返回值应该为 Duration')\n assert(dp.value[0].data === 20 && dp.value[0].unit === DdbDurationUnit.d, 'pair<duration> 的 value 应该已解析')\n \n console.log('测试 void vector')\n const table = await ddb.eval<DdbTableObj>('select *, NULL as val from table(1..100 as id)')\n const { value: [ints, voids] } = table\n \n console.log(voids)\n assert(voids.rows === ints.rows, 'void vector 应该具有正常的 vector length')\n assert(voids.length === 10, 'void vector 应该具有正确的数据长度')\n assert(voids.value === null, 'void vector 的值应该为 null')\n \n await ddb.upload(['voidtable'], [table])\n}\n\n"]}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, inspect, set_inspect_options, WebSocketConnectionError } from 'xshell'\n\nimport { keywords } from './language.js'\nimport { DDB, DdbConnectionError, DdbDatabaseError, DdbForm, DdbInt, DdbLong, DdbObj, DdbType, DdbVectorAny, DdbVectorDouble, DdbVectorSymbol, month2ms, type DdbStringObj, type DdbVectorAnyObj, type DdbDurationVectorValue, DdbDurationUnit, type DdbVectorObj, type DdbTableObj } from './index.js'\n\n\nset_inspect_options()\n\n\n// linux\n// export const url = 'ws://115.239.209.123:8892' as const\nexport const url = 'ws://192.168.0.200:20023' as const\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// windows\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// local 8848\n// export const url = 'ws://127.0.0.1:8848' as const\n\n\n;(async function test () {\n console.log('--- 测试开始 ---'.green)\n \n let ddb = new DDB(url)\n \n const tests = [\n test_repl,\n \n test_keywords,\n test_types,\n test_reconnection,\n test_print,\n test_time,\n test_streaming,\n test_error,\n ]\n \n for (const fn_test of tests)\n await fn_test(ddb)\n \n ddb.disconnect()\n \n console.log('--- 测试通过 ---'.green)\n})()\n\n\n\nfunction test_keywords () {\n assert(new Set(keywords).size === keywords.length, 'keywords 中不能有重复的项')\n}\n\n\nasync function get_printed (ddb: DDB, code: string) {\n return new Promise<string>(async (resolve, reject) => {\n try {\n let resolved = false\n await ddb.eval(\n `print(${code})`,\n {\n listener ({ type, data }) {\n if (type === 'print' && !resolved) {\n resolved = true\n resolve(data)\n }\n }\n }\n )\n if (!resolved)\n reject(new Error('未输出 print 消息'))\n } catch (error) {\n reject(error)\n }\n })\n}\n\n\nasync function test_repl (ddb: DDB) {\n \n}\n\n\nasync function test_reconnection (ddb: DDB) {\n let _ddb = new DDB(url)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.connect()\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_error (ddb: DDB) {\n console.log('测试 DdbDatabaseError 和 DdbConnectionError')\n \n const error_message = '错误消息'\n const error_script = `throw ${error_message.quote()}`\n \n let database_error: DdbDatabaseError\n \n try {\n await ddb.eval(error_script)\n } catch (error) {\n database_error = error\n }\n \n assert(database_error)\n assert(database_error instanceof DdbDatabaseError)\n assert(database_error.message === `throw ${error_message.quote('double')} => ${error_message}`)\n assert(database_error.name === 'DdbDatabaseError')\n assert(database_error.ddb === ddb)\n assert(database_error.type === 'script')\n assert(database_error.options.script === error_script)\n assert(database_error.stack.includes('test_error'))\n \n \n let ddbtest = new DDB(url)\n let connection_error: DdbConnectionError\n try {\n await ddbtest.connect()\n ddbtest.disconnect()\n await ddbtest.eval('1')\n } catch (error) {\n connection_error = error\n }\n \n assert(connection_error)\n assert(connection_error instanceof DdbConnectionError)\n assert(connection_error.ddb === ddbtest)\n \n \n // --- 首次连接失败也会抛出 DdbConnectionError\n let ddbtest2 = new DDB('ws://dolphindb.com/')\n let connection_error2: DdbConnectionError\n try {\n await ddbtest2.connect()\n } catch (error) {\n connection_error2 = error\n }\n \n assert(connection_error2)\n assert(connection_error2 instanceof DdbConnectionError)\n assert(connection_error2.cause && connection_error2.cause instanceof WebSocketConnectionError)\n}\n\n\nasync function test_print (ddb: DDB) {\n console.log('测试 print message')\n \n const str = 'test print message\\n中文'\n \n assert(await get_printed(ddb, str.quote()) === str)\n \n console.log('测试 verbose 输出')\n \n let vddb = new DDB(url, { verbose: true })\n \n await vddb.call('typestr', [\n new DdbVectorAny([\n new DdbVectorSymbol(['a', 'b', 'a', 'b', 'a', 'b']),\n new DdbLong(3n)\n ])\n ])\n \n vddb.disconnect()\n}\n\n\nasync function test_streaming (ddb: DDB) {\n console.log('测试流数据')\n \n await ddb.eval(\n 'try {\\n' +\n \" if (!defined('prices', SHARED)) {\\n\" +\n ' share(\\n' +\n ' streamTable(\\n' +\n ' 10000:0,\\n' +\n \" ['time', 'stock', 'price'],\\n\" +\n ' [TIMESTAMP, SYMBOL, DOUBLE]\\n' +\n ' ),\\n' +\n \" 'prices'\\n\" +\n ' )\\n' +\n \" print('prices 流表创建成功')\\n\" +\n ' } else\\n' +\n \" print('prices 流表已存在')\\n\" +\n '} catch (error) {\\n' +\n \" print('prices 流表创建失败')\\n\" +\n ' print(error)\\n' +\n '}\\n'\n )\n \n let rows = 0\n let resolve: Function\n let promise = new Promise(_resolve => resolve = _resolve)\n \n let sddb = new DDB(url, {\n streaming: {\n table: 'prices',\n handler (message) {\n // console.log(message)\n rows += message.rows\n if (rows === 50)\n resolve()\n },\n }\n })\n \n await sddb.connect()\n \n await ddb.eval(\n 'n = 5\\n' +\n '\\n' +\n 'for (i in 0..9)\\n' +\n ' append!(\\n' +\n ' prices,\\n' +\n ' table([\\n' +\n ' (now() + 0..(n-1)) as time,\\n' +\n \" take(['MSFT', 'FUTU'], n) as stock,\\n\" +\n ' (0..(n-1) \\\\ 10) as price\\n' +\n ' ])\\n' +\n ' )\\n'\n )\n \n await promise\n console.log('流数据已全部收齐')\n \n sddb.disconnect()\n}\n\n\nasync function test_time (ddb: DDB) {\n console.log('测试时间显示')\n \n await time2str_equal(ddb, '2022-09-01T14:30:01.095')\n await time2str_equal(ddb, '2022-07-01T00:00:00.000')\n await time2str_equal(ddb, '2022-07-02T00:00:00.000')\n await time2str_equal(ddb, '2022-06-30T00:00:00.000')\n await time2str_equal(ddb, '2022-12-22T16:57:30.248')\n \n \n console.log('测试 month2ms')\n assert(\n month2ms(\n (\n await ddb.eval<DdbObj<number>>('2022.12M')\n ).value\n ) === new Date('2022.12.01').valueOf()\n )\n}\n\n\nasync function time2str_equal (ddb: DDB, timestr: string) {\n const code = `temporalParse('${timestr}', 'yyyy-MM-ddTHH:mm:sss.SSS')`\n \n assert(\n inspect(\n await ddb.eval(code),\n { colors: false }\n ).slice('timestamp('.length, -1) === \n (\n await get_printed(ddb, code)\n ).replace('T', ' ')\n )\n}\n\n\nexport async function test_types (ddb: DDB) {\n console.log('测试通过 ddb.call 调用 getNodeAlias 函数')\n console.log(await ddb.call('getNodeAlias'))\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result0 = await ddb.call('typestr', [new DdbInt(1)])\n console.log(result0)\n assert(result0.form === DdbForm.scalar)\n assert(result0.type === DdbType.string)\n assert(result0.value === 'INT')\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result1 = await ddb.call('typestr', [new DdbVectorDouble([0.1, 0.2, 0.3])])\n console.log(result1)\n assert(result1.form === DdbForm.scalar)\n assert(result1.type === DdbType.string)\n assert(result1.value === 'FAST DOUBLE VECTOR')\n \n console.log('测试 array vector')\n const av = await ddb.eval(\n 'av = array(INT[], 0, 3)\\n' +\n 'append!(av, [1..4])\\n' +\n 'append!(av, [1..70000])\\n' +\n 'av\\n'\n )\n \n console.log(av)\n assert(av.form === DdbForm.vector)\n assert(av.type === DdbType.int + 64) // array vector 的 type 比较特殊,需要偏移 64\n assert(av.rows === 2)\n \n \n console.log('测试大数据')\n let bigarr = new Float64Array(10)\n bigarr.fill(0.5)\n \n await ddb.call<DdbStringObj>('typestr', [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n await ddb.upload(['a'], [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n assert((\n await ddb.eval<DdbVectorDouble>('a')\n ).rows === bigarr.length)\n \n \n console.log('测试 datasource')\n \n const ds = (await ddb.eval<DdbVectorAnyObj>(\n 'db_path = \"dfs://test-datasource\"\\n' + \n 'tb_name = \"db\"\\n' + \n 'if (!existsTable(db_path, tb_name))\\n' + \n ' createTable(\\n' + \n ' database(db_path, VALUE , [1]),\\n' +\n ' table(1:0,`id`name, [INT, STRING]),\\n' +\n ' tb_name\\n' +\n ' ).append!(table(1 2 as id, `str1`str2 as name))\\n' +\n '\\n' +\n 'tb = loadTable(db_path, tb_name)\\n' +\n 'sqlDS(<select * from tb where id = 1>)\\n'\n )).value[0] as DdbStringObj\n \n const { type, form, value } = ds\n \n assert(type === DdbType.datasource && form === DdbForm.scalar, '返回的 DdbObj 具有正确的 type 和 form')\n \n assert(value === 'DataSource< select [7] * from tb where id == 1 >')\n \n // 如果直接构造 DdbObj Datasource,将其送入 ddb.call, ddb将仍然认为送入的是一个 STRING \n assert(\n (await ddb.call<DdbStringObj>('typestr', [ds])).value === 'STRING', \n '从 js 构建的 Datasource DdbObj 会被识别为 STRING'\n )\n \n console.log('测试 pair<duration>')\n const dp = await ddb.eval<DdbVectorObj<DdbDurationVectorValue>>(\n 'pair(duration(\"20d\"), duration(\"2H\"))'\n ) \n \n console.log(dp)\n assert(dp.type === DdbType.duration, 'dp 的返回值应该为 Duration')\n assert(dp.value[0].data === 20 && dp.value[0].unit === DdbDurationUnit.d, 'pair<duration> 的 value 应该已解析')\n \n console.log('测试 void vector')\n const table = await ddb.eval<DdbTableObj>('select *, NULL as val from table(1..100 as id)')\n const { value: [ints, voids] } = table\n \n console.log(voids)\n assert(voids.rows === ints.rows, 'void vector 应该具有正常的 vector length')\n assert(voids.length === 10, 'void vector 应该具有正确的数据长度')\n assert(voids.value === null, 'void vector 的值应该为 null')\n \n await ddb.upload(['voidtable'], [table])\n}\n\n"]}