optimized search count queries to use rowid by default

This commit is contained in:
Gani Georgiev
2023-07-03 17:57:13 +03:00
parent 1679c88e6d
commit 9ec01d74d8
37 changed files with 88 additions and 45 deletions
+10 -1
View File
@@ -36,6 +36,7 @@ type Result struct {
type Provider struct {
fieldResolver FieldResolver
query *dbx.SelectQuery
countCol string
page int
perPage int
sort []SortField
@@ -56,6 +57,7 @@ type Provider struct {
func NewProvider(fieldResolver FieldResolver) *Provider {
return &Provider{
fieldResolver: fieldResolver,
countCol: "_rowid_",
page: 1,
perPage: DefaultPerPage,
sort: []SortField{},
@@ -69,6 +71,13 @@ func (s *Provider) Query(query *dbx.SelectQuery) *Provider {
return s
}
// CountCol allows changing the default column (_rowid_) that is used
// to generated the COUNT SQL query statement.
func (s *Provider) CountCol(name string) *Provider {
s.countCol = name
return s
}
// Page sets the `page` field of the current search provider.
//
// Normalization on the `page` value is done during `Exec()`.
@@ -198,7 +207,7 @@ func (s *Provider) Exec(items any) (*Result, error) {
baseTable = queryInfo.From[0]
}
clone := modelsQuery
countQuery := clone.Select("COUNT(DISTINCT [[" + baseTable + ".id]])").OrderBy()
countQuery := clone.Distinct(false).Select("COUNT(DISTINCT [[" + baseTable + "." + s.countCol + "]])").OrderBy()
if err := countQuery.Row(&totalCount); err != nil {
return nil, err
}