/* 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 ( "fmt" "strings" "dim/types" ) // 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, "->")) }