This is a implementation of dim, which is built in python. But this time in go.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.5 KiB

Package query provides functions useful for building database queries.
It contains functions to build select clauses or where clauses together
with the necessary parameter keys.
package query
import (
// FieldListToSelect converts the fieldlist to a select clause.
// It takes a fieldField and tries to find a matching name in the nameMap and
// uses the provided name.
// Any field that is not found will be converted to an attributes selector, so
// that extra attributes can be selected dynamically.
// Each field will be selected with the requested name, so be careful to
// avoid collisions.
// The tableName will be used as a prefix to the attributes field. Only one
// attributes field can be used at the same time.
func FieldListToSelect(tableName string, fl types.FieldList, nameMap map[string]string) string {
res := []string{}
for _, name := range fl.Fields() {
if field, found := nameMap[name]; found {
res = append(res, fmt.Sprintf(`%s as %s`, field, name))
} else {
res = append(res, fmt.Sprintf(`%s as %s`, nameToAttrPath(tableName, name), name))
return strings.Join(res, ",")
// nameToAttrPath takes a dotted string and converts it into a json field path.
func nameToAttrPath(tabName, name string) string {
if name == "" {
return tabName + ".attributes"
parts := strings.Split(name, ".")
for i, part := range parts {
parts[i] = fmt.Sprintf(`'%s'`, part)
return fmt.Sprintf("%s.attributes->%s", tabName, strings.Join(parts, "->"))