diff --git a/go.mod b/go.mod index 6d58c2f..c764ba4 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,8 @@ go 1.23.5 require github.com/mattn/go-sqlite3 v1.14.24 +require github.com/knaka/go-sqlite3-fts5 v0.0.0-20240729040425-e53b86878d0d + require ( golang.org/x/crypto v0.36.0 golang.org/x/sys v0.31.0 // indirect diff --git a/go.sum b/go.sum index 6e5b973..76d405a 100644 --- a/go.sum +++ b/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/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= diff --git a/internal/server/get.go b/internal/server/get.go index 93e03b2..3b47235 100644 --- a/internal/server/get.go +++ b/internal/server/get.go @@ -18,8 +18,7 @@ func (h *Server) orders(r *http.Request) (any, int, error) { func (h *Server) ordersSearch(r *http.Request) (any, int, error) { q := r.URL.Query().Get("q") fmt.Println(q) - data, err := h.s.GetTopOrders() - data = data[:3] + data, err := h.s.GetFilteredOrder(q) return data, http.StatusOK, err } diff --git a/internal/store/migrations/9.sql b/internal/store/migrations/9.sql new file mode 100644 index 0000000..251e594 --- /dev/null +++ b/internal/store/migrations/9.sql @@ -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; diff --git a/internal/store/order.go b/internal/store/order.go index 58515db..38ce217 100644 --- a/internal/store/order.go +++ b/internal/store/order.go @@ -11,7 +11,6 @@ import ( ) func (s *Store) parseOrderRow(row *sql.Rows) (models.Order, error) { - var out models.Order 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) @@ -56,9 +55,35 @@ func (s *Store) GetOrder(id int) (models.Order, error) { 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) { 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 { return out, err } diff --git a/internal/store/store.go b/internal/store/store.go index c7e96ed..2877676 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -5,6 +5,7 @@ import ( "log" "github.com/Bronku/iroon/internal/models" + _ "github.com/knaka/go-sqlite3-fts5" _ "github.com/mattn/go-sqlite3" )