# HG changeset patch # User Bernhard Reiter # Date 1562221992 -7200 # Node ID b330e014c655b02ed302184feb9f580f0da09266 # Parent 9156890179e22e4158ffe47db131f529dbffb2c2# Parent 6521c962a7b6c6bd2df26f1871b384c21faeb85f merge from default diff -r 9156890179e2 -r b330e014c655 pkg/controllers/common.go --- a/pkg/controllers/common.go Wed Jul 03 17:48:19 2019 +0200 +++ b/pkg/controllers/common.go Thu Jul 04 08:33:12 2019 +0200 @@ -100,6 +100,18 @@ return &ia } +func sliceToTextArray(s []string) *pgtype.TextArray { + if len(s) == 0 { + return nil + } + var ta pgtype.TextArray + if err := ta.Set(s); err != nil { + log.Printf("warn: %v\n", err) + return nil + } + return &ta +} + func toTextArray(txt string, allowed []string) *pgtype.TextArray { parts := strings.Split(txt, ",") var accepted []string @@ -114,13 +126,15 @@ } } } - if len(accepted) == 0 { - return nil - } - var ta pgtype.TextArray - if err := ta.Set(accepted); err != nil { - log.Printf("warn: %v\n", err) - return nil - } - return &ta + return sliceToTextArray(accepted) } + +func splitUpper(s string) []string { + s = strings.Map(func(r rune) rune { + if ('A' <= r && r <= 'Z') || r == ',' { + return r + } + return -1 + }, strings.ToUpper(s)) + return strings.FieldsFunc(s, func(r rune) bool { return r != ',' }) +} diff -r 9156890179e2 -r b330e014c655 pkg/controllers/importqueue.go --- a/pkg/controllers/importqueue.go Wed Jul 03 17:48:19 2019 +0200 +++ b/pkg/controllers/importqueue.go Thu Jul 04 08:33:12 2019 +0200 @@ -112,6 +112,14 @@ query, query, query, query) } + if cc := req.FormValue("cc"); cc != "" { + codes := sliceToTextArray(splitUpper(cc)) + cond(" username IN "+ + "(SELECT username FROM internal.user_profiles "+ + "WHERE country = ANY($%d)) ", + codes) + } + if st := req.FormValue("states"); st != "" { states := toTextArray(st, imports.ImportStateNames) cond(" state = ANY($%d) ", states) diff -r 9156890179e2 -r b330e014c655 pkg/octree/simplify.go --- a/pkg/octree/simplify.go Wed Jul 03 17:48:19 2019 +0200 +++ b/pkg/octree/simplify.go Thu Jul 04 08:33:12 2019 +0200 @@ -17,6 +17,74 @@ "math" ) +func handleTriangle( + t *Triangle, + maxDist, tolerance float64, + maxIdx int, + points MultiPointZ, + result *MultiPointZ, +) bool { + if maxDist <= tolerance { + return false + } + + if len(points) == 1 { + *result = append(*result, points[0]) + return true + } + + var ( + tris [3]Triangle + planes [3]Plane3D + maxDists [3]float64 + maxIdxs [3]int + parts [3]MultiPointZ + ) + + top := points[maxIdx] + for i := 0; i < 3; i++ { + tris[i] = Triangle{t[i], t[(i+1)%3], top} + planes[i] = tris[i].Plane3D() + } + +nextPoint: + for i, v := range points { + if i == maxIdx { + continue + } + + for j := range tris { + if tris[j].Contains(v.X, v.Y) { + if dist := math.Abs(planes[j].Eval(v)); dist > maxDists[j] { + maxDists[j] = dist + maxIdxs[j] = len(parts[j]) + } + parts[j] = append(parts[j], v) + continue nextPoint + } + } + } + + var found bool + for i, part := range parts { + if len(part) > 0 && handleTriangle( + &tris[i], + maxDists[i], tolerance, + maxIdxs[i], + part, + result, + ) { + found = true + } + } + + if found { + *result = append(*result, top) + } + + return found +} + func (points MultiPointZ) Simplify(tolerance float64) MultiPointZ { if len(points) < 2 { @@ -111,72 +179,17 @@ } } - result := make([]Vertex, 0, len(points)) - - var handleTriangle func(*Triangle, float64, int, []Vertex) bool - - handleTriangle = func( - t *Triangle, - maxDist float64, maxIdx int, - points []Vertex, - ) bool { - if maxDist <= tolerance { - return false - } - - if len(points) == 1 { - result = append(result, points[0]) - } - - var ( - tris [3]Triangle - planes [3]Plane3D - maxDists [3]float64 - maxIdxs [3]int - parts [3][]Vertex - ) - - top := points[maxIdx] - for i := 0; i < 3; i++ { - tris[i] = Triangle{t[i], t[(i+1)%3], top} - planes[i] = tris[i].Plane3D() - } - - nextPoint: - for i, v := range points { - if i == maxIdx { - continue - } - - for j := range tris { - if tris[j].Contains(v.X, v.Y) { - if dist := math.Abs(planes[j].Eval(v)); dist > maxDists[j] { - maxDists[j] = dist - maxIdxs[j] = len(parts[j]) - } - parts[j] = append(parts[j], v) - continue nextPoint - } - } - } - - var found bool - for i, part := range parts { - if len(part) > 0 && handleTriangle(&tris[i], maxDists[i], maxIdxs[i], part) { - found = true - } - } - - if found { - result = append(result, top) - } - - return found - } + result := make(MultiPointZ, 0, len(points)) var found bool for i, part := range parts { - if len(part) > 0 && handleTriangle(&tris[i], maxDists[i], maxIdxs[i], part) { + if len(part) > 0 && handleTriangle( + &tris[i], + maxDists[i], tolerance, + maxIdxs[i], + part, + &result, + ) { found = true } }