Skip to content

Commit abf13bd

Browse files
ivke995Ante-Koceic
andauthored
iso week fix (#373)
* started * Using Date.UTC to get currentDate when seeding * Changed week to text * date map changed * utc fixed * test test teeest * unused import removed * Fixed errors from conflicts * new db sql file generated --------- Co-authored-by: Ante Koceić <ante@crocoder.dev>
1 parent 3278d8f commit abf13bd

File tree

8 files changed

+110
-33
lines changed

8 files changed

+110
-33
lines changed

migrations/tenant-db/0000_bitter_firelord.sql renamed to migrations/tenant-db/0000_gray_moondragon.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ CREATE TABLE `extract_timeline_events` (
160160
CREATE TABLE `transform_dates` (
161161
`id` integer PRIMARY KEY NOT NULL,
162162
`day` integer NOT NULL,
163-
`week` integer NOT NULL,
163+
`week` text NOT NULL,
164164
`month` integer NOT NULL,
165165
`year` integer NOT NULL,
166166
`__created_at` integer DEFAULT (strftime('%s', 'now')),

migrations/tenant-db/meta/0000_snapshot.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"version": "5",
33
"dialect": "sqlite",
4-
"id": "5aea1665-0130-4769-b328-0cf598573a17",
4+
"id": "5486d1de-b91c-4ff9-80fa-cbb0481ad6e8",
55
"prevId": "00000000-0000-0000-0000-000000000000",
66
"tables": {
77
"crawl_events": {
@@ -1034,7 +1034,8 @@
10341034
"columns": [
10351035
"member_id",
10361036
"repository_id"
1037-
]
1037+
],
1038+
"name": "extract_repositories_to_members_repository_id_member_id_pk"
10381039
}
10391040
},
10401041
"uniqueConstraints": {}
@@ -1170,7 +1171,7 @@
11701171
},
11711172
"week": {
11721173
"name": "week",
1173-
"type": "integer",
1174+
"type": "text",
11741175
"primaryKey": false,
11751176
"notNull": true,
11761177
"autoincrement": false

migrations/tenant-db/meta/_journal.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
{
66
"idx": 0,
77
"version": "5",
8-
"when": 1704818265547,
9-
"tag": "0000_bitter_firelord",
8+
"when": 1705312108477,
9+
"tag": "0000_gray_moondragon",
1010
"breakpoints": true
1111
}
1212
]

packages/functions/transform/src/merge-request-metrics.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { parseHunks } from './parse-hunks';
77
import { type SQLiteTransaction } from 'drizzle-orm/sqlite-core';
88
import { type ResultSet } from '@libsql/client/.';
99
import { isMemberKnownBot } from './known-bots';
10+
import { getDateInfo } from '../../../schemas/transform/src/seed/dimensions';
1011

1112
type BrandedDatabase<T> = LibSQLDatabase<Record<string, never>> & { __brand: T }
1213

@@ -168,7 +169,7 @@ type DMY = {
168169
year: number,
169170
month: number,
170171
day: number,
171-
week: number,
172+
week: string,
172173
};
173174

174175
type selectDatesArgs = {
@@ -181,21 +182,11 @@ type selectDatesArgs = {
181182
lastUpdatedAt: DMY | null,
182183
};
183184

184-
function getWeek(date: Date): number {
185-
// Logic copied from dimensions.ts
186-
return Math.ceil(((+date - +new Date(date.getUTCFullYear(), 0, 1)) / (24 * 60 * 60 * 1000)) / 7);
187-
}
188-
189185
function getDMY(date: Date | null) {
190186
if (date === null) {
191187
return null;
192188
}
193-
return {
194-
year: date.getUTCFullYear(),
195-
month: date.getUTCMonth() + 1,
196-
day: date.getUTCDate(),
197-
week: getWeek(date),
198-
};
189+
return getDateInfo(new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())))
199190
}
200191

