beancount-gs/script/bql.go

58 lines
1.4 KiB
Go

package script
import (
"fmt"
"os/exec"
"reflect"
"strings"
)
type QueryParams struct {
Year int `bql:"year ="`
Month int `bql:"month ="`
AccountType string `bql:"account ~"`
}
func BQLQuery(ledgerConfig *Config, queryParams QueryParams, queryResult interface{}) error {
bql := "SELECT '\\', id, '\\', date, '\\', payee, '\\', narration, '\\', account, '\\', position, '\\', tags, '\\' WHERE"
queryParamsType := reflect.TypeOf(queryParams)
queryParamsValue := reflect.ValueOf(queryParams)
for i := 0; i < queryParamsValue.NumField(); i++ {
typeField := queryParamsType.Field(i)
valueField := queryParamsValue.Field(i)
switch valueField.Kind() {
case reflect.String:
val := valueField.String()
if val != "" {
bql = fmt.Sprintf("%s %s '%s' AND", bql, typeField.Tag.Get("bql"), val)
}
case reflect.Int:
val := valueField.Int()
if val != 0 {
bql = fmt.Sprintf("%s %s %d AND", bql, typeField.Tag.Get("bql"), val)
}
}
}
bql = strings.TrimRight(bql, " AND")
output, err := queryByBQL(ledgerConfig, bql)
if err != nil {
return err
}
fmt.Println(output)
//panic("Unsupported result type")
return nil
}
func queryByBQL(ledgerConfig *Config, bql string) (string, error) {
beanFilePath := ledgerConfig.DataPath + "/index.bean"
LogInfo(ledgerConfig.Mail, bql)
cmd := exec.Command("bean-query", beanFilePath, bql)
output, err := cmd.Output()
if err != nil {
return "", err
}
return string(output), nil
}