1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2025-12-07 18:48:55 +08:00

Pivot implementation and redesign (#69)

- Pivot support implementation 
- Rename queries into inquiries
- Rename editor into workspace
- Change result set format
- New JSON format for inquiries
- Redesign panels
This commit is contained in:
lana-k
2021-08-04 22:20:51 +02:00
committed by GitHub
parent 8d0bc6affe
commit 5017b55944
105 changed files with 4659 additions and 2021 deletions

View File

@@ -4,6 +4,17 @@ import dbUtils from './_statements'
let SQL = null
const sqlModuleReady = initSqlJs().then(sqlModule => { SQL = sqlModule })
function _getDataSourcesFromSqlResult (sqlResult) {
if (!sqlResult) {
return {}
}
const dataSorces = {}
sqlResult.columns.forEach((column, index) => {
dataSorces[column] = sqlResult.values.map(row => row[index])
})
return dataSorces
}
export default class Sql {
constructor () {
this.db = null
@@ -36,16 +47,19 @@ export default class Sql {
if (!sql) {
throw new Error('exec: Missing query string')
}
return this.db.exec(sql, params)
const sqlResults = this.db.exec(sql, params)
return sqlResults.map(result => _getDataSourcesFromSqlResult(result))
}
import (tabName, columns, values, progressCounterId, progressCallback, chunkSize = 1500) {
import (tabName, data, progressCounterId, progressCallback, chunkSize = 1500) {
if (this.db === null) {
this.createDb()
}
this.db.exec(dbUtils.getCreateStatement(tabName, columns, values))
const chunks = dbUtils.generateChunks(values, chunkSize)
const chunksAmount = Math.ceil(values.length / chunkSize)
const columns = Object.keys(data)
const rowCount = data[columns[0]].length
this.db.exec(dbUtils.getCreateStatement(tabName, data))
const chunks = dbUtils.generateChunks(data, chunkSize)
const chunksAmount = Math.ceil(rowCount / chunkSize)
let count = 0
const insertStr = dbUtils.getInsertStmt(tabName, columns)
const insertStmt = this.db.prepare(insertStr)

View File

@@ -1,13 +1,17 @@
import sqliteParser from 'sqlite-parser'
export default {
* generateChunks (arr, size) {
const count = Math.ceil(arr.length / size)
* generateChunks (data, size) {
const matrix = Object.keys(data).map(col => data[col])
const [row] = matrix
const transposedMatrix = row.map((value, column) => matrix.map(row => row[column]))
const count = Math.ceil(transposedMatrix.length / size)
for (let i = 0; i <= count - 1; i++) {
const start = size * i
const end = start + size
yield arr.slice(start, end)
yield transposedMatrix.slice(start, end)
}
},
@@ -17,11 +21,11 @@ export default {
return `INSERT INTO "${tabName}" (${colList}) VALUES (${params});`
},
getCreateStatement (tabName, columns, values) {
getCreateStatement (tabName, data) {
let result = `CREATE table "${tabName}"(`
columns.forEach((col, index) => {
// Get the first row of values to determine types
const value = values[0][index]
for (const col in data) {
// Get the first row of values to determine types
const value = data[col][0]
let type = ''
switch (typeof value) {
case 'number': {
@@ -39,7 +43,8 @@ export default {
default: type = 'TEXT'
}
result += `"${col}" ${type}, `
})
}
result = result.replace(/,\s$/, ');')
return result
},

View File

@@ -15,8 +15,7 @@ function processMsg (sql) {
case 'import':
return sql.import(
data.tabName,
data.columns,
data.values,
data.data,
data.progressCounterId,
postMessage
)

View File

@@ -55,8 +55,7 @@ class Database {
async addTableFromCsv (tabName, data, progressCounterId) {
const result = await this.pw.postMessage({
action: 'import',
columns: data.columns,
values: data.values,
data,
progressCounterId,
tabName
})
@@ -89,11 +88,11 @@ class Database {
const result = await this.execute(getSchemaSql)
// Parse DDL statements to get column names and types
const parsedSchema = []
if (result && result.values) {
result.values.forEach(item => {
if (result && result.name) {
result.name.forEach((table, index) => {
parsedSchema.push({
name: item[0],
columns: stms.getColumns(item[1])
name: table,
columns: stms.getColumns(result.sql[index])
})
})
}