Skip to content

Commit 4f22c97

Browse files
author
sheepzh
committed
Clean code
1 parent 7dbb58d commit 4f22c97

File tree

2 files changed

+148
-139
lines changed

2 files changed

+148
-139
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import { DATE_FORMAT } from "@db/common/constant"
2+
import { judgeVirtualFast } from "@util/pattern"
3+
import { formatTime } from "@util/time"
4+
import StatDatabase, { StatCondition } from "."
5+
6+
type _StatCondition = StatCondition & {
7+
// Use exact date condition
8+
useExactDate?: boolean
9+
// date str
10+
exactDateStr?: string
11+
startDateStr?: string
12+
endDateStr?: string
13+
// time range
14+
timeStart?: number
15+
timeEnd?: number
16+
focusStart?: number
17+
focusEnd?: number
18+
}
19+
20+
type _FilterResult = {
21+
host: string
22+
date: string
23+
value: timer.stat.Result
24+
}
25+
26+
function filterHost(host: string, condition: _StatCondition): boolean {
27+
const paramHost = (condition.host || '').trim()
28+
const exlcusiveVirtual = condition.exlcusiveVirtual
29+
if (!paramHost) return true
30+
if (!!condition.fullHost && host !== paramHost) return false
31+
if (!condition.fullHost && !host.includes(paramHost)) return false
32+
if (exlcusiveVirtual && judgeVirtualFast(host)) return false
33+
return true
34+
}
35+
36+
function filterDate(date: string, condition: _StatCondition): boolean {
37+
if (condition.useExactDate) {
38+
if (condition.exactDateStr !== date) return false
39+
} else {
40+
const { startDateStr, endDateStr } = condition
41+
if (startDateStr && startDateStr > date) return false
42+
if (endDateStr && endDateStr < date) return false
43+
}
44+
return true
45+
}
46+
47+
function filterNumberRange(val: number, range: number[]): boolean {
48+
const start = range[0]
49+
const end = range[1]
50+
if (start !== null && start !== undefined && start > val) return false
51+
if (end !== null && end !== undefined && end < val) return false
52+
return true
53+
}
54+
55+
/**
56+
* Filter by query parameters
57+
*
58+
* @param date date of item
59+
* @param host host of item
60+
* @param val val of item
61+
* @param condition query parameters
62+
* @return true if valid, or false
63+
*/
64+
function filterByCond(result: _FilterResult, condition: _StatCondition): boolean {
65+
const { host, date, value } = result
66+
const { focus, time } = value
67+
const { timeStart, timeEnd, focusStart, focusEnd } = condition
68+
69+
return filterHost(host, condition)
70+
&& filterDate(date, condition)
71+
&& filterNumberRange(time, [timeStart, timeEnd])
72+
&& filterNumberRange(focus, [focusStart, focusEnd])
73+
}
74+
75+
76+
function processDateCondition(cond: _StatCondition, paramDate: Date | Date[]) {
77+
if (!paramDate) return
78+
79+
if (paramDate instanceof Date) {
80+
cond.useExactDate = true
81+
cond.exactDateStr = formatTime(paramDate as Date, DATE_FORMAT)
82+
} else {
83+
let startDate: Date = undefined
84+
let endDate: Date = undefined
85+
const dateArr = paramDate as Date[]
86+
dateArr && dateArr.length >= 2 && (endDate = dateArr[1])
87+
dateArr && dateArr.length >= 1 && (startDate = dateArr[0])
88+
cond.useExactDate = false
89+
startDate && (cond.startDateStr = formatTime(startDate, DATE_FORMAT))
90+
endDate && (cond.endDateStr = formatTime(endDate, DATE_FORMAT))
91+
}
92+
}
93+
94+
function processParamTimeCondition(cond: _StatCondition, paramTime: number[]) {
95+
if (!paramTime) return
96+
paramTime.length >= 2 && (cond.timeEnd = paramTime[1])
97+
paramTime.length >= 1 && (cond.timeStart = paramTime[0])
98+
}
99+
100+
function processParamFocusCondition(cond: _StatCondition, paramFocus: number[]) {
101+
if (!paramFocus) return
102+
paramFocus.length >= 2 && (cond.focusEnd = paramFocus[1])
103+
paramFocus.length >= 1 && (cond.focusStart = paramFocus[0])
104+
}
105+
106+
107+
function processCondition(condition: StatCondition): _StatCondition {
108+
const result: _StatCondition = { ...condition }
109+
processDateCondition(result, condition.date)
110+
processParamTimeCondition(result, condition.timeRange)
111+
processParamFocusCondition(result, condition.focusRange)
112+
return result
113+
}
114+
115+
/**
116+
* Filter by query parameters
117+
*/
118+
export async function filter(this: StatDatabase, condition?: StatCondition): Promise<_FilterResult[]> {
119+
condition = condition || {}
120+
const cond = processCondition(condition)
121+
const items = await this.refresh()
122+
return Object.entries(items).map(
123+
([key, value]) => {
124+
const date = key.substring(0, 8)
125+
const host = key.substring(8)
126+
return { date, host, value: value as timer.stat.Result }
127+
}
128+
).filter(item => filterByCond(item, cond))
129+
}
Lines changed: 19 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
* https://opensource.org/licenses/MIT
66
*/
77

