rowpipe 1.0.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 (225) hide show
  1. package/README.md +401 -0
  2. package/benchmarks/memory-bench.ts +109 -0
  3. package/dist/analytics/reduce.d.ts +33 -0
  4. package/dist/analytics/reduce.d.ts.map +1 -0
  5. package/dist/analytics/reduce.js +318 -0
  6. package/dist/analytics/reduce.js.map +1 -0
  7. package/dist/analytics/schema-inference.d.ts +31 -0
  8. package/dist/analytics/schema-inference.d.ts.map +1 -0
  9. package/dist/analytics/schema-inference.js +166 -0
  10. package/dist/analytics/schema-inference.js.map +1 -0
  11. package/dist/analytics/semantic-types.d.ts +6 -0
  12. package/dist/analytics/semantic-types.d.ts.map +1 -0
  13. package/dist/analytics/semantic-types.js +40 -0
  14. package/dist/analytics/semantic-types.js.map +1 -0
  15. package/dist/analytics/stats.d.ts +102 -0
  16. package/dist/analytics/stats.d.ts.map +1 -0
  17. package/dist/analytics/stats.js +307 -0
  18. package/dist/analytics/stats.js.map +1 -0
  19. package/dist/analytics/validator.d.ts +32 -0
  20. package/dist/analytics/validator.d.ts.map +1 -0
  21. package/dist/analytics/validator.js +96 -0
  22. package/dist/analytics/validator.js.map +1 -0
  23. package/dist/cli/commands/cast.d.ts +13 -0
  24. package/dist/cli/commands/cast.d.ts.map +1 -0
  25. package/dist/cli/commands/cast.js +39 -0
  26. package/dist/cli/commands/cast.js.map +1 -0
  27. package/dist/cli/commands/convert.d.ts +15 -0
  28. package/dist/cli/commands/convert.d.ts.map +1 -0
  29. package/dist/cli/commands/convert.js +89 -0
  30. package/dist/cli/commands/convert.js.map +1 -0
  31. package/dist/cli/commands/filter.d.ts +11 -0
  32. package/dist/cli/commands/filter.d.ts.map +1 -0
  33. package/dist/cli/commands/filter.js +38 -0
  34. package/dist/cli/commands/filter.js.map +1 -0
  35. package/dist/cli/commands/inspect.d.ts +10 -0
  36. package/dist/cli/commands/inspect.d.ts.map +1 -0
  37. package/dist/cli/commands/inspect.js +134 -0
  38. package/dist/cli/commands/inspect.js.map +1 -0
  39. package/dist/cli/commands/map.d.ts +11 -0
  40. package/dist/cli/commands/map.d.ts.map +1 -0
  41. package/dist/cli/commands/map.js +43 -0
  42. package/dist/cli/commands/map.js.map +1 -0
  43. package/dist/cli/commands/reduce.d.ts +12 -0
  44. package/dist/cli/commands/reduce.d.ts.map +1 -0
  45. package/dist/cli/commands/reduce.js +49 -0
  46. package/dist/cli/commands/reduce.js.map +1 -0
  47. package/dist/cli/commands/rename.d.ts +11 -0
  48. package/dist/cli/commands/rename.d.ts.map +1 -0
  49. package/dist/cli/commands/rename.js +39 -0
  50. package/dist/cli/commands/rename.js.map +1 -0
  51. package/dist/cli/commands/sample.d.ts +13 -0
  52. package/dist/cli/commands/sample.d.ts.map +1 -0
  53. package/dist/cli/commands/sample.js +40 -0
  54. package/dist/cli/commands/sample.js.map +1 -0
  55. package/dist/cli/commands/schema.d.ts +13 -0
  56. package/dist/cli/commands/schema.d.ts.map +1 -0
  57. package/dist/cli/commands/schema.js +57 -0
  58. package/dist/cli/commands/schema.js.map +1 -0
  59. package/dist/cli/commands/select.d.ts +11 -0
  60. package/dist/cli/commands/select.d.ts.map +1 -0
  61. package/dist/cli/commands/select.js +39 -0
  62. package/dist/cli/commands/select.js.map +1 -0
  63. package/dist/cli/commands/stats.d.ts +15 -0
  64. package/dist/cli/commands/stats.d.ts.map +1 -0
  65. package/dist/cli/commands/stats.js +75 -0
  66. package/dist/cli/commands/stats.js.map +1 -0
  67. package/dist/cli/commands/validate.d.ts +12 -0
  68. package/dist/cli/commands/validate.d.ts.map +1 -0
  69. package/dist/cli/commands/validate.js +86 -0
  70. package/dist/cli/commands/validate.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +262 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/batch.d.ts +15 -0
  76. package/dist/core/batch.d.ts.map +1 -0
  77. package/dist/core/batch.js +67 -0
  78. package/dist/core/batch.js.map +1 -0
  79. package/dist/core/errors.d.ts +35 -0
  80. package/dist/core/errors.d.ts.map +1 -0
  81. package/dist/core/errors.js +55 -0
  82. package/dist/core/errors.js.map +1 -0
  83. package/dist/core/pipeline.d.ts +40 -0
  84. package/dist/core/pipeline.d.ts.map +1 -0
  85. package/dist/core/pipeline.js +120 -0
  86. package/dist/core/pipeline.js.map +1 -0
  87. package/dist/core/types.d.ts +73 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +2 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/index.d.ts +22 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +28 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/readers/csv.d.ts +24 -0
  96. package/dist/readers/csv.d.ts.map +1 -0
  97. package/dist/readers/csv.js +251 -0
  98. package/dist/readers/csv.js.map +1 -0
  99. package/dist/readers/index.d.ts +17 -0
  100. package/dist/readers/index.d.ts.map +1 -0
  101. package/dist/readers/index.js +74 -0
  102. package/dist/readers/index.js.map +1 -0
  103. package/dist/readers/json.d.ts +20 -0
  104. package/dist/readers/json.d.ts.map +1 -0
  105. package/dist/readers/json.js +219 -0
  106. package/dist/readers/json.js.map +1 -0
  107. package/dist/readers/jsonl.d.ts +14 -0
  108. package/dist/readers/jsonl.d.ts.map +1 -0
  109. package/dist/readers/jsonl.js +95 -0
  110. package/dist/readers/jsonl.js.map +1 -0
  111. package/dist/readers/xlsx.d.ts +18 -0
  112. package/dist/readers/xlsx.d.ts.map +1 -0
  113. package/dist/readers/xlsx.js +138 -0
  114. package/dist/readers/xlsx.js.map +1 -0
  115. package/dist/transforms/cast.d.ts +21 -0
  116. package/dist/transforms/cast.d.ts.map +1 -0
  117. package/dist/transforms/cast.js +182 -0
  118. package/dist/transforms/cast.js.map +1 -0
  119. package/dist/transforms/expression.d.ts +67 -0
  120. package/dist/transforms/expression.d.ts.map +1 -0
  121. package/dist/transforms/expression.js +943 -0
  122. package/dist/transforms/expression.js.map +1 -0
  123. package/dist/transforms/filter.d.ts +6 -0
  124. package/dist/transforms/filter.d.ts.map +1 -0
  125. package/dist/transforms/filter.js +31 -0
  126. package/dist/transforms/filter.js.map +1 -0
  127. package/dist/transforms/map.d.ts +12 -0
  128. package/dist/transforms/map.d.ts.map +1 -0
  129. package/dist/transforms/map.js +76 -0
  130. package/dist/transforms/map.js.map +1 -0
  131. package/dist/transforms/rename.d.ts +10 -0
  132. package/dist/transforms/rename.d.ts.map +1 -0
  133. package/dist/transforms/rename.js +39 -0
  134. package/dist/transforms/rename.js.map +1 -0
  135. package/dist/transforms/sample.d.ts +10 -0
  136. package/dist/transforms/sample.d.ts.map +1 -0
  137. package/dist/transforms/sample.js +47 -0
  138. package/dist/transforms/sample.js.map +1 -0
  139. package/dist/transforms/select.d.ts +6 -0
  140. package/dist/transforms/select.d.ts.map +1 -0
  141. package/dist/transforms/select.js +63 -0
  142. package/dist/transforms/select.js.map +1 -0
  143. package/dist/utils/compression.d.ts +14 -0
  144. package/dist/utils/compression.d.ts.map +1 -0
  145. package/dist/utils/compression.js +38 -0
  146. package/dist/utils/compression.js.map +1 -0
  147. package/dist/utils/formatting.d.ts +6 -0
  148. package/dist/utils/formatting.d.ts.map +1 -0
  149. package/dist/utils/formatting.js +56 -0
  150. package/dist/utils/formatting.js.map +1 -0
  151. package/dist/utils/progress.d.ts +13 -0
  152. package/dist/utils/progress.d.ts.map +1 -0
  153. package/dist/utils/progress.js +27 -0
  154. package/dist/utils/progress.js.map +1 -0
  155. package/dist/writers/csv.d.ts +18 -0
  156. package/dist/writers/csv.d.ts.map +1 -0
  157. package/dist/writers/csv.js +84 -0
  158. package/dist/writers/csv.js.map +1 -0
  159. package/dist/writers/index.d.ts +17 -0
  160. package/dist/writers/index.d.ts.map +1 -0
  161. package/dist/writers/index.js +73 -0
  162. package/dist/writers/index.js.map +1 -0
  163. package/dist/writers/json.d.ts +12 -0
  164. package/dist/writers/json.d.ts.map +1 -0
  165. package/dist/writers/json.js +42 -0
  166. package/dist/writers/json.js.map +1 -0
  167. package/dist/writers/jsonl.d.ts +12 -0
  168. package/dist/writers/jsonl.d.ts.map +1 -0
  169. package/dist/writers/jsonl.js +41 -0
  170. package/dist/writers/jsonl.js.map +1 -0
  171. package/dist/writers/xlsx.d.ts +13 -0
  172. package/dist/writers/xlsx.d.ts.map +1 -0
  173. package/dist/writers/xlsx.js +65 -0
  174. package/dist/writers/xlsx.js.map +1 -0
  175. package/package.json +44 -0
  176. package/src/analytics/reduce.ts +388 -0
  177. package/src/analytics/schema-inference.ts +217 -0
  178. package/src/analytics/semantic-types.ts +36 -0
  179. package/src/analytics/stats.ts +383 -0
  180. package/src/analytics/validator.ts +134 -0
  181. package/src/cli/commands/cast.ts +60 -0
  182. package/src/cli/commands/convert.ts +128 -0
  183. package/src/cli/commands/filter.ts +58 -0
  184. package/src/cli/commands/inspect.ts +193 -0
  185. package/src/cli/commands/map.ts +66 -0
  186. package/src/cli/commands/reduce.ts +74 -0
  187. package/src/cli/commands/rename.ts +59 -0
  188. package/src/cli/commands/sample.ts +61 -0
  189. package/src/cli/commands/schema.ts +86 -0
  190. package/src/cli/commands/select.ts +59 -0
  191. package/src/cli/commands/stats.ts +100 -0
  192. package/src/cli/commands/validate.ts +123 -0
  193. package/src/cli/index.ts +285 -0
  194. package/src/core/batch.ts +81 -0
  195. package/src/core/errors.ts +81 -0
  196. package/src/core/pipeline.ts +150 -0
  197. package/src/core/types.ts +110 -0
  198. package/src/index.ts +52 -0
  199. package/src/readers/csv.ts +302 -0
  200. package/src/readers/index.ts +88 -0
  201. package/src/readers/json.ts +256 -0
  202. package/src/readers/jsonl.ts +126 -0
  203. package/src/readers/xlsx.ts +182 -0
  204. package/src/transforms/cast.ts +212 -0
  205. package/src/transforms/expression.ts +1114 -0
  206. package/src/transforms/filter.ts +38 -0
  207. package/src/transforms/map.ts +99 -0
  208. package/src/transforms/rename.ts +47 -0
  209. package/src/transforms/sample.ts +57 -0
  210. package/src/transforms/select.ts +64 -0
  211. package/src/utils/compression.ts +43 -0
  212. package/src/utils/formatting.ts +75 -0
  213. package/src/utils/progress.ts +37 -0
  214. package/src/writers/csv.ts +106 -0
  215. package/src/writers/index.ts +87 -0
  216. package/src/writers/json.ts +52 -0
  217. package/src/writers/jsonl.ts +49 -0
  218. package/src/writers/xlsx.ts +87 -0
  219. package/tests/analytics.test.ts +119 -0
  220. package/tests/cli-integration.test.ts +187 -0
  221. package/tests/map-reduce.test.ts +223 -0
  222. package/tests/readers-writers.test.ts +189 -0
  223. package/tests/transforms.test.ts +199 -0
  224. package/tsconfig.json +21 -0
  225. package/vitest.config.ts +9 -0
