tranfi 0.1.2 → 0.2.0

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.
Files changed (132) hide show
  1. package/LICENSE +177 -0
  2. package/NOTICE +8 -0
  3. package/README.md +272 -40
  4. package/app/assets/{index-pDFMluyz.js → index-BIAIKnrp.js} +1 -1
  5. package/app/index.html +1 -1
  6. package/binding.gyp +55 -3
  7. package/csrc/arena.c +7 -5
  8. package/csrc/batch.c +818 -71
  9. package/csrc/buffer.c +84 -8
  10. package/csrc/cJSON.c +262 -19
  11. package/csrc/cJSON.h +17 -1
  12. package/csrc/codec_csv.c +1074 -181
  13. package/csrc/codec_jsonl.c +830 -118
  14. package/csrc/codec_table.c +108 -78
  15. package/csrc/codec_text.c +286 -68
  16. package/csrc/compiler.c +31 -3
  17. package/csrc/config.h +21 -0
  18. package/csrc/dsl.c +4722 -485
  19. package/csrc/expr.c +363 -55
  20. package/csrc/expr.h +2 -0
  21. package/csrc/internal.h +316 -27
  22. package/csrc/ir.c +65 -18
  23. package/csrc/ir.h +41 -0
  24. package/csrc/ir_schema.c +20 -5
  25. package/csrc/ir_serialize.c +68 -6
  26. package/csrc/ir_sql.c +796 -185
  27. package/csrc/ir_validate.c +462 -6
  28. package/csrc/json_path.c +210 -0
  29. package/csrc/main.c +879 -30
  30. package/csrc/memory_estimate.c +477 -0
  31. package/csrc/op_acf.c +171 -21
  32. package/csrc/op_across.c +477 -0
  33. package/csrc/op_anomaly.c +167 -32
  34. package/csrc/op_assert.c +761 -0
  35. package/csrc/op_bin.c +168 -29
  36. package/csrc/op_cast.c +383 -55
  37. package/csrc/op_clip.c +30 -19
  38. package/csrc/op_date_trunc.c +208 -34
  39. package/csrc/op_datetime.c +259 -77
  40. package/csrc/op_derive.c +65 -97
  41. package/csrc/op_diff.c +146 -30
  42. package/csrc/op_ewma.c +149 -30
  43. package/csrc/op_explode.c +124 -26
  44. package/csrc/op_fill_down.c +125 -53
  45. package/csrc/op_fill_null.c +176 -31
  46. package/csrc/op_filter.c +89 -40
  47. package/csrc/op_frequency.c +571 -43
  48. package/csrc/op_grep.c +36 -18
  49. package/csrc/op_group_agg.c +1790 -119
  50. package/csrc/op_hash.c +48 -15
  51. package/csrc/op_head.c +21 -86
  52. package/csrc/op_interpolate.c +268 -62
  53. package/csrc/op_join.c +2700 -182
  54. package/csrc/op_json_extract.c +227 -0
  55. package/csrc/op_json_filter.c +384 -0
  56. package/csrc/op_json_flatten.c +293 -0
  57. package/csrc/op_json_schema.c +503 -0
  58. package/csrc/op_label_encode.c +328 -53
  59. package/csrc/op_lag.c +181 -0
  60. package/csrc/op_lead.c +141 -89
  61. package/csrc/op_normalize.c +363 -79
  62. package/csrc/op_onehot.c +345 -73
  63. package/csrc/op_pivot.c +1546 -162
  64. package/csrc/op_quarantine.c +189 -0
  65. package/csrc/op_registry.c +2062 -166
  66. package/csrc/op_rename.c +41 -50
  67. package/csrc/op_replace.c +270 -118
  68. package/csrc/op_rleid.c +297 -0
  69. package/csrc/op_rowid.c +559 -0
  70. package/csrc/op_sample.c +80 -23
  71. package/csrc/op_schema.c +1341 -0
  72. package/csrc/op_schema_infer.c +252 -0
  73. package/csrc/op_select.c +265 -65
  74. package/csrc/op_set.c +3449 -0
  75. package/csrc/op_skip.c +30 -87
  76. package/csrc/op_sort.c +670 -124
  77. package/csrc/op_source_name.c +120 -0
  78. package/csrc/op_split.c +65 -28
  79. package/csrc/op_split_data.c +41 -9
  80. package/csrc/op_stack.c +178 -222
  81. package/csrc/op_stats.c +206 -110
  82. package/csrc/op_step.c +217 -55
  83. package/csrc/op_tail.c +21 -12
  84. package/csrc/op_tee.c +338 -0
  85. package/csrc/op_top.c +260 -53
  86. package/csrc/op_trim.c +48 -19
  87. package/csrc/op_unique.c +1193 -150
  88. package/csrc/op_unpivot.c +100 -66
  89. package/csrc/op_validate.c +601 -24
  90. package/csrc/op_window.c +492 -51
  91. package/csrc/path_policy.c +85 -0
  92. package/csrc/pipeline.c +872 -99
  93. package/csrc/recipes.c +3 -1
  94. package/csrc/report.c +73 -30
  95. package/csrc/selector.c +1097 -0
  96. package/csrc/size_utils.c +348 -0
  97. package/csrc/spill.c +317 -0
  98. package/csrc/spill.h +21 -0
  99. package/csrc/tranfi.h +169 -1
  100. package/csrc/transform.h +209 -0
  101. package/csrc/transform_api.c +2237 -0
  102. package/csrc/transform_categorical.c +923 -0
  103. package/csrc/transform_internal.h +472 -0
  104. package/csrc/transform_json.c +3812 -0
  105. package/csrc/transform_numeric.c +1966 -0
  106. package/csrc/transform_sha256.c +154 -0
  107. package/csrc/transform_wasm.h +162 -0
  108. package/csrc/transform_wasm_api.c +1373 -0
  109. package/csrc/wasm_api.c +70 -9
  110. package/napi_api.c +219 -11
  111. package/napi_transform.c +1648 -0
  112. package/napi_transform.h +8 -0
  113. package/package.json +27 -11
  114. package/scripts/install-native.js +76 -0
  115. package/scripts/prepack.js +64 -0
  116. package/scripts/sync-csrc.js +23 -0
  117. package/src/cli.js +8 -11
  118. package/src/engines/duckdb.js +45 -12
  119. package/src/index.js +661 -42
  120. package/src/memory_policy.js +411 -0
  121. package/src/native.js +1 -5
  122. package/src/pipeline.js +454 -31
  123. package/src/recipe_json.js +80 -0
  124. package/src/server.js +10 -8
  125. package/src/transform.js +403 -0
  126. package/src/transform_error.js +10 -0
  127. package/src/wasm.js +6 -4
  128. package/wasm/index.js +498 -10
  129. package/wasm/tranfi_core.js +0 -0
  130. package/wasm/transform.js +1156 -0
  131. package/wasm/worker.js +786 -0
  132. package/csrc/plan.c +0 -206
