// getQueryKey returns the etcd key for the query. func GetQueryKey(q *protocol.KontrolQuery) (string, error) { fields := q.Fields() if q.Username == "" { return "", errors.New("Empty username field") } // Validate query and build key. path := "/" empty := false // encountered with empty field? empytField := "" // for error log // http://golang.org/doc/go1.3#map, order is important and we can't rely on // maps because the keys are not ordered :) for _, key := range keyOrder { v := fields[key] if v == "" { empty = true empytField = key continue } if empty && v != "" { return "", fmt.Errorf("Invalid query. Query option is not set: %s", empytField) } path = path + v + "/" } path = strings.TrimSuffix(path, "/") return path, nil }
// selectQuery returns a SQL query for the given query func selectQuery(query *protocol.KontrolQuery) (string, []interface{}, error) { psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) kites := psql.Select("*").From("kite.kite") fields := query.Fields() andQuery := sq.And{} // we stop for the first empty value for _, key := range keyOrder { v := fields[key] if v == "" { continue } // we are using "kitename" as the columname if key == "name" { key = "kitename" } andQuery = append(andQuery, sq.Eq{key: v}) } if len(andQuery) == 0 { return "", nil, ErrQueryFieldsEmpty } return kites.Where(andQuery).ToSql() }
// onlyIDQuery returns true if the query contains only a non-empty ID and all // others keys are empty func onlyIDQuery(q *protocol.KontrolQuery) bool { fields := q.Fields() // check if any other key exist, if yes return a false for _, k := range keyOrder { v := fields[k] if k != "id" && v != "" { return false } } // now all other keys are empty, check finally for our ID if fields["id"] != "" { return true } // ID is empty too! return false }