tranfi 0.0.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 (151) hide show
  1. package/LICENSE +177 -21
  2. package/NOTICE +8 -0
  3. package/README.md +627 -0
  4. package/app/assets/index-6quYZ5Ap.css +5 -0
  5. package/app/assets/index-BIAIKnrp.js +160 -0
  6. package/app/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  7. package/app/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  8. package/app/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  9. package/app/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  10. package/app/index.html +13 -0
  11. package/binding.gyp +121 -0
  12. package/csrc/arena.c +93 -0
  13. package/csrc/batch.c +976 -0
  14. package/csrc/buffer.c +154 -0
  15. package/csrc/cJSON.c +3386 -0
  16. package/csrc/cJSON.h +316 -0
  17. package/csrc/codec_csv.c +1951 -0
  18. package/csrc/codec_jsonl.c +1086 -0
  19. package/csrc/codec_table.c +248 -0
  20. package/csrc/codec_text.c +447 -0
  21. package/csrc/compiler.c +130 -0
  22. package/csrc/config.h +21 -0
  23. package/csrc/date_utils.h +94 -0
  24. package/csrc/dsl.c +5417 -0
  25. package/csrc/dsl.h +22 -0
  26. package/csrc/expr.c +1553 -0
  27. package/csrc/expr.h +58 -0
  28. package/csrc/internal.h +539 -0
  29. package/csrc/ir.c +166 -0
  30. package/csrc/ir.h +208 -0
  31. package/csrc/ir_schema.c +75 -0
  32. package/csrc/ir_serialize.c +166 -0
  33. package/csrc/ir_sql.c +1822 -0
  34. package/csrc/ir_validate.c +576 -0
  35. package/csrc/json_path.c +210 -0
  36. package/csrc/main.c +1241 -0
  37. package/csrc/memory_estimate.c +477 -0
  38. package/csrc/op_acf.c +283 -0
  39. package/csrc/op_across.c +477 -0
  40. package/csrc/op_anomaly.c +255 -0
  41. package/csrc/op_assert.c +761 -0
  42. package/csrc/op_bin.c +248 -0
  43. package/csrc/op_cast.c +523 -0
  44. package/csrc/op_clip.c +99 -0
  45. package/csrc/op_date_trunc.c +355 -0
  46. package/csrc/op_datetime.c +394 -0
  47. package/csrc/op_derive.c +216 -0
  48. package/csrc/op_diff.c +250 -0
  49. package/csrc/op_ewma.c +222 -0
  50. package/csrc/op_explode.c +206 -0
  51. package/csrc/op_fill_down.c +235 -0
  52. package/csrc/op_fill_null.c +268 -0
  53. package/csrc/op_filter.c +181 -0
  54. package/csrc/op_frequency.c +721 -0
  55. package/csrc/op_grep.c +181 -0
  56. package/csrc/op_group_agg.c +1956 -0
  57. package/csrc/op_hash.c +159 -0
  58. package/csrc/op_head.c +84 -0
  59. package/csrc/op_interpolate.c +445 -0
  60. package/csrc/op_join.c +2902 -0
  61. package/csrc/op_json_extract.c +227 -0
  62. package/csrc/op_json_filter.c +384 -0
  63. package/csrc/op_json_flatten.c +293 -0
  64. package/csrc/op_json_schema.c +503 -0
  65. package/csrc/op_label_encode.c +419 -0
  66. package/csrc/op_lag.c +181 -0
  67. package/csrc/op_lead.c +242 -0
  68. package/csrc/op_normalize.c +510 -0
  69. package/csrc/op_onehot.c +457 -0
  70. package/csrc/op_pivot.c +1754 -0
  71. package/csrc/op_quarantine.c +189 -0
  72. package/csrc/op_registry.c +3044 -0
  73. package/csrc/op_rename.c +129 -0
  74. package/csrc/op_replace.c +354 -0
  75. package/csrc/op_rleid.c +297 -0
  76. package/csrc/op_rowid.c +559 -0
  77. package/csrc/op_sample.c +158 -0
  78. package/csrc/op_schema.c +1341 -0
  79. package/csrc/op_schema_infer.c +252 -0
  80. package/csrc/op_select.c +340 -0
  81. package/csrc/op_set.c +3449 -0
  82. package/csrc/op_skip.c +95 -0
  83. package/csrc/op_sort.c +819 -0
  84. package/csrc/op_source_name.c +120 -0
  85. package/csrc/op_split.c +151 -0
  86. package/csrc/op_split_data.c +119 -0
  87. package/csrc/op_stack.c +271 -0
  88. package/csrc/op_stats.c +875 -0
  89. package/csrc/op_step.c +333 -0
  90. package/csrc/op_tail.c +105 -0
  91. package/csrc/op_tee.c +338 -0
  92. package/csrc/op_top.c +357 -0
  93. package/csrc/op_trim.c +138 -0
  94. package/csrc/op_unique.c +1343 -0
  95. package/csrc/op_unpivot.c +193 -0
  96. package/csrc/op_validate.c +648 -0
  97. package/csrc/op_window.c +591 -0
  98. package/csrc/path_policy.c +85 -0
  99. package/csrc/pipeline.c +1088 -0
  100. package/csrc/recipes.c +104 -0
  101. package/csrc/recipes.h +27 -0
  102. package/csrc/report.c +506 -0
  103. package/csrc/report.h +22 -0
  104. package/csrc/selector.c +1097 -0
  105. package/csrc/size_utils.c +348 -0
  106. package/csrc/spill.c +317 -0
  107. package/csrc/spill.h +21 -0
  108. package/csrc/tranfi.h +291 -0
  109. package/csrc/transform.h +209 -0
  110. package/csrc/transform_api.c +2237 -0
  111. package/csrc/transform_categorical.c +923 -0
  112. package/csrc/transform_internal.h +472 -0
  113. package/csrc/transform_json.c +3812 -0
  114. package/csrc/transform_numeric.c +1966 -0
  115. package/csrc/transform_sha256.c +154 -0
  116. package/csrc/transform_wasm.h +162 -0
  117. package/csrc/transform_wasm_api.c +1373 -0
  118. package/csrc/wasm_api.c +218 -0
  119. package/napi_api.c +534 -0
  120. package/napi_transform.c +1648 -0
  121. package/napi_transform.h +8 -0
  122. package/package.json +64 -59
  123. package/scripts/install-native.js +76 -0
  124. package/scripts/prepack.js +64 -0
  125. package/scripts/sync-csrc.js +23 -0
  126. package/src/cli.js +190 -0
  127. package/src/engines/duckdb.js +142 -0
  128. package/src/index.js +925 -0
  129. package/src/memory_policy.js +411 -0
  130. package/src/native.js +18 -0
  131. package/src/pipeline.js +709 -0
  132. package/src/recipe_json.js +80 -0
  133. package/src/server.js +279 -0
  134. package/src/transform.js +403 -0
  135. package/src/transform_error.js +10 -0
  136. package/src/wasm.js +21 -0
  137. package/wasm/index.js +732 -0
  138. package/wasm/package.json +1 -0
  139. package/wasm/tranfi_core.js +0 -0
  140. package/wasm/transform.js +1156 -0
  141. package/wasm/worker.js +786 -0
  142. package/dist/bundle.js +0 -1
  143. package/index.html +0 -18
  144. package/src/app.css +0 -169
  145. package/src/app.js +0 -203
  146. package/src/app.vue +0 -250
  147. package/src/bulma-input.vue +0 -110
  148. package/src/common-inputs.js +0 -28
  149. package/src/main.js +0 -20
  150. package/src/transforms.js +0 -166
  151. package/webpack.config.js +0 -108
