This commit is contained in:
Ben Wilson
2023-06-24 20:20:41 -04:00
parent f61e9f1417
commit 9315d200ff
11 changed files with 199 additions and 62 deletions
@@ -1,5 +1,6 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { DateTimeTransformer } from '../utils/DateTimeTransformer';
import { TrackedEntity } from '../utils/TrackedEntity.entity';
@Entity()
@@ -17,7 +18,10 @@ export class ClientStatisticsEntity extends TrackedEntity {
@Column({ length: 8, type: 'varchar' })
sessionId: string;
@Column({ type: 'datetime' })
@Column({
type: 'datetime',
transformer: new DateTimeTransformer()
})
time: Date;
@Column()
@@ -19,7 +19,7 @@ export class ClientStatisticsService {
return await this.clientStatisticsRepository.save(clientStatistic);
}
public async getHashRate(sessionId: string) {
public async getHashRateForAddress(address: string) {
const query = `
SELECT
@@ -28,10 +28,10 @@ export class ClientStatisticsService {
FROM
client_statistics_entity AS entry
WHERE
entry.sessionId = ? AND entry.time > datetime("now", "-1 hour")
entry.address = ? AND entry.time > datetime("now", "-1 hour")
`;
const result = await this.clientStatisticsRepository.query(query, [sessionId]);
const result = await this.clientStatisticsRepository.query(query, [address]);
const timeDiff = result[0].timeDiff;
const difficultySum = result[0].difficultySum;
@@ -40,26 +40,125 @@ export class ClientStatisticsService {
}
public async getChartData(sessionId: string) {
public async getChartDataForAddress(address: string) {
const query = `
WITH result_set AS (
SELECT
MAX(time) AS label,
MAX(time) || 'GMT' AS label,
(SUM(difficulty) * 4294967296) /
((JULIANDAY(MAX(time)) - JULIANDAY(MIN(time))) * 24 * 60 * 60 * 1000000000) AS data
FROM
client_statistics_entity AS entry
WHERE
entry.sessionId = ? AND entry.time > datetime("now", "-1 day")
entry.address = ? AND entry.time > datetime("now", "-1 day")
GROUP BY
strftime('%Y-%m-%d %H', time, 'localtime') || (strftime('%M', time, 'localtime') / 5)
ORDER BY
time
)
SELECT *
FROM result_set
WHERE label <> (SELECT MAX(label) FROM result_set);
`;
const result = await this.clientStatisticsRepository.query(query, [address]);
return result;
}
public async getHashRateForGroup(address: string, clientName: string) {
const query = `
SELECT
(JULIANDAY(MAX(entry.time)) - JULIANDAY(MIN(entry.time))) * 24 * 60 * 60 AS timeDiff,
SUM(entry.difficulty) AS difficultySum
FROM
client_statistics_entity AS entry
WHERE
entry.address = ? AND entry.clientName = ? AND entry.time > datetime("now", "-1 hour")
`;
const result = await this.clientStatisticsRepository.query(query, [address, clientName]);
const timeDiff = result[0].timeDiff;
const difficultySum = result[0].difficultySum;
return (difficultySum * 4294967296) / (timeDiff * 1000000000);
}
public async getChartDataForGroup(address: string, clientName: string) {
const query = `
WITH result_set AS (
SELECT
MAX(time) || 'GMT' AS label,
(SUM(difficulty) * 4294967296) /
((JULIANDAY(MAX(time)) - JULIANDAY(MIN(time))) * 24 * 60 * 60 * 1000000000) AS data
FROM
client_statistics_entity AS entry
WHERE
entry.address = ? AND entry.clientName = ? AND entry.time > datetime("now", "-1 day")
GROUP BY
strftime('%Y-%m-%d %H', time, 'localtime') || (strftime('%M', time, 'localtime') / 5)
ORDER BY
time
)
SELECT *
FROM result_set
WHERE label <> (SELECT MAX(Label) FROM result_set);
WHERE label <> (SELECT MAX(label) FROM result_set);
`;
const result = await this.clientStatisticsRepository.query(query, [sessionId]);
const result = await this.clientStatisticsRepository.query(query, [address, clientName]);
return result;
}
public async getHashRateForSession(address: string, clientName: string, sessionId: string) {
const query = `
SELECT
(JULIANDAY(MAX(entry.time)) - JULIANDAY(MIN(entry.time))) * 24 * 60 * 60 AS timeDiff,
SUM(entry.difficulty) AS difficultySum
FROM
client_statistics_entity AS entry
WHERE
entry.address = ? AND entry.clientName = ? AND entry.sessionId = ? AND entry.time > datetime("now", "-1 hour")
`;
const result = await this.clientStatisticsRepository.query(query, [address, clientName, sessionId]);
const timeDiff = result[0].timeDiff;
const difficultySum = result[0].difficultySum;
return (difficultySum * 4294967296) / (timeDiff * 1000000000);
}
public async getChartDataForSession(address: string, clientName: string, sessionId: string) {
const query = `
WITH result_set AS (
SELECT
MAX(time) || 'GMT' AS label,
(SUM(difficulty) * 4294967296) /
((JULIANDAY(MAX(time)) - JULIANDAY(MIN(time))) * 24 * 60 * 60 * 1000000000) AS data
FROM
client_statistics_entity AS entry
WHERE
entry.address = ? AND entry.clientName = ? AND entry.sessionId = ? AND entry.time > datetime("now", "-1 day")
GROUP BY
strftime('%Y-%m-%d %H', time, 'localtime') || (strftime('%M', time, 'localtime') / 5)
ORDER BY
time
)
SELECT *
FROM result_set
WHERE label <> (SELECT MAX(label) FROM result_set);
`;
const result = await this.clientStatisticsRepository.query(query, [address, clientName, sessionId]);
return result;
}
+2 -1
View File
@@ -1,5 +1,6 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { DateTimeTransformer } from '../utils/DateTimeTransformer';
import { TrackedEntity } from '../utils/TrackedEntity.entity';
@Entity()
@@ -18,7 +19,7 @@ export class ClientEntity extends TrackedEntity {
@Column({ length: 8, type: 'varchar' })
sessionId: string;
@Column({ type: 'datetime' })
@Column({ type: 'datetime', transformer: new DateTimeTransformer() })
startTime: Date;
+11 -1
View File
@@ -40,7 +40,17 @@ export class ClientService {
})
}
public async getById(address: string, clientName: string, sessionId: string): Promise<ClientEntity> {
public async getByName(address: string, clientName: string): Promise<ClientEntity[]> {
return await this.clientRepository.find({
where: {
address,
clientName
}
})
}
public async getBySessionId(address: string, clientName: string, sessionId: string): Promise<ClientEntity> {
return await this.clientRepository.findOne({
where: {
address,
+14
View File
@@ -0,0 +1,14 @@
import { ValueTransformer } from 'typeorm';
export class DateTimeTransformer implements ValueTransformer {
to(value: Date): any {
// Convert the local time to UTC before saving to the database
const utcTime = value?.toLocaleString();
return utcTime;
}
from(value: any): Date {
// Convert the UTC time from the database to the local time zone
return value;
}
}
+5 -3
View File
@@ -1,12 +1,14 @@
import { CreateDateColumn, DeleteDateColumn, UpdateDateColumn } from 'typeorm';
import { DateTimeTransformer } from './DateTimeTransformer';
export abstract class TrackedEntity {
@DeleteDateColumn({ nullable: true, type: 'datetime' })
@DeleteDateColumn({ nullable: true, type: 'datetime', transformer: new DateTimeTransformer() })
public deletedAt?: Date;
@CreateDateColumn({ type: 'datetime' })
@CreateDateColumn({ type: 'datetime', transformer: new DateTimeTransformer() })
public createdAt?: Date
@UpdateDateColumn({ type: 'datetime' })
@UpdateDateColumn({ type: 'datetime', transformer: new DateTimeTransformer() })
public updatedAt?: Date
}