From 3ef11921d95e9aa5916bf309de261b2aaebf2429 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Wed, 20 Nov 2024 13:26:52 +0200 Subject: [PATCH] =?UTF-8?q?put=20native=20parseCubestoreResultMessage=20be?= =?UTF-8?q?hind=20the=C2=A0flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cubejs-backend-shared/src/env.ts | 3 + .../src/WebSocketConnection.ts | 59 +++++++++++++++++-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/packages/cubejs-backend-shared/src/env.ts b/packages/cubejs-backend-shared/src/env.ts index b736f26ec004e..33e5b650c3222 100644 --- a/packages/cubejs-backend-shared/src/env.ts +++ b/packages/cubejs-backend-shared/src/env.ts @@ -193,6 +193,9 @@ const variables: Record any> = { .default('1') .asInt(), nativeSqlPlanner: () => get('CUBEJS_TESSERACT_SQL_PLANNER').asBool(), + nativeOrchestrator: () => get('CUBEJS_TESSERACT_ORCHESTRATOR') + .default('false') + .asBoolStrict(), /** **************************************************************** * Common db options * diff --git a/packages/cubejs-cubestore-driver/src/WebSocketConnection.ts b/packages/cubejs-cubestore-driver/src/WebSocketConnection.ts index 646ebfd98560a..7095c0eda1aa7 100644 --- a/packages/cubejs-cubestore-driver/src/WebSocketConnection.ts +++ b/packages/cubejs-cubestore-driver/src/WebSocketConnection.ts @@ -6,8 +6,10 @@ import { getEnv } from '@cubejs-backend/shared'; import { parseCubestoreResultMessage } from '@cubejs-backend/native'; import { HttpCommand, + HttpError, HttpMessage, HttpQuery, + HttpResultSet, HttpTable } from '../codegen'; @@ -116,11 +118,58 @@ export class WebSocketConnection { throw new Error(`Cube Store missed message id: ${httpMessage.messageId()}`); // logging } - try { - const nativeResMsg = parseCubestoreResultMessage(msg); - resolvers.resolve(nativeResMsg); - } catch (e) { - resolvers.reject(e); + if (getEnv('nativeOrchestrator')) { + try { + const nativeResMsg = parseCubestoreResultMessage(msg); + resolvers.resolve(nativeResMsg); + } catch (e) { + resolvers.reject(e); + } + } else { + const commandType = httpMessage.commandType(); + + if (commandType === HttpCommand.HttpError) { + resolvers.reject(new Error(`${httpMessage.command(new HttpError())?.error()}`)); + } else if (commandType === HttpCommand.HttpResultSet) { + const resultSet = httpMessage.command(new HttpResultSet()); + + if (!resultSet) { + resolvers.reject(new Error('Empty resultSet')); + return; + } + + const columnsLen = resultSet.columnsLength(); + const columns: Array = []; + for (let i = 0; i < columnsLen; i++) { + const columnName = resultSet.columns(i); + if (!columnName) { + resolvers.reject(new Error('Column name is not defined')); + return; + } + columns.push(columnName); + } + + const rowLen = resultSet.rowsLength(); + const result: any[] = []; + for (let i = 0; i < rowLen; i++) { + const row = resultSet.rows(i); + if (!row) { + resolvers.reject(new Error('Null row')); + return; + } + const valueLen = row.valuesLength(); + const rowObj = {}; + for (let j = 0; j < valueLen; j++) { + const value = row.values(j); + rowObj[columns[j]] = value?.stringValue(); + } + result.push(rowObj); + } + + resolvers.resolve(result); + } else { + resolvers.reject(new Error('Unsupported command')); + } } }); });