package/csrc/op_grep.c ADDED
@@ -0,0 +1,181 @@
1
+ /*
2
+ * op_grep.c — Substring/regex filter.
3
+ *
4
+ * Config: {"pattern": "error", "invert": false, "column": "_line", "regex": false}
5
+ * For each row, checks if column value matches pattern.
6
+ * Uses strstr for substring mode, regexec for regex mode.
7
+ * Keeps or discards based on invert flag.
8
+ */
9
+
10
+ #include "internal.h"
11
+ #include "cJSON.h"
12
+ #include <stdlib.h>
13
+ #include <string.h>
14
+ #include <stdio.h>
15
+ #include <regex.h>
16
+
17
+ typedef struct {
18
+ char *pattern;
19
+ char *column;
20
+ int invert;
21
+ int use_regex;
22
+ regex_t compiled;
23
+ size_t rows_in;
24
+ size_t rows_out;
25
+ } grep_state;
26
+
27
+ static int grep_process(tf_step *self, tf_batch *in, tf_batch **out,
28
+ tf_side_channels *side) {
29
+ grep_state *st = self->state;
30
+ *out = NULL;
31
+
32
+ /* Find target column */
33
+ int col_idx = tf_batch_col_index(in, st->column);
34
+ if (col_idx < 0) {
35
+ /* Column not found — pass through or drop all depending on invert */
36
+ if (st->invert) {
37
+ tf_batch *ob = tf_batch_create(in->n_cols, in->n_rows);
38
+ if (!ob) return TF_ERROR;
39
+ if (tf_batch_clone_schema(ob, in) != TF_OK) {
40
+ tf_batch_free(ob);
41
+ return TF_ERROR;
42
+ }
43
+ for (size_t r = 0; r < in->n_rows; r++) {
44
+ if (tf_batch_copy_row(ob, r, in, r) != TF_OK) {
45
+ tf_batch_free(ob);
46
+ return TF_ERROR;
47
+ }
48
+ if (tf_batch_expose_row(ob, r) != TF_OK) {
49
+ tf_batch_free(ob);
50
+ return TF_ERROR;
51
+ }
52
+ }
53
+ *out = ob;
54
+ }
55
+ return TF_OK;
56
+ }
57
+
58
+ /* Create output batch with same schema */
59
+ tf_batch *ob = tf_batch_create(in->n_cols, in->n_rows);
60
+ if (!ob) return TF_ERROR;
61
+ if (tf_batch_clone_schema(ob, in) != TF_OK) {
62
+ tf_batch_free(ob);
63
+ return TF_ERROR;
64
+ }
65
+
66
+ size_t out_row = 0;
67
+ for (size_t r = 0; r < in->n_rows; r++) {
68
+ int match = 0;
69
+
70
+ if (tf_batch_is_null(in, r, (size_t)col_idx)) {
71
+ match = 0;
72
+ } else if (in->col_types[(size_t)col_idx] == TF_TYPE_STRING) {
73
+ const char *val = tf_batch_get_string(in, r, (size_t)col_idx);
74
+ if (st->use_regex) {
75
+ match = (regexec(&st->compiled, val, 0, NULL, 0) == 0) ? 1 : 0;
76
+ } else {
77
+ match = (strstr(val, st->pattern) != NULL) ? 1 : 0;
78
+ }
79
+ }
80
+
81
+ int keep = st->invert ? !match : match;
82
+ if (!keep) continue;
83
+
84
+ if (tf_batch_ensure_capacity(ob, out_row + 1) != TF_OK) {
85
+ tf_batch_free(ob);
86
+ return TF_ERROR;
87
+ }
88
+
89
+ if (tf_batch_copy_row(ob, out_row, in, r) != TF_OK) {
90
+ tf_batch_free(ob);
91
+ return TF_ERROR;
92
+ }
93
+ if (tf_batch_expose_row(ob, out_row) != TF_OK) {
94
+ tf_batch_free(ob);
95
+ return TF_ERROR;
96
+ }
97
+ out_row++;
98
+ }
99
+
100
+ st->rows_in += in->n_rows;
101
+ st->rows_out += out_row;
102
+
103
+ if (side && side->stats) {
104
+ char stats_buf[128];
105
+ snprintf(stats_buf, sizeof(stats_buf),
106
+ "{\"op\":\"grep\",\"rows_in\":%zu,\"rows_out\":%zu}",
107
+ in->n_rows, out_row);
108
+ if (tf_buffer_write_line(side->stats, stats_buf) != TF_OK) {
109
+ tf_batch_free(ob);
110
+ return TF_ERROR;
111
+ }
112
+ }
113
+
114
+ if (out_row > 0) {
115
+ *out = ob;
116
+ } else {
117
+ tf_batch_free(ob);
118
+ }
119
+ return TF_OK;
120
+ }
121
+
122
+ static int grep_flush(tf_step *self, tf_batch **out, tf_side_channels *side) {
123
+ (void)self; (void)side;
124
+ *out = NULL;
125
+ return TF_OK;
126
+ }
127
+
128
+ static void grep_destroy(tf_step *self) {
129
+ grep_state *st = self->state;
130
+ if (st) {
131
+ if (st->use_regex) regfree(&st->compiled);
132
+ free(st->pattern);
133
+ free(st->column);
134
+ free(st);
135
+ }
136
+ free(self);
137
+ }
138
+
139
+ tf_step *tf_grep_create(const cJSON *args) {
140
+ if (!args) return NULL;
141
+
142
+ cJSON *pattern_json = cJSON_GetObjectItemCaseSensitive(args, "pattern");
143
+ if (!cJSON_IsString(pattern_json)) return NULL;
144
+
145
+ grep_state *st = tf_callocarray_checked(1, sizeof(grep_state));
146
+ if (!st) return NULL;
147
+
148
+ st->pattern = tf_strdup_checked(pattern_json->valuestring);
149
+ if (!st->pattern) { free(st); return NULL; }
150
+
151
+ cJSON *column_json = cJSON_GetObjectItemCaseSensitive(args, "column");
152
+ if (cJSON_IsString(column_json))
153
+ st->column = tf_strdup_checked(column_json->valuestring);
154
+ else
155
+ st->column = tf_strdup_checked("_line");
156
+ if (!st->column) { free(st->pattern); free(st); return NULL; }
157
+
158
+ cJSON *invert_json = cJSON_GetObjectItemCaseSensitive(args, "invert");
159
+ st->invert = (cJSON_IsBool(invert_json) && cJSON_IsTrue(invert_json)) ? 1 : 0;
160
+
161
+ cJSON *regex_json = cJSON_GetObjectItemCaseSensitive(args, "regex");
162
+ st->use_regex = (cJSON_IsBool(regex_json) && cJSON_IsTrue(regex_json)) ? 1 : 0;
163
+
164
+ if (st->use_regex) {
165
+ int rc = regcomp(&st->compiled, st->pattern, REG_EXTENDED | REG_NOSUB);
166
+ if (rc != 0) {
167
+ free(st->pattern);
168
+ free(st->column);
169
+ free(st);
170
+ return NULL;
171
+ }
172
+ }
173
+
174
+ tf_step *step = tf_callocarray_checked(1, sizeof(tf_step));
175
+ if (!step) { free(st->pattern); free(st->column); free(st); return NULL; }
176
+ step->process = grep_process;
177
+ step->flush = grep_flush;
178
+ step->destroy = grep_destroy;
179
+ step->state = st;
180
+ return step;
181
+ }