@@ -0,0 +1,154 @@
1
+ #include "transform_internal.h"
2
+
3
+ #include <string.h>
4
+
5
+ typedef struct tf_sha256_context {
6
+ uint32_t state[8];
7
+ uint64_t total_bytes;
8
+ uint8_t block[64];
9
+ size_t block_len;
10
+ } tf_sha256_context;
11
+
12
+ static const uint32_t sha256_round[64] = {
13
+ 0x428a2f98u, 0x71374491u, 0xb5c0fbcfu, 0xe9b5dba5u,
14
+ 0x3956c25bu, 0x59f111f1u, 0x923f82a4u, 0xab1c5ed5u,
15
+ 0xd807aa98u, 0x12835b01u, 0x243185beu, 0x550c7dc3u,
16
+ 0x72be5d74u, 0x80deb1feu, 0x9bdc06a7u, 0xc19bf174u,
17
+ 0xe49b69c1u, 0xefbe4786u, 0x0fc19dc6u, 0x240ca1ccu,
18
+ 0x2de92c6fu, 0x4a7484aau, 0x5cb0a9dcu, 0x76f988dau,
19
+ 0x983e5152u, 0xa831c66du, 0xb00327c8u, 0xbf597fc7u,
20
+ 0xc6e00bf3u, 0xd5a79147u, 0x06ca6351u, 0x14292967u,
21
+ 0x27b70a85u, 0x2e1b2138u, 0x4d2c6dfcu, 0x53380d13u,
22
+ 0x650a7354u, 0x766a0abbu, 0x81c2c92eu, 0x92722c85u,
23
+ 0xa2bfe8a1u, 0xa81a664bu, 0xc24b8b70u, 0xc76c51a3u,
24
+ 0xd192e819u, 0xd6990624u, 0xf40e3585u, 0x106aa070u,
25
+ 0x19a4c116u, 0x1e376c08u, 0x2748774cu, 0x34b0bcb5u,
26
+ 0x391c0cb3u, 0x4ed8aa4au, 0x5b9cca4fu, 0x682e6ff3u,
27
+ 0x748f82eeu, 0x78a5636fu, 0x84c87814u, 0x8cc70208u,
28
+ 0x90befffau, 0xa4506cebu, 0xbef9a3f7u, 0xc67178f2u
29
+ };
30
+
31
+ static uint32_t rotate_right(uint32_t value, unsigned int count) {
32
+ return (value >> count) | (value << (32u - count));
33
+ }
34
+
35
+ static uint32_t load_be32(const uint8_t *data) {
36
+ return ((uint32_t)data[0] << 24) | ((uint32_t)data[1] << 16)
37
+ | ((uint32_t)data[2] << 8) | (uint32_t)data[3];
38
+ }
39
+
40
+ static void store_be32(uint8_t *data, uint32_t value) {
41
+ data[0] = (uint8_t)(value >> 24);
42
+ data[1] = (uint8_t)(value >> 16);
43
+ data[2] = (uint8_t)(value >> 8);
44
+ data[3] = (uint8_t)value;
45
+ }
46
+
47
+ static void sha256_compress(tf_sha256_context *context, const uint8_t block[64]) {
48
+ uint32_t words[64];
49
+ uint32_t a, b, c, d, e, f, g, h;
50
+ for (size_t i = 0; i < 16; ++i) words[i] = load_be32(block + i * 4);
51
+ for (size_t i = 16; i < 64; ++i) {
52
+ uint32_t s0 = rotate_right(words[i - 15], 7)
53
+ ^ rotate_right(words[i - 15], 18) ^ (words[i - 15] >> 3);
54
+ uint32_t s1 = rotate_right(words[i - 2], 17)
55
+ ^ rotate_right(words[i - 2], 19) ^ (words[i - 2] >> 10);
56
+ words[i] = words[i - 16] + s0 + words[i - 7] + s1;
57
+ }
58
+ a = context->state[0]; b = context->state[1];
59
+ c = context->state[2]; d = context->state[3];
60
+ e = context->state[4]; f = context->state[5];
61
+ g = context->state[6]; h = context->state[7];
62
+ for (size_t i = 0; i < 64; ++i) {
63
+ uint32_t sum1 = rotate_right(e, 6) ^ rotate_right(e, 11) ^ rotate_right(e, 25);
64
+ uint32_t choose = (e & f) ^ ((~e) & g);
65
+ uint32_t temp1 = h + sum1 + choose + sha256_round[i] + words[i];
66
+ uint32_t sum0 = rotate_right(a, 2) ^ rotate_right(a, 13) ^ rotate_right(a, 22);
67
+ uint32_t majority = (a & b) ^ (a & c) ^ (b & c);
68
+ uint32_t temp2 = sum0 + majority;
69
+ h = g; g = f; f = e; e = d + temp1;
70
+ d = c; c = b; b = a; a = temp1 + temp2;
71
+ }
72
+ context->state[0] += a; context->state[1] += b;
73
+ context->state[2] += c; context->state[3] += d;
74
+ context->state[4] += e; context->state[5] += f;
75
+ context->state[6] += g; context->state[7] += h;
76
+ }
77
+
78
+ static void sha256_init(tf_sha256_context *context) {
79
+ static const uint32_t initial[8] = {
80
+ 0x6a09e667u, 0xbb67ae85u, 0x3c6ef372u, 0xa54ff53au,
81
+ 0x510e527fu, 0x9b05688cu, 0x1f83d9abu, 0x5be0cd19u
82
+ };
83
+ memset(context, 0, sizeof(*context));
84
+ memcpy(context->state, initial, sizeof(initial));
85
+ }
86
+
87
+ static void sha256_update(tf_sha256_context *context,
88
+ const uint8_t *data, size_t len) {
89
+ context->total_bytes += len;
90
+ while (len != 0) {
91
+ size_t space = 64 - context->block_len;
92
+ size_t take = len < space ? len : space;
93
+ memcpy(context->block + context->block_len, data, take);
94
+ context->block_len += take;
95
+ data += take;
96
+ len -= take;
97
+ if (context->block_len == 64) {
98
+ sha256_compress(context, context->block);
99
+ context->block_len = 0;
100
+ }
101
+ }
102
+ }
103
+
104
+ static void sha256_final(tf_sha256_context *context, uint8_t out[32]) {
105
+ uint64_t total_bits = context->total_bytes * UINT64_C(8);
106
+ context->block[context->block_len++] = 0x80;
107
+ if (context->block_len > 56) {
108
+ memset(context->block + context->block_len, 0, 64 - context->block_len);
109
+ sha256_compress(context, context->block);
110
+ context->block_len = 0;
111
+ }
112
+ memset(context->block + context->block_len, 0, 56 - context->block_len);
113
+ for (size_t i = 0; i < 8; ++i)
114
+ context->block[56 + i] = (uint8_t)(total_bits >> (56u - 8u * i));
115
+ sha256_compress(context, context->block);
116
+ for (size_t i = 0; i < 8; ++i) store_be32(out + i * 4, context->state[i]);
117
+ memset(context, 0, sizeof(*context));
118
+ }
119
+
120
+ void tf_transform_sha256(const uint8_t *data, size_t len, uint8_t out[32]) {
121
+ tf_sha256_context context;
122
+ sha256_init(&context);
123
+ if (len != 0) sha256_update(&context, data, len);
124
+ sha256_final(&context, out);
125
+ }
126
+
127
+ tf_transform_code tf_transform_sha256_runtime(
128
+ const uint8_t *data, size_t len,
129
+ const tf_transform_runtime_copy *runtime,
130
+ uint8_t out[32], tf_transform_error **error) {
131
+ tf_sha256_context context;
132
+ size_t offset = 0;
133
+ tf_transform_code code;
134
+ if ((!data && len != 0) || !out)
135
+ return tf_transform_set_error(
136
+ error, TF_TRANSFORM_INVALID_ARGUMENT, "SHA-256 argument is null");
137
+ code = tf_transform_poll_cancel(runtime, error);
138
+ if (code != TF_TRANSFORM_OK) return code;
139
+ sha256_init(&context);
140
+ while (offset < len) {
141
+ size_t remaining = len - offset;
142
+ size_t chunk = remaining < TF_TRANSFORM_CANCEL_BYTES_V1
143
+ ? remaining : TF_TRANSFORM_CANCEL_BYTES_V1;
144
+ sha256_update(&context, data + offset, chunk);
145
+ offset += chunk;
146
+ code = tf_transform_poll_cancel(runtime, error);
147
+ if (code != TF_TRANSFORM_OK) {
148
+ memset(&context, 0, sizeof(context));
149
+ return code;
150
+ }
151
+ }
152
+ sha256_final(&context, out);
153
+ return tf_transform_poll_cancel(runtime, error);
154
+ }
@@ -0,0 +1,162 @@
1
+ /* Standalone wasm32 prepared-transform ABI. */
2
+
3
+ #ifndef TRANFI_TRANSFORM_WASM_H
4
+ #define TRANFI_TRANSFORM_WASM_H
5
+
6
+ #include <stdint.h>
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ #define TF_WASM_TRANSFORM_NO_HOST_CANCEL UINT32_MAX
13
+
14
+ enum {
15
+ TF_WASM_HANDLE_RECIPE = 1,
16
+ TF_WASM_HANDLE_ANALYZER = 2,
17
+ TF_WASM_HANDLE_PLAN = 3,
18
+ TF_WASM_HANDLE_APPLY = 4,
19
+ TF_WASM_HANDLE_ERROR = 5,
20
+ TF_WASM_HANDLE_OWNED_BYTES = 6,
21
+ TF_WASM_HANDLE_OWNED_DENSE = 7,
22
+ TF_WASM_HANDLE_CANCEL_TOKEN = 8
23
+ };
24
+
25
+ typedef struct tf_wasm_field_view_v1 {
26
+ uint32_t abi_version;
27
+ uint32_t struct_size;
28
+ uint32_t dtype;
29
+ uint32_t flags;
30
+ uint32_t id_offset;
31
+ uint32_t id_bytes;
32
+ uint32_t name_offset;
33
+ uint32_t name_bytes;
34
+ } tf_wasm_field_view_v1;
35
+
36
+ typedef struct tf_wasm_schema_view_v1 {
37
+ uint32_t abi_version;
38
+ uint32_t struct_size;
39
+ uint32_t column_count;
40
+ uint32_t fields_offset;
41
+ uint32_t fields_bytes;
42
+ } tf_wasm_schema_view_v1;
43
+
44
+ typedef struct tf_wasm_column_view_v1 {
45
+ uint32_t abi_version;
46
+ uint32_t struct_size;
47
+ uint32_t data_offset;
48
+ uint32_t data_bytes;
49
+ uint32_t stride_bytes;
50
+ uint32_t validity_offset;
51
+ uint32_t validity_bytes;
52
+ uint32_t validity_bit_offset;
53
+ uint32_t validity_bit_stride;
54
+ } tf_wasm_column_view_v1;
55
+
56
+ typedef struct tf_wasm_table_view_v1 {
57
+ uint32_t abi_version;
58
+ uint32_t struct_size;
59
+ uint32_t row_count;
60
+ uint32_t column_count;
61
+ uint32_t columns_offset;
62
+ uint32_t columns_bytes;
63
+ } tf_wasm_table_view_v1;
64
+
65
+ typedef struct tf_wasm_dense_info_v1 {
66
+ uint32_t abi_version;
67
+ uint32_t struct_size;
68
+ uint32_t dtype;
69
+ uint32_t flags;
70
+ uint32_t rows;
71
+ uint32_t columns;
72
+ uint32_t data_bytes;
73
+ } tf_wasm_dense_info_v1;
74
+
75
+ typedef struct tf_wasm_schema_field_info_v1 {
76
+ uint32_t abi_version;
77
+ uint32_t struct_size;
78
+ uint32_t dtype;
79
+ uint32_t id_bytes;
80
+ uint32_t name_bytes;
81
+ } tf_wasm_schema_field_info_v1;
82
+
83
+ uint32_t tf_wasm_transform_limits_init_safe_v1(
84
+ uint32_t out_offset, uint32_t out_size);
85
+ uint32_t tf_wasm_transform_cancel_create(
86
+ uint32_t host_poll_slot, uint32_t limits_offset,
87
+ uint32_t out_handle_offset, uint32_t out_error_offset);
88
+ uint32_t tf_wasm_transform_cancel_request(uint32_t token_handle);
89
+
90
+ uint32_t tf_wasm_transform_recipe_from_json(
91
+ uint32_t json_offset, uint32_t json_bytes, uint32_t limits_offset,
92
+ uint32_t out_handle_offset, uint32_t out_error_offset);
93
+ uint32_t tf_wasm_transform_analyzer_create(
94
+ uint32_t recipe_handle, uint32_t schema_offset,
95
+ uint32_t limits_offset, uint32_t cancel_token_handle,
96
+ uint32_t out_handle_offset, uint32_t out_error_offset);
97
+ uint32_t tf_wasm_transform_analyzer_push(
98
+ uint32_t analyzer_handle, uint32_t table_offset,
99
+ uint32_t out_error_offset);
100
+ uint32_t tf_wasm_transform_analyzer_finalize(
101
+ uint32_t analyzer_handle, uint32_t out_handle_offset,
102
+ uint32_t out_error_offset);
103
+ uint32_t tf_wasm_transform_plan_export(
104
+ uint32_t plan_handle, uint32_t limits_offset,
105
+ uint32_t out_handle_offset, uint32_t out_error_offset);
106
+ uint32_t tf_wasm_transform_plan_import(
107
+ uint32_t bytes_offset, uint32_t bytes_len, uint32_t limits_offset,
108
+ uint32_t cancel_token_handle, uint32_t out_handle_offset,
109
+ uint32_t out_error_offset);
110
+ uint32_t tf_wasm_transform_plan_schema_json(
111
+ uint32_t plan_handle, uint32_t which, uint32_t limits_offset,
112
+ uint32_t out_handle_offset, uint32_t out_error_offset);
113
+ uint32_t tf_wasm_transform_plan_recipe_sha256(
114
+ uint32_t plan_handle, uint32_t limits_offset,
115
+ uint32_t out_handle_offset, uint32_t out_error_offset);
116
+ uint32_t tf_wasm_transform_plan_schema_field_count(
117
+ uint32_t plan_handle, uint32_t which, uint32_t out_count_offset,
118
+ uint32_t out_error_offset);
119
+ uint32_t tf_wasm_transform_plan_schema_field_info(
120
+ uint32_t plan_handle, uint32_t which, uint32_t index,
121
+ uint32_t out_info_offset, uint32_t out_error_offset);
122
+ uint32_t tf_wasm_transform_plan_schema_field_copy(
123
+ uint32_t plan_handle, uint32_t which, uint32_t index,
124
+ uint32_t id_offset, uint32_t id_capacity,
125
+ uint32_t name_offset, uint32_t name_capacity,
126
+ uint32_t out_error_offset);
127
+ uint32_t tf_wasm_transform_apply_create(
128
+ uint32_t plan_handle, uint32_t schema_offset,
129
+ uint32_t limits_offset, uint32_t cancel_token_handle,
130
+ uint32_t out_handle_offset, uint32_t out_error_offset);
131
+ uint32_t tf_wasm_transform_apply_run(
132
+ uint32_t apply_handle, uint32_t table_offset,
133
+ uint32_t out_handle_offset, uint32_t out_error_offset);
134
+
135
+ uint32_t tf_wasm_transform_error_code(
136
+ uint32_t error_handle, uint32_t out_code_offset);
137
+ uint32_t tf_wasm_transform_error_message_size(
138
+ uint32_t error_handle, uint32_t out_size_offset);
139
+ uint32_t tf_wasm_transform_error_message_copy(
140
+ uint32_t error_handle, uint32_t destination_offset,
141
+ uint32_t destination_capacity);
142
+ uint32_t tf_wasm_transform_owned_bytes_size(
143
+ uint32_t bytes_handle, uint32_t out_size_offset);
144
+ uint32_t tf_wasm_transform_owned_bytes_copy(
145
+ uint32_t bytes_handle, uint32_t destination_offset,
146
+ uint32_t destination_capacity);
147
+ uint32_t tf_wasm_transform_owned_dense_info(
148
+ uint32_t dense_handle, uint32_t out_info_offset);
149
+ uint32_t tf_wasm_transform_owned_dense_copy(
150
+ uint32_t dense_handle, uint32_t destination_offset,
151
+ uint32_t destination_capacity);
152
+ uint32_t tf_wasm_transform_handle_destroy(uint32_t handle);
153
+
154
+ #ifndef __EMSCRIPTEN__
155
+ void tf_wasm_transform_test_set_heap(void *base, uint32_t size);
156
+ #endif
157
+
158
+ #ifdef __cplusplus
159
+ }
160
+ #endif
161
+
162
+ #endif