Skip to content

Commit cb5dfe5

Browse files
committed
Add total_relations and content_length fields to model to capture exact counts irrespective of max config.
1 parent 7885df1 commit cb5dfe5

File tree

4 files changed

+32
-36
lines changed

4 files changed

+32
-36
lines changed

cmd/dictpress/handlers.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,3 @@ func getGlossaryWords(lang, initial string, pg paginator.Set, app *App) (*glossa
303303

304304
return out, nil
305305
}
306-
307-
// validateSearchQuery does basic validation and sanity checks
308-
// on data.Query (useful for params coming from the outside world).
309-
func validateSearchQuery(q data.Query, langs data.LangMap) error {
310-
for _, t := range q.Types {
311-
if _, ok := langs[q.FromLang].Types[t]; !ok {
312-
return fmt.Errorf("unknown type %s", t)
313-
}
314-
}
315-
316-
return nil
317-
}

internal/data/data.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,8 @@ func (d *Data) SearchAndLoadRelations(e []Entry, q Query) error {
479479
pq.StringArray(q.Types),
480480
pq.StringArray(q.Tags),
481481
pq.Int64Array(IDs),
482-
q.Status, q.MaxRelations)
482+
q.Status,
483+
q.MaxRelations)
483484
if err != nil {
484485
if err == sql.ErrNoRows {
485486
return nil
@@ -507,6 +508,7 @@ func (d *Data) SearchAndLoadRelations(e []Entry, q Query) error {
507508

508509
idx := idMap[r.FromID]
509510
e[idx].Relations = append(e[idx].Relations, r)
511+
e[idx].TotalRelations = r.TotalRelations
510512
}
511513

512514
return nil

internal/data/models.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,25 @@ type JSON map[string]interface{}
1414

1515
// Entry represents a dictionary entry.
1616
type Entry struct {
17-
ID int `json:"id,omitempty" db:"id"`
18-
GUID string `json:"guid" db:"guid"`
19-
Weight float64 `json:"weight" db:"weight"`
20-
Initial string `json:"initial" db:"initial"`
21-
Lang string `json:"lang" db:"lang"`
22-
Content pq.StringArray `json:"content" db:"content"`
23-
Tokens string `json:"tokens" db:"tokens"`
24-
Tags pq.StringArray `json:"tags" db:"tags"`
25-
Phones pq.StringArray `json:"phones" db:"phones"`
26-
Notes string `json:"notes" db:"notes"`
27-
Meta JSON `json:"meta" db:"meta"`
28-
Status string `json:"status" db:"status"`
29-
Relations []Entry `json:"relations,omitempty" db:"relations"`
30-
Total int `json:"-" db:"total"`
31-
CreatedAt null.Time `json:"created_at" db:"created_at"`
32-
UpdatedAt null.Time `json:"updated_at" db:"updated_at"`
17+
ID int `json:"id,omitempty" db:"id"`
18+
GUID string `json:"guid" db:"guid"`
19+
Weight float64 `json:"weight" db:"weight"`
20+
Initial string `json:"initial" db:"initial"`
21+
Lang string `json:"lang" db:"lang"`
22+
Content pq.StringArray `json:"content" db:"content"`
23+
ContentLength int `json:"content_length" db:"content_length"`
24+
Tokens string `json:"tokens" db:"tokens"`
25+
Tags pq.StringArray `json:"tags" db:"tags"`
26+
Phones pq.StringArray `json:"phones" db:"phones"`
27+
Notes string `json:"notes" db:"notes"`
28+
Meta JSON `json:"meta" db:"meta"`
29+
Status string `json:"status" db:"status"`
30+
Relations []Entry `json:"relations,omitempty" db:"relations"`
31+
CreatedAt null.Time `json:"created_at" db:"created_at"`
32+
UpdatedAt null.Time `json:"updated_at" db:"updated_at"`
33+
34+
TotalRelations int `json:"total_relations" db:"total_relations"`
35+
Total int `json:"-" db:"total"`
3336

3437
// Non-public fields for scanning relationship data and populating Relation.
3538
FromID int `json:"-" db:"from_id"`

queries.sql

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ results AS (
5555
SELECT * FROM tokenMatch
5656
) AS combined
5757
)
58-
SELECT COUNT(*) OVER () AS total, * FROM results ORDER BY rank OFFSET $7 LIMIT $8;
58+
SELECT COUNT(*) OVER () AS total, *, ARRAY_LENGTH(content, 1) AS content_length FROM results ORDER BY rank OFFSET $7 LIMIT $8;
5959

6060
-- name: search-relations
61-
SELECT entries.*,
61+
SELECT entries.*, ARRAY_LENGTH(entries.content, 1) AS content_length,
6262
sub.from_id AS from_id,
6363
sub.types AS relation_types,
6464
sub.tags AS relation_tags,
@@ -67,11 +67,14 @@ SELECT entries.*,
6767
sub.weight as relation_weight,
6868
sub.status as relation_status,
6969
sub.created_at as relation_created_at,
70-
sub.updated_at as relation_updated_at
70+
sub.updated_at as relation_updated_at,
71+
sub.total_relations AS total_relations
7172
FROM entries
7273
INNER JOIN (
73-
SELECT *,ROW_NUMBER() OVER (PARTITION BY relations.from_id, relations.types ORDER BY relations.weight) as rn
74-
FROM relations
74+
SELECT *,
75+
ROW_NUMBER() OVER (PARTITION BY relations.from_id, relations.types ORDER BY relations.weight) as rn,
76+
COUNT(*) OVER (PARTITION BY relations.from_id) as total_relations
77+
FROM relations
7578
WHERE from_id = ANY($4::INT[])
7679
AND (CASE WHEN $5 != '' THEN relations.status = $5::entry_status ELSE TRUE END)
7780
AND (COALESCE(CARDINALITY($2::TEXT[]), 0) = 0 OR relations.types && $2)
@@ -87,7 +90,7 @@ WITH ids AS (
8790
UNION
8891
SELECT DISTINCT from_id FROM comments
8992
)
90-
SELECT COUNT(*) OVER () AS total, e.* FROM entries e
93+
SELECT COUNT(*) OVER () AS total, e.*, ARRAY_LENGTH(e.content, 1) AS content_length FROM entries e
9194
INNER JOIN ids ON (ids.from_id = e.id)
9295
WHERE ($1 = '' OR lang=$1)
9396
AND (COALESCE(CARDINALITY($2::TEXT[]), 0) = 0 OR e.tags && $2)
@@ -109,7 +112,7 @@ r AS (
109112
UPDATE relations WHERE from_id = $1;
110113

111114
-- name: get-entry
112-
SELECT * FROM entries WHERE
115+
SELECT *, ARRAY_LENGTH(content, 1) AS content_length FROM entries WHERE
113116
CASE
114117
WHEN $1 > 0 THEN id = $1
115118
WHEN $2 != '' THEN guid = $2::UUID

0 commit comments

Comments
 (0)