@uwdata/mosaic-core 0.17.0 → 0.19.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 (178) hide show
  1. package/LICENSE +47 -0
  2. package/README.md +0 -1
  3. package/dist/src/Coordinator.d.ts +159 -0
  4. package/dist/src/Coordinator.d.ts.map +1 -0
  5. package/dist/src/Coordinator.js +250 -0
  6. package/dist/src/Coordinator.js.map +1 -0
  7. package/dist/src/MosaicClient.d.ts +138 -0
  8. package/dist/src/MosaicClient.d.ts.map +1 -0
  9. package/dist/src/MosaicClient.js +214 -0
  10. package/dist/src/MosaicClient.js.map +1 -0
  11. package/dist/src/Param.d.ts +56 -0
  12. package/dist/src/Param.d.ts.map +1 -0
  13. package/dist/src/Param.js +89 -0
  14. package/dist/src/Param.js.map +1 -0
  15. package/dist/src/QueryConsolidator.d.ts +11 -0
  16. package/dist/src/QueryConsolidator.d.ts.map +1 -0
  17. package/dist/src/QueryConsolidator.js +249 -0
  18. package/dist/src/QueryConsolidator.js.map +1 -0
  19. package/dist/src/QueryManager.d.ts +77 -0
  20. package/dist/src/QueryManager.d.ts.map +1 -0
  21. package/dist/src/QueryManager.js +174 -0
  22. package/dist/src/QueryManager.js.map +1 -0
  23. package/dist/src/Selection.d.ts +222 -0
  24. package/dist/src/Selection.d.ts.map +1 -0
  25. package/dist/src/Selection.js +322 -0
  26. package/dist/src/Selection.js.map +1 -0
  27. package/dist/src/SelectionClause.d.ts +222 -0
  28. package/dist/src/SelectionClause.d.ts.map +1 -0
  29. package/dist/src/SelectionClause.js +168 -0
  30. package/dist/src/SelectionClause.js.map +1 -0
  31. package/dist/src/connectors/Connector.d.ts +26 -0
  32. package/dist/src/connectors/Connector.d.ts.map +1 -0
  33. package/dist/src/connectors/Connector.js +2 -0
  34. package/dist/src/connectors/Connector.js.map +1 -0
  35. package/dist/src/connectors/rest.d.ts +24 -0
  36. package/dist/src/connectors/rest.d.ts.map +1 -0
  37. package/dist/src/connectors/rest.js +37 -0
  38. package/dist/src/connectors/rest.js.map +1 -0
  39. package/dist/src/connectors/socket.d.ts +40 -0
  40. package/dist/src/connectors/socket.d.ts.map +1 -0
  41. package/dist/src/connectors/socket.js +115 -0
  42. package/dist/src/connectors/socket.js.map +1 -0
  43. package/dist/src/connectors/wasm.d.ts +56 -0
  44. package/dist/src/connectors/wasm.d.ts.map +1 -0
  45. package/dist/src/connectors/wasm.js +116 -0
  46. package/dist/src/connectors/wasm.js.map +1 -0
  47. package/dist/src/index.d.ts +28 -0
  48. package/dist/src/index.d.ts.map +1 -0
  49. package/{src → dist/src}/index.js +8 -11
  50. package/dist/src/index.js.map +1 -0
  51. package/dist/src/make-client.d.ts +33 -0
  52. package/dist/src/make-client.d.ts.map +1 -0
  53. package/dist/src/make-client.js +52 -0
  54. package/dist/src/make-client.js.map +1 -0
  55. package/dist/src/preagg/PreAggregator.d.ts +150 -0
  56. package/dist/src/preagg/PreAggregator.d.ts.map +1 -0
  57. package/dist/src/preagg/PreAggregator.js +382 -0
  58. package/dist/src/preagg/PreAggregator.js.map +1 -0
  59. package/dist/src/preagg/preagg-columns.d.ts +16 -0
  60. package/dist/src/preagg/preagg-columns.d.ts.map +1 -0
  61. package/dist/src/preagg/preagg-columns.js +95 -0
  62. package/dist/src/preagg/preagg-columns.js.map +1 -0
  63. package/dist/src/preagg/sufficient-statistics.d.ts +14 -0
  64. package/dist/src/preagg/sufficient-statistics.d.ts.map +1 -0
  65. package/dist/src/preagg/sufficient-statistics.js +446 -0
  66. package/dist/src/preagg/sufficient-statistics.js.map +1 -0
  67. package/dist/src/types.d.ts +77 -0
  68. package/dist/src/types.d.ts.map +1 -0
  69. package/dist/src/types.js +2 -0
  70. package/dist/src/types.js.map +1 -0
  71. package/dist/src/util/AsyncDispatch.d.ts +121 -0
  72. package/dist/src/util/AsyncDispatch.d.ts.map +1 -0
  73. package/dist/src/util/AsyncDispatch.js +188 -0
  74. package/dist/src/util/AsyncDispatch.js.map +1 -0
  75. package/dist/src/util/cache.d.ts +19 -0
  76. package/dist/src/util/cache.d.ts.map +1 -0
  77. package/dist/src/util/cache.js +66 -0
  78. package/dist/src/util/cache.js.map +1 -0
  79. package/dist/src/util/decode-ipc.d.ts +12 -0
  80. package/dist/src/util/decode-ipc.d.ts.map +1 -0
  81. package/{src → dist/src}/util/decode-ipc.js +5 -6
  82. package/dist/src/util/decode-ipc.js.map +1 -0
  83. package/dist/src/util/distinct.d.ts +3 -0
  84. package/dist/src/util/distinct.d.ts.map +1 -0
  85. package/dist/src/util/distinct.js +16 -0
  86. package/dist/src/util/distinct.js.map +1 -0
  87. package/dist/src/util/field-info.d.ts +26 -0
  88. package/dist/src/util/field-info.d.ts.map +1 -0
  89. package/dist/src/util/field-info.js +91 -0
  90. package/dist/src/util/field-info.js.map +1 -0
  91. package/dist/src/util/hash.d.ts +2 -0
  92. package/dist/src/util/hash.d.ts.map +1 -0
  93. package/dist/src/util/hash.js +26 -0
  94. package/dist/src/util/hash.js.map +1 -0
  95. package/dist/src/util/is-activatable.d.ts +8 -0
  96. package/dist/src/util/is-activatable.d.ts.map +1 -0
  97. package/dist/src/util/is-activatable.js +10 -0
  98. package/dist/src/util/is-activatable.js.map +1 -0
  99. package/dist/src/util/is-arrow-table.d.ts +9 -0
  100. package/dist/src/util/is-arrow-table.d.ts.map +1 -0
  101. package/dist/src/util/is-arrow-table.js +11 -0
  102. package/dist/src/util/is-arrow-table.js.map +1 -0
  103. package/dist/src/util/js-type.d.ts +9 -0
  104. package/dist/src/util/js-type.d.ts.map +1 -0
  105. package/dist/src/util/js-type.js +59 -0
  106. package/dist/src/util/js-type.js.map +1 -0
  107. package/dist/src/util/priority-queue.d.ts +35 -0
  108. package/dist/src/util/priority-queue.d.ts.map +1 -0
  109. package/dist/src/util/priority-queue.js +81 -0
  110. package/dist/src/util/priority-queue.js.map +1 -0
  111. package/dist/src/util/query-result.d.ts +47 -0
  112. package/dist/src/util/query-result.d.ts.map +1 -0
  113. package/dist/src/util/query-result.js +83 -0
  114. package/dist/src/util/query-result.js.map +1 -0
  115. package/dist/src/util/synchronizer.d.ts +36 -0
  116. package/dist/src/util/synchronizer.d.ts.map +1 -0
  117. package/dist/src/util/synchronizer.js +52 -0
  118. package/dist/src/util/synchronizer.js.map +1 -0
  119. package/dist/src/util/throttle.d.ts +12 -0
  120. package/dist/src/util/throttle.d.ts.map +1 -0
  121. package/dist/src/util/throttle.js +51 -0
  122. package/dist/src/util/throttle.js.map +1 -0
  123. package/dist/src/util/to-data-columns.d.ts +22 -0
  124. package/dist/src/util/to-data-columns.d.ts.map +1 -0
  125. package/dist/src/util/to-data-columns.js +51 -0
  126. package/dist/src/util/to-data-columns.js.map +1 -0
  127. package/dist/src/util/void-logger.d.ts +13 -0
  128. package/dist/src/util/void-logger.d.ts.map +1 -0
  129. package/dist/src/util/void-logger.js +13 -0
  130. package/dist/src/util/void-logger.js.map +1 -0
  131. package/package.json +17 -11
  132. package/src/Coordinator.ts +396 -0
  133. package/src/{MosaicClient.js → MosaicClient.ts} +50 -43
  134. package/src/{Param.js → Param.ts} +29 -28
  135. package/src/{QueryConsolidator.js → QueryConsolidator.ts} +85 -62
  136. package/src/{QueryManager.js → QueryManager.ts} +61 -54
  137. package/src/Selection.ts +391 -0
  138. package/src/SelectionClause.ts +357 -0
  139. package/src/connectors/Connector.ts +6 -6
  140. package/src/connectors/rest.ts +56 -0
  141. package/src/connectors/{socket.js → socket.ts} +53 -42
  142. package/src/connectors/{wasm.js → wasm.ts} +52 -63
  143. package/src/index.ts +42 -0
  144. package/src/make-client.ts +93 -0
  145. package/src/preagg/{PreAggregator.js → PreAggregator.ts} +164 -145
  146. package/src/preagg/{preagg-columns.js → preagg-columns.ts} +27 -24
  147. package/src/preagg/{sufficient-statistics.js → sufficient-statistics.ts} +160 -110
  148. package/src/types.ts +24 -9
  149. package/src/util/{AsyncDispatch.js → AsyncDispatch.ts} +62 -43
  150. package/src/util/{cache.js → cache.ts} +25 -15
  151. package/src/util/decode-ipc.ts +15 -0
  152. package/src/util/{distinct.js → distinct.ts} +3 -3
  153. package/src/util/{field-info.js → field-info.ts} +30 -31
  154. package/src/util/{hash.js → hash.ts} +4 -4
  155. package/src/util/is-activatable.ts +11 -0
  156. package/src/util/is-arrow-table.ts +12 -0
  157. package/src/util/{js-type.js → js-type.ts} +7 -5
  158. package/src/util/{priority-queue.js → priority-queue.ts} +32 -20
  159. package/src/util/{query-result.js → query-result.ts} +24 -17
  160. package/src/util/synchronizer.ts +56 -0
  161. package/src/util/throttle.ts +59 -0
  162. package/src/util/to-data-columns.ts +65 -0
  163. package/src/util/void-logger.ts +23 -0
  164. package/src/Coordinator.js +0 -313
  165. package/src/Selection.js +0 -380
  166. package/src/SelectionClause.js +0 -159
  167. package/src/connectors/rest.js +0 -38
  168. package/src/index-types.ts +0 -5
  169. package/src/make-client.js +0 -101
  170. package/src/util/is-activatable.js +0 -8
  171. package/src/util/is-arrow-table.js +0 -10
  172. package/src/util/selection-types.ts +0 -137
  173. package/src/util/synchronizer.js +0 -47
  174. package/src/util/throttle.js +0 -54
  175. package/src/util/to-data-columns.js +0 -60
  176. package/src/util/void-logger.js +0 -13
  177. package/tsconfig.json +0 -9
  178. package/vitest.config.ts +0 -3
