From 3fe37224ccc2500e7e767e5fc00163ef61182828 Mon Sep 17 00:00:00 2001 From: Jonas Knobloch Date: Fri, 17 Apr 2026 16:07:14 +0200 Subject: Add sander module --- research/sander/experiment.go | 85 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 research/sander/experiment.go (limited to 'research/sander/experiment.go') diff --git a/research/sander/experiment.go b/research/sander/experiment.go new file mode 100644 index 0000000..1521cf8 --- /dev/null +++ b/research/sander/experiment.go @@ -0,0 +1,85 @@ +package sander + +import ( + "database/sql" + "fmt" + "log" + "os" + "path/filepath" + + _ "github.com/duckdb/duckdb-go/v2" +) + +type Experiment struct { + name string + model string + reference map[int64]struct{} +} + +func NewExperiment(name, model string, reference map[int64]struct{}) (*Experiment, error) { + e := &Experiment{ + name: name, + model: model, + reference: reference, + } + + return e, nil +} + +func (e *Experiment) Run() error { + if err := os.MkdirAll(e.name, 0775); err != nil { + log.Fatal(err) + } + + dsn := filepath.Join(e.name, "wte.db") + + var db *sql.DB + + if database, err := initDatabase(dsn); err != nil { + return err + } else { + db = database + } + + defer db.Close() + + db.SetMaxOpenConns(1) + + fmt.Println(e.name) + + if _, err := db.Exec(`INSTALL vss; LOAD vss;`); err != nil { + return err + } + + if err := e.Extract(db); err != nil { + return err + } + + if err := e.Analyze(db); err != nil { + return err + } + + if err := e.Plot(db); err != nil { + return err + } + + return nil +} + +func initDatabase(dsn string) (*sql.DB, error) { + var db *sql.DB + + if database, err := sql.Open("duckdb", dsn); err != nil { + return nil, err + } else { + db = database + } + + if err := db.Ping(); err != nil { + _ = db.Close() + + return nil, err + } + + return db, nil +} -- cgit v1.3.1