Skip to content

Commit ccbd1b4

Browse files
authored
Merge pull request #5 from CNAG-Biomedical-Informatics/codex/fetch-column-value-types-for-queries
Improve query builder by using column types
2 parents 75fee42 + 33b950f commit ccbd1b4

File tree

5 files changed

+49
-30
lines changed

5 files changed

+49
-30
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ dist-ssr
2323
*.sln
2424
*.sw?
2525

26-
# Rendered HTML
26+
# rendered html files
2727
README.html
2828
README_files

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
2-
"name": "sql.js-httpvfs-playground",
2+
"name": "cnag-bmi-sql.js-httpvfs-playground",
33
"private": true,
44
"author": {
5-
"name": "Nishad Thalhath"
5+
"name": "Ivo Christopher Leist"
66
},
77
"version": "0.1.6",
88
"type": "module",

public/db/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
tcga.db

public/db/tcga.db

-57.8 MB
Binary file not shown.

src/App.svelte

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,22 @@
7171
return "string";
7272
}
7373
74-
function updateInstructs(data) {
74+
async function getColumnTypes(table) {
75+
const { result } = await queryDb(dbUrl, `PRAGMA table_info('${table}')`);
76+
const types = {};
77+
result.forEach((col) => {
78+
types[col.name] = col.type || "";
79+
});
80+
return types;
81+
}
82+
83+
async function updateInstructs(data, table = activeTable) {
7584
if (Array.isArray(data) && data.length > 0) {
85+
const colTypes = await getColumnTypes(table);
7686
ptInstructs = Object.keys(data[0]).map((key) => ({
7787
key,
7888
title: key,
79-
valueType: inferColValsType(data[0][key]),
89+
valueType: colTypes[key] || inferColValsType(data[0][key]),
8090
...(key.includes("URL") ? { parseAs: "unsafe-html" } : {}),
8191
}));
8292
}
@@ -186,39 +196,47 @@
186196
console.log(
187197
`Running query on table: ${activeTable}, column: ${selectedColumn}, search value: ${searchValue}`
188198
);
189-
const escaped = searchValue.replace(/'/g, "''");
190-
sqlQuery = `SELECT * FROM "${activeTable}" WHERE "${selectedColumn}" LIKE '%${escaped}%' LIMIT 20;`;
199+
const col = ptInstructs.find((c) => c.key === selectedColumn);
200+
const isNumber = col && /int|real|num|float/i.test(col.valueType);
201+
let clause;
202+
if (isNumber && !isNaN(searchValue)) {
203+
clause = `"${selectedColumn}" = ${Number(searchValue)}`;
204+
} else {
205+
const escaped = searchValue.replace(/'/g, "''");
206+
clause = `"${selectedColumn}" LIKE '%${escaped}%'`;
207+
}
208+
sqlQuery = `SELECT * FROM "${activeTable}" WHERE ${clause};`;
191209
runQuery(dbUrl, sqlQuery);
192210
}
193211
194212
async function runQuery(url = dbUrl, query = sqlQuery) {
195213
result = null;
196214
querying = true;
197215
error = false;
198-
let queryData = pTime(() => queryDb(url, query))();
199-
await queryData
200-
.then((data) => {
201-
result = data.result;
202-
updateInstructs(result);
203-
timeTaken = queryData.time;
204-
bytesRead = data.bytesRead;
205-
totalRequests = data.stats.totalRequests;
206-
totalBytes = data.stats.totalBytes;
207-
querying = false;
208-
error = false;
209-
jsonFile = new Blob([JSON.stringify(result, null, 2)], {
210-
type: "application/json",
211-
});
212-
})
213-
.catch((queryError) => {
214-
error = true;
215-
errorMessage = queryError.message;
216-
console.log("Query Error message: ", errorMessage);
217-
console.log(queryError);
218-
querying = false;
219-
updateInstructs([]);
220-
jsonFile = null;
216+
try {
217+
let queryData = pTime(() => queryDb(url, query));
218+
const data = await queryData();
219+
220+
result = data.result;
221+
await updateInstructs(result, activeTable);
222+
timeTaken = queryData.time;
223+
bytesRead = data.bytesRead;
224+
totalRequests = data.stats.totalRequests;
225+
totalBytes = data.stats.totalBytes;
226+
error = false;
227+
jsonFile = new Blob([JSON.stringify(result, null, 2)], {
228+
type: "application/json",
221229
});
230+
} catch (queryError) {
231+
error = true;
232+
errorMessage = queryError.message;
233+
console.log("Query Error message: ", errorMessage);
234+
console.log(queryError);
235+
await updateInstructs([], activeTable);
236+
jsonFile = null;
237+
} finally {
238+
querying = false;
239+
}
222240
}
223241
</script>
224242

0 commit comments

Comments
 (0)