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
package/csrc/op_skip.c CHANGED
@@ -21,102 +21,44 @@ static int skip_process(tf_step *self, tf_batch *in, tf_batch **out,
21
21
  skip_state *st = self->state;
22
22
  *out = NULL;
23
23
 
24
- if (st->seen >= st->n) {
25
- /* Already past skip region — pass through all rows */
26
- tf_batch *ob = tf_batch_create(in->n_cols, in->n_rows);
27
- if (!ob) return TF_ERROR;
28
- for (size_t c = 0; c < in->n_cols; c++) {
29
- tf_batch_set_schema(ob, c, in->col_names[c], in->col_types[c]);
24
+ size_t emit_start = 0;
25
+ size_t next_seen = st->seen;
26
+ if (st->seen < st->n) {
27
+ size_t remaining_skip = st->n - st->seen;
28
+ if (remaining_skip >= in->n_rows) {
29
+ /* Skip entire batch */
30
+ st->seen += in->n_rows;
31
+ return TF_OK;
30
32
  }
31
- for (size_t r = 0; r < in->n_rows; r++) {
32
- tf_batch_ensure_capacity(ob, r + 1);
33
- for (size_t c = 0; c < in->n_cols; c++) {
34
- if (tf_batch_is_null(in, r, c)) {
35
- tf_batch_set_null(ob, r, c);
36
- continue;
37
- }
38
- switch (in->col_types[c]) {
39
- case TF_TYPE_BOOL:
40
- tf_batch_set_bool(ob, r, c, tf_batch_get_bool(in, r, c));
41
- break;
42
- case TF_TYPE_INT64:
43
- tf_batch_set_int64(ob, r, c, tf_batch_get_int64(in, r, c));
44
- break;
45
- case TF_TYPE_FLOAT64:
46
- tf_batch_set_float64(ob, r, c, tf_batch_get_float64(in, r, c));
47
- break;
48
- case TF_TYPE_STRING:
49
- tf_batch_set_string(ob, r, c, tf_batch_get_string(in, r, c));
50
- break;
51
- case TF_TYPE_DATE:
52
- tf_batch_set_date(ob, r, c, tf_batch_get_date(in, r, c));
53
- break;
54
- case TF_TYPE_TIMESTAMP:
55
- tf_batch_set_timestamp(ob, r, c, tf_batch_get_timestamp(in, r, c));
56
- break;
57
- default:
58
- tf_batch_set_null(ob, r, c);
59
- break;
60
- }
61
- }
62
- ob->n_rows = r + 1;
63
- }
64
- *out = ob;
65
- return TF_OK;
33
+ emit_start = remaining_skip;
34
+ next_seen = st->n;
66
35
  }
67
36
 
68
- size_t remaining_skip = st->n - st->seen;
69
-
70
- if (remaining_skip >= in->n_rows) {
71
- /* Skip entire batch */
72
- st->seen += in->n_rows;
37
+ size_t emit_count = in->n_rows - emit_start;
38
+ if (emit_count == 0) {
39
+ st->seen = next_seen;
73
40
  return TF_OK;
74
41
  }
75
42
 
76
- /* Partial skip — emit rows after the skip region */
77
- size_t emit_start = remaining_skip;
78
- size_t emit_count = in->n_rows - emit_start;
79
- st->seen = st->n;
80
-
81
43
  tf_batch *ob = tf_batch_create(in->n_cols, emit_count);
82
44
  if (!ob) return TF_ERROR;
83
- for (size_t c = 0; c < in->n_cols; c++) {
84
- tf_batch_set_schema(ob, c, in->col_names[c], in->col_types[c]);
45
+ if (tf_batch_clone_schema(ob, in) != TF_OK) {
46
+ tf_batch_free(ob);
47
+ return TF_ERROR;
85
48
  }
86
49
  for (size_t i = 0; i < emit_count; i++) {
87
50
  size_t r = emit_start + i;
88
- tf_batch_ensure_capacity(ob, i + 1);
89
- for (size_t c = 0; c < in->n_cols; c++) {
90
- if (tf_batch_is_null(in, r, c)) {
91
- tf_batch_set_null(ob, i, c);
92
- continue;
93
- }
94
- switch (in->col_types[c]) {
95
- case TF_TYPE_BOOL:
96
- tf_batch_set_bool(ob, i, c, tf_batch_get_bool(in, r, c));
97
- break;
98
- case TF_TYPE_INT64:
99
- tf_batch_set_int64(ob, i, c, tf_batch_get_int64(in, r, c));
100
- break;
101
- case TF_TYPE_FLOAT64:
102
- tf_batch_set_float64(ob, i, c, tf_batch_get_float64(in, r, c));
103
- break;
104
- case TF_TYPE_STRING:
105
- tf_batch_set_string(ob, i, c, tf_batch_get_string(in, r, c));
106
- break;
107
- case TF_TYPE_DATE:
108
- tf_batch_set_date(ob, i, c, tf_batch_get_date(in, r, c));
109
- break;
110
- case TF_TYPE_TIMESTAMP:
111
- tf_batch_set_timestamp(ob, i, c, tf_batch_get_timestamp(in, r, c));
112
- break;
113
- default:
114
- tf_batch_set_null(ob, i, c);
115
- break;
116
- }
51
+ if (tf_batch_copy_row(ob, i, in, r) != TF_OK) {
52
+ tf_batch_free(ob);
53
+ return TF_ERROR;
54
+ }
55
+ if (tf_batch_expose_row(ob, i) != TF_OK) {
56
+ tf_batch_free(ob);
57
+ return TF_ERROR;
117
58
  }
118
- ob->n_rows = i + 1;
119
59
  }
60
+
61
+ st->seen = next_seen;
120
62
  *out = ob;
121
63
  return TF_OK;
122
64
  }
@@ -134,15 +76,16 @@ static void skip_destroy(tf_step *self) {
134
76
 
135
77
  tf_step *tf_skip_create(const cJSON *args) {
136
78
  if (!args) return NULL;
137
- cJSON *n_json = cJSON_GetObjectItemCaseSensitive(args, "n");
138
- if (!cJSON_IsNumber(n_json) || n_json->valueint <= 0) return NULL;
79
+ size_t n = 0;
80
+ int has_n = tf_json_get_size_arg(args, "n", 0, TF_MAX_COUNT_ARG, &n, "skip");
81
+ if (has_n <= 0) return NULL;
139
82
 
140
83
  skip_state *st = calloc(1, sizeof(skip_state));
141
84
  if (!st) return NULL;
142
- st->n = (size_t)n_json->valueint;
85
+ st->n = n;
143
86
  st->seen = 0;
144
87
 
145
- tf_step *step = malloc(sizeof(tf_step));
88
+ tf_step *step = calloc(1, sizeof(tf_step));
146
89
  if (!step) { free(st); return NULL; }
147
90
  step->process = skip_process;
148
91
  step->flush = skip_flush;