Skip to content

Commit 45460b7

Browse files
author
BoilingData
authored
Merge pull request #2 from boilingdata/add-support-for-sqlite
feat: Add support for sqlite engine
2 parents a693352 + 02e92bb commit 45460b7

5 files changed

Lines changed: 85 additions & 8 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@boilingdata/node-boilingdata",
3-
"version": "0.0.12",
3+
"version": "0.0.13",
44
"description": "BoilingData client",
55
"main": "dist/cjs/index.js",
66
"types": "dist/cjs/index.d.ts",

src/boilingdata/boilingdata.api.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// https://www.boilingdata.com/apidoc.html
33

44
export interface IBDDataQuery {
5-
messageType: string; // "SQL_QUERY"
5+
messageType: string; // SQL_QUERY
66
requestId: string;
77
sql: string;
8+
engine?: string; // DUCKDB (default), SQLITE
89
keys?: string[];
910
crossRegionPolicy?: string; // DISALLOWED, ALLOWED, SELECTED
1011
allowedRegions?: string[];
@@ -37,6 +38,11 @@ export enum EMessageTypes {
3738
SQL_QUERY = "SQL_QUERY",
3839
}
3940

41+
export enum EEngineTypes {
42+
DUCKDB = "DUCKDB",
43+
SQLITE = "SQLITE",
44+
}
45+
4046
export enum EEvent {
4147
REQUEST = "REQUEST",
4248
DATA = "DATA",

src/boilingdata/boilingdata.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createLogger } from "bunyan";
22
import { BDCredentials, getBoilingDataCredentials } from "../common/identity";
3-
import { EEvent, EMessageTypes, IBDDataQuery, IBDDataResponse } from "./boilingdata.api";
3+
import { EEngineTypes, EEvent, EMessageTypes, IBDDataQuery, IBDDataResponse } from "./boilingdata.api";
44
import { v4 as uuidv4 } from "uuid";
55
import { WebSocket, MessageEvent } from "ws";
66
import { inspect } from "util";
@@ -28,6 +28,7 @@ export interface IBoilingData {
2828

2929
export interface IBDQuery {
3030
sql: string;
31+
engine?: EEngineTypes.DUCKDB | EEngineTypes.SQLITE;
3132
keys?: string[];
3233
requestId?: string;
3334
callbacks?: IBDCallbacks;
@@ -133,6 +134,7 @@ export class BoilingData {
133134
messageType: EMessageTypes.SQL_QUERY,
134135
sql: params.sql,
135136
keys: params.keys || [],
137+
engine: params.engine ?? EEngineTypes.DUCKDB,
136138
requestId,
137139
};
138140
this.socketInstance.queries.set(requestId, {

src/tests/__snapshots__/query.test.ts.snap

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`boilingdata run all meta queries 1`] = `
3+
exports[`boilingdata with DuckDB run all meta queries 1`] = `
44
Array [
55
Array [],
66
Array [
@@ -60,7 +60,7 @@ Array [
6060
]
6161
`;
6262

63-
exports[`boilingdata run multi-key query 1`] = `
63+
exports[`boilingdata with DuckDB run multi-key query 1`] = `
6464
Array [
6565
Object {
6666
"count": 44459136,
@@ -73,7 +73,7 @@ Array [
7373
]
7474
`;
7575

76-
exports[`boilingdata run single query 1`] = `
76+
exports[`boilingdata with DuckDB run single query 1`] = `
7777
Array [
7878
Object {
7979
"DOLocationID": 145,
@@ -117,3 +117,38 @@ Array [
117117
},
118118
]
119119
`;
120+
121+
exports[`boilingdata with SQLite3 run single query 1`] = `
122+
Array [
123+
Object {
124+
"birthdate": "3/8/1971",
125+
"cc": "6759521864920116",
126+
"comments": "1E+02",
127+
"country": "Indonesia",
128+
"email": "ajordan0@com.com",
129+
"first_name": "Amanda",
130+
"gender": "Female",
131+
"id": 1,
132+
"ip_address": "1.197.201.2",
133+
"last_name": "Jordan",
134+
"registration_dttm": 1454486129000,
135+
"salary": 49756.53,
136+
"title": "Internal Auditor",
137+
},
138+
Object {
139+
"birthdate": "1/16/1968",
140+
"cc": "",
141+
"comments": "",
142+
"country": "Canada",
143+
"email": "afreeman1@is.gd",
144+
"first_name": "Albert",
145+
"gender": "Male",
146+
"id": 2,
147+
"ip_address": "218.111.175.34",
148+
"last_name": "Freeman",
149+
"registration_dttm": 1454519043000,
150+
"salary": 150280.17,
151+
"title": "Accountant IV",
152+
},
153+
]
154+
`;

src/tests/query.test.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { globalCallbacksList, IBDDataResponse } from "../boilingdata/boilingdata.api";
1+
import { EEngineTypes, globalCallbacksList, IBDDataResponse } from "../boilingdata/boilingdata.api";
22
import { BoilingData, isDataResponse } from "../boilingdata/boilingdata";
33
import { createLogger } from "bunyan";
44

@@ -23,7 +23,7 @@ globalCallbacks.onSocketClose = () => {
2323
};
2424
const bdInstance = new BoilingData({ username, password, globalCallbacks, logLevel });
2525

26-
describe("boilingdata", () => {
26+
describe("boilingdata with DuckDB", () => {
2727
beforeAll(async () => {
2828
await bdInstance.connect();
2929
logger.info("connected.");
@@ -39,6 +39,7 @@ describe("boilingdata", () => {
3939
const r: any[] = [];
4040
bdInstance.execQuery({
4141
sql: `SELECT * FROM parquet_scan('s3://boilingdata-demo/demo2.parquet:m=0') LIMIT 2;`,
42+
// engine: EEngineTypes.DUCKDB, // DuckDB is the default
4243
keys: [],
4344
callbacks: {
4445
onData: (data: IBDDataResponse | unknown) => {
@@ -57,6 +58,7 @@ describe("boilingdata", () => {
5758
const r: any[] = [];
5859
bdInstance.execQuery({
5960
sql: `SELECT 's3://KEY' AS key, COUNT(*) AS count FROM parquet_scan('s3://KEY');`,
61+
engine: EEngineTypes.DUCKDB,
6062
keys: ["s3://boilingdata-demo/demo.parquet", "s3://boilingdata-demo/demo2.parquet"],
6163
callbacks: {
6264
onData: (data: IBDDataResponse | unknown) => {
@@ -85,6 +87,7 @@ describe("boilingdata", () => {
8587
bdInstance.execQuery({
8688
sql,
8789
keys: [],
90+
engine: EEngineTypes.DUCKDB,
8891
callbacks: {
8992
onData: (data: IBDDataResponse | unknown) => {
9093
if (isDataResponse(data)) data.data.map(row => r.push(row));
@@ -99,3 +102,34 @@ describe("boilingdata", () => {
99102
expect(rows.sort()).toMatchSnapshot();
100103
});
101104
});
105+
106+
describe("boilingdata with SQLite3", () => {
107+
beforeAll(async () => {
108+
await bdInstance.connect();
109+
logger.info("connected.");
110+
});
111+
112+
afterAll(async () => {
113+
await bdInstance.close();
114+
logger.info("connection closed.");
115+
});
116+
117+
it("run single query", async () => {
118+
const rows = await new Promise<any[]>((resolve, reject) => {
119+
const r: any[] = [];
120+
bdInstance.execQuery({
121+
sql: `SELECT * FROM sqlite('s3://boilingdata-demo/uploads/userdata1.sqlite3','userdata1') LIMIT 2;`,
122+
engine: EEngineTypes.SQLITE,
123+
keys: [],
124+
callbacks: {
125+
onData: (data: IBDDataResponse | unknown) => {
126+
if (isDataResponse(data)) data.data.map(row => r.push(row));
127+
resolve(r);
128+
},
129+
onLogError: (data: any) => reject(data),
130+
},
131+
});
132+
});
133+
expect(rows.sort()).toMatchSnapshot();
134+
});
135+
});

0 commit comments

Comments
 (0)