8-
import { log } from "../common/logger"
8+
import { log } from "../../common/logger"
99
import { formatTime } from "@util/time"
10-
import BaseDatabase from "./common/base-database"
11-
import { DATE_FORMAT, REMAIN_WORD_PREFIX } from "./common/constant"
10+
import BaseDatabase from "../common/base-database"
11+
import { DATE_FORMAT, REMAIN_WORD_PREFIX } from "../common/constant"
1212
import { createZeroResult, mergeResult, isNotZeroResult } from "@util/stat"
1313
import { judgeVirtualFast } from "@util/pattern"
14+
import { filter } from "./filter"
1415

1516
export type StatCondition = {
1617
/**
@@ -48,58 +49,6 @@ export type StatCondition = {
4849
exlcusiveVirtual?: boolean
4950
}
5051

51-
type _StatCondition = StatCondition & {
52-
// Use exact date condition
53-
useExactDate?: boolean
54-
// date str
55-
exactDateStr?: string
56-
startDateStr?: string
57-
endDateStr?: string
58-
// time range
59-
timeStart?: number
60-
timeEnd?: number
61-
focusStart?: number
62-
focusEnd?: number
63-
}
64-
65-
function processDateCondition(cond: _StatCondition, paramDate: Date | Date[]) {
66-
if (!paramDate) return
67-
68-
if (paramDate instanceof Date) {
69-
cond.useExactDate = true
70-
cond.exactDateStr = formatTime(paramDate as Date, DATE_FORMAT)
71-
} else {
72-
let startDate: Date = undefined
73-
let endDate: Date = undefined
74-
const dateArr = paramDate as Date[]
75-
dateArr && dateArr.length >= 2 && (endDate = dateArr[1])
76-
dateArr && dateArr.length >= 1 && (startDate = dateArr[0])
77-
cond.useExactDate = false
78-
startDate && (cond.startDateStr = formatTime(startDate, DATE_FORMAT))
79-
endDate && (cond.endDateStr = formatTime(endDate, DATE_FORMAT))
80-
}
81-
}
82-
83-
function processParamTimeCondition(cond: _StatCondition, paramTime: number[]) {
84-
if (!paramTime) return
85-
paramTime.length >= 2 && (cond.timeEnd = paramTime[1])
86-
paramTime.length >= 1 && (cond.timeStart = paramTime[0])
87-
}
88-
89-
function processParamFocusCondition(cond: _StatCondition, paramFocus: number[]) {
90-
if (!paramFocus) return
91-
paramFocus.length >= 2 && (cond.focusEnd = paramFocus[1])
92-
paramFocus.length >= 1 && (cond.focusStart = paramFocus[0])
93-
}
94-
95-
function processCondition(condition: StatCondition): _StatCondition {
96-
const result: _StatCondition = { ...condition }
97-
processDateCondition(result, condition.date)
98-
processParamTimeCondition(result, condition.timeRange)
99-
processParamFocusCondition(result, condition.focusRange)
100-
return result
101-
}
102-
10352
function mergeMigration(exist: timer.stat.Result | undefined, another: any) {
10453
exist = exist || createZeroResult()
10554
return mergeResult(exist, { focus: another.focus || 0, time: another.time || 0 })
@@ -181,78 +130,33 @@ class StatDatabase extends BaseDatabase {
181130
return afterUpdated
182131
}
183132

133+
filter = filter
134+
184135
/**
185136
* Select
186137
*
187138
* @param condition condition
188139
*/
189140
async select(condition?: StatCondition): Promise<timer.stat.Row[]> {
190141
log("select:{condition}", condition)
191-
condition = condition || {}
192-
const _cond: _StatCondition = processCondition(condition)
193-
const items = await this.refresh()
194-
let result: timer.stat.Row[] = []
195-
196-
for (let key in items) {
197-
const date = key.substring(0, 8)
198-
const host = key.substring(8)
199-
const val: timer.stat.Result = items[key]
200-
if (this.filterBefore(date, host, val, _cond)) {
201-
const { focus, time } = val
202-
result.push({ date, host, focus, time, mergedHosts: [], virtual: judgeVirtualFast(host) })
203-
}
204-
}
205-
206-
log('Result of select: ', result)
207-
return result
208-
}
209-
210-
private filterHost(host: string, condition: _StatCondition): boolean {
211-
const paramHost = (condition.host || '').trim()
212-
const exlcusiveVirtual = condition.exlcusiveVirtual
213-
if (!paramHost) return true
214-
if (!!condition.fullHost && host !== paramHost) return false
215-
if (!condition.fullHost && !host.includes(paramHost)) return false
216-
if (exlcusiveVirtual && judgeVirtualFast(host)) return false
217-
return true
218-
}
219-
220-
private filterDate(date: string, condition: _StatCondition): boolean {
221-
if (condition.useExactDate) {
222-
if (condition.exactDateStr !== date) return false
223-
} else {
224-
const { startDateStr, endDateStr } = condition
225-
if (startDateStr && startDateStr > date) return false
226-
if (endDateStr && endDateStr < date) return false
227-
}
228-
return true
229-
}
230-
231-
private filterNumberRange(val: number, range: number[]): boolean {
232-
const start = range[0]
233-
const end = range[1]
234-
if (start !== null && start !== undefined && start > val) return false
235-
if (end !== null && end !== undefined && end < val) return false
236-
return true
142+
const filterResults = await this.filter(condition)
143+
return filterResults.map(({ date, host, value }) => {
144+
const { focus, time } = value
145+
return { date, host, focus, time, mergedHosts: [], virtual: judgeVirtualFast(host) }
146+
})
237147
}
238148

239149
/**
240-
* Filter by query parameters
150+
* Count by condition
241151
*
242-
* @param date date of item
243-
* @param host host of item
244-
* @param val val of item
245-
* @param condition query parameters
246-
* @return true if valid, or false
152+
* @param condition
153+
* @returns count
154+
* @since 1.0.2
247155
*/
248-
private filterBefore(date: string, host: string, val: timer.stat.Result, condition: _StatCondition): boolean {
249-
const { focus, time } = val
250-
const { timeStart, timeEnd, focusStart, focusEnd } = condition
251-
252-
return this.filterHost(host, condition)
253-
&& this.filterDate(date, condition)
254-
&& this.filterNumberRange(time, [timeStart, timeEnd])
255-
&& this.filterNumberRange(focus, [focusStart, focusEnd])
156+
async count(condition: StatCondition): Promise<number> {
157+
log("select:{condition}", condition)
158+
const filterResults = await this.filter(condition)
159+
return filterResults.length || 0
256160
}
257161

258162
/**
@@ -331,30 +235,6 @@ class StatDatabase extends BaseDatabase {
331235
return this.deleteByUrlBetween(host)
332236
}
333237

334-
/**
335-
* Count by condition
336-
*
337-
* @param condition
338-
* @returns count
339-
* @since 1.0.2
340-
*/
341-
async count(condition: StatCondition): Promise<number> {
342-
condition = condition || {}
343-
const _cond: _StatCondition = processCondition(condition)
344-
const items = await this.refresh()
345-
let count = 0
346-
347-
for (let key in items) {
348-
const date = key.substring(0, 8)
349-
const host = key.substring(8)
350-
const val: timer.stat.Result = items[key]
351-
if (this.filterBefore(date, host, val, _cond)) {
352-
count++
353-
}
354-
}
355-
return count
356-
}
357-
358238
async importData(data: any): Promise<void> {
359239
if (typeof data !== "object") return
360240
const items = await this.storage.get()

0 commit comments

Comments
 (0)