Mercurial > gemma
view pkg/common/round.go @ 4873:8a4c98b80fbd
Make constraint trigger work in sessions with empty search_path
Constraint triggers involving check_sr_in_bn_area() failed when applied
in a session with empty search_path, because the used PostGIS function in
the public schema was not found. This could prevent restoring values in
waterway.sounding_results from a dump created using pg_dump.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Fri, 24 Jan 2020 17:33:12 +0100 |
parents | 6a985796f401 |
children |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2019 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha Wilde <wilde@sha-bang.de> package common import ( "math" "sort" "time" ) // SumPreservingRound rounds the values of arr preserving the sum. func SumPreservingRound(arr []float64) []int { type rest struct { key int rest float64 } var ( result = make([]int, len(arr)) rests = make([]rest, len(arr)) sum float64 newSum int ) // floor all values for i, v := range arr { sum += v result[i] = int(v) newSum += int(v) rests[i] = rest{key: i, rest: v - float64(result[i])} } // spread delta over values with highest rest sort.Slice(rests, func(i, j int) bool { return rests[i].rest > rests[j].rest }) // find the difference in sums delta := int(math.Round(sum)) - newSum for _, v := range rests { if delta <= 0 { break } result[v.key]++ delta-- } return result } // RoundToFullDays rounds durations to full days. func RoundToFullDays(durations []time.Duration) []int { days := make([]float64, len(durations)) for i, v := range durations { days[i] = v.Hours() / 24 } return SumPreservingRound(days) }