-
Notifications
You must be signed in to change notification settings - Fork 1k
/
search.go
130 lines (113 loc) · 4.01 KB
/
search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package plugin
import (
"context"
)
type SearchResult struct {
// ID content ID
ID string
// Type content type, example: "answer", "question"
Type string
}
type SearchContent struct {
ObjectID string `json:"objectID"`
Title string `json:"title"`
Type string `json:"type"`
Content string `json:"content"`
Answers int64 `json:"answers"`
Status SearchContentStatus `json:"status"`
Tags []string `json:"tags"`
QuestionID string `json:"questionID"`
UserID string `json:"userID"`
Views int64 `json:"views"`
Created int64 `json:"created"`
Active int64 `json:"active"`
Score int64 `json:"score"`
HasAccepted bool `json:"hasAccepted"`
}
type SearchBasicCond struct {
// From zero-based page number
Page int
// Page size
PageSize int
// The keywords for search.
Words []string
// TagIDs is a list of tag IDs.
TagIDs [][]string
// The object's owner user ID.
UserID string
// The order of the search result.
Order SearchOrderCond
// Weathers the question is accepted or not. Only support search question.
QuestionAccepted SearchAcceptedCond
// Weathers the answer is accepted or not. Only support search answer.
AnswerAccepted SearchAcceptedCond
// Only support search answer.
QuestionID string
// greater than or equal to the number of votes.
VoteAmount int
// greater than or equal to the number of views.
ViewAmount int
// greater than or equal to the number of answers. Only support search question.
AnswerAmount int
}
type SearchAcceptedCond int
type SearchContentStatus int
type SearchOrderCond string
const (
AcceptedCondAll SearchAcceptedCond = iota
AcceptedCondTrue
AcceptedCondFalse
)
const (
SearchContentStatusAvailable = 1
SearchContentStatusDeleted = 10
)
const (
SearchNewestOrder SearchOrderCond = "newest"
SearchActiveOrder SearchOrderCond = "active"
SearchScoreOrder SearchOrderCond = "score"
SearchRelevanceOrder SearchOrderCond = "relevance"
)
type Search interface {
Base
Description() SearchDesc
RegisterSyncer(ctx context.Context, syncer SearchSyncer)
SearchContents(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error)
SearchQuestions(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error)
SearchAnswers(ctx context.Context, cond *SearchBasicCond) (res []SearchResult, total int64, err error)
UpdateContent(ctx context.Context, content *SearchContent) (err error)
DeleteContent(ctx context.Context, objectID string) (err error)
}
type SearchDesc struct {
// A svg icon it wil be display in search result page. optional
Icon string `json:"icon"`
// The link address of the search engine. optional
Link string `json:"link"`
}
type SearchSyncer interface {
GetAnswersPage(ctx context.Context, page, pageSize int) (answerList []*SearchContent, err error)
GetQuestionsPage(ctx context.Context, page, pageSize int) (questionList []*SearchContent, err error)
}
var (
// CallUserCenter is a function that calls all registered parsers
CallSearch,
registerSearch = MakePlugin[Search](false)
)