@@ -0,0 +1,168 @@
1
+ import { isMosaicClient } from './MosaicClient.js';
2
+ import { and, contains, isBetween, isIn, isNotDistinct, literal, or, prefix, regexp_matches, suffix, listHasAny, listHasAll, lower } from '@uwdata/mosaic-sql';
3
+ /**
4
+ * Generate a selection clause for a single selected point value.
5
+ * @param field The table column or expression to select.
6
+ * @param value The selected value.
7
+ * @param options Additional clause properties.
8
+ * @param options.source The source component generating this clause.
9
+ * @param options.clients The Mosaic clients associated
10
+ * with this clause. These clients are not filtered by this clause in
11
+ * cross-filtering contexts.
12
+ * @returns The generated selection clause.
13
+ */
14
+ export function clausePoint(field, value, { source, clients = isMosaicClient(source) ? new Set([source]) : undefined }) {
15
+ const predicate = value !== undefined
16
+ ? isIn(field, [literal(value)])
17
+ : null;
18
+ return {
19
+ meta: { type: 'point' },
20
+ source,
21
+ clients,
22
+ value,
23
+ predicate
24
+ };
25
+ }
26
+ /**
27
+ * Generate a selection clause for multiple selected point values.
28
+ * @param fields The table columns or expressions to select.
29
+ * @param value The selected values, as an array of
30
+ * arrays. Each subarray contains values for each *fields* entry.
31
+ * @param options Additional clause properties.
32
+ * @param options.source The source component generating this clause.
33
+ * @param options.clients The Mosaic clients associated
34
+ * with this clause. These clients are not filtered by this clause in
35
+ * cross-filtering contexts.
36
+ * @returns The generated selection clause.
37
+ */
38
+ export function clausePoints(fields, value, { source, clients = isMosaicClient(source) ? new Set([source]) : undefined }) {
39
+ let predicate = null;
40
+ if (value?.length) {
41
+ const clauses = value.length && fields.length === 1
42
+ ? [isIn(fields[0], value.map(v => literal(v[0])))]
43
+ : value.map(v => and(v.map((_, i) => isNotDistinct(fields[i], literal(_)))));
44
+ predicate = value.length === 0 ? literal(false)
45
+ : clauses.length > 1 ? or(clauses)
46
+ : clauses[0];
47
+ }
48
+ return {
49
+ meta: { type: 'point' },
50
+ source,
51
+ clients,
52
+ value,
53
+ predicate
54
+ };
55
+ }
56
+ /**
57
+ * Generate a selection clause for a selected 1D interval.
58
+ * @param field The table column or expression to select.
59
+ * @param value The selected interval as a [lo, hi] array.
60
+ * @param options Additional clause properties.
61
+ * @param options.source The source component generating this clause.
62
+ * @param options.clients The Mosaic clients associated
63
+ * with this clause. These clients are not filtered by this clause in
64
+ * cross-filtering contexts.
65
+ * @param options.scale The scale mapping descriptor.
66
+ * @param options.bin A binning method hint.
67
+ * @param options.pixelSize The interactive pixel size.
68
+ * @returns The generated selection clause.
69
+ */
70
+ export function clauseInterval(field, value, { source, clients = isMosaicClient(source) ? new Set([source]) : undefined, bin, scale, pixelSize = 1 }) {
71
+ const predicate = value != null ? isBetween(field, value) : null;
72
+ const meta = {
73
+ type: 'interval',
74
+ scales: scale && [scale],
75
+ bin,
76
+ pixelSize
77
+ };
78
+ return { meta, source, clients, value, predicate };
79
+ }
80
+ /**
81
+ * Generate a selection clause for multiple selected intervals.
82
+ * @param fields The table columns or expressions to select.
83
+ * @param value The selected intervals, as an array of extents.
84
+ * @param options Additional clause properties.
85
+ * @param options.source The source component generating this clause.
86
+ * @param options.clients The Mosaic clients associated
87
+ * with this clause. These clients are not filtered by this clause in
88
+ * cross-filtering contexts.
89
+ * @param options.scales The scale mapping descriptors,
90
+ * in an order matching the given *fields* and *value* extents.
91
+ * @param options.bin A binning method hint.
92
+ * @param options.pixelSize The interactive pixel size.
93
+ * @returns The generated selection clause.
94
+ */
95
+ export function clauseIntervals(fields, value, { source, clients = isMosaicClient(source) ? new Set([source]) : undefined, bin, scales = [], pixelSize = 1 }) {
96
+ const predicate = value != null
97
+ ? and(fields.map((f, i) => isBetween(f, value[i])))
98
+ : null;
99
+ const meta = {
100
+ type: 'interval',
101
+ scales,
102
+ bin,
103
+ pixelSize
104
+ };
105
+ return { meta, source, clients, value, predicate };
106
+ }
107
+ const identity = (x) => x;
108
+ const MATCH_METHODS = { contains, prefix, suffix, regexp: regexp_matches };
109
+ /**
110
+ * Generate a selection clause for text search matching over a single column.
111
+ * @param field The table column or expression to match.
112
+ * @param value The selected text search query string.
113
+ * @param options Additional clause properties.
114
+ * @param options.source The source component generating this clause.
115
+ * @param options.clients Mosaic clients associated with this clause.
116
+ * These clients are not filtered by this clause in cross-filtering contexts.
117
+ * @param options.method The text matching method to use, default `'contains'`.
118
+ * @param options.caseSensitive Flag for case sensitive matching, default `false`.
119
+ * @returns The generated selection clause.
120
+ */
121
+ export function clauseMatch(field, value, { source, clients = undefined, method = 'contains', caseSensitive = false }) {
122
+ const fn = MATCH_METHODS[method];
123
+ const transform = caseSensitive ? identity : lower;
124
+ const predicate = value ? fn(transform(field), transform(literal(value))) : null;
125
+ const meta = { type: 'match', method };
126
+ return { meta, source, clients, value, predicate };
127
+ }
128
+ /**
129
+ * Generate a selection clause for text search matching over multiple columns.
130
+ * A match will succeed if any field successfully matches.
131
+ * @param fields The table columns or expressions to match.
132
+ * @param value The selected text search query string.
133
+ * @param options Additional clause properties.
134
+ * @param options.source The source component generating this clause.
135
+ * @param options.clients Mosaic clients associated with this clause.
136
+ * These clients are not filtered by this clause in cross-filtering contexts.
137
+ * @param options.method The text matching method to use, default `'contains'`.
138
+ * @param options.caseSensitive Flag for case sensitive matching, default `false`.
139
+ * @returns The generated selection clause.
140
+ */
141
+ export function clauseMatchAny(fields, value, { source, clients = undefined, method = 'contains', caseSensitive = false }) {
142
+ value = value || null;
143
+ const fn = MATCH_METHODS[method];
144
+ const transform = caseSensitive ? identity : lower;
145
+ const query = transform(literal(value));
146
+ const predicate = value
147
+ ? or(fields.flatMap(field => value ? fn(transform(field), query) : []))
148
+ : null;
149
+ const meta = { type: 'match', method };
150
+ return { meta, source, clients, value, predicate };
151
+ }
152
+ /**
153
+ * Generate a selection clause for a single selected point value in a list.
154
+ * @param field The table column or expression to select, which must be a list.
155
+ * @param value The selected value.
156
+ * @param options Additional clause properties.
157
+ * @param options.source The source component generating this clause.
158
+ * @param options.clients The Mosaic clients associated
159
+ * with this clause. These clients are not filtered by this clause in
160
+ * cross-filtering contexts.
161
+ * @returns The generated selection clause.
162
+ */
163
+ export function clauseList(field, value, { source, clients = isMosaicClient(source) ? new Set([source]) : undefined, listMatch = 'any' }) {
164
+ const listFn = listMatch === 'all' ? listHasAll : listHasAny;
165
+ const predicate = value !== undefined ? listFn(field, literal(value)) : null;
166
+ return { source, clients, value, predicate };
167
+ }
168
+ //# sourceMappingURL=SelectionClause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionClause.js","sourceRoot":"","sources":["../../src/SelectionClause.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Table } from '@uwdata/flechette';
2
+ export interface ConnectorQueryRequest {
3
+ /** The query type. */
4
+ type?: string;
5
+ /** A SQL query string. */
6
+ sql: string;
7
+ }
8
+ export interface ArrowQueryRequest extends ConnectorQueryRequest {
9
+ /** The query type. */
10
+ type?: 'arrow';
11
+ }
12
+ export interface ExecQueryRequest extends ConnectorQueryRequest {
13
+ /** The query type. */
14
+ type: 'exec';
15
+ }
16
+ export interface JSONQueryRequest extends ConnectorQueryRequest {
17
+ /** The query type. */
18
+ type: 'json';
19
+ }
20
+ export interface Connector {
21
+ /** Issue a query and return the result. */
22
+ query(query: ArrowQueryRequest): Promise<Table>;
23
+ query(query: ExecQueryRequest): Promise<void>;
24
+ query(query: JSONQueryRequest): Promise<Record<string, unknown>[]>;
25
+ }
26
+ //# sourceMappingURL=Connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connector.d.ts","sourceRoot":"","sources":["../../../src/connectors/Connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;CACpE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connector.js","sourceRoot":"","sources":["../../../src/connectors/Connector.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { ExtractionOptions, Table } from '@uwdata/flechette';
2
+ import type { ArrowQueryRequest, Connector, ExecQueryRequest, JSONQueryRequest } from './Connector.js';
3
+ interface RestOptions {
4
+ uri?: string;
5
+ ipc?: ExtractionOptions;
6
+ }
7
+ /**
8
+ * Connect to a DuckDB server over an HTTP REST interface.
9
+ * @param options Connector options.
10
+ * @param options.uri The URI for the DuckDB REST server.
11
+ * @param options.ipc Arrow IPC extraction options.
12
+ * @returns A connector instance.
13
+ */
14
+ export declare function restConnector(options?: RestOptions): RestConnector;
15
+ export declare class RestConnector implements Connector {
16
+ private _uri;
17
+ private _ipc?;
18
+ constructor({ uri, ipc }?: RestOptions);
19
+ query(query: ArrowQueryRequest): Promise<Table>;
20
+ query(query: ExecQueryRequest): Promise<void>;
21
+ query(query: JSONQueryRequest): Promise<Record<string, unknown>[]>;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../../src/connectors/rest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAyB,MAAM,gBAAgB,CAAC;AAG9H,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,iBAAiB,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,iBAElD;AAED,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAC,CAAoB;gBAErB,EACV,GAA8B,EAC9B,GAAe,EAChB,GAAE,WAAgB;IAKb,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAqBzE"}
@@ -0,0 +1,37 @@
1
+ import { decodeIPC } from '../util/decode-ipc.js';
2
+ /**
3
+ * Connect to a DuckDB server over an HTTP REST interface.
4
+ * @param options Connector options.
5
+ * @param options.uri The URI for the DuckDB REST server.
6
+ * @param options.ipc Arrow IPC extraction options.
7
+ * @returns A connector instance.
8
+ */
9
+ export function restConnector(options) {
10
+ return new RestConnector(options);
11
+ }
12
+ export class RestConnector {
13
+ _uri;
14
+ _ipc;
15
+ constructor({ uri = 'http://localhost:3000/', ipc = undefined } = {}) {
16
+ this._uri = uri;
17
+ this._ipc = ipc;
18
+ }
19
+ async query(query) {
20
+ const req = fetch(this._uri, {
21
+ method: 'POST',
22
+ mode: 'cors',
23
+ cache: 'no-cache',
24
+ credentials: 'omit',
25
+ headers: { 'Content-Type': 'application/json' },
26
+ body: JSON.stringify(query)
27
+ });
28
+ const res = await req;
29
+ if (!res.ok) {
30
+ throw new Error(`Query failed with HTTP status ${res.status}: ${await res.text()}`);
31
+ }
32
+ return query.type === 'exec' ? req
33
+ : query.type === 'arrow' ? decodeIPC(await res.arrayBuffer(), this._ipc)
34
+ : res.json();
35
+ }
36
+ }
37
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/connectors/rest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAOlD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,OAAO,aAAa;IAChB,IAAI,CAAS;IACb,IAAI,CAAqB;IAEjC,YAAY,EACV,GAAG,GAAG,wBAAwB,EAC9B,GAAG,GAAG,SAAS,KACA,EAAE;QACjB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAKD,KAAK,CAAC,KAAK,CAAC,KAA4B;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG;YAChC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;gBACxE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import type { ExtractionOptions, Table } from '@uwdata/flechette';
2
+ import type { ArrowQueryRequest, Connector, ExecQueryRequest, JSONQueryRequest, ConnectorQueryRequest } from './Connector.js';
3
+ interface SocketOptions {
4
+ uri?: string;
5
+ ipc?: ExtractionOptions;
6
+ }
7
+ /**
8
+ * Connect to a DuckDB server over a WebSocket interface.
9
+ * @param options Connector options.
10
+ * @param options.uri The URI for the DuckDB REST server.
11
+ * @param options.ipc Arrow IPC extraction options.
12
+ * @returns A connector instance.
13
+ */
14
+ export declare function socketConnector(options?: SocketOptions): SocketConnector;
15
+ /**
16
+ * DuckDB socket connector.
17
+ */
18
+ export declare class SocketConnector implements Connector {
19
+ private _uri;
20
+ private _queue;
21
+ private _connected;
22
+ private _request;
23
+ private _ws;
24
+ private _events;
25
+ /**
26
+ * @param options Connector options.
27
+ * @param options.uri The URI for the DuckDB REST server.
28
+ * @param options.ipc Arrow IPC extraction options.
29
+ */
30
+ constructor({ uri, ipc, }?: SocketOptions);
31
+ get connected(): boolean;
32
+ init(): void;
33
+ enqueue(query: ConnectorQueryRequest, resolve: (value?: unknown) => void, reject: (reason?: unknown) => void): void;
34
+ next(): void;
35
+ query(query: ArrowQueryRequest): Promise<Table>;
36
+ query(query: ExecQueryRequest): Promise<void>;
37
+ query(query: JSONQueryRequest): Promise<Record<string, unknown>[]>;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../src/connectors/socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG9H,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,iBAAiB,CAAC;CACzB;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,aAAa,mBAEtD;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAA4C;IAE3D;;;;OAIG;gBACS,EACV,GAA4B,EAC5B,GAAe,GAChB,GAAE,aAAkB;IA+DrB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,IAAI,IAAI;IAQZ,OAAO,CACL,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,EAClC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,GACjC,IAAI;IAMP,IAAI,IAAI,IAAI;IAOZ,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAMnE"}
@@ -0,0 +1,115 @@
1
+ import { decodeIPC } from '../util/decode-ipc.js';
2
+ /**
3
+ * Connect to a DuckDB server over a WebSocket interface.
4
+ * @param options Connector options.
5
+ * @param options.uri The URI for the DuckDB REST server.
6
+ * @param options.ipc Arrow IPC extraction options.
7
+ * @returns A connector instance.
8
+ */
9
+ export function socketConnector(options) {
10
+ return new SocketConnector(options);
11
+ }
12
+ /**
13
+ * DuckDB socket connector.
14
+ */
15
+ export class SocketConnector {
16
+ _uri;
17
+ _queue;
18
+ _connected;
19
+ _request;
20
+ _ws;
21
+ _events;
22
+ /**
23
+ * @param options Connector options.
24
+ * @param options.uri The URI for the DuckDB REST server.
25
+ * @param options.ipc Arrow IPC extraction options.
26
+ */
27
+ constructor({ uri = 'ws://localhost:3000/', ipc = undefined, } = {}) {
28
+ this._uri = uri;
29
+ this._queue = [];
30
+ this._connected = false;
31
+ this._request = null;
32
+ this._ws = null;
33
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
34
+ const c = this;
35
+ this._events = {
36
+ open() {
37
+ c._connected = true;
38
+ c.next();
39
+ },
40
+ close() {
41
+ c._connected = false;
42
+ c._request = null;
43
+ c._ws = null;
44
+ while (c._queue.length) {
45
+ c._queue.shift().reject('Socket closed');
46
+ }
47
+ },
48
+ error(event) {
49
+ if (c._request) {
50
+ const { reject } = c._request;
51
+ c._request = null;
52
+ c.next();
53
+ reject(event);
54
+ }
55
+ else {
56
+ console.error('WebSocket error: ', event);
57
+ }
58
+ },
59
+ message(msg) {
60
+ const { data } = msg;
61
+ if (c._request) {
62
+ const { query, resolve, reject } = c._request;
63
+ // clear state, start next request
64
+ c._request = null;
65
+ c.next();
66
+ // process result
67
+ if (typeof data === 'string') {
68
+ const json = JSON.parse(data);
69
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
70
+ json.error ? reject(json.error) : resolve(json);
71
+ }
72
+ else if (query.type === 'exec') {
73
+ resolve();
74
+ }
75
+ else if (query.type === 'arrow') {
76
+ resolve(decodeIPC(data, ipc));
77
+ }
78
+ else {
79
+ throw new Error(`Unexpected socket data: ${data}`);
80
+ }
81
+ }
82
+ else {
83
+ console.log('WebSocket message: ', data);
84
+ }
85
+ }
86
+ };
87
+ }
88
+ get connected() {
89
+ return this._connected;
90
+ }
91
+ init() {
92
+ this._ws = new WebSocket(this._uri);
93
+ this._ws.binaryType = 'arraybuffer';
94
+ for (const type in this._events) {
95
+ this._ws.addEventListener(type, this._events[type]);
96
+ }
97
+ }
98
+ enqueue(query, resolve, reject) {
99
+ if (this._ws == null)
100
+ this.init();
101
+ this._queue.push({ query, resolve, reject });
102
+ if (this._connected && !this._request)
103
+ this.next();
104
+ }
105
+ next() {
106
+ if (this._queue.length) {
107
+ this._request = this._queue.shift();
108
+ this._ws.send(JSON.stringify(this._request.query));
109
+ }
110
+ }
111
+ query(query) {
112
+ return new Promise((resolve, reject) => this.enqueue(query, resolve, reject));
113
+ }
114
+ }
115
+ //# sourceMappingURL=socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/connectors/socket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { ExtractionOptions, Table } from '@uwdata/flechette';
2
+ import type { ArrowQueryRequest, Connector, ExecQueryRequest, JSONQueryRequest } from './Connector.js';
3
+ import * as duckdb from '@duckdb/duckdb-wasm';
4
+ interface DuckDBWASMOptions {
5
+ /** Flag to enable logging. */
6
+ log?: boolean;
7
+ }
8
+ interface DuckDBWASMConnectorOptions extends DuckDBWASMOptions {
9
+ /** Arrow IPC extraction options. */
10
+ ipc?: ExtractionOptions;
11
+ /** Optional pre-existing DuckDB-WASM instance. */
12
+ duckdb?: duckdb.AsyncDuckDB;
13
+ /** Optional pre-existing DuckDB-WASM connection. */
14
+ connection?: duckdb.AsyncDuckDBConnection;
15
+ /** Optional database config. */
16
+ config?: duckdb.DuckDBConfig;
17
+ }
18
+ /**
19
+ * Connect to a DuckDB-WASM instance.
20
+ * @param options Connector options.
21
+ * @returns A connector instance.
22
+ */
23
+ export declare function wasmConnector(options?: DuckDBWASMConnectorOptions): DuckDBWASMConnector;
24
+ /**
25
+ * DuckDB-WASM connector.
26
+ */
27
+ export declare class DuckDBWASMConnector implements Connector {
28
+ private _ipc?;
29
+ _options: DuckDBWASMOptions;
30
+ _db?: duckdb.AsyncDuckDB;
31
+ _con?: duckdb.AsyncDuckDBConnection;
32
+ _config?: duckdb.DuckDBConfig;
33
+ _loadPromise?: Promise<unknown>;
34
+ /**
35
+ * Create a new DuckDB-WASM connector instance.
36
+ * @param options Connector options.
37
+ */
38
+ constructor(options?: DuckDBWASMConnectorOptions);
39
+ /**
40
+ * Get the backing DuckDB-WASM instance.
41
+ * Lazily initializes DuckDB-WASM if not already loaded.
42
+ * @returns The DuckDB-WASM instance.
43
+ */
44
+ getDuckDB(): Promise<duckdb.AsyncDuckDB>;
45
+ /**
46
+ * Get the backing DuckDB-WASM connection.
47
+ * Lazily initializes DuckDB-WASM if not already loaded.
48
+ * @returns The DuckDB-WASM connection.
49
+ */
50
+ getConnection(): Promise<duckdb.AsyncDuckDBConnection>;
51
+ query(query: ArrowQueryRequest): Promise<Table>;
52
+ query(query: ExecQueryRequest): Promise<void>;
53
+ query(query: JSONQueryRequest): Promise<Record<string, unknown>[]>;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=wasm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../../src/connectors/wasm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAyB,MAAM,gBAAgB,CAAC;AAC9H,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAG9C,UAAU,iBAAiB;IACzB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,UAAU,0BAA2B,SAAQ,iBAAiB;IAC5D,oCAAoC;IACpC,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC,qBAAqB,CAAC;IAC1C,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,0BAA+B,GAAG,mBAAmB,CAE3F;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,IAAI,CAAC,CAAoB;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC,qBAAqB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvC;;;OAGG;gBACS,OAAO,GAAE,0BAA+B;IASpD;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;IAK9C;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAKtD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7C,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CASzE"}
@@ -0,0 +1,116 @@
1
+ import * as duckdb from '@duckdb/duckdb-wasm';
2
+ import { decodeIPC } from '../util/decode-ipc.js';
3
+ /**
4
+ * Connect to a DuckDB-WASM instance.
5
+ * @param options Connector options.
6
+ * @returns A connector instance.
7
+ */
8
+ export function wasmConnector(options = {}) {
9
+ return new DuckDBWASMConnector(options);
10
+ }
11
+ /**
12
+ * DuckDB-WASM connector.
13
+ */
14
+ export class DuckDBWASMConnector {
15
+ _ipc;
16
+ _options;
17
+ _db;
18
+ _con;
19
+ _config;
20
+ _loadPromise;
21
+ /**
22
+ * Create a new DuckDB-WASM connector instance.
23
+ * @param options Connector options.
24
+ */
25
+ constructor(options = {}) {
26
+ const { ipc, duckdb, connection, config, ...opts } = options;
27
+ this._ipc = ipc;
28
+ this._options = opts;
29
+ this._db = duckdb;
30
+ this._con = connection;
31
+ this._config = config;
32
+ }
33
+ /**
34
+ * Get the backing DuckDB-WASM instance.
35
+ * Lazily initializes DuckDB-WASM if not already loaded.
36
+ * @returns The DuckDB-WASM instance.
37
+ */
38
+ async getDuckDB() {
39
+ if (!this._db)
40
+ await connect(this);
41
+ return this._db;
42
+ }
43
+ /**
44
+ * Get the backing DuckDB-WASM connection.
45
+ * Lazily initializes DuckDB-WASM if not already loaded.
46
+ * @returns The DuckDB-WASM connection.
47
+ */
48
+ async getConnection() {
49
+ if (!this._con)
50
+ await connect(this);
51
+ return this._con;
52
+ }
53
+ async query(query) {
54
+ const { type, sql } = query;
55
+ const con = await this.getConnection();
56
+ const result = await getArrowIPC(con, sql);
57
+ return type === 'exec' ? undefined
58
+ : type === 'arrow' ? decodeIPC(result, this._ipc)
59
+ : decodeIPC(result).toArray();
60
+ }
61
+ }
62
+ /**
63
+ * Bypass duckdb-wasm query method to get Arrow IPC bytes directly.
64
+ * https://github.com/duckdb/duckdb-wasm/issues/267#issuecomment-2252749509
65
+ * @param con The DuckDB-WASM connection.
66
+ * @param query The SQL query to run.
67
+ */
68
+ function getArrowIPC(con, query) {
69
+ return new Promise((resolve, reject) => {
70
+ con.useUnsafe(async (bindings, conn) => {
71
+ try {
72
+ const buffer = await bindings.runQuery(conn, query);
73
+ resolve(buffer);
74
+ }
75
+ catch (error) {
76
+ reject(error);
77
+ }
78
+ });
79
+ });
80
+ }
81
+ /**
82
+ * Establish a new database connection for the given connector.
83
+ * @param c The connector.
84
+ * @returns Connection promise.
85
+ */
86
+ function connect(c) {
87
+ if (!c._loadPromise) {
88
+ // use a loading promise to avoid race conditions
89
+ // synchronizes multiple callees on the same load
90
+ c._loadPromise = (c._db
91
+ ? Promise.resolve(c._db)
92
+ : initDatabase(c._options).then(result => c._db = result))
93
+ .then(db => c._config != undefined ? db.open(c._config).then(() => db) : db)
94
+ .then(db => db.connect())
95
+ .then(result => c._con = result);
96
+ }
97
+ return c._loadPromise;
98
+ }
99
+ /**
100
+ * Initialize a new DuckDB-WASM instance.
101
+ * @param options Database initialization options.
102
+ */
103
+ async function initDatabase({ log = false } = {}) {
104
+ const JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
105
+ // Select a bundle based on browser checks
106
+ const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);
107
+ const worker_url = URL.createObjectURL(new Blob([`importScripts("${bundle.mainWorker}");`], { type: 'text/javascript' }));
108
+ // Instantiate the asynchronous version of DuckDB-wasm
109
+ const worker = new Worker(worker_url);
110
+ const logger = log ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
111
+ const db = new duckdb.AsyncDuckDB(logger, worker);
112
+ await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
113
+ URL.revokeObjectURL(worker_url);
114
+ return db;
115
+ }
116
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../src/connectors/wasm.ts"],"names":[],"mappings":"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"}