Documentation ¶
Overview ¶
Package searchstore converts search queries to SQL.
Because of the wide array of deployments supported by Grafarg, search strives to be both performant enough to handle heavy users and lightweight enough to not increase complexity/resource utilization for light users. To allow this we're currently searching without fuzziness and in a single SQL query.
Search queries are a combination of an outer query which Builder creates automatically when calling the Builder.ToSQL method and an inner query feeding that which lists the IDs of the dashboards that should be part of the result set. By default search will return all dashboards (behind pagination) but it is possible to dynamically add filters capable of adding more specific inclusion or ordering requirements.
A filter is any data type which implements one or more of the FilterWhere, FilterGroupBy, FilterOrderBy, or FilterLeftJoin interfaces. The filters will be applied (in order) to limit or reorder the results.
Filters will be applied in order with the final result like such:
SELECT id FROM dashboard LEFT OUTER JOIN <FilterLeftJoin...> WHERE <FilterWhere[0]> AND ... AND <FilterWhere[n]> GROUP BY <FilterGroupBy...> ORDER BY <FilterOrderBy...> LIMIT <limit> OFFSET <(page-1)*limit>;
This structure is intended to isolate the filters from each other and implementors are expected to add all the required joins, where clauses, groupings, and/or orderings necessary for applying a filter in the filter. Using side-effects of other filters is bad manners and increases the complexity and volatility of the code.
Index ¶
Constants ¶
const ( TypeFolder = "dash-folder" TypeDashboard = "dash-db" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Builder ¶
type Builder struct { // List of FilterWhere/FilterGroupBy/FilterOrderBy/FilterLeftJoin // to modify the query. Filters []interface{} Dialect migrator.Dialect // contains filtered or unexported fields }
Builder defaults to returning a SQL query to get a list of all dashboards in default order, but can be modified by applying filters.
type DashboardFilter ¶
type DashboardFilter struct {
IDs []int64
}
func (DashboardFilter) Where ¶
func (f DashboardFilter) Where() (string, []interface{})
type FilterGroupBy ¶
type FilterGroupBy interface {
GroupBy() (string, []interface{})
}
FilterGroupBy should be used after performing an outer join on the search result to ensure there is only one of each ID in the results. The id column must be present in the result.
type FilterLeftJoin ¶
type FilterLeftJoin interface {
LeftJoin() string
}
FilterLeftJoin adds the returned string as a "LEFT OUTER JOIN" to allow for fetching extra columns from a table outside of the dashboard column.
type FilterOrderBy ¶
type FilterOrderBy interface {
OrderBy() string
}
FilterOrderBy provides an ordering for the search result.
type FilterSelect ¶
type FilterSelect interface {
Select() string
}
type FilterWhere ¶
type FilterWhere interface {
Where() (string, []interface{})
}
FilterWhere limits the set of dashboard IDs to the dashboards for which the filter is applicable. Results where the first value is an empty string are discarded.
type FolderFilter ¶
type FolderFilter struct {
IDs []int64
}
func (FolderFilter) Where ¶
func (f FolderFilter) Where() (string, []interface{})
type StarredFilter ¶
type StarredFilter struct {
UserId int64
}
func (StarredFilter) Where ¶
func (f StarredFilter) Where() (string, []interface{})
type TagsFilter ¶
type TagsFilter struct {
Tags []string
}
func (TagsFilter) GroupBy ¶
func (f TagsFilter) GroupBy() (string, []interface{})
func (TagsFilter) LeftJoin ¶
func (f TagsFilter) LeftJoin() string
func (TagsFilter) Where ¶
func (f TagsFilter) Where() (string, []interface{})
type TitleFilter ¶
func (TitleFilter) Where ¶
func (f TitleFilter) Where() (string, []interface{})
type TitleSorter ¶
type TitleSorter struct {
Descending bool
}
func (TitleSorter) OrderBy ¶
func (s TitleSorter) OrderBy() string
type TypeFilter ¶
func (TypeFilter) Where ¶
func (f TypeFilter) Where() (string, []interface{})