Skip to content

Commit 622bee3

Browse files
author
qcloud
committed
Support search with alias (#214)
1 parent 6001231 commit 622bee3

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

src/app/components/analysis/components/filter.ts

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,36 @@ import type { Ref, PropType, VNode } from "vue"
1010
import { ElOption, ElSelect, ElTag } from "element-plus"
1111
import { ref, h, defineComponent } from "vue"
1212
import statService, { HostSet } from "@service/stat-service"
13+
import siteService from "@service/site-service"
1314
import { t } from "@app/locale"
1415
import SelectFilterItem from "@app/components/common/select-filter-item"
1516
import { labelOfHostInfo } from "../util"
1617

17-
async function handleRemoteSearch(queryStr: string, trendDomainOptions: Ref<timer.site.SiteKey[]>, searching: Ref<boolean>) {
18+
const calcUniqueKey = ({ host, virtual, merged }: timer.site.SiteInfo) => `${host}${virtual ? 1 : 0}${merged ? 1 : 0}`
19+
20+
async function handleRemoteSearch(queryStr: string, trendDomainOptions: Ref<timer.site.SiteInfo[]>, searching: Ref<boolean>) {
1821
if (!queryStr) {
1922
trendDomainOptions.value = []
2023
return
2124
}
2225
searching.value = true
23-
const domains: HostSet = await statService.listHosts(queryStr)
24-
const options: timer.site.SiteKey[] = []
25-
const { origin, merged, virtual } = domains
26-
origin.forEach(host => options.push({ host }))
27-
merged.forEach(host => options.push({ host, merged: true }))
28-
virtual.forEach(host => options.push({ host, virtual: true }))
29-
trendDomainOptions.value = options
26+
27+
const options: Record<string, timer.site.SiteInfo> = {}
28+
const sites = await siteService.selectAll({ fuzzyQuery: queryStr })
29+
const hosts: HostSet = await statService.listHosts(queryStr)
30+
31+
sites.forEach(site => options[calcUniqueKey(site)] = site)
32+
33+
const { origin, merged, virtual } = hosts
34+
const originSiteInfo: timer.site.SiteInfo[] = []
35+
origin.forEach(host => originSiteInfo.push({ host }))
36+
merged.forEach(host => originSiteInfo.push({ host, merged: true }))
37+
virtual.forEach(host => originSiteInfo.push({ host, virtual: true }))
38+
originSiteInfo.forEach(o => {
39+
const key = calcUniqueKey(o)
40+
!options[key] && (options[key] = o)
41+
})
42+
trendDomainOptions.value = Object.values(options)
3043
searching.value = false
3144
}
3245

@@ -55,16 +68,21 @@ function hostInfoOfKey(key: string): timer.site.SiteKey {
5568

5669
const MERGED_TAG_TXT = t(msg => msg.analysis.common.merged)
5770
const VIRTUAL_TAG_TXT = t(msg => msg.analysis.common.virtual)
58-
function renderHostLabel(hostInfo: timer.site.SiteKey): VNode[] {
71+
72+
const renderOptionTag = (tagLabel: string) => h('span',
73+
{ style: { float: "right", height: "34px" } },
74+
h(ElTag, { size: 'small' }, () => tagLabel)
75+
)
76+
77+
function renderHostLabel({ host, merged, virtual, alias }: timer.site.SiteInfo): VNode[] {
5978
const result = [
60-
h('span', {}, hostInfo.host)
79+
h('span', {}, host)
6180
]
62-
hostInfo.merged && result.push(
63-
h(ElTag, { size: 'small' }, () => MERGED_TAG_TXT)
64-
)
65-
hostInfo.virtual && result.push(
66-
h(ElTag, { size: 'small' }, () => VIRTUAL_TAG_TXT)
81+
alias && result.push(
82+
h(ElTag, { size: 'small', type: 'info' }, () => alias)
6783
)
84+
merged && result.push(renderOptionTag(MERGED_TAG_TXT))
85+
virtual && result.push(renderOptionTag(VIRTUAL_TAG_TXT))
6886
return result
6987
}
7088

@@ -113,10 +131,10 @@ const _default = defineComponent({
113131
handleSiteChange()
114132
}
115133
}, () => (trendDomainOptions.value || [])?.map(
116-
hostInfo => h(ElOption, {
117-
value: keyOfHostInfo(hostInfo),
118-
label: labelOfHostInfo(hostInfo),
119-
}, () => renderHostLabel(hostInfo))
134+
siteInfo => h(ElOption, {
135+
value: keyOfHostInfo(siteInfo),
136+
label: labelOfHostInfo(siteInfo),
137+
}, () => renderHostLabel(siteInfo))
120138
)),
121139
h(SelectFilterItem, {
122140
historyName: 'timeFormat',

src/database/site-database.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import { REMAIN_WORD_PREFIX } from "./common/constant"
1111
export type SiteCondition = {
1212
host?: string
1313
alias?: string
14+
/**
15+
* Fuzzy query of host or alias
16+
*/
17+
fuzzyQuery?: string
1418
source?: timer.site.AliasSource
1519
virtual?: boolean
1620
}
@@ -95,16 +99,18 @@ async function select(this: SiteDatabase, condition?: SiteCondition): Promise<ti
9599
}
96100

97101
function buildFilter(condition: SiteCondition): (site: timer.site.SiteInfo) => boolean {
98-
const { host, alias, source, virtual } = condition || {}
102+
const { host, alias, source, virtual, fuzzyQuery } = condition || {}
99103
return site => {
100-
if (host && !site.host.includes(host)) return false
101-
if (alias && !site.alias?.includes(alias)) return false
102-
if (source && source !== site.source) return false
104+
const { host: siteHost, alias: siteAlias, source: siteSource, virtual: siteVirtual } = site || {}
105+
if (host && !siteHost.includes(host)) return false
106+
if (alias && !siteAlias?.includes(alias)) return false
107+
if (source && source !== siteSource) return false
103108
if (virtual !== undefined && virtual !== null) {
104109
const virtualCond = virtual || false
105-
const virtualFactor = site.virtual || false
110+
const virtualFactor = siteVirtual || false
106111
if (virtualCond !== virtualFactor) return false
107112
}
113+
if (fuzzyQuery && !(siteHost?.includes(fuzzyQuery) || siteAlias?.includes(fuzzyQuery))) return false
108114
return true
109115
}
110116
}

src/service/site-service.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
*/
77

88
import SiteDatabase, { SiteCondition } from "@db/site-database"
9+
import StatDatabase from "@db/stat-database"
910
import { slicePageResult } from "./components/page-info"
1011

1112
const storage = chrome.storage.local
1213
const siteDatabase = new SiteDatabase(storage)
14+
const statDatabase = new StatDatabase(storage)
1315

1416
export type SiteQueryParam = SiteCondition
1517

@@ -63,6 +65,10 @@ class SiteService {
6365
return result
6466
}
6567

68+
selectAll(param?: SiteQueryParam): Promise<timer.site.SiteInfo[]> {
69+
return siteDatabase.select(param)
70+
}
71+
6672
async batchSelect(keys: timer.site.SiteKey[]): Promise<timer.site.SiteInfo[]> {
6773
return siteDatabase.getBatch(keys)
6874
}

0 commit comments

Comments
 (0)