Skip to content

Commit 677b275

Browse files
committed
Add support for running SQL queries on Boiling
1 parent c0ff748 commit 677b275

File tree

5 files changed

+666
-12
lines changed

5 files changed

+666
-12
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"@aws-sdk/client-iam": "^3.533.0",
6262
"@aws-sdk/client-sts": "^3.533.0",
6363
"@aws-sdk/credential-provider-cognito-identity": "^3.533.0",
64+
"@boilingdata/node-boilingdata": "^1.0.20",
6465
"amazon-cognito-identity-js": "^6.3.4",
6566
"aws-jwt-verify": "^4.0.0",
6667
"chalk": "^4.0.0",
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as cmd from "commander";
2+
import { ELogLevel, getLogger } from "../../utils/logger_util.js";
3+
import { spinnerError, spinnerSuccess, updateSpinnerText } from "../../utils/spinner_util.js";
4+
import { addGlobalOptions } from "../../utils/options_util.js";
5+
import { getIdToken } from "../../utils/auth_util.js";
6+
import { combineOptsWithSettings } from "../../utils/config_util.js";
7+
import { outputResults } from "../../utils/output_util.js";
8+
import { runBoilingQuery } from "../../../integration/boilingdata/query.js";
9+
10+
const logger = getLogger("bdcli-api");
11+
logger.setLogLevel(ELogLevel.WARN);
12+
13+
async function query(options: any, _command: cmd.Command): Promise<void> {
14+
try {
15+
options = await combineOptsWithSettings(options, logger);
16+
17+
updateSpinnerText("Authenticating");
18+
const { idToken: token, cached, region } = await getIdToken(logger);
19+
updateSpinnerText(cached ? "Authenticating: cached" : "Authenticating: success");
20+
spinnerSuccess();
21+
22+
updateSpinnerText("Sending Query to Boiling API");
23+
const results = await runBoilingQuery(options.sql, token, region, logger);
24+
spinnerSuccess();
25+
await outputResults(results, options.disableSpinner);
26+
} catch (err: any) {
27+
spinnerError(err?.message);
28+
}
29+
}
30+
31+
const program = new cmd.Command("bdcli api query")
32+
.addOption(new cmd.Option("--sql <sqlQuery>", "SQL clause").makeOptionMandatory())
33+
.action(async (options, command) => await query(options, command));
34+
35+
(async () => {
36+
await addGlobalOptions(program, logger);
37+
await program.parseAsync(process.argv);
38+
})();

src/bdcli/commands/bdcli-api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Command } from "commander";
22

33
const program = new Command("bdcli api")
44
.executableDir("api")
5-
.command("wssurl", "Get signed WebSocket (wss://) URL for connecting to Boiling Data");
5+
.command("wssurl", "Get signed WebSocket (wss://) URL for connecting to Boiling Data")
6+
.command("query", "Run SQL query on Boiling cloud");
67

78
program.parse(process.argv);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { BoilingData } from "@boilingdata/node-boilingdata";
2+
import { ILogger } from "../../bdcli/utils/logger_util.js";
3+
import { BDAWSRegion } from "@boilingdata/node-boilingdata/dist/cjs/boilingdata/boilingdata.js";
4+
5+
export async function runBoilingQuery(sql: string, idToken: string, region: string, logger: ILogger): Promise<any[]> {
6+
try {
7+
logger.debug({ sql, idToken, region });
8+
const bdInstance = new BoilingData({
9+
logLevel: "error",
10+
region: <BDAWSRegion>region,
11+
authcontext: { idToken: { jwtToken: idToken } },
12+
});
13+
await bdInstance.connect();
14+
const start = Date.now();
15+
//const sql = `SELECT COUNT(*) FROM parquet_scan('s3://boilingdata-demo/demo.parquet');`;
16+
const rows = await bdInstance.execQueryPromise({ sql });
17+
const stop = Date.now();
18+
const parsedRows = JSON.parse(JSON.stringify(rows));
19+
logger.debug(JSON.parse(JSON.stringify(rows)));
20+
logger.debug("Query time measured e2e (ms):", stop - start);
21+
await bdInstance.close();
22+
return parsedRows;
23+
} catch (err) {
24+
logger.error(err);
25+
}
26+
return [];
27+
}

0 commit comments

Comments
 (0)