multiple filters

This commit is contained in:
stfrigerio 2025-02-04 17:20:26 +01:00
parent c8539fadaf
commit 387a1bb751
5 changed files with 51 additions and 34 deletions

View file

@ -4,8 +4,6 @@ export function buildSqlQuery(params: SqlParams): { query: string; queryParams:
const { const {
table, table,
columns, columns,
keyColumn,
value,
dateColumn, dateColumn,
startDate, startDate,
endDate, endDate,
@ -23,10 +21,19 @@ export function buildSqlQuery(params: SqlParams): { query: string; queryParams:
const queryParams: any[] = []; const queryParams: any[] = [];
const conditions: string[] = []; const conditions: string[] = [];
// Add key-value condition if provided // Handle multiple filters
if (keyColumn && value !== undefined) { if (filterColumn && filterValue) {
conditions.push(`"${keyColumn}" = ?`); const filterColumns = Array.isArray(filterColumn) ? filterColumn : [filterColumn];
queryParams.push(value); const filterValues = Array.isArray(filterValue) ? filterValue : [filterValue];
if (filterColumns.length !== filterValues.length) {
throw new Error('Number of filter columns must match number of filter values');
}
filterColumns.forEach((col, index) => {
conditions.push(`"${col}" = ?`);
queryParams.push(filterValues[index]);
});
} }
// Add date range conditions if provided // Add date range conditions if provided
@ -40,13 +47,7 @@ export function buildSqlQuery(params: SqlParams): { query: string; queryParams:
queryParams.push(endDate); queryParams.push(endDate);
} }
} }
// Add filter condition if provided
if (filterColumn && filterValue !== undefined) {
conditions.push(`"${filterColumn}" = ?`);
queryParams.push(filterValue);
}
// Build the query // Build the query
let query = `SELECT ${selectCols} FROM "${table}"`; let query = `SELECT ${selectCols} FROM "${table}"`;

View file

@ -17,6 +17,10 @@ export function parseSqlParams(source: string): SqlParams | null {
case 'columns': case 'columns':
params.columns = val.split(',').map(c => c.trim()).join(', '); params.columns = val.split(',').map(c => c.trim()).join(', ');
break; break;
case 'filterColumn':
case 'filterValue':
params[key] = val.split(',').map(v => v.trim());
break;
case 'limit': case 'limit':
const limitNum = parseInt(val); const limitNum = parseInt(val);
if (!isNaN(limitNum)) params.limit = limitNum; if (!isNaN(limitNum)) params.limit = limitNum;
@ -27,15 +31,19 @@ export function parseSqlParams(source: string): SqlParams | null {
} }
break; break;
case 'table': case 'table':
case 'keyColumn': params.table = val;
case 'value': break;
case 'dateColumn': case 'dateColumn':
params.dateColumn = val;
break;
case 'startDate': case 'startDate':
params.startDate = val;
break;
case 'endDate': case 'endDate':
case 'filterColumn': params.endDate = val;
case 'filterValue': break;
case 'orderBy': case 'orderBy':
params[key] = val; params.orderBy = val;
break; break;
} }
} }

View file

@ -33,11 +33,19 @@ export async function validateTable(db: any, params: SqlParams) {
} }
// Validate filterColumn if specified // Validate filterColumn if specified
if (params.filterColumn && !availableColumns.includes(params.filterColumn)) { if (params.filterColumn) {
return { const filterColumns = Array.isArray(params.filterColumn)
message: `Filter column "${params.filterColumn}" does not exist in table "${params.table}".`, ? params.filterColumn
availableColumns : [params.filterColumn];
};
for (const col of filterColumns) {
if (!availableColumns.includes(col)) {
return {
message: `Filter column "${col}" does not exist in table "${params.table}".`,
availableColumns
};
}
}
} }
// Validate orderBy if specified // Validate orderBy if specified

View file

@ -16,15 +16,15 @@ export async function processSqlBlock(dbService: DBService, source: string, el:
el.createEl("p", { text: "Example usage:" }); el.createEl("p", { text: "Example usage:" });
el.createEl("pre", { el.createEl("pre", {
text: `table: tasks text: `table: tasks
columns: title, status, dueDate columns: title, status
dateColumn: dueDate filterColumn: status, priority
startDate: 2024-01-01 filterValue: active, high
endDate: 2024-12-31 dateColumn: dueDate
filterColumn: status startDate: 2024-01-01
filterValue: active endDate: 2024-12-31
limit: 10 limit: 10
orderBy: dueDate orderBy: dueDate
orderDirection: asc` orderDirection: asc`
}); });
return; return;
} }

View file

@ -6,8 +6,8 @@ export interface SqlParams {
dateColumn?: string; dateColumn?: string;
startDate?: string; startDate?: string;
endDate?: string; endDate?: string;
filterColumn?: string; filterColumn?: string | string[];
filterValue?: string; filterValue?: string | string[];
orderBy?: string; orderBy?: string;
orderDirection?: string; orderDirection?: string;
limit?: number; limit?: number;