1// Code generated by sqlc. DO NOT EDIT.
2// versions:
3// sqlc v1.30.0
4// source: history.sql
5
6package sqlc
7
8import (
9 "context"
10 "database/sql"
11)
12
13const CapVisitCount = `-- name: CapVisitCount :exec
14UPDATE history SET visit_count = ? WHERE url = ? AND visit_count > ?
15`
16
17type CapVisitCountParams struct {
18 VisitCount sql.NullInt64 `json:"visit_count"`
19 Url string `json:"url"`
20 VisitCount_2 sql.NullInt64 `json:"visit_count_2"`
21}
22
23func (q *Queries) CapVisitCount(ctx context.Context, arg CapVisitCountParams) error {
24 _, err := q.db.ExecContext(ctx, CapVisitCount, arg.VisitCount, arg.Url, arg.VisitCount_2)
25 return err
26}
27
28const DeleteAllHistory = `-- name: DeleteAllHistory :exec
29DELETE FROM history
30`
31
32func (q *Queries) DeleteAllHistory(ctx context.Context) error {
33 _, err := q.db.ExecContext(ctx, DeleteAllHistory)
34 return err
35}
36
37const DeleteHistoryByDomain = `-- name: DeleteHistoryByDomain :exec
38DELETE FROM history WHERE domain = ?1
39`
40
41func (q *Queries) DeleteHistoryByDomain(ctx context.Context, domain sql.NullString) error {
42 _, err := q.db.ExecContext(ctx, DeleteHistoryByDomain, domain)
43 return err
44}
45
46const DeleteHistoryByID = `-- name: DeleteHistoryByID :exec
47DELETE FROM history WHERE id = ?
48`
49
50func (q *Queries) DeleteHistoryByID(ctx context.Context, id int64) error {
51 _, err := q.db.ExecContext(ctx, DeleteHistoryByID, id)
52 return err
53}
54
55const DeleteHistoryOlderThan = `-- name: DeleteHistoryOlderThan :exec
56DELETE FROM history WHERE last_visited < ?
57`
58
59func (q *Queries) DeleteHistoryOlderThan(ctx context.Context, lastVisited sql.NullTime) error {
60 _, err := q.db.ExecContext(ctx, DeleteHistoryOlderThan, lastVisited)
61 return err
62}
63
64const DeleteHistorySince = `-- name: DeleteHistorySince :exec
65DELETE FROM history WHERE last_visited >= ?
66`
67
68func (q *Queries) DeleteHistorySince(ctx context.Context, lastVisited sql.NullTime) error {
69 _, err := q.db.ExecContext(ctx, DeleteHistorySince, lastVisited)
70 return err
71}
72
73const GetAllMostVisited = `-- name: GetAllMostVisited :many
74SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
75ORDER BY visit_count DESC, last_visited DESC
76`
77
78func (q *Queries) GetAllMostVisited(ctx context.Context) ([]History, error) {
79 rows, err := q.db.QueryContext(ctx, GetAllMostVisited)
80 if err != nil {
81 return nil, err
82 }
83 defer rows.Close()
84 items := []History{}
85 for rows.Next() {
86 var i History
87 if err := rows.Scan(
88 &i.ID,
89 &i.Url,
90 &i.Title,
91 &i.FaviconUrl,
92 &i.VisitCount,
93 &i.LastVisited,
94 &i.CreatedAt,
95 &i.Domain,
96 ); err != nil {
97 return nil, err
98 }
99 items = append(items, i)
100 }
101 if err := rows.Close(); err != nil {
102 return nil, err
103 }
104 if err := rows.Err(); err != nil {
105 return nil, err
106 }
107 return items, nil
108}
109
110const GetAllRecentHistory = `-- name: GetAllRecentHistory :many
111SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
112ORDER BY last_visited DESC, id DESC
113`
114
115func (q *Queries) GetAllRecentHistory(ctx context.Context) ([]History, error) {
116 rows, err := q.db.QueryContext(ctx, GetAllRecentHistory)
117 if err != nil {
118 return nil, err
119 }
120 defer rows.Close()
121 items := []History{}
122 for rows.Next() {
123 var i History
124 if err := rows.Scan(
125 &i.ID,
126 &i.Url,
127 &i.Title,
128 &i.FaviconUrl,
129 &i.VisitCount,
130 &i.LastVisited,
131 &i.CreatedAt,
132 &i.Domain,
133 ); err != nil {
134 return nil, err
135 }
136 items = append(items, i)
137 }
138 if err := rows.Close(); err != nil {
139 return nil, err
140 }
141 if err := rows.Err(); err != nil {
142 return nil, err
143 }
144 return items, nil
145}
146
147const GetAllRecentHistoryByDomain = `-- name: GetAllRecentHistoryByDomain :many
148SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
149WHERE domain = ?1
150ORDER BY last_visited DESC, id DESC
151`
152
153func (q *Queries) GetAllRecentHistoryByDomain(ctx context.Context, domain sql.NullString) ([]History, error) {
154 rows, err := q.db.QueryContext(ctx, GetAllRecentHistoryByDomain, domain)
155 if err != nil {
156 return nil, err
157 }
158 defer rows.Close()
159 items := []History{}
160 for rows.Next() {
161 var i History
162 if err := rows.Scan(
163 &i.ID,
164 &i.Url,
165 &i.Title,
166 &i.FaviconUrl,
167 &i.VisitCount,
168 &i.LastVisited,
169 &i.CreatedAt,
170 &i.Domain,
171 ); err != nil {
172 return nil, err
173 }
174 items = append(items, i)
175 }
176 if err := rows.Close(); err != nil {
177 return nil, err
178 }
179 if err := rows.Err(); err != nil {
180 return nil, err
181 }
182 return items, nil
183}
184
185const GetDailyVisitCount = `-- name: GetDailyVisitCount :many
186SELECT
187 date(last_visited) as day,
188 COUNT(*) as entries,
189 SUM(visit_count) as visits
190FROM history
191WHERE last_visited >= date('now', ?)
192GROUP BY day
193ORDER BY day ASC
194`
195
196type GetDailyVisitCountRow struct {
197 Day interface{} `json:"day"`
198 Entries int64 `json:"entries"`
199 Visits sql.NullFloat64 `json:"visits"`
200}
201
202func (q *Queries) GetDailyVisitCount(ctx context.Context, date interface{}) ([]GetDailyVisitCountRow, error) {
203 rows, err := q.db.QueryContext(ctx, GetDailyVisitCount, date)
204 if err != nil {
205 return nil, err
206 }
207 defer rows.Close()
208 items := []GetDailyVisitCountRow{}
209 for rows.Next() {
210 var i GetDailyVisitCountRow
211 if err := rows.Scan(&i.Day, &i.Entries, &i.Visits); err != nil {
212 return nil, err
213 }
214 items = append(items, i)
215 }
216 if err := rows.Close(); err != nil {
217 return nil, err
218 }
219 if err := rows.Err(); err != nil {
220 return nil, err
221 }
222 return items, nil
223}
224
225const GetDomainStats = `-- name: GetDomainStats :many
226SELECT
227 COALESCE(domain, '') as domain,
228 COUNT(*) as page_count,
229 SUM(visit_count) as total_visits,
230 MAX(last_visited) as last_visit
231FROM history
232WHERE domain IS NOT NULL AND domain != ''
233GROUP BY domain
234ORDER BY total_visits DESC
235LIMIT ?
236`
237
238type GetDomainStatsRow struct {
239 Domain string `json:"domain"`
240 PageCount int64 `json:"page_count"`
241 TotalVisits sql.NullFloat64 `json:"total_visits"`
242 LastVisit interface{} `json:"last_visit"`
243}
244
245func (q *Queries) GetDomainStats(ctx context.Context, limit int64) ([]GetDomainStatsRow, error) {
246 rows, err := q.db.QueryContext(ctx, GetDomainStats, limit)
247 if err != nil {
248 return nil, err
249 }
250 defer rows.Close()
251 items := []GetDomainStatsRow{}
252 for rows.Next() {
253 var i GetDomainStatsRow
254 if err := rows.Scan(
255 &i.Domain,
256 &i.PageCount,
257 &i.TotalVisits,
258 &i.LastVisit,
259 ); err != nil {
260 return nil, err
261 }
262 items = append(items, i)
263 }
264 if err := rows.Close(); err != nil {
265 return nil, err
266 }
267 if err := rows.Err(); err != nil {
268 return nil, err
269 }
270 return items, nil
271}
272
273const GetHistoryByURL = `-- name: GetHistoryByURL :one
274SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history WHERE url = ? LIMIT 1
275`
276
277func (q *Queries) GetHistoryByURL(ctx context.Context, url string) (History, error) {
278 row := q.db.QueryRowContext(ctx, GetHistoryByURL, url)
279 var i History
280 err := row.Scan(
281 &i.ID,
282 &i.Url,
283 &i.Title,
284 &i.FaviconUrl,
285 &i.VisitCount,
286 &i.LastVisited,
287 &i.CreatedAt,
288 &i.Domain,
289 )
290 return i, err
291}
292
293const GetHistoryStats = `-- name: GetHistoryStats :one
294SELECT
295 COUNT(*) as total_entries,
296 COALESCE(SUM(visit_count), 0) as total_visits,
297 COUNT(DISTINCT date(last_visited)) as unique_days
298FROM history
299`
300
301type GetHistoryStatsRow struct {
302 TotalEntries int64 `json:"total_entries"`
303 TotalVisits interface{} `json:"total_visits"`
304 UniqueDays int64 `json:"unique_days"`
305}
306
307func (q *Queries) GetHistoryStats(ctx context.Context) (GetHistoryStatsRow, error) {
308 row := q.db.QueryRowContext(ctx, GetHistoryStats)
309 var i GetHistoryStatsRow
310 err := row.Scan(&i.TotalEntries, &i.TotalVisits, &i.UniqueDays)
311 return i, err
312}
313
314const GetHourlyDistribution = `-- name: GetHourlyDistribution :many
315SELECT
316 CAST(strftime('%H', last_visited) AS INTEGER) as hour,
317 COUNT(*) as visit_count
318FROM history
319GROUP BY hour
320ORDER BY hour
321`
322
323type GetHourlyDistributionRow struct {
324 Hour int64 `json:"hour"`
325 VisitCount int64 `json:"visit_count"`
326}
327
328func (q *Queries) GetHourlyDistribution(ctx context.Context) ([]GetHourlyDistributionRow, error) {
329 rows, err := q.db.QueryContext(ctx, GetHourlyDistribution)
330 if err != nil {
331 return nil, err
332 }
333 defer rows.Close()
334 items := []GetHourlyDistributionRow{}
335 for rows.Next() {
336 var i GetHourlyDistributionRow
337 if err := rows.Scan(&i.Hour, &i.VisitCount); err != nil {
338 return nil, err
339 }
340 items = append(items, i)
341 }
342 if err := rows.Close(); err != nil {
343 return nil, err
344 }
345 if err := rows.Err(); err != nil {
346 return nil, err
347 }
348 return items, nil
349}
350
351const GetMostVisited = `-- name: GetMostVisited :many
352SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
353WHERE last_visited >= datetime('now', ?)
354ORDER BY visit_count DESC, last_visited DESC
355`
356
357func (q *Queries) GetMostVisited(ctx context.Context, datetime interface{}) ([]History, error) {
358 rows, err := q.db.QueryContext(ctx, GetMostVisited, datetime)
359 if err != nil {
360 return nil, err
361 }
362 defer rows.Close()
363 items := []History{}
364 for rows.Next() {
365 var i History
366 if err := rows.Scan(
367 &i.ID,
368 &i.Url,
369 &i.Title,
370 &i.FaviconUrl,
371 &i.VisitCount,
372 &i.LastVisited,
373 &i.CreatedAt,
374 &i.Domain,
375 ); err != nil {
376 return nil, err
377 }
378 items = append(items, i)
379 }
380 if err := rows.Close(); err != nil {
381 return nil, err
382 }
383 if err := rows.Err(); err != nil {
384 return nil, err
385 }
386 return items, nil
387}
388
389const GetMostVisitedHistory = `-- name: GetMostVisitedHistory :many
390SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
391ORDER BY visit_count DESC, last_visited DESC
392LIMIT ?1
393`
394
395func (q *Queries) GetMostVisitedHistory(ctx context.Context, limit int64) ([]History, error) {
396 rows, err := q.db.QueryContext(ctx, GetMostVisitedHistory, limit)
397 if err != nil {
398 return nil, err
399 }
400 defer rows.Close()
401 items := []History{}
402 for rows.Next() {
403 var i History
404 if err := rows.Scan(
405 &i.ID,
406 &i.Url,
407 &i.Title,
408 &i.FaviconUrl,
409 &i.VisitCount,
410 &i.LastVisited,
411 &i.CreatedAt,
412 &i.Domain,
413 ); err != nil {
414 return nil, err
415 }
416 items = append(items, i)
417 }
418 if err := rows.Close(); err != nil {
419 return nil, err
420 }
421 if err := rows.Err(); err != nil {
422 return nil, err
423 }
424 return items, nil
425}
426
427const GetMostVisitedHistorySinceCutoff = `-- name: GetMostVisitedHistorySinceCutoff :many
428SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
429WHERE last_visited >= ?1
430ORDER BY visit_count DESC, last_visited DESC
431LIMIT ?2
432`
433
434type GetMostVisitedHistorySinceCutoffParams struct {
435 Cutoff sql.NullTime `json:"cutoff"`
436 Limit int64 `json:"limit"`
437}
438
439// Bounded window variant: the direct comparison keeps the last_visited index
440// usable. Rows with a NULL last_visited are intentionally excluded.
441func (q *Queries) GetMostVisitedHistorySinceCutoff(ctx context.Context, arg GetMostVisitedHistorySinceCutoffParams) ([]History, error) {
442 rows, err := q.db.QueryContext(ctx, GetMostVisitedHistorySinceCutoff, arg.Cutoff, arg.Limit)
443 if err != nil {
444 return nil, err
445 }
446 defer rows.Close()
447 items := []History{}
448 for rows.Next() {
449 var i History
450 if err := rows.Scan(
451 &i.ID,
452 &i.Url,
453 &i.Title,
454 &i.FaviconUrl,
455 &i.VisitCount,
456 &i.LastVisited,
457 &i.CreatedAt,
458 &i.Domain,
459 ); err != nil {
460 return nil, err
461 }
462 items = append(items, i)
463 }
464 if err := rows.Close(); err != nil {
465 return nil, err
466 }
467 if err := rows.Err(); err != nil {
468 return nil, err
469 }
470 return items, nil
471}
472
473const GetRecentHistory = `-- name: GetRecentHistory :many
474SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
475ORDER BY last_visited DESC, id DESC
476LIMIT ? OFFSET ?
477`
478
479type GetRecentHistoryParams struct {
480 Limit int64 `json:"limit"`
481 Offset int64 `json:"offset"`
482}
483
484func (q *Queries) GetRecentHistory(ctx context.Context, arg GetRecentHistoryParams) ([]History, error) {
485 rows, err := q.db.QueryContext(ctx, GetRecentHistory, arg.Limit, arg.Offset)
486 if err != nil {
487 return nil, err
488 }
489 defer rows.Close()
490 items := []History{}
491 for rows.Next() {
492 var i History
493 if err := rows.Scan(
494 &i.ID,
495 &i.Url,
496 &i.Title,
497 &i.FaviconUrl,
498 &i.VisitCount,
499 &i.LastVisited,
500 &i.CreatedAt,
501 &i.Domain,
502 ); err != nil {
503 return nil, err
504 }
505 items = append(items, i)
506 }
507 if err := rows.Close(); err != nil {
508 return nil, err
509 }
510 if err := rows.Err(); err != nil {
511 return nil, err
512 }
513 return items, nil
514}
515
516const GetRecentHistoryByDomain = `-- name: GetRecentHistoryByDomain :many
517SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
518WHERE domain = ?1
519ORDER BY last_visited DESC, id DESC
520LIMIT ?3 OFFSET ?2
521`
522
523type GetRecentHistoryByDomainParams struct {
524 Domain sql.NullString `json:"domain"`
525 Offset int64 `json:"offset"`
526 Limit int64 `json:"limit"`
527}
528
529func (q *Queries) GetRecentHistoryByDomain(ctx context.Context, arg GetRecentHistoryByDomainParams) ([]History, error) {
530 rows, err := q.db.QueryContext(ctx, GetRecentHistoryByDomain, arg.Domain, arg.Offset, arg.Limit)
531 if err != nil {
532 return nil, err
533 }
534 defer rows.Close()
535 items := []History{}
536 for rows.Next() {
537 var i History
538 if err := rows.Scan(
539 &i.ID,
540 &i.Url,
541 &i.Title,
542 &i.FaviconUrl,
543 &i.VisitCount,
544 &i.LastVisited,
545 &i.CreatedAt,
546 &i.Domain,
547 ); err != nil {
548 return nil, err
549 }
550 items = append(items, i)
551 }
552 if err := rows.Close(); err != nil {
553 return nil, err
554 }
555 if err := rows.Err(); err != nil {
556 return nil, err
557 }
558 return items, nil
559}
560
561const GetRecentHistorySince = `-- name: GetRecentHistorySince :many
562SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
563WHERE last_visited >= datetime('now', ?)
564ORDER BY last_visited DESC
565`
566
567func (q *Queries) GetRecentHistorySince(ctx context.Context, datetime interface{}) ([]History, error) {
568 rows, err := q.db.QueryContext(ctx, GetRecentHistorySince, datetime)
569 if err != nil {
570 return nil, err
571 }
572 defer rows.Close()
573 items := []History{}
574 for rows.Next() {
575 var i History
576 if err := rows.Scan(
577 &i.ID,
578 &i.Url,
579 &i.Title,
580 &i.FaviconUrl,
581 &i.VisitCount,
582 &i.LastVisited,
583 &i.CreatedAt,
584 &i.Domain,
585 ); err != nil {
586 return nil, err
587 }
588 items = append(items, i)
589 }
590 if err := rows.Close(); err != nil {
591 return nil, err
592 }
593 if err := rows.Err(); err != nil {
594 return nil, err
595 }
596 return items, nil
597}
598
599const GetRecentHistorySinceCutoff = `-- name: GetRecentHistorySinceCutoff :many
600SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
601WHERE last_visited >= ?1
602ORDER BY last_visited DESC, id DESC
603LIMIT ?3 OFFSET ?2
604`
605
606type GetRecentHistorySinceCutoffParams struct {
607 Cutoff sql.NullTime `json:"cutoff"`
608 Offset int64 `json:"offset"`
609 Limit int64 `json:"limit"`
610}
611
612// Bounded window variant: the direct comparison keeps the last_visited index
613// usable. Rows with a NULL last_visited are intentionally excluded.
614func (q *Queries) GetRecentHistorySinceCutoff(ctx context.Context, arg GetRecentHistorySinceCutoffParams) ([]History, error) {
615 rows, err := q.db.QueryContext(ctx, GetRecentHistorySinceCutoff, arg.Cutoff, arg.Offset, arg.Limit)
616 if err != nil {
617 return nil, err
618 }
619 defer rows.Close()
620 items := []History{}
621 for rows.Next() {
622 var i History
623 if err := rows.Scan(
624 &i.ID,
625 &i.Url,
626 &i.Title,
627 &i.FaviconUrl,
628 &i.VisitCount,
629 &i.LastVisited,
630 &i.CreatedAt,
631 &i.Domain,
632 ); err != nil {
633 return nil, err
634 }
635 items = append(items, i)
636 }
637 if err := rows.Close(); err != nil {
638 return nil, err
639 }
640 if err := rows.Err(); err != nil {
641 return nil, err
642 }
643 return items, nil
644}
645
646const GetRecentHistoryWindow = `-- name: GetRecentHistoryWindow :many
647SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
648WHERE last_visited < ?1 OR (last_visited = ?1 AND id < ?2)
649ORDER BY last_visited DESC, id DESC
650LIMIT ?3
651`
652
653type GetRecentHistoryWindowParams struct {
654 Before sql.NullTime `json:"before"`
655 BeforeID int64 `json:"before_id"`
656 Limit int64 `json:"limit"`
657}
658
659func (q *Queries) GetRecentHistoryWindow(ctx context.Context, arg GetRecentHistoryWindowParams) ([]History, error) {
660 rows, err := q.db.QueryContext(ctx, GetRecentHistoryWindow, arg.Before, arg.BeforeID, arg.Limit)
661 if err != nil {
662 return nil, err
663 }
664 defer rows.Close()
665 items := []History{}
666 for rows.Next() {
667 var i History
668 if err := rows.Scan(
669 &i.ID,
670 &i.Url,
671 &i.Title,
672 &i.FaviconUrl,
673 &i.VisitCount,
674 &i.LastVisited,
675 &i.CreatedAt,
676 &i.Domain,
677 ); err != nil {
678 return nil, err
679 }
680 items = append(items, i)
681 }
682 if err := rows.Close(); err != nil {
683 return nil, err
684 }
685 if err := rows.Err(); err != nil {
686 return nil, err
687 }
688 return items, nil
689}
690
691const GetRecentHistoryWindowByDomain = `-- name: GetRecentHistoryWindowByDomain :many
692SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
693WHERE domain = ?1 AND (last_visited < ?2 OR (last_visited = ?2 AND id < ?3))
694ORDER BY last_visited DESC, id DESC
695LIMIT ?4
696`
697
698type GetRecentHistoryWindowByDomainParams struct {
699 Domain sql.NullString `json:"domain"`
700 Before sql.NullTime `json:"before"`
701 BeforeID int64 `json:"before_id"`
702 Limit int64 `json:"limit"`
703}
704
705func (q *Queries) GetRecentHistoryWindowByDomain(ctx context.Context, arg GetRecentHistoryWindowByDomainParams) ([]History, error) {
706 rows, err := q.db.QueryContext(ctx, GetRecentHistoryWindowByDomain,
707 arg.Domain,
708 arg.Before,
709 arg.BeforeID,
710 arg.Limit,
711 )
712 if err != nil {
713 return nil, err
714 }
715 defer rows.Close()
716 items := []History{}
717 for rows.Next() {
718 var i History
719 if err := rows.Scan(
720 &i.ID,
721 &i.Url,
722 &i.Title,
723 &i.FaviconUrl,
724 &i.VisitCount,
725 &i.LastVisited,
726 &i.CreatedAt,
727 &i.Domain,
728 ); err != nil {
729 return nil, err
730 }
731 items = append(items, i)
732 }
733 if err := rows.Close(); err != nil {
734 return nil, err
735 }
736 if err := rows.Err(); err != nil {
737 return nil, err
738 }
739 return items, nil
740}
741
742const IncrementVisitCount = `-- name: IncrementVisitCount :exec
743UPDATE history
744SET visit_count = visit_count + 1, last_visited = CURRENT_TIMESTAMP
745WHERE url = ?
746`
747
748func (q *Queries) IncrementVisitCount(ctx context.Context, url string) error {
749 _, err := q.db.ExecContext(ctx, IncrementVisitCount, url)
750 return err
751}
752
753const IncrementVisitCountByDelta = `-- name: IncrementVisitCountByDelta :exec
754UPDATE history
755SET visit_count = visit_count + ?, last_visited = CURRENT_TIMESTAMP
756WHERE url = ?
757`
758
759type IncrementVisitCountByDeltaParams struct {
760 VisitCount sql.NullInt64 `json:"visit_count"`
761 Url string `json:"url"`
762}
763
764func (q *Queries) IncrementVisitCountByDelta(ctx context.Context, arg IncrementVisitCountByDeltaParams) error {
765 _, err := q.db.ExecContext(ctx, IncrementVisitCountByDelta, arg.VisitCount, arg.Url)
766 return err
767}
768
769const SearchHistory = `-- name: SearchHistory :many
770SELECT id, url, title, favicon_url, visit_count, last_visited, created_at, domain FROM history
771WHERE url LIKE '%' || ? || '%' OR title LIKE '%' || ? || '%'
772ORDER BY visit_count DESC, last_visited DESC
773LIMIT ?
774`
775
776type SearchHistoryParams struct {
777 Column1 sql.NullString `json:"column_1"`
778 Column2 sql.NullString `json:"column_2"`
779 Limit int64 `json:"limit"`
780}
781
782func (q *Queries) SearchHistory(ctx context.Context, arg SearchHistoryParams) ([]History, error) {
783 rows, err := q.db.QueryContext(ctx, SearchHistory, arg.Column1, arg.Column2, arg.Limit)
784 if err != nil {
785 return nil, err
786 }
787 defer rows.Close()
788 items := []History{}
789 for rows.Next() {
790 var i History
791 if err := rows.Scan(
792 &i.ID,
793 &i.Url,
794 &i.Title,
795 &i.FaviconUrl,
796 &i.VisitCount,
797 &i.LastVisited,
798 &i.CreatedAt,
799 &i.Domain,
800 ); err != nil {
801 return nil, err
802 }
803 items = append(items, i)
804 }
805 if err := rows.Close(); err != nil {
806 return nil, err
807 }
808 if err := rows.Err(); err != nil {
809 return nil, err
810 }
811 return items, nil
812}
813
814const SearchHistoryFTSTitle = `-- name: SearchHistoryFTSTitle :many
815SELECT h.id, h.url, h.title, h.favicon_url, h.visit_count, h.last_visited, h.created_at, h.domain
816FROM history_fts fts
817JOIN history h ON fts.rowid = h.id
818WHERE fts.title MATCH ?1
819 AND (?2 IS NULL OR h.last_visited >= ?2)
820ORDER BY h.visit_count DESC, h.last_visited DESC
821LIMIT ?3
822`
823
824type SearchHistoryFTSTitleParams struct {
825 Query string `json:"query"`
826 Cutoff interface{} `json:"cutoff"`
827 Limit int64 `json:"limit"`
828}
829
830func (q *Queries) SearchHistoryFTSTitle(ctx context.Context, arg SearchHistoryFTSTitleParams) ([]History, error) {
831 rows, err := q.db.QueryContext(ctx, SearchHistoryFTSTitle, arg.Query, arg.Cutoff, arg.Limit)
832 if err != nil {
833 return nil, err
834 }
835 defer rows.Close()
836 items := []History{}
837 for rows.Next() {
838 var i History
839 if err := rows.Scan(
840 &i.ID,
841 &i.Url,
842 &i.Title,
843 &i.FaviconUrl,
844 &i.VisitCount,
845 &i.LastVisited,
846 &i.CreatedAt,
847 &i.Domain,
848 ); err != nil {
849 return nil, err
850 }
851 items = append(items, i)
852 }
853 if err := rows.Close(); err != nil {
854 return nil, err
855 }
856 if err := rows.Err(); err != nil {
857 return nil, err
858 }
859 return items, nil
860}
861
862const SearchHistoryFTSUrlWithDomainBoost = `-- name: SearchHistoryFTSUrlWithDomainBoost :many
863SELECT h.id, h.url, h.title, h.favicon_url, h.visit_count, h.last_visited, h.created_at,
864 CASE
865 WHEN h.url LIKE '%://' || ?1 || '.%' THEN 2
866 WHEN h.url LIKE '%://%.' || ?1 || '.%' THEN 2
867 WHEN h.url LIKE '%://' || ?1 || '/%' THEN 2
868 WHEN h.url LIKE '%://%.' || ?1 || '/%' THEN 1
869 ELSE 0
870 END as domain_boost
871FROM history_fts fts
872JOIN history h ON fts.rowid = h.id
873WHERE fts.url MATCH ?2
874 AND (?3 IS NULL OR h.last_visited >= ?3)
875ORDER BY domain_boost DESC, h.visit_count DESC, h.last_visited DESC
876LIMIT ?4
877`
878
879type SearchHistoryFTSUrlWithDomainBoostParams struct {
880 Term sql.NullString `json:"term"`
881 Query string `json:"query"`
882 Cutoff interface{} `json:"cutoff"`
883 Limit int64 `json:"limit"`
884}
885
886type SearchHistoryFTSUrlWithDomainBoostRow struct {
887 ID int64 `json:"id"`
888 Url string `json:"url"`
889 Title sql.NullString `json:"title"`
890 FaviconUrl sql.NullString `json:"favicon_url"`
891 VisitCount sql.NullInt64 `json:"visit_count"`
892 LastVisited sql.NullTime `json:"last_visited"`
893 CreatedAt sql.NullTime `json:"created_at"`
894 DomainBoost int64 `json:"domain_boost"`
895}
896
897func (q *Queries) SearchHistoryFTSUrlWithDomainBoost(ctx context.Context, arg SearchHistoryFTSUrlWithDomainBoostParams) ([]SearchHistoryFTSUrlWithDomainBoostRow, error) {
898 rows, err := q.db.QueryContext(ctx, SearchHistoryFTSUrlWithDomainBoost,
899 arg.Term,
900 arg.Query,
901 arg.Cutoff,
902 arg.Limit,
903 )
904 if err != nil {
905 return nil, err
906 }
907 defer rows.Close()
908 items := []SearchHistoryFTSUrlWithDomainBoostRow{}
909 for rows.Next() {
910 var i SearchHistoryFTSUrlWithDomainBoostRow
911 if err := rows.Scan(
912 &i.ID,
913 &i.Url,
914 &i.Title,
915 &i.FaviconUrl,
916 &i.VisitCount,
917 &i.LastVisited,
918 &i.CreatedAt,
919 &i.DomainBoost,
920 ); err != nil {
921 return nil, err
922 }
923 items = append(items, i)
924 }
925 if err := rows.Close(); err != nil {
926 return nil, err
927 }
928 if err := rows.Err(); err != nil {
929 return nil, err
930 }
931 return items, nil
932}
933
934const UpsertHistory = `-- name: UpsertHistory :exec
935INSERT INTO history (url, title, favicon_url, domain)
936VALUES (?, ?, ?, ?)
937ON CONFLICT(url)
938DO UPDATE SET
939 visit_count = visit_count + 1,
940 last_visited = CURRENT_TIMESTAMP,
941 title = COALESCE(EXCLUDED.title, history.title),
942 favicon_url = COALESCE(EXCLUDED.favicon_url, history.favicon_url),
943 domain = COALESCE(EXCLUDED.domain, history.domain)
944`
945
946type UpsertHistoryParams struct {
947 Url string `json:"url"`
948 Title sql.NullString `json:"title"`
949 FaviconUrl sql.NullString `json:"favicon_url"`
950 Domain sql.NullString `json:"domain"`
951}
952
953func (q *Queries) UpsertHistory(ctx context.Context, arg UpsertHistoryParams) error {
954 _, err := q.db.ExecContext(ctx, UpsertHistory,
955 arg.Url,
956 arg.Title,
957 arg.FaviconUrl,
958 arg.Domain,
959 )
960 return err
961}