Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions components/FilterDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,13 @@ export default function FilterDialog({
const actualExtract = originalField ? originalField[1] : dateExtract;

if (actualExtract) {
query = `SELECT DISTINCT REPLACE(CAST(EXTRACT(${actualExtract} FROM CAST("${actualField}" AS DATE)) AS VARCHAR), '"', '') as value FROM '${table}' WHERE "${actualField}" IS NOT NULL ORDER BY value`;
if (actualExtract === "MONTH") {
query = `SELECT DISTINCT LPAD(CAST(EXTRACT(${actualExtract} FROM CAST("${actualField}" AS DATE)) AS VARCHAR), 2, '0') as value FROM '${table}' WHERE "${actualField}" IS NOT NULL ORDER BY value`;
} else if (actualExtract === "QUARTER") {
query = `SELECT DISTINCT 'Q' || CAST(EXTRACT(${actualExtract} FROM CAST("${actualField}" AS DATE)) AS VARCHAR) as value FROM '${table}' WHERE "${actualField}" IS NOT NULL ORDER BY value`;
} else {
query = `SELECT DISTINCT CAST(EXTRACT(${actualExtract} FROM CAST("${actualField}" AS DATE)) AS VARCHAR) as value FROM '${table}' WHERE "${actualField}" IS NOT NULL ORDER BY value`;
}
} else {
query = `SELECT DISTINCT REPLACE("${actualField}", '"', '') as value FROM '${table}' WHERE "${actualField}" IS NOT NULL ORDER BY value`;
}
Expand Down Expand Up @@ -130,10 +136,17 @@ export default function FilterDialog({
};

const handleSubmit = () => {
addFilter(table, field, selectedValues, dateExtract);
// Extract the original field name if it's already a date-extracted field
const originalField = field.match(/^(YEAR|MONTH|QUARTER)\((.*?)\)$/);
const actualField = originalField ? originalField[2] : field;
const actualExtract = originalField
? (originalField[1] as "YEAR" | "MONTH" | "QUARTER")
: dateExtract;

addFilter(table, actualField, selectedValues, actualExtract);
toast({
title: "Filter Applied",
description: `Successfully applied filter for ${field}`,
description: `Successfully applied filter for ${actualField}`,
});
};

Expand Down
60 changes: 40 additions & 20 deletions components/Main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,15 @@ export default function Main() {
field: (typeof rows)[0] | (typeof columns)[0]
) => {
if (field.dateExtract) {
// Extract the original field name by removing the dateExtract prefix
const originalField = field.name
.replace(`${field.dateExtract}(`, "")
.replace(")", "");
return `CAST(EXTRACT(${field.dateExtract} FROM CAST("${originalField}" AS DATE)) AS VARCHAR) AS "${field.name}"`;
const extractExpr = `EXTRACT(${field.dateExtract} FROM CAST("${originalField}" AS DATE))`;
return field.dateExtract === "MONTH"
? `LPAD(CAST(${extractExpr} AS VARCHAR), 2, '0') AS "${field.name}"`
: field.dateExtract === "QUARTER"
? `CONCAT('Q', CAST(${extractExpr} AS VARCHAR)) AS "${field.name}"`
: `CAST(${extractExpr} AS VARCHAR) AS "${field.name}"`;
}
return `CAST("${field.name}" AS ${
getTypeForColumn(queryFields, field.table, field.name) === "Utf8"
Expand All @@ -118,7 +122,6 @@ export default function Main() {
field: (typeof rows)[0] | (typeof columns)[0]
) => {
if (field.dateExtract) {
// Extract the original field name by removing the dateExtract prefix
const originalField = field.name
.replace(`${field.dateExtract}(`, "")
.replace(")", "");
Expand Down Expand Up @@ -158,9 +161,14 @@ export default function Main() {
const originalField = filter.field
.replace(`${filter.dateExtract}(`, "")
.replace(")", "");
return `CAST(EXTRACT(${
filter.dateExtract
} FROM CAST("${originalField}" AS DATE)) AS VARCHAR) IN (${filter.values
const extractExpr = `EXTRACT(${filter.dateExtract} FROM CAST("${originalField}" AS DATE))`;
const filterExpr =
filter.dateExtract === "MONTH"
? `LPAD(CAST(${extractExpr} AS VARCHAR), 2, '0')`
: filter.dateExtract === "QUARTER"
? `CONCAT('Q', CAST(${extractExpr} AS VARCHAR))`
: `CAST(${extractExpr} AS VARCHAR)`;
return `${filterExpr} IN (${filter.values
.map((value) => `'${value}'`)
.join(", ")})`;
}
Expand All @@ -185,11 +193,15 @@ export default function Main() {
const originalField = field.name
.replace(`${field.dateExtract}(`, "")
.replace(")", "");
return `CAST(EXTRACT(${
field.dateExtract
} FROM CAST(TABLE${files.findIndex(
const tablePrefix = `TABLE${files.findIndex(
(file) => file.name === field.table
)}."${originalField}" AS DATE)) AS VARCHAR) AS "${field.name}"`;
)}`;
const extractExpr = `EXTRACT(${field.dateExtract} FROM CAST(${tablePrefix}."${originalField}" AS DATE))`;
return field.dateExtract === "MONTH"
? `LPAD(CAST(${extractExpr} AS VARCHAR), 2, '0') AS "${field.name}"`
: field.dateExtract === "QUARTER"
? `CONCAT('Q', CAST(${extractExpr} AS VARCHAR)) AS "${field.name}"`
: `CAST(${extractExpr} AS VARCHAR) AS "${field.name}"`;
}
return `CAST(TABLE${files.findIndex(
(file) => file.name === field.table
Expand Down Expand Up @@ -292,21 +304,29 @@ export default function Main() {
filters.length > 0
? `WHERE ${filters
.map((filter) => {
const tablePrefix = `TABLE${files.findIndex(
(file) => file.name === filter.table
)}`;
if (filter.dateExtract) {
// Extract original field name from the date extract expression
const originalField = filter.field
.replace(`${filter.dateExtract}(`, "")
.replace(")", "");
return `CAST(EXTRACT(${
filter.dateExtract
} FROM CAST(TABLE${files.findIndex(
(file) => file.name === filter.table
)}."${originalField}" AS DATE)) AS VARCHAR) IN (${filter.values
const extractExpr = `EXTRACT(${filter.dateExtract} FROM CAST(${tablePrefix}."${originalField}" AS DATE))`;
const filterExpr =
filter.dateExtract === "MONTH"
? `LPAD(CAST(${extractExpr} AS VARCHAR), 2, '0')`
: filter.dateExtract === "QUARTER"
? `CONCAT('Q', CAST(${extractExpr} AS VARCHAR))`
: `CAST(${extractExpr} AS VARCHAR)`;
return `${filterExpr} IN (${filter.values
.map((value) => `'${value}'`)
.join(", ")})`;
}
return `TABLE${files.findIndex(
(file) => file.name === filter.table
)}."${filter.field}" IN (${filter.values
// For non-date fields, use the original field name
return `${tablePrefix}."${
filter.field
}" IN (${filter.values
.map((value) => `'${value}'`)
.join(", ")})`;
})
Expand All @@ -321,7 +341,7 @@ export default function Main() {
};

const rawQuery = generateQuery();
return rawQuery ? format(rawQuery, { language: "sqlite" }) : null;
return rawQuery ? format(rawQuery, { language: "duckdb" }) : null;
})();

const handleRunQuery = async () => {
Expand Down Expand Up @@ -363,7 +383,7 @@ export default function Main() {

try {
const excelBytes = pyodide.FS.readFile("/excel_output.xlsx");
const blob = new Blob([excelBytes], {
const blob = new Blob([Buffer.from(excelBytes)], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
});
const url = URL.createObjectURL(blob);
Expand Down
6 changes: 5 additions & 1 deletion components/pivotfields/PivotFilters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,11 @@ export default function PivotFilters() {
</span>
</div>
<div>{filter.field}</div>
<FilterDialog table={filter.table} field={filter.field} />
<FilterDialog
table={filter.table}
field={filter.field}
dateExtract={filter.dateExtract}
/>
<Trash2
className="cursor-pointer hover:text-black"
size={20}
Expand Down
Loading