@@ -0,0 +1,102 @@
1
+ import type { Aggregator, Row } from "../core/types.js";
2
+ /**
3
+ * HyperLogLog (HLL) distinct count estimator with bounded O(1) memory.
4
+ * Uses m = 1024 registers (p = 10), standard error ~3.25%.
5
+ * Hardware Math.clz32 for instantaneous zero counting.
6
+ */
7
+ export declare class HyperLogLog {
8
+ private p;
9
+ private m;
10
+ private registers;
11
+ private alphaMM;
12
+ constructor(p?: number);
13
+ add(value: unknown): void;
14
+ merge(other: HyperLogLog): void;
15
+ count(): number;
16
+ }
17
+ export interface NumericColumnStats {
18
+ count: number;
19
+ nullCount: number;
20
+ min: number | null;
21
+ max: number | null;
22
+ sum: number;
23
+ mean: number | null;
24
+ variance: number | null;
25
+ stddev: number | null;
26
+ approxDistinct: number;
27
+ }
28
+ export interface StringColumnStats {
29
+ count: number;
30
+ nullCount: number;
31
+ emptyCount: number;
32
+ minLength: number | null;
33
+ maxLength: number | null;
34
+ avgLength: number | null;
35
+ emptyCountRatio?: number;
36
+ approxDistinct: number;
37
+ topValues: Array<{
38
+ value: string;
39
+ count: number;
40
+ }>;
41
+ }
42
+ export interface ColumnStatsResult {
43
+ column: string;
44
+ type: "numeric" | "string";
45
+ numeric?: NumericColumnStats;
46
+ string?: StringColumnStats;
47
+ }
48
+ export interface DatasetStatsResult {
49
+ totalRows: number;
50
+ columns: Record<string, ColumnStatsResult>;
51
+ }
52
+ /**
53
+ * Online Welford statistics collector for a numeric column.
54
+ */
55
+ export declare class NumericStatsCollector {
56
+ count: number;
57
+ nullCount: number;
58
+ min: number | null;
59
+ max: number | null;
60
+ sum: number;
61
+ mean: number;
62
+ M2: number;
63
+ hll: HyperLogLog;
64
+ add(val: unknown): void;
65
+ merge(other: NumericStatsCollector): void;
66
+ result(): NumericColumnStats;
67
+ }
68
+ /**
69
+ * Online statistics collector for a string column.
70
+ */
71
+ export declare class StringStatsCollector {
72
+ count: number;
73
+ nullCount: number;
74
+ emptyCount: number;
75
+ minLength: number | null;
76
+ maxLength: number | null;
77
+ totalLength: number;
78
+ hll: HyperLogLog;
79
+ private frequencyMap;
80
+ private maxTrackedValues;
81
+ add(val: unknown): void;
82
+ result(): StringColumnStats;
83
+ }
84
+ /**
85
+ * Dataset-wide Aggregator collecting statistics across all columns in stream.
86
+ */
87
+ export declare class DatasetStatsAggregator implements Aggregator<DatasetStatsResult> {
88
+ private totalRows;
89
+ private targetColumn?;
90
+ private numericCollectors;
91
+ private stringCollectors;
92
+ private columnTypeHints;
93
+ private handlers;
94
+ private initialized;
95
+ constructor(options?: {
96
+ column?: string;
97
+ });
98
+ private initHandler;
99
+ add(row: Row): void;
100
+ result(): DatasetStatsResult;
101
+ }
102
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/analytics/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Fast 32-bit FNV-1a hash function with 32-bit avalanche mixing.
3
+ * Zero BigInt allocations, runs at native CPU register speed.
4
+ */
5
+ function hash32(str) {
6
+ let h = 0x811c9dc5;
7
+ const len = str.length;
8
+ for (let i = 0; i < len; i++) {
9
+ h = (h ^ str.charCodeAt(i)) >>> 0;
10
+ h = Math.imul(h, 0x01000193) >>> 0;
11
+ }
12
+ // Avalanche mixing
13
+ h ^= h >>> 16;
14
+ h = Math.imul(h, 0x85ebca6b) >>> 0;
15
+ h ^= h >>> 13;
16
+ h = Math.imul(h, 0xc2b2ae35) >>> 0;
17
+ h ^= h >>> 16;
18
+ return h >>> 0;
19
+ }
20
+ /**
21
+ * HyperLogLog (HLL) distinct count estimator with bounded O(1) memory.
22
+ * Uses m = 1024 registers (p = 10), standard error ~3.25%.
23
+ * Hardware Math.clz32 for instantaneous zero counting.
24
+ */
25
+ export class HyperLogLog {
26
+ p;
27
+ m;
28
+ registers;
29
+ alphaMM;
30
+ constructor(p = 10) {
31
+ this.p = p;
32
+ this.m = 1 << p;
33
+ this.registers = new Uint8Array(this.m);
34
+ // Alpha constant calculation
35
+ if (this.m === 16)
36
+ this.alphaMM = 0.673 * this.m * this.m;
37
+ else if (this.m === 32)
38
+ this.alphaMM = 0.697 * this.m * this.m;
39
+ else if (this.m === 64)
40
+ this.alphaMM = 0.709 * this.m * this.m;
41
+ else
42
+ this.alphaMM = (0.7213 / (1 + 1.079 / this.m)) * this.m * this.m;
43
+ }
44
+ add(value) {
45
+ if (value === null || value === undefined)
46
+ return;
47
+ const str = String(value);
48
+ const hash = hash32(str);
49
+ // Low p bits for register index
50
+ const index = hash & (this.m - 1);
51
+ // Remaining (32 - p) bits for leading zeros
52
+ const w = hash >>> this.p;
53
+ // Single-cycle CPU instruction Math.clz32 for leading zero count
54
+ let leadingZeros;
55
+ if (w === 0) {
56
+ leadingZeros = 32 - this.p + 1;
57
+ }
58
+ else {
59
+ leadingZeros = Math.clz32(w) - this.p + 1;
60
+ }
61
+ if (leadingZeros > this.registers[index]) {
62
+ this.registers[index] = leadingZeros;
63
+ }
64
+ }
65
+ merge(other) {
66
+ for (let i = 0; i < this.m; i++) {
67
+ if (other.registers[i] > this.registers[i]) {
68
+ this.registers[i] = other.registers[i];
69
+ }
70
+ }
71
+ }
72
+ count() {
73
+ let sum = 0;
74
+ let zeros = 0;
75
+ for (let i = 0; i < this.m; i++) {
76
+ const val = this.registers[i];
77
+ sum += 2 ** -val;
78
+ if (val === 0)
79
+ zeros++;
80
+ }
81
+ let estimate = this.alphaMM / sum;
82
+ // Small range correction (Linear Counting)
83
+ if (estimate <= 2.5 * this.m && zeros > 0) {
84
+ estimate = this.m * Math.log(this.m / zeros);
85
+ }
86
+ return Math.round(estimate);
87
+ }
88
+ }
89
+ /**
90
+ * Online Welford statistics collector for a numeric column.
91
+ */
92
+ export class NumericStatsCollector {
93
+ count = 0;
94
+ nullCount = 0;
95
+ min = null;
96
+ max = null;
97
+ sum = 0;
98
+ mean = 0;
99
+ M2 = 0; // sum of squared differences from the mean
100
+ hll = new HyperLogLog();
101
+ add(val) {
102
+ if (val === null || val === undefined || val === "") {
103
+ this.nullCount++;
104
+ return;
105
+ }
106
+ const num = typeof val === "number" ? val : Number(val);
107
+ if (Number.isNaN(num)) {
108
+ this.nullCount++;
109
+ return;
110
+ }
111
+ this.count++;
112
+ this.sum += num;
113
+ this.hll.add(num);
114
+ if (this.min === null || num < this.min)
115
+ this.min = num;
116
+ if (this.max === null || num > this.max)
117
+ this.max = num;
118
+ // Welford's online algorithm
119
+ const delta = num - this.mean;
120
+ this.mean += delta / this.count;
121
+ const delta2 = num - this.mean;
122
+ this.M2 += delta * delta2;
123
+ }
124
+ merge(other) {
125
+ if (other.count === 0) {
126
+ this.nullCount += other.nullCount;
127
+ return;
128
+ }
129
+ if (this.count === 0) {
130
+ this.count = other.count;
131
+ this.nullCount = other.nullCount;
132
+ this.min = other.min;
133
+ this.max = other.max;
134
+ this.sum = other.sum;
135
+ this.mean = other.mean;
136
+ this.M2 = other.M2;
137
+ this.hll.merge(other.hll);
138
+ return;
139
+ }
140
+ const totalCount = this.count + other.count;
141
+ const delta = other.mean - this.mean;
142
+ this.mean = (this.count * this.mean + other.count * other.mean) / totalCount;
143
+ this.M2 = this.M2 + other.M2 + (delta * delta * this.count * other.count) / totalCount;
144
+ this.count = totalCount;
145
+ this.nullCount += other.nullCount;
146
+ this.sum += other.sum;
147
+ if (this.min === null || (other.min !== null && other.min < this.min))
148
+ this.min = other.min;
149
+ if (this.max === null || (other.max !== null && other.max > this.max))
150
+ this.max = other.max;
151
+ this.hll.merge(other.hll);
152
+ }
153
+ result() {
154
+ const variance = this.count > 1 ? this.M2 / (this.count - 1) : this.count === 1 ? 0 : null;
155
+ const stddev = variance !== null ? Math.sqrt(variance) : null;
156
+ return {
157
+ count: this.count,
158
+ nullCount: this.nullCount,
159
+ min: this.min,
160
+ max: this.max,
161
+ sum: this.sum,
162
+ mean: this.count > 0 ? this.mean : null,
163
+ variance,
164
+ stddev,
165
+ approxDistinct: this.hll.count(),
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Online statistics collector for a string column.
171
+ */
172
+ export class StringStatsCollector {
173
+ count = 0;
174
+ nullCount = 0;
175
+ emptyCount = 0;
176
+ minLength = null;
177
+ maxLength = null;
178
+ totalLength = 0;
179
+ hll = new HyperLogLog();
180
+ frequencyMap = new Map();
181
+ maxTrackedValues = 1000;
182
+ add(val) {
183
+ if (val === null || val === undefined) {
184
+ this.nullCount++;
185
+ return;
186
+ }
187
+ const str = String(val);
188
+ if (str === "") {
189
+ this.emptyCount++;
190
+ }
191
+ this.count++;
192
+ this.totalLength += str.length;
193
+ this.hll.add(str);
194
+ if (this.minLength === null || str.length < this.minLength)
195
+ this.minLength = str.length;
196
+ if (this.maxLength === null || str.length > this.maxLength)
197
+ this.maxLength = str.length;
198
+ // Track top values bounded
199
+ if (this.frequencyMap.size < this.maxTrackedValues || this.frequencyMap.has(str)) {
200
+ this.frequencyMap.set(str, (this.frequencyMap.get(str) || 0) + 1);
201
+ }
202
+ }
203
+ result() {
204
+ const sorted = Array.from(this.frequencyMap.entries())
205
+ .sort((a, b) => b[1] - a[1])
206
+ .slice(0, 5)
207
+ .map(([value, count]) => ({ value, count }));
208
+ return {
209
+ count: this.count,
210
+ nullCount: this.nullCount,
211
+ emptyCount: this.emptyCount,
212
+ minLength: this.minLength,
213
+ maxLength: this.maxLength,
214
+ avgLength: this.count > 0 ? this.totalLength / this.count : null,
215
+ approxDistinct: this.hll.count(),
216
+ topValues: sorted,
217
+ };
218
+ }
219
+ }
220
+ /**
221
+ * Dataset-wide Aggregator collecting statistics across all columns in stream.
222
+ */
223
+ export class DatasetStatsAggregator {
224
+ totalRows = 0;
225
+ targetColumn;
226
+ numericCollectors = new Map();
227
+ stringCollectors = new Map();
228
+ columnTypeHints = new Map();
229
+ handlers = [];
230
+ initialized = false;
231
+ constructor(options) {
232
+ this.targetColumn = options?.column;
233
+ }
234
+ initHandler(col) {
235
+ let numCollector = this.numericCollectors.get(col);
236
+ let strCollector = this.stringCollectors.get(col);
237
+ let hint = this.columnTypeHints.get(col);
238
+ if (!numCollector) {
239
+ numCollector = new NumericStatsCollector();
240
+ strCollector = new StringStatsCollector();
241
+ hint = { numericVotes: 0, totalVotes: 0 };
242
+ this.numericCollectors.set(col, numCollector);
243
+ this.stringCollectors.set(col, strCollector);
244
+ this.columnTypeHints.set(col, hint);
245
+ }
246
+ return { col, numCollector: numCollector, strCollector: strCollector, hint: hint };
247
+ }
248
+ add(row) {
249
+ this.totalRows++;
250
+ if (!this.initialized) {
251
+ const columns = this.targetColumn ? [this.targetColumn] : Object.keys(row);
252
+ this.handlers = new Array(columns.length);
253
+ for (let i = 0; i < columns.length; i++) {
254
+ this.handlers[i] = this.initHandler(columns[i]);
255
+ }
256
+ this.initialized = true;
257
+ }
258
+ const handlers = this.handlers;
259
+ const len = handlers.length;
260
+ for (let i = 0; i < len; i++) {
261
+ const h = handlers[i];
262
+ const val = row[h.col];
263
+ h.strCollector.add(val);
264
+ if (val !== null && val !== undefined && val !== "") {
265
+ h.hint.totalVotes++;
266
+ const num = typeof val === "number" ? val : Number(val);
267
+ if (!Number.isNaN(num) && typeof val !== "boolean") {
268
+ h.hint.numericVotes++;
269
+ h.numCollector.add(num);
270
+ }
271
+ else {
272
+ h.numCollector.add(null);
273
+ }
274
+ }
275
+ else {
276
+ h.numCollector.add(null);
277
+ }
278
+ }
279
+ }
280
+ result() {
281
+ const columns = {};
282
+ for (const [col, hint] of this.columnTypeHints.entries()) {
283
+ const isNumeric = hint.totalVotes > 0 && hint.numericVotes / hint.totalVotes >= 0.8;
284
+ const numCollector = this.numericCollectors.get(col);
285
+ const strCollector = this.stringCollectors.get(col);
286
+ if (isNumeric) {
287
+ columns[col] = {
288
+ column: col,
289
+ type: "numeric",
290
+ numeric: numCollector.result(),
291
+ };
292
+ }
293
+ else {
294
+ columns[col] = {
295
+ column: col,
296
+ type: "string",
297
+ string: strCollector.result(),
298
+ };
299
+ }
300
+ }
301
+ return {
302
+ totalRows: this.totalRows,
303
+ columns,
304
+ };
305
+ }
306
+ }
307
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/analytics/stats.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,mBAAmB;IACnB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACd,CAAC,CAAS;IACV,CAAC,CAAS;IACV,SAAS,CAAa;IACtB,OAAO,CAAS;IAExB,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExC,6BAA6B;QAC7B,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;aACrD,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;aAC1D,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;YAC1D,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,GAAG,CAAC,KAAc;QAChB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEzB,gCAAgC;QAChC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,4CAA4C;QAC5C,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QAE1B,iEAAiE;QACjE,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAkB;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAC/B,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,IAAI,GAAG,KAAK,CAAC;gBAAE,KAAK,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QAElC,2CAA2C;QAC3C,IAAI,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACF;AAsCD;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACzB,KAAK,GAAG,CAAC,CAAC;IACV,SAAS,GAAG,CAAC,CAAC;IACd,GAAG,GAAkB,IAAI,CAAC;IAC1B,GAAG,GAAkB,IAAI,CAAC;IAC1B,GAAG,GAAG,CAAC,CAAC;IACR,IAAI,GAAG,CAAC,CAAC;IACT,EAAE,GAAG,CAAC,CAAC,CAAC,2CAA2C;IACnD,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAE/B,GAAG,CAAC,GAAY;QACd,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAExD,6BAA6B;QAC7B,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,EAAE,IAAI,KAAK,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAA4B;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAErC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;QAC7E,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;QACvF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;QAEtB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAC5F,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9D,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACvC,QAAQ;YACR,MAAM;YACN,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;SACjC,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACxB,KAAK,GAAG,CAAC,CAAC;IACV,SAAS,GAAG,CAAC,CAAC;IACd,UAAU,GAAG,CAAC,CAAC;IACf,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,GAAkB,IAAI,CAAC;IAChC,WAAW,GAAG,CAAC,CAAC;IAChB,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IACvB,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,gBAAgB,GAAG,IAAI,CAAC;IAEhC,GAAG,CAAC,GAAY;QACd,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QACxF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAExF,2BAA2B;QAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;aACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAE/C,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAChE,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAChC,SAAS,EAAE,MAAM;SAClB,CAAC;IACJ,CAAC;CACF;AASD;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACzB,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,CAAU;IACtB,iBAAiB,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC7D,gBAAgB,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,eAAe,GAAG,IAAI,GAAG,EAAwD,CAAC;IAClF,QAAQ,GAAoB,EAAE,CAAC;IAC/B,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,OAA6B;QACvC,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,CAAC;IACtC,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,IAAI,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAC3C,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC1C,IAAI,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,YAAa,EAAE,YAAY,EAAE,YAAa,EAAE,IAAI,EAAE,IAAK,EAAE,CAAC;IACxF,CAAC;IAED,GAAG,CAAC,GAAQ;QACV,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3E,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEvB,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAExB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;gBACpD,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;oBACnD,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,OAAO,GAAsC,EAAE,CAAC;QAEtD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;YACpF,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YAErD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,GAAG;oBACb,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE;iBAC/B,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG;oBACb,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE;iBAC9B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO;SACR,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import type { Aggregator, Row } from "../core/types.js";
2
+ export interface ColumnSchemaRule {
3
+ type?: string;
4
+ nullable?: boolean;
5
+ format?: string;
6
+ }
7
+ export type ValidationSchemaDefinition = Record<string, ColumnSchemaRule>;
8
+ export interface ColumnViolationSummary {
9
+ column: string;
10
+ rule: string;
11
+ violationsCount: number;
12
+ sampleInvalidValues: unknown[];
13
+ }
14
+ export interface ValidationReport {
15
+ totalRows: number;
16
+ validRows: number;
17
+ invalidRows: number;
18
+ isValid: boolean;
19
+ violations: ColumnViolationSummary[];
20
+ }
21
+ export declare class SchemaValidatorAggregator implements Aggregator<ValidationReport> {
22
+ private schema;
23
+ private totalRows;
24
+ private validRows;
25
+ private invalidRows;
26
+ private violationsMap;
27
+ constructor(schema: ValidationSchemaDefinition);
28
+ private addViolation;
29
+ add(row: Row): void;
30
+ result(): ValidationReport;
31
+ }
32
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/analytics/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAIxD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,OAAO,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,sBAAsB,EAAE,CAAC;CACtC;AAED,qBAAa,yBAA0B,YAAW,UAAU,CAAC,gBAAgB,CAAC;IAC5E,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAA6C;gBAEtD,MAAM,EAAE,0BAA0B;IAI9C,OAAO,CAAC,YAAY;IAkBpB,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAoEnB,MAAM,IAAI,gBAAgB;CAS3B"}
@@ -0,0 +1,96 @@
1
+ import { classifyPrimitiveType } from "./schema-inference.js";
2
+ import { detectSemanticType } from "./semantic-types.js";
3
+ export class SchemaValidatorAggregator {
4
+ schema;
5
+ totalRows = 0;
6
+ validRows = 0;
7
+ invalidRows = 0;
8
+ violationsMap = new Map();
9
+ constructor(schema) {
10
+ this.schema = schema;
11
+ }
12
+ addViolation(column, rule, value) {
13
+ const key = `${column}::${rule}`;
14
+ if (!this.violationsMap.has(key)) {
15
+ this.violationsMap.set(key, {
16
+ column,
17
+ rule,
18
+ violationsCount: 0,
19
+ sampleInvalidValues: [],
20
+ });
21
+ }
22
+ const v = this.violationsMap.get(key);
23
+ v.violationsCount++;
24
+ if (v.sampleInvalidValues.length < 5) {
25
+ v.sampleInvalidValues.push(value);
26
+ }
27
+ }
28
+ add(row) {
29
+ this.totalRows++;
30
+ let rowHasError = false;
31
+ for (const [colName, rule] of Object.entries(this.schema)) {
32
+ const val = row[colName];
33
+ const isNull = val === null || val === undefined || val === "";
34
+ // Nullability check
35
+ if (isNull) {
36
+ if (rule.nullable === false) {
37
+ this.addViolation(colName, "null not allowed", val);
38
+ rowHasError = true;
39
+ }
40
+ continue;
41
+ }
42
+ // Type check
43
+ if (rule.type) {
44
+ const actualType = classifyPrimitiveType(val);
45
+ const expectedType = rule.type.toLowerCase();
46
+ let matchesType = false;
47
+ if (expectedType === "string") {
48
+ matchesType = true;
49
+ }
50
+ else if (expectedType === "integer" || expectedType === "int") {
51
+ matchesType = actualType === "integer";
52
+ }
53
+ else if (expectedType === "number" || expectedType === "float") {
54
+ matchesType = actualType === "integer" || actualType === "number";
55
+ }
56
+ else if (expectedType === "boolean" || expectedType === "bool") {
57
+ matchesType = actualType === "boolean";
58
+ }
59
+ else if (expectedType === "date") {
60
+ matchesType = actualType === "date" || actualType === "datetime";
61
+ }
62
+ else if (expectedType === "datetime") {
63
+ matchesType = actualType === "datetime";
64
+ }
65
+ if (!matchesType) {
66
+ this.addViolation(colName, `expected ${rule.type}`, val);
67
+ rowHasError = true;
68
+ }
69
+ }
70
+ // Format check (semantic type)
71
+ if (rule.format) {
72
+ const detected = detectSemanticType(val);
73
+ if (detected !== rule.format.toLowerCase()) {
74
+ this.addViolation(colName, `expected format ${rule.format}`, val);
75
+ rowHasError = true;
76
+ }
77
+ }
78
+ }
79
+ if (rowHasError) {
80
+ this.invalidRows++;
81
+ }
82
+ else {
83
+ this.validRows++;
84
+ }
85
+ }
86
+ result() {
87
+ return {
88
+ totalRows: this.totalRows,
89
+ validRows: this.validRows,
90
+ invalidRows: this.invalidRows,
91
+ isValid: this.invalidRows === 0,
92
+ violations: Array.from(this.violationsMap.values()),
93
+ };
94
+ }
95
+ }
96
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/analytics/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CastOnError } from "../../transforms/cast.js";
2
+ export interface CastCommandOptions {
3
+ onError?: CastOnError;
4
+ from?: string;
5
+ to?: string;
6
+ sheet?: string;
7
+ delimiter?: string;
8
+ batchSize?: string | number;
9
+ quiet?: boolean;
10
+ noProgress?: boolean;
11
+ }
12
+ export declare function castCommand(inputPath: string | undefined, specs: string[], options?: CastCommandOptions): Promise<void>;
13
+ //# sourceMappingURL=cast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,WAAW,EAAkB,MAAM,0BAA0B,CAAC;AAKzF,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,SAAS,oBAAM,EACf,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,39 @@
1
+ import { createPipeline } from "../../core/pipeline.js";
2
+ import { createReader, inferFormatFromPath as inferReaderFormat } from "../../readers/index.js";
3
+ import { createWriter } from "../../writers/index.js";
4
+ import { castColumns, parseCastSpecs } from "../../transforms/cast.js";
5
+ import { openReadableStream } from "../../utils/compression.js";
6
+ import { logMemoryDebug } from "../../utils/formatting.js";
7
+ import { ProgressReporter } from "../../utils/progress.js";
8
+ export async function castCommand(inputPath = "-", specs, options = {}) {
9
+ const effectiveBatchSize = Number(options.batchSize) || 1000;
10
+ const progress = new ProgressReporter(options);
11
+ let fromFormat = options.from?.toLowerCase();
12
+ if (!fromFormat && inputPath !== "-") {
13
+ fromFormat = inferReaderFormat(inputPath) ?? undefined;
14
+ }
15
+ if (!fromFormat) {
16
+ fromFormat = "csv";
17
+ }
18
+ const toFormat = options.to?.toLowerCase() || (fromFormat === "xlsx" ? "csv" : fromFormat);
19
+ const mapping = parseCastSpecs(specs);
20
+ const inputStream = openReadableStream(inputPath);
21
+ const reader = createReader(inputStream, {
22
+ format: fromFormat,
23
+ sheet: options.sheet,
24
+ delimiter: options.delimiter,
25
+ batchSize: effectiveBatchSize,
26
+ filePath: inputPath,
27
+ });
28
+ const writer = createWriter(process.stdout, {
29
+ format: toFormat,
30
+ delimiter: options.delimiter,
31
+ });
32
+ const pipeline = createPipeline(reader, { batchSize: effectiveBatchSize });
33
+ pipeline.pipe(castColumns(mapping, { onError: options.onError }));
34
+ pipeline.onProgress((info) => progress.update(info));
35
+ await pipeline.to(writer);
36
+ progress.done();
37
+ logMemoryDebug();
38
+ }
39
+ //# sourceMappingURL=cast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.js","sourceRoot":"","sources":["../../../src/cli/commands/cast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAoB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAa3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAS,GAAG,GAAG,EACf,KAAe,EACf,UAA8B,EAAE;IAEhC,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACrC,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE;QACvC,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE;QAC1C,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3E,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAErD,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface ConvertCommandOptions {
2
+ from?: string;
3
+ to?: string;
4
+ sheet?: string;
5
+ allSheets?: boolean;
6
+ outDir?: string;
7
+ path?: string;
8
+ delimiter?: string;
9
+ header?: boolean;
10
+ batchSize?: string | number;
11
+ quiet?: boolean;
12
+ noProgress?: boolean;
13
+ }
14
+ export declare function convertCommand(inputPath?: string, outputPath?: string, options?: ConvertCommandOptions): Promise<void>;
15
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/convert.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,cAAc,CAClC,SAAS,SAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAmGf"}