Skip to content

Commit

Permalink
feat: make aggregate function to support date and date time
Browse files Browse the repository at this point in the history
  • Loading branch information
keppere committed Jan 1, 2025
1 parent 0c86ee6 commit 779c0b5
Showing 1 changed file with 79 additions and 10 deletions.
89 changes: 79 additions & 10 deletions src/components/gui/table-optimized/OptimizeTableState.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,7 @@ export default class OptimizeTableState {
let min = undefined;
let max = undefined;
let count = 0;
let detectedDataType = undefined;

const selectedCell = new Set<string>();
for (const range of this.selectionRanges) {
Expand All @@ -878,12 +879,57 @@ export default class OptimizeTableState {
selectedCell.add(key);

const value = this.getValue(y, x);
const parsed = Number(value);

if (!isNaN(parsed)) {
sum = sum !== undefined ? sum + parsed : parsed;
min = min !== undefined ? (min < parsed ? min : parsed) : parsed;
max = max !== undefined ? (max > parsed ? max : parsed) : parsed;
if (value !== null && value !== undefined && value !== "") {
// detect first valid element data type
if (detectedDataType === undefined) {
if (!isNaN(Number(value))) {
detectedDataType = "number";
} else if (
typeof value === "string" &&
!isNaN(Date.parse(value))
) {
detectedDataType = "date";
}
}

if (detectedDataType === "number") {
const parsed = Number(value);
if (!isNaN(parsed)) {
sum = sum !== undefined ? sum + parsed : parsed;
min =
min !== undefined
? (min as number) < parsed
? min
: parsed
: parsed;
max =
max !== undefined
? (max as number) > parsed
? max
: parsed
: parsed;
}
} else if (
detectedDataType === "date" &&
(isValidDate(value as string) || isValidDateTime(value as string))
) {
const parsed = Date.parse(value as string);
if (!isNaN(parsed)) {
min =
min !== undefined
? Date.parse(min as string) < parsed
? min
: value
: value;
max =
max !== undefined
? Date.parse(max as string) > parsed
? max
: value
: value;
}
}
}
count = count + 1;
}
Expand All @@ -892,12 +938,19 @@ export default class OptimizeTableState {
if (sum !== undefined && count > 0) {
avg = sum / count;
}
if (detectedDataType === "number") {
return {
sum: formatNumber(sum),
avg: formatNumber(avg),
min: formatNumber(min as number),
max: formatNumber(max as number),
count: formatNumber(count),
};
}
return {
sum: formatNumber(sum),
avg: formatNumber(avg),
min: formatNumber(min),
max: formatNumber(max),
count: formatNumber(count),
min,
max,
count,
};
}

Expand All @@ -914,3 +967,19 @@ export default class OptimizeTableState {
return this.sql;
}
}

function isValidDate(value: string): boolean {
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dateRegex.test(value)) return false;

const parsedDate = new Date(value);
return !isNaN(parsedDate.getTime());
}

function isValidDateTime(value: string): boolean {
const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
if (!dateTimeRegex.test(value)) return false;

const parsedDate = new Date(value);
return !isNaN(parsedDate.getTime());
}

0 comments on commit 779c0b5

Please sign in to comment.