Implement spellfix
This commit is contained in:
12
db.go
12
db.go
@@ -6,7 +6,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
"github.com/mattn/go-sqlite3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DB struct {
|
type DB struct {
|
||||||
@@ -21,7 +21,11 @@ func (db *DB) Open() error {
|
|||||||
return fmt.Errorf("database path not set")
|
return fmt.Errorf("database path not set")
|
||||||
}
|
}
|
||||||
|
|
||||||
writeConn, err := sql.Open("sqlite3", db.path+"?_journal=WAL&_synchronous=NORMAL")
|
sql.Register("spellfixlite", &sqlite3.SQLiteDriver{
|
||||||
|
Extensions: []string{"spellfix"},
|
||||||
|
})
|
||||||
|
|
||||||
|
writeConn, err := sql.Open("spellfixlite", db.path+"?_journal=WAL&_synchronous=NORMAL")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Error.Printf("%++v", err)
|
Error.Printf("%++v", err)
|
||||||
return err
|
return err
|
||||||
@@ -31,7 +35,7 @@ func (db *DB) Open() error {
|
|||||||
writeConn.SetConnMaxLifetime(30 * time.Second)
|
writeConn.SetConnMaxLifetime(30 * time.Second)
|
||||||
db.writeConn = writeConn
|
db.writeConn = writeConn
|
||||||
|
|
||||||
readConn, err := sql.Open("sqlite3", db.path+"?mode=ro&_journal=WAL&_synchronous=NORMAL&_mode=ro")
|
readConn, err := sql.Open("spellfixlite", db.path+"?mode=ro&_journal=WAL&_synchronous=NORMAL&_mode=ro")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Error.Printf("%++v", err)
|
Error.Printf("%++v", err)
|
||||||
return err
|
return err
|
||||||
@@ -79,7 +83,7 @@ func (db *DB) Init(ddl string) error {
|
|||||||
if _, ok := rows[table]; !ok {
|
if _, ok := rows[table]; !ok {
|
||||||
log.Printf("Table %s not found, initializing", table)
|
log.Printf("Table %s not found, initializing", table)
|
||||||
needsInit = true
|
needsInit = true
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
88
food.ddl
88
food.ddl
@@ -27,28 +27,28 @@ order by date desc;
|
|||||||
create view weightDaily as
|
create view weightDaily as
|
||||||
select strftime('%Y-%m-%d', date) as period,
|
select strftime('%Y-%m-%d', date) as period,
|
||||||
round(avg(weight), 2) as amount
|
round(avg(weight), 2) as amount
|
||||||
from weight
|
from weight
|
||||||
group by strftime('%Y-%m-%d', date)
|
group by strftime('%Y-%m-%d', date)
|
||||||
order by date desc;
|
order by date desc;
|
||||||
|
|
||||||
create view weightWeekly as
|
create view weightWeekly as
|
||||||
select strftime('%Y-%W', date) as period,
|
select strftime('%Y-%W', date) as period,
|
||||||
round(avg(weight), 2) as amount
|
round(avg(weight), 2) as amount
|
||||||
from weight
|
from weight
|
||||||
group by strftime('%Y-%W', date)
|
group by strftime('%Y-%W', date)
|
||||||
order by date desc;
|
order by date desc;
|
||||||
|
|
||||||
create view weightMonthly as
|
create view weightMonthly as
|
||||||
select strftime('%Y-%m', date) as period,
|
select strftime('%Y-%m', date) as period,
|
||||||
round(avg(weight), 2) as amount
|
round(avg(weight), 2) as amount
|
||||||
from weight
|
from weight
|
||||||
group by strftime('%Y-%m', date)
|
group by strftime('%Y-%m', date)
|
||||||
order by date desc;
|
order by date desc;
|
||||||
|
|
||||||
create view weightYearly as
|
create view weightYearly as
|
||||||
select strftime('%Y', date) as period,
|
select strftime('%Y', date) as period,
|
||||||
round(avg(weight), 2) as amount
|
round(avg(weight), 2) as amount
|
||||||
from weight
|
from weight
|
||||||
group by strftime('%Y', date)
|
group by strftime('%Y', date)
|
||||||
order by date desc;
|
order by date desc;
|
||||||
|
|
||||||
@@ -61,6 +61,80 @@ create table food(
|
|||||||
energy generated always as (coalesce(amount, 0) * coalesce(per100, 0) / 100) stored
|
energy generated always as (coalesce(amount, 0) * coalesce(per100, 0) / 100) stored
|
||||||
);
|
);
|
||||||
|
|
||||||
|
create virtual table foodfix using spellfix1;
|
||||||
|
-- insert into foodfix (word, rank)
|
||||||
|
-- select food as word,
|
||||||
|
-- count(*) as rank
|
||||||
|
-- from food
|
||||||
|
-- group by food;
|
||||||
|
drop trigger if exists food_foodfix_insert;
|
||||||
|
create trigger food_foodfix_insert AFTER
|
||||||
|
insert on food for EACH row
|
||||||
|
begin
|
||||||
|
update foodfix
|
||||||
|
set rank = rank + 1
|
||||||
|
where word = new.food;
|
||||||
|
insert into foodfix (word, rank)
|
||||||
|
select new.food,
|
||||||
|
1
|
||||||
|
where not exists (
|
||||||
|
select 1
|
||||||
|
from foodfix
|
||||||
|
where word = new.food
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
drop trigger if exists food_foodfix_delete;
|
||||||
|
create trigger food_foodfix_delete AFTER
|
||||||
|
delete on food for EACH row
|
||||||
|
begin
|
||||||
|
update foodfix
|
||||||
|
set rank = rank - 1
|
||||||
|
where word = old.food;
|
||||||
|
|
||||||
|
delete from foodfix
|
||||||
|
where word = old.food
|
||||||
|
and rank <= 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
drop trigger if exists food_foodfix_update;
|
||||||
|
create trigger food_foodfix_update AFTER
|
||||||
|
update on food for EACH row
|
||||||
|
begin
|
||||||
|
update foodfix
|
||||||
|
set rank = rank - 1
|
||||||
|
where word = old.food;
|
||||||
|
|
||||||
|
delete from foodfix
|
||||||
|
where word = old.food
|
||||||
|
and rank <= 0;
|
||||||
|
update foodfix
|
||||||
|
set rank = rank + 1
|
||||||
|
where word = new.food;
|
||||||
|
|
||||||
|
insert into foodfix (word, rank)
|
||||||
|
select new.food,
|
||||||
|
1
|
||||||
|
where not exists (
|
||||||
|
select 1
|
||||||
|
from foodfix
|
||||||
|
where word = new.food
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
-- Spellfix search example
|
||||||
|
with search_results as (
|
||||||
|
select word, rank
|
||||||
|
from foodfix
|
||||||
|
where word MATCH 'B'
|
||||||
|
limit 1
|
||||||
|
)
|
||||||
|
select f.*, s.rank
|
||||||
|
from search_results s
|
||||||
|
inner join food f on s.word = f.food
|
||||||
|
order by f.date desc;
|
||||||
|
|
||||||
create index dailyIdx on food(strftime('%Y-%m-%d', date));
|
create index dailyIdx on food(strftime('%Y-%m-%d', date));
|
||||||
create index weeklyIdx on food(strftime('%Y-%W', date));
|
create index weeklyIdx on food(strftime('%Y-%W', date));
|
||||||
create index monthlyIdx on food(strftime('%Y-%m', date));
|
create index monthlyIdx on food(strftime('%Y-%m', date));
|
||||||
@@ -134,17 +208,17 @@ insert on food
|
|||||||
begin
|
begin
|
||||||
update food
|
update food
|
||||||
set per100 = coalesce(
|
set per100 = coalesce(
|
||||||
new .per100,
|
new.per100,
|
||||||
(
|
(
|
||||||
select per100
|
select per100
|
||||||
from food
|
from food
|
||||||
where food = new .food
|
where food = new.food
|
||||||
and per100 is not null
|
and per100 is not null
|
||||||
order by date desc
|
order by date desc
|
||||||
limit 1
|
limit 1
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
where rowid = new .rowid;
|
where rowid = new.rowid;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
create table settings(
|
create table settings(
|
||||||
|
Reference in New Issue
Block a user