@uwdata/mosaic-core 0.6.1 → 0.7.1
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.
- package/LICENSE +19 -0
- package/dist/mosaic-core.js +233 -146
- package/dist/mosaic-core.min.js +8 -8
- package/package.json +4 -4
- package/src/Coordinator.js +4 -6
- package/src/QueryConsolidator.js +38 -15
- package/src/index.js +6 -0
- package/src/util/convert-arrow.js +148 -0
- package/src/util/field-info.js +80 -0
- package/src/util/js-type.js +9 -1
- package/src/Catalog.js +0 -88
- package/src/util/summarize.js +0 -23
package/LICENSE
CHANGED
|
@@ -26,3 +26,22 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
26
26
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
27
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
28
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
Portions of this software are derived from Observable Plot, which is released
|
|
33
|
+
under the ISC license.
|
|
34
|
+
|
|
35
|
+
Copyright 2020-2023 Observable, Inc.
|
|
36
|
+
|
|
37
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
38
|
+
with or without fee is hereby granted, provided that the above copyright notice
|
|
39
|
+
and this permission notice appear in all copies.
|
|
40
|
+
|
|
41
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
42
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
43
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
44
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
45
|
+
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
46
|
+
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
47
|
+
THIS SOFTWARE.
|
package/dist/mosaic-core.js
CHANGED
|
@@ -12353,6 +12353,15 @@ var Query = class _Query {
|
|
|
12353
12353
|
static except(...queries) {
|
|
12354
12354
|
return new SetOperation("EXCEPT", queries.flat());
|
|
12355
12355
|
}
|
|
12356
|
+
static describe(query) {
|
|
12357
|
+
const q2 = query.clone();
|
|
12358
|
+
const { clone, toString } = q2;
|
|
12359
|
+
return Object.assign(q2, {
|
|
12360
|
+
describe: true,
|
|
12361
|
+
clone: () => _Query.describe(clone.call(q2)),
|
|
12362
|
+
toString: () => `DESCRIBE ${toString.call(q2)}`
|
|
12363
|
+
});
|
|
12364
|
+
}
|
|
12356
12365
|
constructor() {
|
|
12357
12366
|
this.query = {
|
|
12358
12367
|
with: [],
|
|
@@ -12587,6 +12596,7 @@ var Query = class _Query {
|
|
|
12587
12596
|
}
|
|
12588
12597
|
toString() {
|
|
12589
12598
|
const {
|
|
12599
|
+
with: cte,
|
|
12590
12600
|
select,
|
|
12591
12601
|
distinct: distinct2,
|
|
12592
12602
|
from,
|
|
@@ -12598,8 +12608,7 @@ var Query = class _Query {
|
|
|
12598
12608
|
qualify,
|
|
12599
12609
|
orderby,
|
|
12600
12610
|
limit,
|
|
12601
|
-
offset
|
|
12602
|
-
with: cte
|
|
12611
|
+
offset
|
|
12603
12612
|
} = this.query;
|
|
12604
12613
|
const sql2 = [];
|
|
12605
12614
|
if (cte.length) {
|
|
@@ -12721,6 +12730,9 @@ var SetOperation = class _SetOperation {
|
|
|
12721
12730
|
function isQuery(value) {
|
|
12722
12731
|
return value instanceof Query || value instanceof SetOperation;
|
|
12723
12732
|
}
|
|
12733
|
+
function isDescribeQuery(value) {
|
|
12734
|
+
return isQuery(value) && value.describe;
|
|
12735
|
+
}
|
|
12724
12736
|
function unquote(s) {
|
|
12725
12737
|
return isDoubleQuoted(s) ? s.slice(1, -1) : s;
|
|
12726
12738
|
}
|
|
@@ -12820,131 +12832,6 @@ function create(name, query, {
|
|
|
12820
12832
|
return "CREATE" + (replace ? " OR REPLACE " : " ") + (temp ? "TEMP " : "") + (view ? "VIEW" : "TABLE") + (replace ? " " : " IF NOT EXISTS ") + name + " AS " + query;
|
|
12821
12833
|
}
|
|
12822
12834
|
|
|
12823
|
-
// src/util/js-type.js
|
|
12824
|
-
function jsType(type) {
|
|
12825
|
-
switch (type) {
|
|
12826
|
-
case "BIGINT":
|
|
12827
|
-
case "HUGEINT":
|
|
12828
|
-
case "INTEGER":
|
|
12829
|
-
case "SMALLINT":
|
|
12830
|
-
case "TINYINT":
|
|
12831
|
-
case "UBIGINT":
|
|
12832
|
-
case "UINTEGER":
|
|
12833
|
-
case "USMALLINT":
|
|
12834
|
-
case "UTINYINT":
|
|
12835
|
-
case "DOUBLE":
|
|
12836
|
-
case "FLOAT":
|
|
12837
|
-
case "REAL":
|
|
12838
|
-
case "DECIMAL":
|
|
12839
|
-
return "number";
|
|
12840
|
-
case "DATE":
|
|
12841
|
-
case "TIMESTAMP":
|
|
12842
|
-
case "TIMESTAMPTZ":
|
|
12843
|
-
case "TIMESTAMP WITH TIME ZONE":
|
|
12844
|
-
case "TIME":
|
|
12845
|
-
case "TIMESTAMP_NS":
|
|
12846
|
-
return "date";
|
|
12847
|
-
case "BOOLEAN":
|
|
12848
|
-
return "boolean";
|
|
12849
|
-
case "VARCHAR":
|
|
12850
|
-
case "UUID":
|
|
12851
|
-
return "string";
|
|
12852
|
-
case "LIST":
|
|
12853
|
-
return "array";
|
|
12854
|
-
case "BLOB":
|
|
12855
|
-
case "STRUCT":
|
|
12856
|
-
case "MAP":
|
|
12857
|
-
return "object";
|
|
12858
|
-
default:
|
|
12859
|
-
throw new Error(`Unsupported type: ${type}`);
|
|
12860
|
-
}
|
|
12861
|
-
}
|
|
12862
|
-
|
|
12863
|
-
// src/util/summarize.js
|
|
12864
|
-
var Count = "count";
|
|
12865
|
-
var Nulls = "nulls";
|
|
12866
|
-
var Max = "max";
|
|
12867
|
-
var Min = "min";
|
|
12868
|
-
var Distinct = "distinct";
|
|
12869
|
-
var statMap = {
|
|
12870
|
-
[Count]: count,
|
|
12871
|
-
[Distinct]: (column2) => count(column2).distinct(),
|
|
12872
|
-
[Max]: max,
|
|
12873
|
-
[Min]: min,
|
|
12874
|
-
[Nulls]: (column2) => count().where(isNull(column2))
|
|
12875
|
-
};
|
|
12876
|
-
function summarize({ table, column: column2 }, stats) {
|
|
12877
|
-
return Query.from(table).select(stats.map((s) => [s, statMap[s](column2)]));
|
|
12878
|
-
}
|
|
12879
|
-
|
|
12880
|
-
// src/Catalog.js
|
|
12881
|
-
var object = () => /* @__PURE__ */ Object.create(null);
|
|
12882
|
-
var Catalog = class {
|
|
12883
|
-
constructor(coordinator2) {
|
|
12884
|
-
this.mc = coordinator2;
|
|
12885
|
-
this.clear();
|
|
12886
|
-
}
|
|
12887
|
-
clear() {
|
|
12888
|
-
this.tables = object();
|
|
12889
|
-
}
|
|
12890
|
-
tableInfo(table) {
|
|
12891
|
-
const cache = this.tables;
|
|
12892
|
-
if (cache[table]) {
|
|
12893
|
-
return cache[table];
|
|
12894
|
-
}
|
|
12895
|
-
const infoPromise = getTableInfo(this.mc, table).catch((err) => {
|
|
12896
|
-
cache[table] = null;
|
|
12897
|
-
throw err;
|
|
12898
|
-
});
|
|
12899
|
-
return cache[table] = infoPromise;
|
|
12900
|
-
}
|
|
12901
|
-
async fieldInfo({ table, column: column2, stats }) {
|
|
12902
|
-
const tableInfo = await this.tableInfo(table);
|
|
12903
|
-
const colInfo = tableInfo[column2];
|
|
12904
|
-
if (colInfo == null)
|
|
12905
|
-
return;
|
|
12906
|
-
if (!stats?.length)
|
|
12907
|
-
return colInfo;
|
|
12908
|
-
const result = await this.mc.query(
|
|
12909
|
-
summarize(colInfo, stats),
|
|
12910
|
-
{ persist: true }
|
|
12911
|
-
);
|
|
12912
|
-
const info = { ...colInfo, ...Array.from(result)[0] };
|
|
12913
|
-
for (const key in info) {
|
|
12914
|
-
const value = info[key];
|
|
12915
|
-
if (typeof value === "bigint") {
|
|
12916
|
-
info[key] = Number(value);
|
|
12917
|
-
}
|
|
12918
|
-
}
|
|
12919
|
-
return info;
|
|
12920
|
-
}
|
|
12921
|
-
async queryFields(fields) {
|
|
12922
|
-
const list = await resolveFields(this, fields);
|
|
12923
|
-
const data = await Promise.all(list.map((f2) => this.fieldInfo(f2)));
|
|
12924
|
-
return data.filter((x3) => x3);
|
|
12925
|
-
}
|
|
12926
|
-
};
|
|
12927
|
-
async function getTableInfo(mc, table) {
|
|
12928
|
-
const result = await mc.query(
|
|
12929
|
-
`DESCRIBE ${asRelation(table)}`,
|
|
12930
|
-
{ type: "json", cache: false }
|
|
12931
|
-
);
|
|
12932
|
-
const columns = object();
|
|
12933
|
-
for (const entry of result) {
|
|
12934
|
-
columns[entry.column_name] = {
|
|
12935
|
-
table,
|
|
12936
|
-
column: entry.column_name,
|
|
12937
|
-
sqlType: entry.column_type,
|
|
12938
|
-
type: jsType(entry.column_type),
|
|
12939
|
-
nullable: entry.null === "YES"
|
|
12940
|
-
};
|
|
12941
|
-
}
|
|
12942
|
-
return columns;
|
|
12943
|
-
}
|
|
12944
|
-
async function resolveFields(catalog, list) {
|
|
12945
|
-
return list.length === 1 && list[0].column === "*" ? Object.values(await catalog.tableInfo(list[0].table)) : list;
|
|
12946
|
-
}
|
|
12947
|
-
|
|
12948
12835
|
// src/util/hash.js
|
|
12949
12836
|
function fnv_hash(v2) {
|
|
12950
12837
|
let a2 = 2166136261;
|
|
@@ -13304,7 +13191,7 @@ function consolidate(group, enqueue, record) {
|
|
|
13304
13191
|
type: "arrow",
|
|
13305
13192
|
cache: false,
|
|
13306
13193
|
record: false,
|
|
13307
|
-
query: consolidatedQuery(group, record)
|
|
13194
|
+
query: group.query = consolidatedQuery(group, record)
|
|
13308
13195
|
},
|
|
13309
13196
|
result: group.result = queryResult()
|
|
13310
13197
|
});
|
|
@@ -13352,7 +13239,7 @@ function consolidatedQuery(group, record) {
|
|
|
13352
13239
|
return query.$select(Array.from(fields.values()));
|
|
13353
13240
|
}
|
|
13354
13241
|
async function processResults(group, cache) {
|
|
13355
|
-
const { maps, result } = group;
|
|
13242
|
+
const { maps, query, result } = group;
|
|
13356
13243
|
if (!maps)
|
|
13357
13244
|
return;
|
|
13358
13245
|
let data;
|
|
@@ -13364,25 +13251,33 @@ async function processResults(group, cache) {
|
|
|
13364
13251
|
}
|
|
13365
13252
|
return;
|
|
13366
13253
|
}
|
|
13254
|
+
const describe = isDescribeQuery(query);
|
|
13367
13255
|
group.forEach(({ entry }, index) => {
|
|
13368
13256
|
const { request, result: result2 } = entry;
|
|
13369
|
-
const
|
|
13257
|
+
const map = maps[index];
|
|
13258
|
+
const extract = describe && map ? filterResult(data, map) : map ? projectResult(data, map) : data;
|
|
13370
13259
|
if (request.cache) {
|
|
13371
|
-
cache.set(String(request.query),
|
|
13260
|
+
cache.set(String(request.query), extract);
|
|
13372
13261
|
}
|
|
13373
|
-
result2.fulfill(
|
|
13262
|
+
result2.fulfill(extract);
|
|
13374
13263
|
});
|
|
13375
13264
|
}
|
|
13376
13265
|
function projectResult(data, map) {
|
|
13377
|
-
|
|
13378
|
-
|
|
13379
|
-
|
|
13380
|
-
|
|
13266
|
+
const cols = {};
|
|
13267
|
+
for (const [name, as] of map) {
|
|
13268
|
+
cols[as] = data.getChild(name);
|
|
13269
|
+
}
|
|
13270
|
+
return new data.constructor(cols);
|
|
13271
|
+
}
|
|
13272
|
+
function filterResult(data, map) {
|
|
13273
|
+
const lookup = new Map(map);
|
|
13274
|
+
const result = [];
|
|
13275
|
+
for (const d of data) {
|
|
13276
|
+
if (lookup.has(d.column_name)) {
|
|
13277
|
+
result.push({ ...d, column_name: lookup.get(d.column_name) });
|
|
13381
13278
|
}
|
|
13382
|
-
return new data.constructor(cols);
|
|
13383
|
-
} else {
|
|
13384
|
-
return data;
|
|
13385
13279
|
}
|
|
13280
|
+
return result;
|
|
13386
13281
|
}
|
|
13387
13282
|
|
|
13388
13283
|
// src/util/cache.js
|
|
@@ -13629,6 +13524,197 @@ function QueryManager() {
|
|
|
13629
13524
|
};
|
|
13630
13525
|
}
|
|
13631
13526
|
|
|
13527
|
+
// src/util/js-type.js
|
|
13528
|
+
function jsType(type) {
|
|
13529
|
+
switch (type) {
|
|
13530
|
+
case "BIGINT":
|
|
13531
|
+
case "HUGEINT":
|
|
13532
|
+
case "INTEGER":
|
|
13533
|
+
case "SMALLINT":
|
|
13534
|
+
case "TINYINT":
|
|
13535
|
+
case "UBIGINT":
|
|
13536
|
+
case "UINTEGER":
|
|
13537
|
+
case "USMALLINT":
|
|
13538
|
+
case "UTINYINT":
|
|
13539
|
+
case "DOUBLE":
|
|
13540
|
+
case "FLOAT":
|
|
13541
|
+
case "REAL":
|
|
13542
|
+
return "number";
|
|
13543
|
+
case "DATE":
|
|
13544
|
+
case "TIMESTAMP":
|
|
13545
|
+
case "TIMESTAMPTZ":
|
|
13546
|
+
case "TIMESTAMP WITH TIME ZONE":
|
|
13547
|
+
case "TIME":
|
|
13548
|
+
case "TIMESTAMP_NS":
|
|
13549
|
+
return "date";
|
|
13550
|
+
case "BOOLEAN":
|
|
13551
|
+
return "boolean";
|
|
13552
|
+
case "VARCHAR":
|
|
13553
|
+
case "UUID":
|
|
13554
|
+
return "string";
|
|
13555
|
+
case "ARRAY":
|
|
13556
|
+
case "LIST":
|
|
13557
|
+
return "array";
|
|
13558
|
+
case "BLOB":
|
|
13559
|
+
case "STRUCT":
|
|
13560
|
+
case "MAP":
|
|
13561
|
+
case "GEOMETRY":
|
|
13562
|
+
return "object";
|
|
13563
|
+
default:
|
|
13564
|
+
if (type.startsWith("DECIMAL")) {
|
|
13565
|
+
return "number";
|
|
13566
|
+
} else if (type.startsWith("STRUCT") || type.startsWith("MAP")) {
|
|
13567
|
+
return "object";
|
|
13568
|
+
} else if (type.endsWith("]")) {
|
|
13569
|
+
return "array";
|
|
13570
|
+
}
|
|
13571
|
+
throw new Error(`Unsupported type: ${type}`);
|
|
13572
|
+
}
|
|
13573
|
+
}
|
|
13574
|
+
|
|
13575
|
+
// src/util/convert-arrow.js
|
|
13576
|
+
var INTEGER = 2;
|
|
13577
|
+
var FLOAT = 3;
|
|
13578
|
+
var DECIMAL = 7;
|
|
13579
|
+
var TIMESTAMP = 10;
|
|
13580
|
+
function isArrowTable(values) {
|
|
13581
|
+
return typeof values?.getChild === "function";
|
|
13582
|
+
}
|
|
13583
|
+
function convertArrowArrayType(type) {
|
|
13584
|
+
switch (type.typeId) {
|
|
13585
|
+
case INTEGER:
|
|
13586
|
+
case FLOAT:
|
|
13587
|
+
case DECIMAL:
|
|
13588
|
+
return Float64Array;
|
|
13589
|
+
default:
|
|
13590
|
+
return Array;
|
|
13591
|
+
}
|
|
13592
|
+
}
|
|
13593
|
+
function convertArrowValue(type) {
|
|
13594
|
+
const { typeId } = type;
|
|
13595
|
+
if (typeId === TIMESTAMP) {
|
|
13596
|
+
return (v2) => v2 == null ? v2 : new Date(v2);
|
|
13597
|
+
}
|
|
13598
|
+
if (typeId === INTEGER && type.bitWidth >= 64) {
|
|
13599
|
+
return (v2) => v2 == null ? v2 : Number(v2);
|
|
13600
|
+
}
|
|
13601
|
+
if (typeId === DECIMAL) {
|
|
13602
|
+
const scale = 1 / Math.pow(10, type.scale);
|
|
13603
|
+
return (v2) => v2 == null ? v2 : decimalToNumber(v2, scale);
|
|
13604
|
+
}
|
|
13605
|
+
return (v2) => v2;
|
|
13606
|
+
}
|
|
13607
|
+
function convertArrowColumn(column2) {
|
|
13608
|
+
const { type } = column2;
|
|
13609
|
+
const { typeId } = type;
|
|
13610
|
+
if (typeId === TIMESTAMP) {
|
|
13611
|
+
const size = column2.length;
|
|
13612
|
+
const array = new Array(size);
|
|
13613
|
+
for (let row = 0; row < size; ++row) {
|
|
13614
|
+
const v2 = column2.get(row);
|
|
13615
|
+
array[row] = v2 == null ? null : new Date(v2);
|
|
13616
|
+
}
|
|
13617
|
+
return array;
|
|
13618
|
+
}
|
|
13619
|
+
if (typeId === INTEGER && type.bitWidth >= 64) {
|
|
13620
|
+
const size = column2.length;
|
|
13621
|
+
const array = new Float64Array(size);
|
|
13622
|
+
for (let row = 0; row < size; ++row) {
|
|
13623
|
+
const v2 = column2.get(row);
|
|
13624
|
+
array[row] = v2 == null ? NaN : Number(v2);
|
|
13625
|
+
}
|
|
13626
|
+
return array;
|
|
13627
|
+
}
|
|
13628
|
+
if (typeId === DECIMAL) {
|
|
13629
|
+
const scale = 1 / Math.pow(10, type.scale);
|
|
13630
|
+
const size = column2.length;
|
|
13631
|
+
const array = new Float64Array(size);
|
|
13632
|
+
for (let row = 0; row < size; ++row) {
|
|
13633
|
+
const v2 = column2.get(row);
|
|
13634
|
+
array[row] = v2 == null ? NaN : decimalToNumber(v2, scale);
|
|
13635
|
+
}
|
|
13636
|
+
return array;
|
|
13637
|
+
}
|
|
13638
|
+
return column2.toArray();
|
|
13639
|
+
}
|
|
13640
|
+
var BASE32 = Array.from(
|
|
13641
|
+
{ length: 8 },
|
|
13642
|
+
(_2, i) => Math.pow(2, i * 32)
|
|
13643
|
+
);
|
|
13644
|
+
function decimalToNumber(v2, scale) {
|
|
13645
|
+
const n = v2.length;
|
|
13646
|
+
let x3 = 0;
|
|
13647
|
+
if (v2.signed && (v2[n - 1] | 0) < 0) {
|
|
13648
|
+
for (let i = 0; i < n; ++i) {
|
|
13649
|
+
x3 += ~v2[i] * BASE32[i];
|
|
13650
|
+
}
|
|
13651
|
+
x3 = -(x3 + 1);
|
|
13652
|
+
} else {
|
|
13653
|
+
for (let i = 0; i < n; ++i) {
|
|
13654
|
+
x3 += v2[i] * BASE32[i];
|
|
13655
|
+
}
|
|
13656
|
+
}
|
|
13657
|
+
return x3 * scale;
|
|
13658
|
+
}
|
|
13659
|
+
|
|
13660
|
+
// src/util/field-info.js
|
|
13661
|
+
var Count = "count";
|
|
13662
|
+
var Nulls = "nulls";
|
|
13663
|
+
var Max = "max";
|
|
13664
|
+
var Min = "min";
|
|
13665
|
+
var Distinct = "distinct";
|
|
13666
|
+
var statMap = {
|
|
13667
|
+
[Count]: count,
|
|
13668
|
+
[Distinct]: (column2) => count(column2).distinct(),
|
|
13669
|
+
[Max]: max,
|
|
13670
|
+
[Min]: min,
|
|
13671
|
+
[Nulls]: (column2) => count().where(isNull(column2))
|
|
13672
|
+
};
|
|
13673
|
+
function summarize(table, column2, stats) {
|
|
13674
|
+
return Query.from(table).select(Array.from(stats, (s) => [s, statMap[s](column2)]));
|
|
13675
|
+
}
|
|
13676
|
+
async function queryFieldInfo(mc, fields) {
|
|
13677
|
+
if (fields.length === 1 && `${fields[0].column}` === "*") {
|
|
13678
|
+
return getTableInfo(mc, fields[0].table);
|
|
13679
|
+
} else {
|
|
13680
|
+
return (await Promise.all(fields.map((f2) => getFieldInfo(mc, f2)))).filter((x3) => x3);
|
|
13681
|
+
}
|
|
13682
|
+
}
|
|
13683
|
+
async function getFieldInfo(mc, { table, column: column2, stats }) {
|
|
13684
|
+
const q2 = Query.from({ source: table }).select({ column: column2 }).groupby(column2.aggregate ? sql`ALL` : []);
|
|
13685
|
+
const [desc2] = Array.from(await mc.query(Query.describe(q2)));
|
|
13686
|
+
const info = {
|
|
13687
|
+
table,
|
|
13688
|
+
column: `${column2}`,
|
|
13689
|
+
sqlType: desc2.column_type,
|
|
13690
|
+
type: jsType(desc2.column_type),
|
|
13691
|
+
nullable: desc2.null === "YES"
|
|
13692
|
+
};
|
|
13693
|
+
if (!(stats?.length || stats?.size))
|
|
13694
|
+
return info;
|
|
13695
|
+
const result = await mc.query(
|
|
13696
|
+
summarize(table, column2, stats),
|
|
13697
|
+
{ persist: true }
|
|
13698
|
+
);
|
|
13699
|
+
for (let i = 0; i < result.numCols; ++i) {
|
|
13700
|
+
const { name } = result.schema.fields[i];
|
|
13701
|
+
const child = result.getChildAt(i);
|
|
13702
|
+
const convert = convertArrowValue(child.type);
|
|
13703
|
+
info[name] = convert(child.get(0));
|
|
13704
|
+
}
|
|
13705
|
+
return info;
|
|
13706
|
+
}
|
|
13707
|
+
async function getTableInfo(mc, table) {
|
|
13708
|
+
const result = await mc.query(`DESCRIBE ${asRelation(table)}`);
|
|
13709
|
+
return Array.from(result).map((desc2) => ({
|
|
13710
|
+
table,
|
|
13711
|
+
column: desc2.column_name,
|
|
13712
|
+
sqlType: desc2.column_type,
|
|
13713
|
+
type: jsType(desc2.column_type),
|
|
13714
|
+
nullable: desc2.null === "YES"
|
|
13715
|
+
}));
|
|
13716
|
+
}
|
|
13717
|
+
|
|
13632
13718
|
// src/util/void-logger.js
|
|
13633
13719
|
function voidLogger() {
|
|
13634
13720
|
return {
|
|
@@ -13661,7 +13747,6 @@ var Coordinator = class {
|
|
|
13661
13747
|
logger = console,
|
|
13662
13748
|
manager = QueryManager()
|
|
13663
13749
|
} = options;
|
|
13664
|
-
this.catalog = new Catalog(this);
|
|
13665
13750
|
this.manager = manager;
|
|
13666
13751
|
this.logger(logger);
|
|
13667
13752
|
this.configure(options);
|
|
@@ -13680,7 +13765,7 @@ var Coordinator = class {
|
|
|
13680
13765
|
this.manager.consolidate(consolidate2);
|
|
13681
13766
|
this.indexes = indexes;
|
|
13682
13767
|
}
|
|
13683
|
-
clear({ clients = true, cache = true
|
|
13768
|
+
clear({ clients = true, cache = true } = {}) {
|
|
13684
13769
|
this.manager.clear();
|
|
13685
13770
|
if (clients) {
|
|
13686
13771
|
this.clients?.forEach((client) => this.disconnect(client));
|
|
@@ -13690,8 +13775,6 @@ var Coordinator = class {
|
|
|
13690
13775
|
}
|
|
13691
13776
|
if (cache)
|
|
13692
13777
|
this.manager.cache().clear();
|
|
13693
|
-
if (catalog)
|
|
13694
|
-
this.catalog.clear();
|
|
13695
13778
|
}
|
|
13696
13779
|
databaseConnector(db) {
|
|
13697
13780
|
return this.manager.connector(db);
|
|
@@ -13744,7 +13827,7 @@ var Coordinator = class {
|
|
|
13744
13827
|
* @param {import('./MosaicClient.js').MosaicClient} client the client to disconnect
|
|
13745
13828
|
*/
|
|
13746
13829
|
async connect(client) {
|
|
13747
|
-
const {
|
|
13830
|
+
const { clients, filterGroups, indexes } = this;
|
|
13748
13831
|
if (clients.has(client)) {
|
|
13749
13832
|
throw new Error("Client already connected.");
|
|
13750
13833
|
}
|
|
@@ -13752,7 +13835,7 @@ var Coordinator = class {
|
|
|
13752
13835
|
client.coordinator = this;
|
|
13753
13836
|
const fields = client.fields();
|
|
13754
13837
|
if (fields?.length) {
|
|
13755
|
-
client.fieldInfo(await
|
|
13838
|
+
client.fieldInfo(await queryFieldInfo(this, fields));
|
|
13756
13839
|
}
|
|
13757
13840
|
const filter = client.filterBy;
|
|
13758
13841
|
if (filter) {
|
|
@@ -25598,7 +25681,7 @@ var C = () => (async (s) => {
|
|
|
25598
25681
|
return false;
|
|
25599
25682
|
}
|
|
25600
25683
|
})(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5, 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11]));
|
|
25601
|
-
var _ = { name: "@duckdb/duckdb-wasm", version: "1.28.1-
|
|
25684
|
+
var _ = { name: "@duckdb/duckdb-wasm", version: "1.28.1-dev99.0", description: "DuckDB powered by WebAssembly", license: "MIT", repository: { type: "git", url: "https://github.com/duckdb/duckdb-wasm.git" }, keywords: ["sql", "duckdb", "relational", "database", "data", "query", "wasm", "analytics", "olap", "arrow", "parquet", "json", "csv"], dependencies: { "apache-arrow": "^14.0.1" }, devDependencies: { "@types/emscripten": "^1.39.10", "@types/jasmine": "^5.1.4", "@typescript-eslint/eslint-plugin": "^6.18.0", "@typescript-eslint/parser": "^6.18.0", esbuild: "^0.19.10", eslint: "^8.56.0", "eslint-plugin-jasmine": "^4.1.3", "eslint-plugin-react": "^7.33.2", "fast-glob": "^3.3.2", jasmine: "^5.1.0", "jasmine-core": "^5.1.1", "jasmine-spec-reporter": "^7.0.0", "js-sha256": "^0.10.1", karma: "^6.4.2", "karma-chrome-launcher": "^3.2.0", "karma-coverage": "^2.2.1", "karma-firefox-launcher": "^2.1.2", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.1.0", "karma-sourcemap-loader": "^0.4.0", "karma-spec-reporter": "^0.0.36", "make-dir": "^4.0.0", nyc: "^15.1.0", prettier: "^3.2.2", puppeteer: "^21.7.0", rimraf: "^5.0.5", s3rver: "^3.7.1", typedoc: "^0.25.7", typescript: "^5.3.3", "wasm-feature-detect": "^1.6.1", "web-worker": "^1.2.0" }, scripts: { "build:debug": "node bundle.mjs debug && tsc --emitDeclarationOnly", "build:release": "node bundle.mjs release && tsc --emitDeclarationOnly", docs: "typedoc", report: "node ./coverage.mjs", "test:node": "node --enable-source-maps ../../node_modules/jasmine/bin/jasmine ./dist/tests-node.cjs", "test:node:debug": "node --inspect-brk --enable-source-maps ../../node_modules/jasmine/bin/jasmine ./dist/tests-node.cjs", "test:node:coverage": "nyc -r json --report-dir ./coverage/node node ../../node_modules/jasmine/bin/jasmine ./dist/tests-node.cjs", "test:firefox": "karma start ./karma/tests-firefox.cjs", "test:chrome": "karma start ./karma/tests-chrome.cjs", "test:chrome:eh": "karma start ./karma/tests-chrome-eh.cjs", "test:chrome:coverage": "karma start ./karma/tests-chrome-coverage.cjs", "test:browser": "karma start ./karma/tests-all.cjs", "test:browser:debug": "karma start ./karma/tests-debug.cjs", test: "npm run test:chrome && npm run test:node", "test:coverage": "npm run test:chrome:coverage && npm run test:node:coverage && npm run report", lint: "eslint src test" }, files: ["dist", "!dist/types/test"], main: "dist/duckdb-browser.cjs", module: "dist/duckdb-browser.mjs", types: "dist/duckdb-browser.d.ts", jsdelivr: "dist/duckdb-browser.cjs", unpkg: "dist/duckdb-browser.mjs", sideEffects: false, browser: { fs: false, path: false, perf_hooks: false, os: false, worker_threads: false }, exports: { "./dist/duckdb-mvp.wasm": "./dist/duckdb-mvp.wasm", "./dist/duckdb-eh.wasm": "./dist/duckdb-eh.wasm", "./dist/duckdb-coi.wasm": "./dist/duckdb-coi.wasm", "./dist/duckdb-browser": "./dist/duckdb-browser.mjs", "./dist/duckdb-browser.cjs": "./dist/duckdb-browser.cjs", "./dist/duckdb-browser.mjs": "./dist/duckdb-browser.mjs", "./dist/duckdb-browser-blocking": "./dist/duckdb-browser-blocking.mjs", "./dist/duckdb-browser-blocking.mjs": "./dist/duckdb-browser-blocking.mjs", "./dist/duckdb-browser-blocking.cjs": "./dist/duckdb-browser-blocking.cjs", "./dist/duckdb-browser-coi.pthread.worker.js": "./dist/duckdb-browser-coi.pthread.worker.js", "./dist/duckdb-browser-coi.worker.js": "./dist/duckdb-browser-coi.worker.js", "./dist/duckdb-browser-eh.worker.js": "./dist/duckdb-browser-eh.worker.js", "./dist/duckdb-browser-mvp.worker.js": "./dist/duckdb-browser-mvp.worker.js", "./dist/duckdb-node": "./dist/duckdb-node.cjs", "./dist/duckdb-node.cjs": "./dist/duckdb-node.cjs", "./dist/duckdb-node-blocking": "./dist/duckdb-node-blocking.cjs", "./dist/duckdb-node-blocking.cjs": "./dist/duckdb-node-blocking.cjs", "./dist/duckdb-node-eh.worker.cjs": "./dist/duckdb-node-eh.worker.cjs", "./dist/duckdb-node-mvp.worker.cjs": "./dist/duckdb-node-mvp.worker.cjs", "./blocking": { browser: { types: "./dist/duckdb-browser-blocking.d.ts", import: "./dist/duckdb-browser-blocking.mjs", require: "./dist/duckdb-browser-blocking.cjs" }, node: { types: "./dist/duckdb-node-blocking.d.ts", require: "./dist/duckdb-node-blocking.cjs", import: "./dist/duckdb-node-blocking.cjs" }, types: "./dist/duckdb-browser-blocking.d.ts", import: "./dist/duckdb-browser-blocking.mjs", require: "./dist/duckdb-browser-blocking.cjs" }, ".": { browser: { types: "./dist/duckdb-browser.d.ts", import: "./dist/duckdb-browser.mjs", require: "./dist/duckdb-browser.cjs" }, node: { types: "./dist/duckdb-node.d.ts", import: "./dist/duckdb-node.cjs", require: "./dist/duckdb-node.cjs" }, types: "./dist/duckdb-browser.d.ts", import: "./dist/duckdb-browser.mjs", require: "./dist/duckdb-browser.cjs" } } };
|
|
25602
25685
|
var W = _.name;
|
|
25603
25686
|
var v = _.version;
|
|
25604
25687
|
var I = _.version.split(".");
|
|
@@ -25741,8 +25824,12 @@ export {
|
|
|
25741
25824
|
Param,
|
|
25742
25825
|
Priority,
|
|
25743
25826
|
Selection,
|
|
25827
|
+
convertArrowArrayType,
|
|
25828
|
+
convertArrowColumn,
|
|
25829
|
+
convertArrowValue,
|
|
25744
25830
|
coordinator,
|
|
25745
25831
|
distinct,
|
|
25832
|
+
isArrowTable,
|
|
25746
25833
|
isParam,
|
|
25747
25834
|
isSelection,
|
|
25748
25835
|
restConnector,
|