internal

package
v1.21.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 21, 2023 License: MIT Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Indexer

type Indexer interface {
	internal.Indexer
	Index(ctx context.Context, issue ...*IndexerData) error
	Delete(ctx context.Context, ids ...int64) error
	Search(ctx context.Context, options *SearchOptions) (*SearchResult, error)
}

Indexer defines an interface to indexer issues contents

func NewDummyIndexer

func NewDummyIndexer() Indexer

NewDummyIndexer returns a dummy indexer

type IndexerData

type IndexerData struct {
	ID       int64 `json:"id"`
	RepoID   int64 `json:"repo_id"`
	IsPublic bool  `json:"is_public"` // If the repo is public

	// Fields used for keyword searching
	Title    string   `json:"title"`
	Content  string   `json:"content"`
	Comments []string `json:"comments"`

	// Fields used for filtering
	IsPull             bool               `json:"is_pull"`
	IsClosed           bool               `json:"is_closed"`
	LabelIDs           []int64            `json:"label_ids"`
	NoLabel            bool               `json:"no_label"` // True if LabelIDs is empty
	MilestoneID        int64              `json:"milestone_id"`
	ProjectID          int64              `json:"project_id"`
	ProjectBoardID     int64              `json:"project_board_id"`
	PosterID           int64              `json:"poster_id"`
	AssigneeID         int64              `json:"assignee_id"`
	MentionIDs         []int64            `json:"mention_ids"`
	ReviewedIDs        []int64            `json:"reviewed_ids"`
	ReviewRequestedIDs []int64            `json:"review_requested_ids"`
	SubscriberIDs      []int64            `json:"subscriber_ids"`
	UpdatedUnix        timeutil.TimeStamp `json:"updated_unix"`

	// Fields used for sorting
	// UpdatedUnix is both used for filtering and sorting.
	// ID is used for sorting too, to make the sorting stable.
	CreatedUnix  timeutil.TimeStamp `json:"created_unix"`
	DeadlineUnix timeutil.TimeStamp `json:"deadline_unix"`
	CommentCount int64              `json:"comment_count"`
}

IndexerData data stored in the issue indexer

type Match

type Match struct {
	ID    int64   `json:"id"`
	Score float64 `json:"score"`
}

Match represents on search result

type SearchOptions

type SearchOptions struct {
	Keyword string // keyword to search

	RepoIDs   []int64 // repository IDs which the issues belong to
	AllPublic bool    // if include all public repositories

	IsPull   util.OptionalBool // if the issues is a pull request
	IsClosed util.OptionalBool // if the issues is closed

	IncludedLabelIDs    []int64 // labels the issues have
	ExcludedLabelIDs    []int64 // labels the issues don't have
	IncludedAnyLabelIDs []int64 // labels the issues have at least one. It will be ignored if IncludedLabelIDs is not empty. It's an uncommon filter, but it has been supported accidentally by issues.IssuesOptions.IncludedLabelNames.
	NoLabelOnly         bool    // if the issues have no label, if true, IncludedLabelIDs and ExcludedLabelIDs, IncludedAnyLabelIDs will be ignored

	MilestoneIDs []int64 // milestones the issues have

	ProjectID      *int64 // project the issues belong to
	ProjectBoardID *int64 // project board the issues belong to

	PosterID *int64 // poster of the issues

	AssigneeID *int64 // assignee of the issues, zero means no assignee

	MentionID *int64 // mentioned user of the issues

	ReviewedID        *int64 // reviewer of the issues
	ReviewRequestedID *int64 // requested reviewer of the issues

	SubscriberID *int64 // subscriber of the issues

	UpdatedAfterUnix  *int64
	UpdatedBeforeUnix *int64

	db.Paginator

	SortBy SortBy // sort by field
}

SearchOptions represents search options.

It has a slightly different design from database query options. In database query options, a field is never a pointer, so it could be confusing when it's zero value: Do you want to find data with a field value of 0, or do you not specify the field in the options? To avoid this confusion, db introduced db.NoConditionID(-1). So zero value means the field is not specified in the search options, and db.NoConditionID means "== 0" or "id NOT IN (SELECT id FROM ...)" It's still not ideal, it trapped developers many times. And sometimes -1 could be a valid value, like issue ID, negative numbers indicate exclusion. Since db.NoConditionID is for "db" (the package name is db), it makes sense not to use it in the indexer: Why do bleve/elasticsearch/meilisearch indexers need to know about db.NoConditionID? So in SearchOptions, we use pointer for fields which could be not specified, and always use the value to filter if it's not nil, even if it's zero or negative. It can handle almost all cases, if there is an exception, we can add a new field, like NoLabelOnly. Unfortunately, we still use db for the indexer and have to convert between db.NoConditionID and nil for legacy reasons.

func (*SearchOptions) Copy

func (o *SearchOptions) Copy(edit ...func(options *SearchOptions)) *SearchOptions

Copy returns a copy of the options. Be careful, it's not a deep copy, so `SearchOptions.RepoIDs = {...}` is OK while `SearchOptions.RepoIDs[0] = ...` is not.

type SearchResult

type SearchResult struct {
	Total int64
	Hits  []Match
}

SearchResult represents search results

type SortBy

type SortBy string
const (
	SortByCreatedDesc  SortBy = "-created_unix"
	SortByUpdatedDesc  SortBy = "-updated_unix"
	SortByCommentsDesc SortBy = "-comment_count"
	SortByDeadlineDesc SortBy = "-deadline_unix"
	SortByCreatedAsc   SortBy = "created_unix"
	SortByUpdatedAsc   SortBy = "updated_unix"
	SortByCommentsAsc  SortBy = "comment_count"
	SortByDeadlineAsc  SortBy = "deadline_unix"
)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL