diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000000000..a8b3448fb5d0a --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,180 @@ +docs: +- changed-files: + - any-glob-to-any-file: docs/* + +# Data source drivers +data source driver: +- changed-files: + - any-glob-to-any-file: packages/*-driver/**/* + +cubejs-jdbc-driver: +- changed-files: + - any-glob-to-any-file: packages/cubejs-databricks-jdbc-driver/**/* + +# Individual driver labels +driver:athena: +- changed-files: + - any-glob-to-any-file: packages/cubejs-athena-driver/**/* + +driver:bigquery: +- changed-files: + - any-glob-to-any-file: packages/cubejs-bigquery-driver/**/* + +driver:clickhouse: +- changed-files: + - any-glob-to-any-file: packages/cubejs-clickhouse-driver/**/* + +driver:crate: +- changed-files: + - any-glob-to-any-file: packages/cubejs-crate-driver/**/* + +driver:databricks: +- changed-files: + - any-glob-to-any-file: packages/cubejs-databricks-jdbc-driver/**/* + +driver:dremio: +- changed-files: + - any-glob-to-any-file: packages/cubejs-dremio-driver/**/* + +driver:druid: +- changed-files: + - any-glob-to-any-file: packages/cubejs-druid-driver/**/* + +driver:duckdb: +- changed-files: + - any-glob-to-any-file: packages/cubejs-duckdb-driver/**/* + +driver:elasticsearch: +- changed-files: + - any-glob-to-any-file: packages/cubejs-elasticsearch-driver/**/* + +driver:firebolt: +- changed-files: + - any-glob-to-any-file: packages/cubejs-firebolt-driver/**/* + +driver:hive: +- changed-files: + - any-glob-to-any-file: packages/cubejs-hive-driver/**/* + +driver:materialize: +- changed-files: + - any-glob-to-any-file: packages/cubejs-materialize-driver/**/* + +driver:mongodb: +- changed-files: + - any-glob-to-any-file: packages/cubejs-mongobi-driver/**/* + +driver:mssql: +- changed-files: + - any-glob-to-any-file: packages/cubejs-mssql-driver/**/* + +driver:mysql: +- changed-files: + - any-glob-to-any-file: packages/cubejs-mysql-driver/**/* + +driver:mysql-aurora-serverless: +- changed-files: + - any-glob-to-any-file: packages/cubejs-mysql-aurora-serverless-driver/**/* + +driver:oracle: +- changed-files: + - any-glob-to-any-file: packages/cubejs-oracle-driver/**/* + +driver:pinot: +- changed-files: + - any-glob-to-any-file: packages/cubejs-pinot-driver/**/* + +driver:postgres: +- changed-files: + - any-glob-to-any-file: packages/cubejs-postgres-driver/**/* + +driver:prestodb: +- changed-files: + - any-glob-to-any-file: packages/cubejs-prestodb-driver/**/* + +driver:questdb: +- changed-files: + - any-glob-to-any-file: packages/cubejs-questdb-driver/**/* + +driver:redshift: +- changed-files: + - any-glob-to-any-file: packages/cubejs-redshift-driver/**/* + +driver:snowflake: +- changed-files: + - any-glob-to-any-file: packages/cubejs-snowflake-driver/**/* + +driver:sqlite: +- changed-files: + - any-glob-to-any-file: packages/cubejs-sqlite-driver/**/* + +driver:trino: +- changed-files: + - any-glob-to-any-file: packages/cubejs-trino-driver/**/* + +# Client libraries +client:core: +- changed-files: + - any-glob-to-any-file: packages/cubejs-client-core/**/* + +client:react: +- changed-files: + - any-glob-to-any-file: packages/cubejs-client-react/**/* + +client:vue: +- changed-files: + - any-glob-to-any-file: + - packages/cubejs-client-vue/**/* + - packages/cubejs-client-vue3/**/* + +client:ngx: +- changed-files: + - any-glob-to-any-file: packages/cubejs-client-ngx/**/* + +client:playground: +- changed-files: + - any-glob-to-any-file: packages/cubejs-playground/**/* + +# Cubestore +cube store: +- changed-files: + - any-glob-to-any-file: rust/cubestore/**/* + +# Languages +javascript: +- changed-files: + - any-glob-to-any-file: + - '**/*.js' + - '**/*.jsx' + - '**/*.ts' + - '**/*.tsx' + - '**/*.mjs' + - '**/*.cjs' + +python: +- changed-files: + - any-glob-to-any-file: + - '**/*.py' + - '**/*.pyi' + - '**/*.pyx' + +rust: +- changed-files: + - any-glob-to-any-file: + - '**/*.rs' + - '**/*.toml' + - rust/**/* + +backend:cli: +- changed-files: + - any-glob-to-any-file: packages/cubejs-cli/**/* + +# Dependencies +dependencies: +- changed-files: + - any-glob-to-all-files: + - '**/package.json' + - '**/package-lock.json' + - '**/yarn.lock' + - '**/Cargo.toml' + - '**/Cargo.lock' diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3194b0640b8fe..fa759b0bbcbd1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,5 +1,5 @@ **Check List** -- [ ] Tests have been run in packages where changes made if available +- [ ] Tests have been run in packages where changes have been made if available - [ ] Linter has been run for changed code - [ ] Tests for the changes have been added if not covered yet - [ ] Docs have been added / updated if required diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000000000..65fd96a772d08 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,17 @@ +name: "Pull Request Automatic Labeler" + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + label: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - uses: actions/labeler@v6 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + configuration-path: .github/labeler.yml diff --git a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js index dac95257dfd9e..ec6b95cafcce7 100644 --- a/packages/cubejs-sqlite-driver/driver/SqliteDriver.js +++ b/packages/cubejs-sqlite-driver/driver/SqliteDriver.js @@ -33,7 +33,7 @@ class SqliteDriver extends BaseDriver { const dataSource = config.dataSource || assertDataSource('default'); - + this.config = { database: getEnv('dbName', { dataSource }), ...config @@ -64,7 +64,7 @@ class SqliteDriver extends BaseDriver { informationSchemaQuery() { return ` - SELECT name, sql + SELECT name FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence' @@ -72,31 +72,25 @@ class SqliteDriver extends BaseDriver { `; } + tableColumnsQuery(tableName) { + return ` + SELECT name, type + FROM pragma_table_info('${tableName}') + `; + } + async tablesSchema() { const query = this.informationSchemaQuery(); const tables = await this.query(query); + const tableColumns = await Promise.all(tables.map(async table => { + const columns = await this.query(this.tableColumnsQuery(table.name)); + return [table.name, columns]; + })); + return { - main: tables.reduce((acc, table) => ({ - ...acc, - [table.name]: table.sql - // remove EOL for next .match to read full string - .replace(/\n/g, '') - // extract fields - .match(/\((.*)\)/)[1] - // split fields - .split(',') - .map((nameAndType) => { - const match = nameAndType - .trim() - // replace \t with whitespace - .replace(/\t/g, ' ') - // obtain "([|`|")?name(]|`|")? type" - .match(/([|`|"])?([^[\]"`]+)(]|`|")?\s+(\w+)/); - return { name: match[2], type: match[4] }; - }) - }), {}), + main: Object.fromEntries(tableColumns) }; } diff --git a/packages/cubejs-sqlite-driver/package.json b/packages/cubejs-sqlite-driver/package.json index 833f23b4bcc77..954802f0d740c 100644 --- a/packages/cubejs-sqlite-driver/package.json +++ b/packages/cubejs-sqlite-driver/package.json @@ -14,7 +14,8 @@ "main": "driver/SqliteDriver.js", "typings": "driver/index.d.ts", "scripts": { - "lint": "eslint **/*.js" + "lint": "eslint **/*.js", + "unit": "jest" }, "dependencies": { "@cubejs-backend/base-driver": "1.3.78", @@ -23,7 +24,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.3.78" + "@cubejs-backend/linter": "1.3.78", + "jest": "^29" }, "publishConfig": { "access": "public" diff --git a/packages/cubejs-sqlite-driver/test/SqliteDriver.test.js b/packages/cubejs-sqlite-driver/test/SqliteDriver.test.js new file mode 100644 index 0000000000000..2090fe2346900 --- /dev/null +++ b/packages/cubejs-sqlite-driver/test/SqliteDriver.test.js @@ -0,0 +1,53 @@ +/* globals describe, test, expect, beforeEach */ +const sqlite3 = require('sqlite3'); +const SqliteDriver = require('../driver/SqliteDriver.js'); + +describe('SqliteDriver', () => { + let driver; + + beforeEach(() => { + const db = new sqlite3.Database(':memory:'); + driver = new SqliteDriver({ db }); + }); + + test('testConnection', async () => { + await driver.testConnection(); + }); + + test('tableSchema', async () => { + await driver.query(` + CREATE TABLE users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + email TEXT UNIQUE NOT NULL, + age INTEGER, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + `); + + await driver.query(` + CREATE TABLE groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL + ); + `); + + const tableSchema = await driver.tablesSchema(); + + expect(tableSchema).toEqual({ + main: { + users: [ + { name: 'id', type: 'INTEGER' }, + { name: 'name', type: 'TEXT' }, + { name: 'email', type: 'TEXT' }, + { name: 'age', type: 'INTEGER' }, + { name: 'created_at', type: 'DATETIME' }, + ], + groups: [ + { name: 'id', type: 'INTEGER' }, + { name: 'name', type: 'TEXT' }, + ] + } + }); + }); +});