201192
async function mapDatesToTransformedDates(db: TransformDatabase, dates: mapDatesToTransformedDatesArgs, nullDateId: number) {
@@ -217,7 +208,6 @@ function getDMYQuery(dmy: DMY | null) {
217208
if (dmy === null) {
218209
return undefined;
219210
}
220-
221211
return and(
222212
eq(transform.dates.year, dmy.year),
223213
eq(transform.dates.month, dmy.month),
@@ -231,7 +221,7 @@ function getDateIdOrNullDateId(dmy: DMY | null, datesData: {
231221
year: number;
232222
month: number;
233223
day: number;
234-
week: number;
224+
week: string;
235225
}[], nullDateId: number) {
236226
if (dmy === null) {
237227
return {

packages/schemas/transform/src/dates.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { InferSelectModel, InferInsertModel } from 'drizzle-orm';
22
import { sql } from 'drizzle-orm';
3-
import { integer, uniqueIndex } from 'drizzle-orm/sqlite-core';
3+
import { text, integer, uniqueIndex } from 'drizzle-orm/sqlite-core';
44
import { sqliteTable } from './transform-table';
55

66
export const dates = sqliteTable('dates', {
77
id: integer('id').primaryKey(),
88
day: integer('day').notNull(),
9-
week: integer('week').notNull(),
9+
week: text('week').notNull(),
1010
month: integer('month').notNull(),
1111
year: integer('year').notNull(),
1212

packages/schemas/transform/src/seed/dimensions.test.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { createClient } from "@libsql/client";
44
import { drizzle, type LibSQLDatabase } from "drizzle-orm/libsql";
55
import { migrate } from "drizzle-orm/libsql/migrator";
66

7-
import { seed } from "./dimensions";
7+
import { getDateInfo, seed } from "./dimensions";
88
import { forgeUsers } from "../forge-users";
99
import { dates } from "../dates";
1010
import { mergeRequests } from "../merge-requests";
1111
import { repositories } from "../repositories";
12+
import { getFirstDay } from "./dimensions"
1213

1314
let db: LibSQLDatabase;
1415
let sqlite: ReturnType<typeof createClient>;
@@ -66,4 +67,48 @@ describe("dimensions", () => {
6667
}))
6768
});
6869
});
70+
describe("getFirstDay", () => {
71+
test("should return first day of iso year", () => {
72+
const year1980 = getFirstDay(1980);
73+
const year1981 = getFirstDay(1981);
74+
const year2015 = getFirstDay(2015);
75+
const year2022 = getFirstDay(2022);
76+
expect(year1980).toEqual(new Date("1979-12-31"));
77+
expect(year1981).toEqual(new Date("1980-12-29"));
78+
expect(year2015).toEqual(new Date("2014-12-29"));
79+
expect(year2022).toEqual(new Date("2022-01-03"));
80+
})
81+
});
82+
describe("getDateInfo", () => {
83+
test("should return correct data for given date", () => {
84+
const date1 = getDateInfo(new Date(Date.UTC(2021, 0, 4)));
85+
const date2 = getDateInfo(new Date(Date.UTC(2021, 0, 3)));
86+
const date3 = getDateInfo(new Date(Date.UTC(2023, 0, 4)));
87+
const date4 = getDateInfo(new Date(Date.UTC(2023, 0, 3)));
88+
expect(date1).toEqual({
89+
day: 4,
90+
week: "2021-W1",
91+
month: 1,
92+
year: 2021,
93+
});
94+
expect(date2).toEqual({
95+
day: 3,
96+
week: "2020-W53",
97+
month: 1,
98+
year: 2021,
99+
});
100+
expect(date3).toEqual({
101+
day: 4,
102+
week: "2023-W1",
103+
month: 1,
104+
year: 2023,
105+
});
106+
expect(date4).toEqual({
107+
day: 3,
108+
week: "2023-W1",
109+
month: 1,
110+
year: 2023,
111+
});
112+
});
113+
});
69114
});

packages/schemas/transform/src/seed/dimensions.ts

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const nullForgeUser = {
2020
const nullDate = {
2121
id: 1,
2222
day: Number.MAX_SAFE_INTEGER,
23-
week: Number.MAX_SAFE_INTEGER,
23+
week: '',
2424
month: Number.MAX_SAFE_INTEGER,
2525
year: Number.MAX_SAFE_INTEGER,
2626
} satisfies NewTransformDate;
@@ -61,17 +61,58 @@ export async function seed(db: LibSQLDatabase, startDate: Date, endDate: Date):
6161

6262
}
6363

64+
export function getFirstDay(year: number): Date {
65+
let firstDayOfYear = new Date(Date.UTC(year, 0, 1));
66+
if (firstDayOfYear.getUTCDay() !== 1) {
67+
for (let i = 1; i < 4; i++) {
68+
const p = new Date(firstDayOfYear);
69+
const n = new Date(firstDayOfYear);
70+
p.setUTCDate(p.getUTCDate() - i);
71+
n.setUTCDate(n.getUTCDate() + i);
72+
if (p.getUTCDay() === 1) {
73+
firstDayOfYear = p;
74+
break;
75+
} else if (n.getUTCDay() === 1) {
76+
firstDayOfYear = n;
77+
break;
78+
}
79+
}
80+
}
81+
return firstDayOfYear;
82+
}
83+
84+
export function checkWeek(week: number, year: number): { newWeek: string } {
85+
let isoWeek = week;
86+
let isoYear = year;
87+
if (week < 1) {
88+
const lastDayOfPrev = new Date(Date.UTC(year - 1, 11, 31));
89+
const firstDayOfPrev = getFirstDay(year - 1);
90+
isoWeek = Math.ceil(((lastDayOfPrev.getTime() - firstDayOfPrev.getTime()) / (24 * 60 * 60 * 1000) + 1) / 7)
91+
isoYear = isoYear - 1
92+
}
93+
return { newWeek: `${isoYear}-W${isoWeek}` };
94+
}
95+
96+
export function getDateInfo(date: Date): {day: number, week: string, month: number, year: number} {
97+
98+
const firstDay = getFirstDay(date.getUTCFullYear());
99+
const week = Math.ceil(((date.getTime() - firstDay.getTime()) / (24 * 60 * 60 * 1000) + 1) / 7);
100+
const { newWeek } = checkWeek(week, date.getUTCFullYear());
101+
return {
102+
day: date.getUTCDate(),
103+
week: newWeek,
104+
month: date.getUTCMonth() + 1, // Months are zero-based, so we add 1.
105+
year: date.getUTCFullYear(),
106+
}
107+
}
108+
64109
function generateDates(startDate: Date, endDate: Date) {
65110
const dates = [];
66-
const currentDate = new Date(startDate);
111+
const currentDate = new Date(Date.UTC(startDate.getUTCFullYear(), startDate.getUTCMonth(), startDate.getDate()));
67112

68113
while (currentDate <= endDate) {
69-
const customDate = {
70-
day: currentDate.getUTCDate(),
71-
week: Math.ceil(((+currentDate - +new Date(currentDate.getUTCFullYear(), 0, 1)) / (24 * 60 * 60 * 1000)) / 7),
72-
month: currentDate.getUTCMonth() + 1, // Months are zero-based, so we add 1.
73-
year: currentDate.getUTCFullYear(),
74-
};
114+
115+
const customDate = getDateInfo(currentDate);
75116

76117
dates.push(customDate);
77118
currentDate.setUTCDate(currentDate.getUTCDate() + 1);

scripts/seed.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ seed(
1919
drizzle(
2020
createClient({ url: process.env.TENANT_DATABASE_URL, authToken: process.env.TENANT_DATABASE_AUTH_TOKEN })
2121
),
22-
new Date(now.getTime() - 6 * MONTH),
23-
new Date(now.getTime() + 6 * MONTH)
22+
new Date(now.getTime() - 18 * MONTH),
23+
new Date(now.getTime() + 2 * MONTH)
2424
).catch(console.error);

0 commit comments

Comments
 (0)