Implement FTS5 for order search

This commit is contained in:
bronku 2025-03-30 14:46:01 +02:00
parent 81b442fcc4
commit 2588f2c54e
6 changed files with 125 additions and 4 deletions

2
go.mod
View file

@ -4,6 +4,8 @@ go 1.23.5
require github.com/mattn/go-sqlite3 v1.14.24 require github.com/mattn/go-sqlite3 v1.14.24
require github.com/knaka/go-sqlite3-fts5 v0.0.0-20240729040425-e53b86878d0d
require ( require (
golang.org/x/crypto v0.36.0 golang.org/x/crypto v0.36.0
golang.org/x/sys v0.31.0 // indirect golang.org/x/sys v0.31.0 // indirect

2
go.sum
View file

@ -1,3 +1,5 @@
github.com/knaka/go-sqlite3-fts5 v0.0.0-20240729040425-e53b86878d0d h1:I3lRivq7Zx0fqlKhCJG1KaL2tLG6aiHDj3bvJJqppKw=
github.com/knaka/go-sqlite3-fts5 v0.0.0-20240729040425-e53b86878d0d/go.mod h1:kDHCqub/PNhQnqg8ur7OYO49jpZ+pM0mqBQ768DE3UU=
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=

View file

@ -18,8 +18,7 @@ func (h *Server) orders(r *http.Request) (any, int, error) {
func (h *Server) ordersSearch(r *http.Request) (any, int, error) { func (h *Server) ordersSearch(r *http.Request) (any, int, error) {
q := r.URL.Query().Get("q") q := r.URL.Query().Get("q")
fmt.Println(q) fmt.Println(q)
data, err := h.s.GetTopOrders() data, err := h.s.GetFilteredOrder(q)
data = data[:3]
return data, http.StatusOK, err return data, http.StatusOK, err
} }

View file

@ -0,0 +1,92 @@
create virtual table order_fts using fts5 (
id,
name,
surname,
phone,
location,
status,
order_date,
delivery_date,
paid,
content = 'customer_order'
);
insert into
order_fts (
id,
name,
surname,
phone,
location,
status,
order_date,
delivery_date,
paid
)
select
id,
name,
surname,
phone,
location,
status,
order_date,
delivery_date,
paid
from
customer_order;
create trigger order_fts_insert after insert on customer_order begin
insert into
order_fts (
id,
name,
surname,
phone,
location,
status,
order_date,
delivery_date,
paid
)
values
(
new.id,
new.name,
new.surname,
new.phone,
new.location,
new.status,
new.order_date,
new.delivery_date,
new.paid
);
end;
create trigger order_fts_delete after delete on customer_order begin
delete from order_fts
where
id = old.id;
end;
create trigger order_fts_update after
update on customer_order begin
update customer_order
set
id = new.id,
name = new.name,
surname = new.surname,
phone = new.phone,
location = new.location,
status = new.status,
order_date = new.order_date,
delivery_date = new.delivery_date,
paid = new.paid
where
id = old.id;
end;
pragma user_version = 9;

View file

@ -11,7 +11,6 @@ import (
) )
func (s *Store) parseOrderRow(row *sql.Rows) (models.Order, error) { func (s *Store) parseOrderRow(row *sql.Rows) (models.Order, error) {
var out models.Order var out models.Order
var order_date, delivery_date string var order_date, delivery_date string
err := row.Scan(&out.ID, &out.Name, &out.Surname, &out.Phone, &out.Location, &order_date, &delivery_date, &out.Status, &out.Paid) err := row.Scan(&out.ID, &out.Name, &out.Surname, &out.Phone, &out.Location, &order_date, &delivery_date, &out.Status, &out.Paid)
@ -56,9 +55,35 @@ func (s *Store) GetOrder(id int) (models.Order, error) {
return s.parseOrderRow(row) return s.parseOrderRow(row)
} }
func (s *Store) GetFilteredOrder(filter string) ([]models.Order, error) {
if filter == "" {
return s.GetTopOrders()
}
var out []models.Order
query := "select * from order_fts(?) order by rank;"
rows, err := s.db.Query(query, filter)
if err != nil {
fmt.Println(err)
return out, err
}
defer rows.Close()
for rows.Next() {
fmt.Println("ok")
order, err := s.parseOrderRow(rows)
if err != nil {
fmt.Println(err)
continue
}
out = append(out, order)
}
return out, nil
}
func (s *Store) GetTopOrders() ([]models.Order, error) { func (s *Store) GetTopOrders() ([]models.Order, error) {
var out []models.Order var out []models.Order
rows, err := s.db.Query("select id, name, surname, phone, location, order_date, delivery_date, status, paid from customer_order;") rows, err := s.db.Query("select * from customer_order;")
if err != nil { if err != nil {
return out, err return out, err
} }

View file

@ -5,6 +5,7 @@ import (
"log" "log"
"github.com/Bronku/iroon/internal/models" "github.com/Bronku/iroon/internal/models"
_ "github.com/knaka/go-sqlite3-fts5"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )