Implement FTS5 for order search
This commit is contained in:
parent
81b442fcc4
commit
2588f2c54e
6 changed files with 125 additions and 4 deletions
2
go.mod
2
go.mod
|
|
@ -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
2
go.sum
|
|
@ -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=
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
92
internal/store/migrations/9.sql
Normal file
92
internal/store/migrations/9.sql
Normal 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;
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue